From d5abbbcb760fc7b8f27c2b2f59e2ed8bc9333965 Mon Sep 17 00:00:00 2001 From: Anton <100897060+AntonCSalvador@users.noreply.github.com> Date: Wed, 21 Aug 2024 15:28:03 -0400 Subject: [PATCH] Revert "Rizz party refactor among other things" --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 2 - {src/assets => build}/BoL Logo Edited.png | Bin build/asset-manifest.json | 15 + build/index.html | 1 + {src/assets => build}/main_menu.gif | Bin {src/assets => build}/main_menu.mp3 | Bin build/main_menu.mp4 | Bin 0 -> 434920 bytes build/manifest.json | 25 ++ build/robots.txt | 3 + build/static/css/main.2a765afa.css | 4 + build/static/css/main.2a765afa.css.map | 1 + build/static/js/453.c6e97d81.chunk.js | 2 + build/static/js/453.c6e97d81.chunk.js.map | 1 + build/static/js/main.cf190531.js | 3 + build/static/js/main.cf190531.js.LICENSE.txt | 61 +++ build/static/js/main.cf190531.js.map | 1 + package-lock.json | 402 ------------------ package.json | 6 +- postcss.config.js | 4 +- public/.DS_Store | Bin 0 -> 6148 bytes public/BoL Logo Edited.png | Bin 0 -> 787033 bytes {src/assets => public}/credits/Anton.jpg | Bin {src/assets => public}/credits/Eddy.jpg | Bin {src/assets => public}/credits/Gianna.jpg | Bin {src/assets => public}/credits/Jake.jpg | Bin {src/assets => public}/credits/Jason.jpg | Bin {src/assets => public}/credits/Joey.jpg | Bin {src/assets => public}/credits/Kaniel.jpg | Bin {src/assets => public}/credits/Lazzy.jpg | Bin {src/assets => public}/credits/Mathew.jpg | Bin {src/assets => public}/credits/Mesa.jpg | Bin {src/assets => public}/credits/Mohammed.jpg | Bin {src/assets => public}/credits/Nick.jpg | Bin {src/assets => public}/credits/Ryder.jpg | Bin {src/assets => public}/credits/Sarah.jpg | Bin {src/assets => public}/credits/Shimtone.jpg | Bin {src/assets => public}/credits/Tikiri.jpg | Bin {src/assets => public}/credits/Tyra.jpg | Bin {src/assets => public}/credits/Wilson.jpg | Bin {src/assets => public/images}/C++_Base.png | Bin .../images}/JavaScript_Base.png | Bin {src/assets => public/images}/Java_Wink.png | Bin {src/assets => public/images}/LGTM.png | Bin .../images/Linux_logo_PNG4.png | Bin .../images}/Python_HandsPocket_2.png | Bin {src/assets => public/images}/Summer.png | Bin {src/assets => public/images}/apple-logo.svg | 0 public/images/arrow_left.png | Bin 0 -> 14684 bytes public/images/arrow_right.png | Bin 0 -> 4940 bytes {src/assets => public/images}/github_logo.png | Bin .../assets => public/images}/windows-logo.png | Bin public/main_menu.gif | Bin 0 -> 2236386 bytes public/main_menu.mp3 | Bin 0 -> 3705435 bytes public/main_menu.mp4 | Bin 0 -> 434920 bytes src/About/About.js | 311 ++++++++++++++ src/About/About.jsx | 104 ----- src/About/Contributors.jsx | 148 ------- src/About/Credit.jsx | 26 -- src/App.test.js | 8 + src/App/App.js | 23 + src/App/App.jsx | 20 - src/Carousel/Carousel.css | 83 ++-- src/Carousel/Carousel.js | 62 +++ src/Carousel/Carousel.jsx | 99 ----- src/Download/Download.js | 110 +++++ src/Download/Download.jsx | 79 ---- src/Footer/Footer.css | 7 +- src/Footer/Footer.js | 39 ++ src/Footer/Footer.jsx | 21 - src/Home/Download.jsx | 47 -- src/Home/Home.css | 73 +++- src/Home/Home.js | 150 +++++++ src/Home/Home.jsx | 74 ---- src/Home/MeetChars.jsx | 63 --- src/Image/Image.css | 5 - src/Image/Image.jsx | 28 -- src/Layout/Layout.jsx | 14 - src/Navbar/Navbar.js | 51 +++ src/Navbar/Navbar.jsx | 31 -- src/index.js | 16 +- src/reportWebVitals.js | 16 +- src/setupTests.js | 2 +- tailwind.config.js | 7 +- 84 files changed, 998 insertions(+), 1250 deletions(-) create mode 100644 .DS_Store rename {src/assets => build}/BoL Logo Edited.png (100%) create mode 100644 build/asset-manifest.json create mode 100644 build/index.html rename {src/assets => build}/main_menu.gif (100%) rename {src/assets => build}/main_menu.mp3 (100%) create mode 100644 build/main_menu.mp4 create mode 100644 build/manifest.json create mode 100644 build/robots.txt create mode 100644 build/static/css/main.2a765afa.css create mode 100644 build/static/css/main.2a765afa.css.map create mode 100644 build/static/js/453.c6e97d81.chunk.js create mode 100644 build/static/js/453.c6e97d81.chunk.js.map create mode 100644 build/static/js/main.cf190531.js create mode 100644 build/static/js/main.cf190531.js.LICENSE.txt create mode 100644 build/static/js/main.cf190531.js.map create mode 100644 public/.DS_Store create mode 100644 public/BoL Logo Edited.png rename {src/assets => public}/credits/Anton.jpg (100%) rename {src/assets => public}/credits/Eddy.jpg (100%) rename {src/assets => public}/credits/Gianna.jpg (100%) rename {src/assets => public}/credits/Jake.jpg (100%) rename {src/assets => public}/credits/Jason.jpg (100%) rename {src/assets => public}/credits/Joey.jpg (100%) rename {src/assets => public}/credits/Kaniel.jpg (100%) rename {src/assets => public}/credits/Lazzy.jpg (100%) rename {src/assets => public}/credits/Mathew.jpg (100%) rename {src/assets => public}/credits/Mesa.jpg (100%) rename {src/assets => public}/credits/Mohammed.jpg (100%) rename {src/assets => public}/credits/Nick.jpg (100%) rename {src/assets => public}/credits/Ryder.jpg (100%) rename {src/assets => public}/credits/Sarah.jpg (100%) rename {src/assets => public}/credits/Shimtone.jpg (100%) rename {src/assets => public}/credits/Tikiri.jpg (100%) rename {src/assets => public}/credits/Tyra.jpg (100%) rename {src/assets => public}/credits/Wilson.jpg (100%) rename {src/assets => public/images}/C++_Base.png (100%) rename {src/assets => public/images}/JavaScript_Base.png (100%) rename {src/assets => public/images}/Java_Wink.png (100%) rename {src/assets => public/images}/LGTM.png (100%) rename src/assets/linux-logo.png => public/images/Linux_logo_PNG4.png (100%) rename {src/assets => public/images}/Python_HandsPocket_2.png (100%) rename {src/assets => public/images}/Summer.png (100%) rename {src/assets => public/images}/apple-logo.svg (100%) create mode 100644 public/images/arrow_left.png create mode 100644 public/images/arrow_right.png rename {src/assets => public/images}/github_logo.png (100%) rename {src/assets => public/images}/windows-logo.png (100%) create mode 100644 public/main_menu.gif create mode 100644 public/main_menu.mp3 create mode 100644 public/main_menu.mp4 create mode 100644 src/About/About.js delete mode 100644 src/About/About.jsx delete mode 100644 src/About/Contributors.jsx delete mode 100644 src/About/Credit.jsx create mode 100644 src/App.test.js create mode 100644 src/App/App.js delete mode 100644 src/App/App.jsx create mode 100644 src/Carousel/Carousel.js delete mode 100644 src/Carousel/Carousel.jsx create mode 100644 src/Download/Download.js delete mode 100644 src/Download/Download.jsx create mode 100644 src/Footer/Footer.js delete mode 100644 src/Footer/Footer.jsx delete mode 100644 src/Home/Download.jsx create mode 100644 src/Home/Home.js delete mode 100644 src/Home/Home.jsx delete mode 100644 src/Home/MeetChars.jsx delete mode 100644 src/Image/Image.css delete mode 100644 src/Image/Image.jsx delete mode 100644 src/Layout/Layout.jsx create mode 100644 src/Navbar/Navbar.js delete mode 100644 src/Navbar/Navbar.jsx diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a664584bbda601d77f83bd0f4a641c7e4fa27870 GIT binary patch literal 6148 zcmeHK%}T>S5T5OSDMAj49v8d@Y)e}$UP7!dU_=ipwJ}A5F-U znlBmtCIj-@6~Tuogb=~%_j~b2Q8-EJ^;ee57mB4aO09h5-HDl(43g=@9gHvJ>Qsox zU+M$@EF8}I*5;9jlR+2{$0{HUhUjv69>#%~xnddz6BX;}jVemt+Mdtb`!;Vk4i+|_ zcbj#ax4O;6qFUM7-8($#-$xIzc+xyF{Na>r7+k_LDk}*+dgC|}@hw_qL6dDJ4?#thV)T`zcn60Pv~#H-ItEjXXhETifTDpWV&F#^cmuO(hz0-v literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore index 9f5ab870..b38db2f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ node_modules/ build/ -*/.DS_Store -.DS_Store diff --git a/src/assets/BoL Logo Edited.png b/build/BoL Logo Edited.png similarity index 100% rename from src/assets/BoL Logo Edited.png rename to build/BoL Logo Edited.png diff --git a/build/asset-manifest.json b/build/asset-manifest.json new file mode 100644 index 00000000..adfb2c57 --- /dev/null +++ b/build/asset-manifest.json @@ -0,0 +1,15 @@ +{ + "files": { + "main.css": "/static/css/main.2a765afa.css", + "main.js": "/static/js/main.cf190531.js", + "static/js/453.c6e97d81.chunk.js": "/static/js/453.c6e97d81.chunk.js", + "index.html": "/index.html", + "main.2a765afa.css.map": "/static/css/main.2a765afa.css.map", + "main.cf190531.js.map": "/static/js/main.cf190531.js.map", + "453.c6e97d81.chunk.js.map": "/static/js/453.c6e97d81.chunk.js.map" + }, + "entrypoints": [ + "static/css/main.2a765afa.css", + "static/js/main.cf190531.js" + ] +} \ No newline at end of file diff --git a/build/index.html b/build/index.html new file mode 100644 index 00000000..d497e3b6 --- /dev/null +++ b/build/index.html @@ -0,0 +1 @@ +Bytes of Love
\ No newline at end of file diff --git a/src/assets/main_menu.gif b/build/main_menu.gif similarity index 100% rename from src/assets/main_menu.gif rename to build/main_menu.gif diff --git a/src/assets/main_menu.mp3 b/build/main_menu.mp3 similarity index 100% rename from src/assets/main_menu.mp3 rename to build/main_menu.mp3 diff --git a/build/main_menu.mp4 b/build/main_menu.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..edf7a0410b41f7ccf136714aee5852910b7921e7 GIT binary patch literal 434920 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 -@S#h%|aM20TdZ3QW&P0;C!9T$;ERn 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 literal 0 HcmV?d00001 diff --git a/build/manifest.json b/build/manifest.json new file mode 100644 index 00000000..080d6c77 --- /dev/null +++ b/build/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/build/robots.txt b/build/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/build/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/build/static/css/main.2a765afa.css b/build/static/css/main.2a765afa.css new file mode 100644 index 00000000..9d92cf35 --- /dev/null +++ b/build/static/css/main.2a765afa.css @@ -0,0 +1,4 @@ +/* +! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com +*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.fixed{position:fixed}.bottom-4{bottom:1rem}.right-4{right:1rem}.m-4{margin:1rem}.flex{display:flex}.h-6{height:1.5rem}.h-full{height:100%}.w-1\/2{width:50%}.w-3\/12{width:25%}.w-6{width:1.5rem}.w-full{width:100%}.items-center{align-items:center}.justify-center{justify-content:center}.rounded{border-radius:.25rem}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.stroke-black{stroke:#000}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.font-bold{font-weight:700}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgb(153 27 27/var(--tw-bg-opacity))}.home-page-container{background-color:beige;display:flex;flex-direction:column;position:relative}.picture-carousel{align-content:center;height:60vh;margin-bottom:10vh;outline:2px solid red;text-align:center;width:60vw}.download-title,.picture-carousel{align-self:center;position:relative}.download-title{font-size:50px;margin-bottom:1vh}.download-links-box{align-items:center;display:flex;flex-direction:column;margin-bottom:10vh;position:relative}.download-line{display:flex;flex-direction:row;justify-content:center}.download-button,.os-type{align-content:center;font-size:25px;height:3vw;margin-bottom:2vh;text-align:center;width:10vw}.download-button{background-color:#d3d3d3;margin-left:5vw}.temp-title{left:50vw;position:absolute;top:50vh;transform:translate(-50%,-50%)}.temp-centered-text{align-content:center;font-size:50px}.header-container{align-items:center;background-color:#d3d3d3;display:flex;flex-direction:row;height:10vh;justify-content:center;margin-bottom:10vh;position:relative;width:100vw}.header-option-container{align-content:center;cursor:pointer;font-size:25px;height:8vh;margin-left:2.5vw;margin-right:2.5vw;position:relative;text-align:center;width:10vw} +/*# sourceMappingURL=main.2a765afa.css.map*/ \ No newline at end of file diff --git a/build/static/css/main.2a765afa.css.map b/build/static/css/main.2a765afa.css.map new file mode 100644 index 00000000..30892fc3 --- /dev/null +++ b/build/static/css/main.2a765afa.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.2a765afa.css","mappings":"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","sources":["index.css","Home/Home.css","Navbar/Navbar.css"],"sourcesContent":["@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n",".home-page-container {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: beige;\n}\n\n.picture-carousel {\n position: relative;\n align-self: center;\n text-align: center;\n align-content: center;\n width: 60vw;\n height: 60vh;\n margin-bottom: 10vh;\n outline: 2px solid red; \n}\n\n.download-title {\n position: relative;\n margin-bottom: 1vh;\n align-self: center;\n font-size: 50px;\n}\n\n.download-links-box {\n position: relative;\n margin-bottom: 10vh;\n align-items: center;\n display: flex;\n flex-direction: column;\n} \n\n.download-line {\n display: flex;\n flex-direction: row;\n justify-content: center;\n}\n\n.os-type {\n width: 10vw;\n height: 3vw;\n text-align: center;\n align-content: center;\n font-size: 25px;\n margin-bottom: 2vh;\n}\n\n.download-button {\n margin-left: 5vw;\n width: 10vw;\n height: 3vw;\n background-color: lightgrey;\n text-align: center;\n align-content: center;\n font-size: 25px;\n margin-bottom: 2vh;\n}\n\n.temp-title {\n position: absolute;\n top: 50vh;\n left: 50vw;\n transform: translate(-50%, -50%);\n}\n\n.temp-centered-text {\n align-content: center;\n font-size: 50px;\n}",".header-container {\n background-color: lightgrey;\n position: relative;\n height: 10vh;\n width: 100vw;\n margin-bottom: 10vh;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n}\n\n.header-option-container {\n position: relative;\n width: 10vw;\n height: 8vh;\n margin-left: 2.5vw;\n margin-right: 2.5vw;\n text-align: center;\n align-content: center;\n font-size: 25px;\n cursor: pointer;\n /* outline: 2px solid red; */\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/js/453.c6e97d81.chunk.js b/build/static/js/453.c6e97d81.chunk.js new file mode 100644 index 00000000..9bb0f285 --- /dev/null +++ b/build/static/js/453.c6e97d81.chunk.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkbol_website=self.webpackChunkbol_website||[]).push([[453],{453:(e,t,n)=>{n.r(t),n.d(t,{getCLS:()=>y,getFCP:()=>g,getFID:()=>C,getLCP:()=>P,getTTFB:()=>D});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},s=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},f=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,p=function(){return"hidden"===document.visibilityState?0:1/0},d=function(){s((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=p(),d(),f((function(){setTimeout((function(){v=p(),d()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(s&&s.disconnect(),e.startTime-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},p=c("layout-shift",v);p&&(n=m(i,r,t),s((function(){p.takeRecords().map(v),n(!0)})),f((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]); +//# sourceMappingURL=453.c6e97d81.chunk.js.map \ No newline at end of file diff --git a/build/static/js/453.c6e97d81.chunk.js.map b/build/static/js/453.c6e97d81.chunk.js.map new file mode 100644 index 00000000..f4949e90 --- /dev/null +++ b/build/static/js/453.c6e97d81.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/453.c6e97d81.chunk.js","mappings":"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","sources":["../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["var e,t,n,i,r=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v2-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},a=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},u=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},c=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},f=-1,s=function(){return\"hidden\"===document.visibilityState?0:1/0},m=function(){o((function(e){var t=e.timeStamp;f=t}),!0)},v=function(){return f<0&&(f=s(),m(),u((function(){setTimeout((function(){f=s(),m()}),0)}))),{get firstHiddenTime(){return f}}},d=function(e,t){var n,i=v(),o=r(\"FCP\"),f=function(e){\"first-contentful-paint\"===e.name&&(m&&m.disconnect(),e.startTime-1&&e(t)},f=r(\"CLS\",0),s=0,m=[],v=function(e){if(!e.hadRecentInput){var t=m[0],i=m[m.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,m.push(e)):(s=e.value,m=[e]),s>f.value&&(f.value=s,f.entries=m,n())}},h=a(\"layout-shift\",v);h&&(n=c(i,f,t),o((function(){h.takeRecords().map(v),n(!0)})),u((function(){s=0,l=-1,f=r(\"CLS\",0),n=c(i,f,t)})))},T={passive:!0,capture:!0},y=new Date,g=function(i,r){e||(e=r,t=i,n=new Date,w(removeEventListener),E())},E=function(){if(t>=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){g(e,t),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",n,T),removeEventListener(\"pointercancel\",i,T)};addEventListener(\"pointerup\",n,T),addEventListener(\"pointercancel\",i,T)}(t,e):g(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,S,T)}))},L=function(n,f){var s,m=v(),d=r(\"FID\"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},\"complete\"===document.readyState?setTimeout(t,0):addEventListener(\"load\",(function(){return setTimeout(t,0)}))};export{h as getCLS,d as getFCP,L as getFID,F as getLCP,P as getTTFB};\n"],"names":["e","t","n","i","r","name","value","delta","entries","id","concat","Date","now","Math","floor","random","a","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","u","persisted","c","f","s","m","timeStamp","v","setTimeout","firstHiddenTime","d","disconnect","startTime","push","window","performance","getEntriesByName","requestAnimationFrame","p","l","h","hadRecentInput","length","takeRecords","T","passive","capture","y","g","w","E","entryType","target","cancelable","processingStart","forEach","S","L","b","F","once","P","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/js/main.cf190531.js b/build/static/js/main.cf190531.js new file mode 100644 index 00000000..1a56724c --- /dev/null +++ b/build/static/js/main.cf190531.js @@ -0,0 +1,3 @@ +/*! For license information please see main.cf190531.js.LICENSE.txt */ +(()=>{"use strict";var e={730:(e,t,n)=>{var r=n(43),l=n(853);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n attribute.\n *\n * @param to - The destination URL\n */\n createHref(to: To): string;\n\n /**\n * Returns a URL for the given `to` value\n *\n * @param to - The destination URL\n */\n createURL(to: To): URL;\n\n /**\n * Encode a location the same way window.history would do (no-op for memory\n * history) so we ensure our PUSH/REPLACE navigations for data routers\n * behave the same as POP\n *\n * @param to Unencoded path\n */\n encodeLocation(to: To): Path;\n\n /**\n * Pushes a new location onto the history stack, increasing its length by one.\n * If there were any entries in the stack after the current one, they are\n * lost.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n push(to: To, state?: any): void;\n\n /**\n * Replaces the current location in the history stack with a new one. The\n * location that was replaced will no longer be available.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n replace(to: To, state?: any): void;\n\n /**\n * Navigates `n` entries backward/forward in the history stack relative to the\n * current index. For example, a \"back\" navigation would use go(-1).\n *\n * @param delta - The delta in the stack index\n */\n go(delta: number): void;\n\n /**\n * Sets up a listener that will be called whenever the current location\n * changes.\n *\n * @param listener - A function that will be called when the location changes\n * @returns unlisten - A function that may be used to stop listening\n */\n listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n usr: any;\n key?: string;\n idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial;\n\nexport type MemoryHistoryOptions = {\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n /**\n * The current index in the history stack.\n */\n readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n options: MemoryHistoryOptions = {}\n): MemoryHistory {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries: Location[]; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) =>\n createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index === 0 ? \"default\" : undefined\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n function clampIndex(n: number): number {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation(): Location {\n return entries[index];\n }\n function createMemoryLocation(\n to: To,\n state: any = null,\n key?: string\n ): Location {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n\n function createHref(to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history: MemoryHistory = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to: To) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\",\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn: Listener) {\n listener = fn;\n return () => {\n listener = null;\n };\n },\n };\n\n return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n options: BrowserHistoryOptions = {}\n): BrowserHistory {\n function createBrowserLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let { pathname, search, hash } = window.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createBrowserHref(window: Window, to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n options: HashHistoryOptions = {}\n): HashHistory {\n function createHashLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n } = parsePath(window.location.hash.substr(1));\n\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route () since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createHashHref(window: Window, to: To) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location: Location, to: To) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant(\n value: T | null | undefined,\n message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\nexport function warning(cond: any, message: string) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n current: string | Location,\n to: To,\n state: any = null,\n key?: string\n): Readonly {\n let location: Readonly = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...(typeof to === \"string\" ? parsePath(to) : to),\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: (to && (to as Location).key) || key || createKey(),\n };\n return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n}: Partial) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial {\n let parsedPath: Partial = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n window?: Window;\n v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n createHref: (window: Window, to: To) => string,\n validateLocation: ((location: Location, to: To) => void) | null,\n options: UrlHistoryOptions = {}\n): UrlHistory {\n let { window = document.defaultView!, v5Compat = false } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n let index = getIndex()!;\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n\n function getIndex(): number {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n\n function push(to: To, state?: any) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n\n function replace(to: To, state?: any) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n\n function createURL(to: To): URL {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base =\n window.location.origin !== \"null\"\n ? window.location.origin\n : window.location.href;\n\n let href = typeof to === \"string\" ? to : createPath(to);\n // Treating this as a full URL will strip any trailing spaces so we need to\n // pre-encode them since they might be part of a matching splat param from\n // an ancestor route\n href = href.replace(/ $/, \"%20\");\n invariant(\n base,\n `No window.location.(origin|href) available to create URL for href: ${href}`\n );\n return new URL(href, base);\n }\n\n let history: History = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn: Listener) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n },\n };\n\n return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n [routeId: string]: any;\n}\n\nexport enum ResultType {\n data = \"data\",\n deferred = \"deferred\",\n redirect = \"redirect\",\n error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n type: ResultType.data;\n data: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n type: ResultType.deferred;\n deferredData: DeferredData;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n type: ResultType.redirect;\n // We keep the raw Response for redirects so we can return it verbatim\n response: Response;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n type: ResultType.error;\n error: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n | SuccessResult\n | DeferredResult\n | RedirectResult\n | ErrorResult;\n\n/**\n * Result from a loader or action called via dataStrategy\n */\nexport interface HandlerResult {\n type: \"data\" | \"error\";\n result: unknown; // data, Error, Response, DeferredData\n status?: number;\n}\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `
`,\n * useSubmit(), ``, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState. This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude;\n\nexport type FormEncType =\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"application/json\"\n | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: FormData;\n json: undefined;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: JsonValue;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: undefined;\n text: string;\n };\n\n/**\n * @private\n * Arguments passed to route loader/action functions. Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs {\n request: Request;\n params: Params;\n context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n// ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n// Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return). Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable | null;\n\ntype DataFunctionReturnValue = Promise | DataFunctionValue;\n\n/**\n * Route loader function signature\n */\nexport type LoaderFunction = {\n (\n args: LoaderFunctionArgs,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n} & { hydrate?: boolean };\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction {\n (\n args: ActionFunctionArgs,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n currentUrl: URL;\n currentParams: AgnosticDataRouteMatch[\"params\"];\n nextUrl: URL;\n nextParams: AgnosticDataRouteMatch[\"params\"];\n formMethod?: Submission[\"formMethod\"];\n formAction?: Submission[\"formAction\"];\n formEncType?: Submission[\"formEncType\"];\n text?: Submission[\"text\"];\n formData?: Submission[\"formData\"];\n json?: Submission[\"json\"];\n unstable_actionStatus?: number;\n actionResult?: any;\n defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature. This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments. It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n (route: AgnosticRouteObject): boolean;\n}\n\nexport interface DataStrategyMatch\n extends AgnosticRouteMatch {\n shouldLoad: boolean;\n resolve: (\n handlerOverride?: (\n handler: (ctx?: unknown) => DataFunctionReturnValue\n ) => Promise\n ) => Promise;\n}\n\nexport interface DataStrategyFunctionArgs\n extends DataFunctionArgs {\n matches: DataStrategyMatch[];\n}\n\nexport interface DataStrategyFunction {\n (args: DataStrategyFunctionArgs): Promise;\n}\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n (route: AgnosticRouteObject): {\n hasErrorBoundary: boolean;\n } & Record;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n | \"lazy\"\n | \"caseSensitive\"\n | \"path\"\n | \"id\"\n | \"index\"\n | \"children\";\n\nexport const immutableRouteKeys = new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\",\n]);\n\ntype RequireOne = Exclude<\n {\n [K in keyof T]: K extends Key ? Omit & Required> : never;\n }[keyof T],\n undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction {\n (): Promise>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n caseSensitive?: boolean;\n path?: string;\n id?: string;\n loader?: LoaderFunction | boolean;\n action?: ActionFunction | boolean;\n hasErrorBoundary?: boolean;\n shouldRevalidate?: ShouldRevalidateFunction;\n handle?: any;\n lazy?: LazyRouteFunction;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n children?: undefined;\n index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n children?: AgnosticRouteObject[];\n index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n | AgnosticIndexRouteObject\n | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n children?: AgnosticDataRouteObject[];\n id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n | AgnosticDataIndexRouteObject\n | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam =\n // split path into individual path segments\n Path extends `${infer L}/${infer R}`\n ? _PathParam | _PathParam\n : // find params after `:`\n Path extends `:${infer Param}`\n ? Param extends `${infer Optional}?`\n ? Optional\n : Param\n : // otherwise, there aren't any params present\n never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\nexport type PathParam =\n // check if path is just a wildcard\n Path extends \"*\" | \"/*\"\n ? \"*\"\n : // look for wildcard at the end of the path\n Path extends `${infer Rest}/*`\n ? \"*\" | _PathParam\n : // look for params in the absence of wildcards\n _PathParam;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey =\n // if you could not find path params, fallback to `string`\n [PathParam] extends [never] ? string : PathParam;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params = {\n readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The route object that was used to match.\n */\n route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n extends AgnosticRouteMatch {}\n\nfunction isIndexRoute(\n route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n routes: AgnosticRouteObject[],\n mapRouteProperties: MapRoutePropertiesFunction,\n parentPath: number[] = [],\n manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n return routes.map((route, index) => {\n let treePath = [...parentPath, index];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n !manifest[id],\n `Found a route id collision on id \"${id}\". Route ` +\n \"id's must be globally unique within Data Router usages\"\n );\n\n if (isIndexRoute(route)) {\n let indexRoute: AgnosticDataIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n };\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n children: undefined,\n };\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties,\n treePath,\n manifest\n );\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nexport function matchRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename = \"/\"\n): AgnosticRouteMatch[] | null {\n let location =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n let decoded = decodePath(pathname);\n matches = matchRouteBranch(branches[i], decoded);\n }\n\n return matches;\n}\n\nexport interface UIMatch {\n id: string;\n pathname: string;\n params: AgnosticRouteMatch[\"params\"];\n data: Data;\n handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n match: AgnosticDataRouteMatch,\n loaderData: RouteData\n): UIMatch {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle,\n };\n}\n\ninterface RouteMeta<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n relativePath: string;\n caseSensitive: boolean;\n childrenIndex: number;\n route: RouteObjectType;\n}\n\ninterface RouteBranch<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n path: string;\n score: number;\n routesMeta: RouteMeta[];\n}\n\nfunction flattenRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n branches: RouteBranch[] = [],\n parentsMeta: RouteMeta[] = [],\n parentPath = \"\"\n): RouteBranch[] {\n let flattenRoute = (\n route: RouteObjectType,\n index: number,\n relativePath?: string\n ) => {\n let meta: RouteMeta = {\n relativePath:\n relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route,\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path ` +\n `\"${parentPath}\" is not valid. An absolute child route path ` +\n `must start with the combined path of all its parent routes.`\n );\n\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove ` +\n `all child routes from route path \"${path}\".`\n );\n\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta,\n });\n };\n routes.forEach((route, index) => {\n // coarse-grain check for optional params\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n\n return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n\n let [first, ...rest] = segments;\n\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n let result: string[] = [];\n\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(\n ...restExploded.map((subpath) =>\n subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n\n // for absolute paths, ensure `/` instead of empty segment\n return result.map((exploded) =>\n path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n branches.sort((a, b) =>\n a.score !== b.score\n ? b.score - a.score // Higher score first\n : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\n\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments\n .filter((s) => !isSplat(s))\n .reduce(\n (score, segment) =>\n score +\n (paramRe.test(segment)\n ? dynamicSegmentValue\n : segment === \"\"\n ? emptySegmentValue\n : staticSegmentValue),\n initialScore\n );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n let siblings =\n a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n return siblings\n ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n branch: RouteBranch,\n pathname: string\n): AgnosticRouteMatch[] | null {\n let { routesMeta } = branch;\n\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches: AgnosticRouteMatch[] = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname =\n matchedPathname === \"/\"\n ? pathname\n : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath(\n { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n remainingPathname\n );\n\n if (!match) return null;\n\n Object.assign(matchedParams, match.params);\n\n let route = meta.route;\n\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams as Params,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route,\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nexport function generatePath(\n originalPath: Path,\n params: {\n [key in PathParam]: string | null;\n } = {} as any\n): string {\n let path: string = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\") as Path;\n }\n\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n const stringify = (p: any) =>\n p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n const segments = path\n .split(/\\/+/)\n .map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\" as PathParam;\n // Apply the splat\n return stringify(params[star]);\n }\n\n const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key as PathParam];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return stringify(param);\n }\n\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter((segment) => !!segment);\n\n return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern {\n /**\n * A string to match against a URL pathname. May contain `:id`-style segments\n * to indicate placeholders for dynamic parameters. May also end with `/*` to\n * indicate matching the rest of the URL pathname.\n */\n path: Path;\n /**\n * Should be `true` if the static portions of the `path` should be matched in\n * the same case.\n */\n caseSensitive?: boolean;\n /**\n * Should be `true` if this pattern should match the entire URL pathname.\n */\n end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The pattern that was used to match.\n */\n pattern: PathPattern;\n}\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nexport function matchPath<\n ParamKey extends ParamParseKey,\n Path extends string\n>(\n pattern: PathPattern | Path,\n pathname: string\n): PathMatch | null {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n\n let [matcher, compiledParams] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n\n let match = pathname.match(matcher);\n if (!match) return null;\n\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params: Params = compiledParams.reduce>(\n (memo, { paramName, isOptional }, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname\n .slice(0, matchedPathname.length - splatValue.length)\n .replace(/(.)\\/+$/, \"$1\");\n }\n\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n },\n {}\n );\n\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern,\n };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n path: string,\n caseSensitive = false,\n end = true\n): [RegExp, CompiledPathParam[]] {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n\n let params: CompiledPathParam[] = [];\n let regexpSource =\n \"^\" +\n path\n .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(\n /\\/:([\\w-]+)(\\?)?/g,\n (_: string, paramName: string, isOptional) => {\n params.push({ paramName, isOptional: isOptional != null });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n }\n );\n\n if (path.endsWith(\"*\")) {\n params.push({ paramName: \"*\" });\n regexpSource +=\n path === \"*\" || path === \"/*\"\n ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n // Nothing to match for \"\" or \"/\"\n }\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n return [matcher, params];\n}\n\nfunction decodePath(value: string) {\n try {\n return value\n .split(\"/\")\n .map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\"))\n .join(\"/\");\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is is a ` +\n `malformed URL segment. This is probably due to a bad percent ` +\n `encoding (${error}).`\n );\n\n return value;\n }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n pathname: string,\n basename: string\n): string | null {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\")\n ? basename.length - 1\n : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\",\n } = typeof to === \"string\" ? parsePath(to) : to;\n\n let pathname = toPathname\n ? toPathname.startsWith(\"/\")\n ? toPathname\n : resolvePathname(toPathname, fromPathname)\n : fromPathname;\n\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash),\n };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n char: string,\n field: string,\n dest: string,\n path: Partial\n) {\n return (\n `Cannot include a '${char}' character in a manually specified ` +\n `\\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the ` +\n `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n `a string in and the router will parse it for you.`\n );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\nexport function getPathContributingMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n return matches.filter(\n (match, index) =>\n index === 0 || (match.route.path && match.route.path.length > 0)\n );\n}\n\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nexport function getResolveToMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[], v7_relativeSplatPath: boolean) {\n let pathMatches = getPathContributingMatches(matches);\n\n // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n // match so we include splat values for \".\" links. See:\n // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) =>\n idx === matches.length - 1 ? match.pathname : match.pathnameBase\n );\n }\n\n return pathMatches.map((match) => match.pathnameBase);\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n toArg: To,\n routePathnames: string[],\n locationPathname: string,\n isPathRelative = false\n): Path {\n let to: Partial;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n let from: string;\n\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n // With relative=\"route\" (the default), each leading .. segment means\n // \"go up one route\" instead of \"go up one URL segment\". This is a key\n // difference from how works and a major reason we call this a\n // \"to\" value instead of a \"href\".\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from);\n\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash =\n toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash =\n (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (\n !path.pathname.endsWith(\"/\") &&\n (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n ) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n // Empty strings should be treated the same as / paths\n return to === \"\" || (to as Path).pathname === \"\"\n ? \"/\"\n : typeof to === \"string\"\n ? parsePath(to).pathname\n : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n !search || search === \"?\"\n ? \"\"\n : search.startsWith(\"?\")\n ? search\n : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = (\n data: Data,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\nexport interface TrackedPromise extends Promise {\n _tracked?: boolean;\n _data?: any;\n _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n private pendingKeysSet: Set = new Set();\n private controller: AbortController;\n private abortPromise: Promise;\n private unlistenAbortSignal: () => void;\n private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n new Set();\n data: Record;\n init?: ResponseInit;\n deferredKeys: string[] = [];\n\n constructor(data: Record, responseInit?: ResponseInit) {\n invariant(\n data && typeof data === \"object\" && !Array.isArray(data),\n \"defer() only accepts plain objects\"\n );\n\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject: (e: AbortedDeferredError) => void;\n this.abortPromise = new Promise((_, r) => (reject = r));\n this.controller = new AbortController();\n let onAbort = () =>\n reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () =>\n this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n\n this.data = Object.entries(data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: this.trackPromise(key, value),\n }),\n {}\n );\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n private trackPromise(\n key: string,\n value: Promise | unknown\n ): TrackedPromise | unknown {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n (data) => this.onSettle(promise, key, undefined, data as unknown),\n (error) => this.onSettle(promise, key, error as unknown)\n );\n\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n return promise;\n }\n\n private onSettle(\n promise: TrackedPromise,\n key: string,\n error: unknown,\n data?: unknown\n ): unknown {\n if (\n this.controller.signal.aborted &&\n error instanceof AbortedDeferredError\n ) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", { get: () => error });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\n `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n `you must resolve/reject with a value or \\`null\\`.`\n );\n Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", { get: () => error });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", { get: () => data });\n this.emit(false, key);\n return data;\n }\n\n private emit(aborted: boolean, settledKey?: string) {\n this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n }\n\n subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal: AbortSignal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise((resolve) => {\n this.subscribe((aborted) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(\n this.data !== null && this.done,\n \"Can only unwrap data on initialized and settled deferreds\"\n );\n\n return Object.entries(this.data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: unwrapTrackedPromise(value),\n }),\n {}\n );\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n return (\n value instanceof Promise && (value as TrackedPromise)._tracked === true\n );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n\nexport type DeferFunction = (\n data: Record,\n init?: number | ResponseInit\n) => DeferredData;\n\nexport const defer: DeferFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n url: string,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n\nexport type ErrorResponse = {\n status: number;\n statusText: string;\n data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n status: number;\n statusText: string;\n data: any;\n private error?: Error;\n private internal: boolean;\n\n constructor(\n status: number,\n statusText: string | undefined,\n data: any,\n internal = false\n ) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n return (\n error != null &&\n typeof error.status === \"number\" &&\n typeof error.statusText === \"string\" &&\n typeof error.internal === \"boolean\" &&\n \"data\" in error\n );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n Action as HistoryAction,\n createLocation,\n createPath,\n invariant,\n parsePath,\n warning,\n} from \"./history\";\nimport type {\n AgnosticDataRouteMatch,\n AgnosticDataRouteObject,\n DataStrategyMatch,\n AgnosticRouteObject,\n DataResult,\n DataStrategyFunction,\n DataStrategyFunctionArgs,\n DeferredData,\n DeferredResult,\n DetectErrorBoundaryFunction,\n ErrorResult,\n FormEncType,\n FormMethod,\n HTMLFormMethod,\n HandlerResult,\n ImmutableRouteKey,\n MapRoutePropertiesFunction,\n MutationFormMethod,\n RedirectResult,\n RouteData,\n RouteManifest,\n ShouldRevalidateFunctionArgs,\n Submission,\n SuccessResult,\n UIMatch,\n V7_FormMethod,\n V7_MutationFormMethod,\n} from \"./utils\";\nimport {\n ErrorResponseImpl,\n ResultType,\n convertRouteMatchToUiMatch,\n convertRoutesToDataRoutes,\n getPathContributingMatches,\n getResolveToMatches,\n immutableRouteKeys,\n isRouteErrorResponse,\n joinPaths,\n matchRoutes,\n resolveTo,\n stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the basename for the router\n */\n get basename(): RouterInit[\"basename\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the future config for the router\n */\n get future(): FutureConfig;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the current state of the router\n */\n get state(): RouterState;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the routes for this router instance\n */\n get routes(): AgnosticDataRouteObject[];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the window associated with the router\n */\n get window(): RouterInit[\"window\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Initialize the router, including adding history listeners and kicking off\n * initial data fetches. Returns a function to cleanup listeners and abort\n * any in-progress loads\n */\n initialize(): Router;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Subscribe to router.state updates\n *\n * @param fn function to call with the new state\n */\n subscribe(fn: RouterSubscriber): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Enable scroll restoration behavior in the router\n *\n * @param savedScrollPositions Object that will manage positions, in case\n * it's being restored from sessionStorage\n * @param getScrollPosition Function to get the active Y scroll position\n * @param getKey Function to get the key to use for restoration\n */\n enableScrollRestoration(\n savedScrollPositions: Record,\n getScrollPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Navigate forward/backward in the history stack\n * @param to Delta to move in the history stack\n */\n navigate(to: number): Promise;\n\n /**\n * Navigate to the given path\n * @param to Path to navigate to\n * @param opts Navigation options (method, submission, etc.)\n */\n navigate(to: To | null, opts?: RouterNavigateOptions): Promise;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a fetcher load/submission\n *\n * @param key Fetcher key\n * @param routeId Route that owns the fetcher\n * @param href href to fetch\n * @param opts Fetcher options, (method, submission, etc.)\n */\n fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a revalidation of all current route loaders and fetcher loads\n */\n revalidate(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to create an href for the given location\n * @param location\n */\n createHref(location: Location | URL): string;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to URL encode a destination path according to the internal\n * history implementation\n * @param to\n */\n encodeLocation(to: To): Path;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get/create a fetcher for the given key\n * @param key\n */\n getFetcher(key: string): Fetcher;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete the fetcher for a given key\n * @param key\n */\n deleteFetcher(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Cleanup listeners and abort any in-progress loads\n */\n dispose(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get a navigation blocker\n * @param key The identifier for the blocker\n * @param fn The blocker function implementation\n */\n getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete a navigation blocker\n * @param key The identifier for the blocker\n */\n deleteBlocker(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * HMR needs to pass in-flight route updates to React Router\n * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n */\n _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal fetch AbortControllers accessed by unit tests\n */\n _internalFetchControllers: Map;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal pending DeferredData instances accessed by unit tests\n */\n _internalActiveDeferreds: Map;\n}\n\n/**\n * State maintained internally by the router. During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n /**\n * The action of the most recent navigation\n */\n historyAction: HistoryAction;\n\n /**\n * The current location reflected by the router\n */\n location: Location;\n\n /**\n * The current set of route matches\n */\n matches: AgnosticDataRouteMatch[];\n\n /**\n * Tracks whether we've completed our initial data load\n */\n initialized: boolean;\n\n /**\n * Current scroll position we should start at for a new view\n * - number -> scroll position to restore to\n * - false -> do not restore scroll at all (used during submissions)\n * - null -> don't have a saved position, scroll to hash or top of page\n */\n restoreScrollPosition: number | false | null;\n\n /**\n * Indicate whether this navigation should skip resetting the scroll position\n * if we are unable to restore the scroll position\n */\n preventScrollReset: boolean;\n\n /**\n * Tracks the state of the current navigation\n */\n navigation: Navigation;\n\n /**\n * Tracks any in-progress revalidations\n */\n revalidation: RevalidationState;\n\n /**\n * Data from the loaders for the current matches\n */\n loaderData: RouteData;\n\n /**\n * Data from the action for the current matches\n */\n actionData: RouteData | null;\n\n /**\n * Errors caught from loaders for the current matches\n */\n errors: RouteData | null;\n\n /**\n * Map of current fetchers\n */\n fetchers: Map;\n\n /**\n * Map of current blockers\n */\n blockers: Map;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n Pick\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n v7_fetcherPersist: boolean;\n v7_normalizeFormMethod: boolean;\n v7_partialHydration: boolean;\n v7_prependBasename: boolean;\n v7_relativeSplatPath: boolean;\n unstable_skipActionErrorRevalidation: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n routes: AgnosticRouteObject[];\n history: History;\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n hydrationData?: HydrationState;\n window?: Window;\n unstable_dataStrategy?: DataStrategyFunction;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n basename: Router[\"basename\"];\n location: RouterState[\"location\"];\n matches: RouterState[\"matches\"];\n loaderData: RouterState[\"loaderData\"];\n actionData: RouterState[\"actionData\"];\n errors: RouterState[\"errors\"];\n statusCode: number;\n loaderHeaders: Record;\n actionHeaders: Record;\n activeDeferreds: Record | null;\n _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n dataRoutes: AgnosticDataRouteObject[];\n query(\n request: Request,\n opts?: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n unstable_dataStrategy?: DataStrategyFunction;\n }\n ): Promise;\n queryRoute(\n request: Request,\n opts?: { routeId?: string; requestContext?: unknown }\n ): Promise;\n}\n\ntype ViewTransitionOpts = {\n currentLocation: Location;\n nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n (\n state: RouterState,\n opts: {\n deletedFetchers: string[];\n unstable_viewTransitionOpts?: ViewTransitionOpts;\n unstable_flushSync: boolean;\n }\n ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n unstable_flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n replace?: boolean;\n state?: any;\n fromRouteId?: string;\n unstable_viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n formMethod?: HTMLFormMethod;\n formEncType?: FormEncType;\n} & (\n | { formData: FormData; body?: undefined }\n | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n | LinkNavigateOptions\n | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n Idle: {\n state: \"idle\";\n location: undefined;\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n formData: undefined;\n json: undefined;\n text: undefined;\n };\n Loading: {\n state: \"loading\";\n location: Location;\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n text: Submission[\"text\"] | undefined;\n };\n Submitting: {\n state: \"submitting\";\n location: Location;\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n text: Submission[\"text\"];\n };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates = {\n Idle: {\n state: \"idle\";\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n text: undefined;\n formData: undefined;\n json: undefined;\n data: TData | undefined;\n };\n Loading: {\n state: \"loading\";\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n text: Submission[\"text\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n data: TData | undefined;\n };\n Submitting: {\n state: \"submitting\";\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n text: Submission[\"text\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n data: TData | undefined;\n };\n};\n\nexport type Fetcher =\n FetcherStates[keyof FetcherStates];\n\ninterface BlockerBlocked {\n state: \"blocked\";\n reset(): void;\n proceed(): void;\n location: Location;\n}\n\ninterface BlockerUnblocked {\n state: \"unblocked\";\n reset: undefined;\n proceed: undefined;\n location: undefined;\n}\n\ninterface BlockerProceeding {\n state: \"proceeding\";\n reset: undefined;\n proceed: undefined;\n location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n /**\n * startNavigation does not need to complete the navigation because we\n * redirected or got interrupted\n */\n shortCircuited?: boolean;\n}\n\ntype PendingActionResult = [string, SuccessResult | ErrorResult];\n\ninterface HandleActionResult extends ShortCircuitable {\n /**\n * Tuple for the returned or thrown value from the current action. The routeId\n * is the action route for success and the bubbled boundary route for errors.\n */\n pendingActionResult?: PendingActionResult;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n /**\n * loaderData returned from the current set of loaders\n */\n loaderData?: RouterState[\"loaderData\"];\n /**\n * errors thrown from the current set of loaders\n */\n errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n routeId: string;\n path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n key: string;\n match: AgnosticDataRouteMatch | null;\n matches: AgnosticDataRouteMatch[] | null;\n controller: AbortController | null;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n];\nconst validMutationMethods = new Set(\n validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n \"get\",\n ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n const routerWindow = init.window\n ? init.window\n : typeof window !== \"undefined\"\n ? window\n : undefined;\n const isBrowser =\n typeof routerWindow !== \"undefined\" &&\n typeof routerWindow.document !== \"undefined\" &&\n typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n // Routes keyed by ID\n let manifest: RouteManifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n let basename = init.basename || \"/\";\n let dataStrategyImpl = init.unstable_dataStrategy || defaultDataStrategy;\n // Config driven behavior flags\n let future: FutureConfig = {\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_partialHydration: false,\n v7_prependBasename: false,\n v7_relativeSplatPath: false,\n unstable_skipActionErrorRevalidation: false,\n ...init.future,\n };\n // Cleanup function for history\n let unlistenHistory: (() => void) | null = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions: Record | null = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition: GetScrollPositionFunction | null = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialErrors: RouteData | null = null;\n\n if (initialMatches == null) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname,\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n }\n\n let initialized: boolean;\n let hasLazyRoutes = initialMatches.some((m) => m.route.lazy);\n let hasLoaders = initialMatches.some((m) => m.route.loader);\n if (hasLazyRoutes) {\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n initialized = false;\n } else if (!hasLoaders) {\n // If we've got no loaders to run, then we're good to go\n initialized = true;\n } else if (future.v7_partialHydration) {\n // If partial hydration is enabled, we're initialized so long as we were\n // provided with hydrationData for every route with a loader, and no loaders\n // were marked for explicit hydration\n let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n let errors = init.hydrationData ? init.hydrationData.errors : null;\n let isRouteInitialized = (m: AgnosticDataRouteMatch) => {\n // No loader, nothing to initialize\n if (!m.route.loader) {\n return true;\n }\n // Explicitly opting-in to running on hydration\n if (\n typeof m.route.loader === \"function\" &&\n m.route.loader.hydrate === true\n ) {\n return false;\n }\n // Otherwise, initialized if hydrated with data or an error\n return (\n (loaderData && loaderData[m.route.id] !== undefined) ||\n (errors && errors[m.route.id] !== undefined)\n );\n };\n\n // If errors exist, don't consider routes below the boundary\n if (errors) {\n let idx = initialMatches.findIndex(\n (m) => errors![m.route.id] !== undefined\n );\n initialized = initialMatches.slice(0, idx + 1).every(isRouteInitialized);\n } else {\n initialized = initialMatches.every(isRouteInitialized);\n }\n } else {\n // Without partial hydration - we're initialized if we were provided any\n // hydrationData - which is expected to be complete\n initialized = init.hydrationData != null;\n }\n\n let router: Router;\n let state: RouterState = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n fetchers: new Map(),\n blockers: new Map(),\n };\n\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction: HistoryAction = HistoryAction.Pop;\n\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n\n // AbortController for the active navigation\n let pendingNavigationController: AbortController | null;\n\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions: Map> = new Map<\n string,\n Set\n >();\n\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener: (() => void) | null = null;\n\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes: string[] = [];\n\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads: string[] = [];\n\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n\n // Ref-count mounted fetchers so we know when it's ok to clean them up\n let activeFetchers = new Map();\n\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they'll be officially removed after they return to idle\n let deletedFetchers = new Set();\n\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map();\n\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let ignoreNextHistoryUpdate = false;\n\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (ignoreNextHistoryUpdate) {\n ignoreNextHistoryUpdate = false;\n return;\n }\n\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location \" +\n \"that was not created by @remix-run/router. This will fail silently in \" +\n \"production. This can happen if you are navigating outside the router \" +\n \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n \"router navigation APIs. This can also happen if you are using \" +\n \"createHashRouter and the user manually changes the URL.\"\n );\n\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction,\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n ignoreNextHistoryUpdate = true;\n init.history.go(delta * -1);\n\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location,\n });\n // Re-do the same POP navigation we just blocked\n init.history.go(delta);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }\n );\n\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () =>\n persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () =>\n routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(HistoryAction.Pop, state.location, {\n initialHydration: true,\n });\n }\n\n return router;\n }\n\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n\n // Subscribe to state updates for the router\n function subscribe(fn: RouterSubscriber) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n // Update our state and notify the calling context of the change\n function updateState(\n newState: Partial,\n opts: {\n flushSync?: boolean;\n viewTransitionOpts?: ViewTransitionOpts;\n } = {}\n ): void {\n state = {\n ...state,\n ...newState,\n };\n\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers: string[] = [];\n let deletedFetchersKeys: string[] = [];\n\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don't get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach((subscriber) =>\n subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n unstable_viewTransitionOpts: opts.viewTransitionOpts,\n unstable_flushSync: opts.flushSync === true,\n })\n );\n\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach((key) => state.fetchers.delete(key));\n deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n }\n }\n\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(\n location: Location,\n newState: Partial>,\n { flushSync }: { flushSync?: boolean } = {}\n ): void {\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload =\n state.actionData != null &&\n state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n state.navigation.state === \"loading\" &&\n location.state?._isRedirect !== true;\n\n let actionData: RouteData | null;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData\n ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n )\n : state.loaderData;\n\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset =\n pendingPreventScrollReset === true ||\n (state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n location.state?._isRedirect !== true);\n\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n if (isUninterruptedRevalidation) {\n // If this was an uninterrupted revalidation then do not touch history\n } else if (pendingAction === HistoryAction.Pop) {\n // Do nothing for POP - URL has already been updated\n } else if (pendingAction === HistoryAction.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === HistoryAction.Replace) {\n init.history.replace(location, location.state);\n }\n\n let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === HistoryAction.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don't have a previous forward nav, assume we're popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location,\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n }\n\n updateState(\n {\n ...newState, // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(\n location,\n newState.matches || state.matches\n ),\n preventScrollReset,\n blockers,\n },\n {\n viewTransitionOpts,\n flushSync: flushSync === true,\n }\n );\n\n // Reset stateful navigation vars\n pendingAction = HistoryAction.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n cancelledFetcherLoads = [];\n }\n\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(\n to: number | To | null,\n opts?: RouterNavigateOptions\n ): Promise {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n to,\n future.v7_relativeSplatPath,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n false,\n normalizedPath,\n opts\n );\n\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation),\n };\n\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n let historyAction = HistoryAction.Push;\n\n if (userReplace === true) {\n historyAction = HistoryAction.Replace;\n } else if (userReplace === false) {\n // no-op\n } else if (\n submission != null &&\n isMutationMethod(submission.formMethod) &&\n submission.formAction === state.location.pathname + state.location.search\n ) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = HistoryAction.Replace;\n }\n\n let preventScrollReset =\n opts && \"preventScrollReset\" in opts\n ? opts.preventScrollReset === true\n : undefined;\n\n let flushSync = (opts && opts.unstable_flushSync) === true;\n\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation,\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.unstable_viewTransition,\n flushSync,\n });\n }\n\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true,\n });\n return;\n }\n\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n { overrideNavigation: state.navigation }\n );\n }\n\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(\n historyAction: HistoryAction,\n location: Location,\n opts?: {\n initialHydration?: boolean;\n submission?: Submission;\n fetcherSubmission?: Submission;\n overrideNavigation?: Navigation;\n pendingError?: ErrorResponseImpl;\n startUninterruptedRevalidation?: boolean;\n preventScrollReset?: boolean;\n replace?: boolean;\n enableViewTransition?: boolean;\n flushSync?: boolean;\n }\n ): Promise {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation =\n (opts && opts.startUninterruptedRevalidation) === true;\n\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(routesToUse);\n // Cancel all pending deferred on 404s since we don't keep any routes\n cancelActiveDeferreds();\n completeNavigation(\n location,\n {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n },\n { flushSync }\n );\n return;\n }\n\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial load will always\n // be \"same hash\". For example, on /page#hash and submit a \n // which will default to a navigation to /page\n if (\n state.initialized &&\n !isRevalidationRequired &&\n isHashChangeOnly(state.location, location) &&\n !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n ) {\n completeNavigation(location, { matches }, { flushSync });\n return;\n }\n\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let pendingActionResult: PendingActionResult | undefined;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingActionResult = [\n findNearestBoundary(matches).route.id,\n { type: ResultType.error, error: opts.pendingError },\n ];\n } else if (\n opts &&\n opts.submission &&\n isMutationMethod(opts.submission.formMethod)\n ) {\n // Call action if we received an action submission\n let actionResult = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n { replace: opts.replace, flushSync }\n );\n\n if (actionResult.shortCircuited) {\n return;\n }\n\n pendingActionResult = actionResult.pendingActionResult;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n flushSync = false;\n\n // Create a GET request for the loaders\n request = createClientSideRequest(\n init.history,\n request.url,\n request.signal\n );\n }\n\n // Call loaders\n let { shortCircuited, loaderData, errors } = await handleLoaders(\n request,\n location,\n matches,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n opts && opts.initialHydration === true,\n flushSync,\n pendingActionResult\n );\n\n if (shortCircuited) {\n return;\n }\n\n // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches,\n ...getActionDataForCommit(pendingActionResult),\n loaderData,\n errors,\n });\n }\n\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(\n request: Request,\n location: Location,\n submission: Submission,\n matches: AgnosticDataRouteMatch[],\n opts: { replace?: boolean; flushSync?: boolean } = {}\n ): Promise {\n interruptActiveLoads();\n\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n // Call our action and get the result\n let result: DataResult;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id,\n }),\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n request,\n [actionMatch],\n matches\n );\n result = results[0];\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace: boolean;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n let location = normalizeRedirectLocation(\n result.response.headers.get(\"Location\")!,\n new URL(request.url),\n basename\n );\n replace = location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(request, result, {\n submission,\n replace,\n });\n return { shortCircuited: true };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n // By default, all submissions are REPLACE navigations, but if the\n // action threw an error that'll be rendered in an errorElement, we fall\n // back to PUSH so that the user can use the back button to get back to\n // the pre-submission form location to try again\n if ((opts && opts.replace) !== true) {\n pendingAction = HistoryAction.Push;\n }\n\n return {\n pendingActionResult: [boundaryMatch.route.id, result],\n };\n }\n\n return {\n pendingActionResult: [actionMatch.route.id, result],\n };\n }\n\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n overrideNavigation?: Navigation,\n submission?: Submission,\n fetcherSubmission?: Submission,\n replace?: boolean,\n initialHydration?: boolean,\n flushSync?: boolean,\n pendingActionResult?: PendingActionResult\n ): Promise {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation =\n overrideNavigation || getLoadingNavigation(location, submission);\n\n // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n let activeSubmission =\n submission ||\n fetcherSubmission ||\n getSubmissionFromNavigation(loadingNavigation);\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n future.v7_partialHydration && initialHydration === true,\n future.unstable_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n pendingActionResult\n );\n\n // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(\n (routeId) =>\n !(matches && matches.some((m) => m.route.id === routeId)) ||\n (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n );\n\n pendingNavigationLoadId = ++incrementingLoadId;\n\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(\n location,\n {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? { [pendingActionResult[0]]: pendingActionResult[1].error }\n : null,\n ...getActionDataForCommit(pendingActionResult),\n ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n },\n { flushSync }\n );\n return { shortCircuited: true };\n }\n\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n // If we have partialHydration enabled, then don't update the state for the\n // initial data load since it's not a \"navigation\"\n if (\n !isUninterruptedRevalidation &&\n (!future.v7_partialHydration || !initialHydration)\n ) {\n revalidatingFetchers.forEach((rf) => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n fetcher ? fetcher.data : undefined\n );\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n\n let actionData: Record | null | undefined;\n if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n // This is cast to `any` currently because `RouteData`uses any and it\n // would be a breaking change to use any.\n // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n actionData = {\n [pendingActionResult[0]]: pendingActionResult[1].data as any,\n };\n } else if (state.actionData) {\n if (Object.keys(state.actionData).length === 0) {\n actionData = null;\n } else {\n actionData = state.actionData;\n }\n }\n\n updateState(\n {\n navigation: loadingNavigation,\n ...(actionData !== undefined ? { actionData } : {}),\n ...(revalidatingFetchers.length > 0\n ? { fetchers: new Map(state.fetchers) }\n : {}),\n },\n {\n flushSync,\n }\n );\n }\n\n revalidatingFetchers.forEach((rf) => {\n if (fetchControllers.has(rf.key)) {\n abortFetcher(rf.key);\n }\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state.matches,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n request\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n\n // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect([...loaderResults, ...fetcherResults]);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n let fetcherKey =\n revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n await startRedirectNavigation(request, redirect.result, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n matchesToLoad,\n loaderResults,\n pendingActionResult,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe((aborted) => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n\n // During partial hydration, preserve SSR errors for routes that don't re-run\n if (future.v7_partialHydration && initialHydration && state.errors) {\n Object.entries(state.errors)\n .filter(([id]) => !matchesToLoad.some((m) => m.route.id === id))\n .forEach(([routeId, error]) => {\n errors = Object.assign(errors || {}, { [routeId]: error });\n });\n }\n\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers =\n updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n return {\n loaderData,\n errors,\n ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n };\n }\n\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ) {\n if (isServer) {\n throw new Error(\n \"router.fetch() was called during the server render, but it shouldn't be. \" +\n \"You are likely calling a useFetcher() method in the body of your component. \" +\n \"Try moving it to a useEffect or a callback.\"\n );\n }\n\n if (fetchControllers.has(key)) abortFetcher(key);\n let flushSync = (opts && opts.unstable_flushSync) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n href,\n future.v7_relativeSplatPath,\n routeId,\n opts?.relative\n );\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath }),\n { flushSync }\n );\n return;\n }\n\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n true,\n normalizedPath,\n opts\n );\n\n if (error) {\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n let match = getTargetMatch(matches, path);\n\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(\n key,\n routeId,\n path,\n match,\n matches,\n flushSync,\n submission\n );\n return;\n }\n\n // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, { routeId, path });\n handleFetcherLoader(\n key,\n routeId,\n path,\n match,\n matches,\n flushSync,\n submission\n );\n }\n\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n requestMatches: AgnosticDataRouteMatch[],\n flushSync: boolean,\n submission: Submission\n ) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n if (!match.route.action && !match.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId,\n });\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n // Put this fetcher into it's submitting state\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync,\n });\n\n // Call the action for the fetcher\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let actionResults = await callDataStrategy(\n \"action\",\n fetchRequest,\n [match],\n requestMatches\n );\n let actionResult = actionResults[0];\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n\n // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n // or redirects processed for unmounted fetchers so we just revert them to\n // idle\n if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n // Let SuccessResult's fall through for revalidation\n } else {\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(fetchRequest, actionResult, {\n fetcherSubmission: submission,\n });\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches =\n state.navigation.state !== \"idle\"\n ? matchRoutes(routesToUse, state.navigation.location, basename)\n : state.matches;\n\n invariant(matches, \"Didn't find any matches after fetcher action\");\n\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n false,\n future.unstable_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n [match.route.id, actionResult]\n );\n\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n revalidatingFetchers\n .filter((rf) => rf.key !== key)\n .forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(staleKey, revalidatingFetcher);\n if (fetchControllers.has(staleKey)) {\n abortFetcher(staleKey);\n }\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n\n updateState({ fetchers: new Map(state.fetchers) });\n\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state.matches,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n revalidationRequest\n );\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n let redirect = findRedirect([...loaderResults, ...fetcherResults]);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n let fetcherKey =\n revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n return startRedirectNavigation(revalidationRequest, redirect.result);\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n state.matches,\n matchesToLoad,\n loaderResults,\n undefined,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn't been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n\n abortStaleFetchLoads(loadId);\n\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (\n state.navigation.state === \"loading\" &&\n loadId > pendingNavigationLoadId\n ) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers),\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n fetchers: new Map(state.fetchers),\n });\n isRevalidationRequired = false;\n }\n }\n\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n flushSync: boolean,\n submission?: Submission\n ) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(\n key,\n getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : undefined\n ),\n { flushSync }\n );\n\n // Call the loader for this fetcher route match\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let results = await callDataStrategy(\n \"loader\",\n fetchRequest,\n [match],\n matches\n );\n let result = results[0];\n\n // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result =\n (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n result;\n }\n\n // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n }\n\n // We don't want errors bubbling up or redirects followed for unmounted\n // fetchers, so short circuit here if it was removed from the UI\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(fetchRequest, result);\n return;\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n // Put the fetcher back into an idle state\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(\n request: Request,\n redirect: RedirectResult,\n {\n submission,\n fetcherSubmission,\n replace,\n }: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n replace?: boolean;\n } = {}\n ) {\n if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n isRevalidationRequired = true;\n }\n\n let location = redirect.response.headers.get(\"Location\");\n invariant(location, \"Expected a Location header on the redirect Response\");\n location = normalizeRedirectLocation(\n location,\n new URL(request.url),\n basename\n );\n let redirectLocation = createLocation(state.location, location, {\n _isRedirect: true,\n });\n\n if (isBrowser) {\n let isDocumentReload = false;\n\n if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(location)) {\n const url = init.history.createURL(location);\n isDocumentReload =\n // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(location);\n } else {\n routerWindow.location.assign(location);\n }\n return;\n }\n }\n\n // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n\n let redirectHistoryAction =\n replace === true ? HistoryAction.Replace : HistoryAction.Push;\n\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let { formMethod, formAction, formEncType } = state.navigation;\n if (\n !submission &&\n !fetcherSubmission &&\n formMethod &&\n formAction &&\n formEncType\n ) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n let activeSubmission = submission || fetcherSubmission;\n if (\n redirectPreserveMethodStatusCodes.has(redirect.response.status) &&\n activeSubmission &&\n isMutationMethod(activeSubmission.formMethod)\n ) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: location,\n },\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n } else {\n // If we have a navigation submission, we will preserve it through the\n // redirect navigation\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n submission\n );\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n }\n }\n\n // Utility wrapper for calling dataStrategy client-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[]\n ): Promise {\n try {\n let results = await callDataStrategyImpl(\n dataStrategyImpl,\n type,\n request,\n matchesToLoad,\n matches,\n manifest,\n mapRouteProperties\n );\n\n return await Promise.all(\n results.map((result, i) => {\n if (isRedirectHandlerResult(result)) {\n let response = result.result as Response;\n return {\n type: ResultType.redirect,\n response: normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n matchesToLoad[i].route.id,\n matches,\n basename,\n future.v7_relativeSplatPath\n ),\n };\n }\n\n return convertHandlerResultToDataResult(result);\n })\n );\n } catch (e) {\n // If the outer dataStrategy method throws, just return the error for all\n // matches - and it'll naturally bubble to the root\n return matchesToLoad.map(() => ({\n type: ResultType.error,\n error: e,\n }));\n }\n }\n\n async function callLoadersAndMaybeResolveData(\n currentMatches: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n fetchersToLoad: RevalidatingFetcher[],\n request: Request\n ) {\n let [loaderResults, ...fetcherResults] = await Promise.all([\n matchesToLoad.length\n ? callDataStrategy(\"loader\", request, matchesToLoad, matches)\n : [],\n ...fetchersToLoad.map((f) => {\n if (f.matches && f.match && f.controller) {\n let fetcherRequest = createClientSideRequest(\n init.history,\n f.path,\n f.controller.signal\n );\n return callDataStrategy(\n \"loader\",\n fetcherRequest,\n [f.match],\n f.matches\n ).then((r) => r[0]);\n } else {\n return Promise.resolve({\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path,\n }),\n });\n }\n }),\n ]);\n\n await Promise.all([\n resolveDeferredResults(\n currentMatches,\n matchesToLoad,\n loaderResults,\n loaderResults.map(() => request.signal),\n false,\n state.loaderData\n ),\n resolveDeferredResults(\n currentMatches,\n fetchersToLoad.map((f) => f.match),\n fetcherResults,\n fetchersToLoad.map((f) => (f.controller ? f.controller.signal : null)),\n true\n ),\n ]);\n\n return {\n loaderResults,\n fetcherResults,\n };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.push(key);\n abortFetcher(key);\n }\n });\n }\n\n function updateFetcherState(\n key: string,\n fetcher: Fetcher,\n opts: { flushSync?: boolean } = {}\n ) {\n state.fetchers.set(key, fetcher);\n updateState(\n { fetchers: new Map(state.fetchers) },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function setFetcherError(\n key: string,\n routeId: string,\n error: any,\n opts: { flushSync?: boolean } = {}\n ) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState(\n {\n errors: {\n [boundaryMatch.route.id]: error,\n },\n fetchers: new Map(state.fetchers),\n },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function getFetcher(key: string): Fetcher {\n if (future.v7_fetcherPersist) {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n // If this fetcher was previously marked for deletion, unmark it since we\n // have a new instance\n if (deletedFetchers.has(key)) {\n deletedFetchers.delete(key);\n }\n }\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n\n function deleteFetcher(key: string): void {\n let fetcher = state.fetchers.get(key);\n // Don't abort the controller if this is a deletion of a fetcher.submit()\n // in it's loading phase since - we don't want to abort the corresponding\n // revalidation and want them to complete and land\n if (\n fetchControllers.has(key) &&\n !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n ) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n deletedFetchers.delete(key);\n state.fetchers.delete(key);\n }\n\n function deleteFetcherAndUpdateState(key: string): void {\n if (future.v7_fetcherPersist) {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n deletedFetchers.add(key);\n } else {\n activeFetchers.set(key, count);\n }\n } else {\n deleteFetcher(key);\n }\n updateState({ fetchers: new Map(state.fetchers) });\n }\n\n function abortFetcher(key: string) {\n let controller = fetchControllers.get(key);\n invariant(controller, `Expected fetch controller: ${key}`);\n controller.abort();\n fetchControllers.delete(key);\n }\n\n function markFetchersDone(keys: string[]) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone(): boolean {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId: number): boolean {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key: string, fn: BlockerFunction) {\n let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key: string) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key: string, newBlocker: Blocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n invariant(\n (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n }: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n }): string | undefined {\n if (blockerFunctions.size === 0) {\n return;\n }\n\n // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n }\n\n // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n\n function cancelActiveDeferreds(\n predicate?: (routeId: string) => boolean\n ): string[] {\n let cancelledRouteIds: string[] = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the component\n function enableScrollRestoration(\n positions: Record,\n getPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered \n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(\n location,\n matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n\n function saveScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): void {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): number | null {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n\n function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties,\n undefined,\n manifest\n );\n }\n\n router = {\n get basename() {\n return basename;\n },\n get future() {\n return future;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to: To) => init.history.createHref(to),\n encodeLocation: (to: To) => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher: deleteFetcherAndUpdateState,\n dispose,\n getBlocker,\n deleteBlocker,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n };\n\n return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface StaticHandlerFutureConfig {\n v7_relativeSplatPath: boolean;\n v7_throwAbortReason: boolean;\n}\n\nexport interface CreateStaticHandlerOptions {\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n}\n\nexport function createStaticHandler(\n routes: AgnosticRouteObject[],\n opts?: CreateStaticHandlerOptions\n): StaticHandler {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n\n let manifest: RouteManifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (opts?.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts?.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n // Config driven behavior flags\n let future: StaticHandlerFutureConfig = {\n v7_relativeSplatPath: false,\n v7_throwAbortReason: false,\n ...(opts ? opts.future : null),\n };\n\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n *\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n * the bubbling of errors which allows single-fetch-type implementations\n * where the client will handle the bubbling and we may need to return data\n * for the handling route\n */\n async function query(\n request: Request,\n {\n requestContext,\n skipLoaderErrorBubbling,\n unstable_dataStrategy,\n }: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n unstable_dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n unstable_dataStrategy || null,\n skipLoaderErrorBubbling === true,\n null\n );\n if (isResponse(result)) {\n return result;\n }\n\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return { location, basename, ...result };\n }\n\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n *\n * - `opts.routeId` allows you to specify the specific route handler to call.\n * If not provided the handler will determine the proper route by matching\n * against `request.url`\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n */\n async function queryRoute(\n request: Request,\n {\n routeId,\n requestContext,\n }: { requestContext?: unknown; routeId?: string } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let match = routeId\n ? matches.find((m) => m.route.id === routeId)\n : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId,\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n null,\n false,\n match\n );\n\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n }\n\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n let data = Object.values(result.loaderData)[0];\n if (result.activeDeferreds?.[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n unstable_dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null\n ): Promise | Response> {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(\n request,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n unstable_dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch != null\n );\n return result;\n }\n\n let result = await loadRouteData(\n request,\n matches,\n requestContext,\n unstable_dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch\n );\n return isResponse(result)\n ? result\n : {\n ...result,\n actionData: null,\n actionHeaders: {},\n };\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction for a\n // `queryRoute` call, we throw the `HandlerResult` to bail out early\n // and then return or throw the raw Response here accordingly\n if (isHandlerResult(e) && isResponse(e.result)) {\n if (e.type === ResultType.error) {\n throw e.result;\n }\n return e.result;\n }\n // Redirects are always returned since they don't propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n\n async function submit(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n actionMatch: AgnosticDataRouteMatch,\n requestContext: unknown,\n unstable_dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n isRouteRequest: boolean\n ): Promise | Response> {\n let result: DataResult;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id,\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n request,\n [actionMatch],\n matches,\n isRouteRequest,\n requestContext,\n unstable_dataStrategy\n );\n result = results[0];\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.response.status,\n headers: {\n Location: result.response.headers.get(\"Location\")!,\n },\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, { type: \"defer-action\" });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal,\n });\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = skipLoaderErrorBubbling\n ? actionMatch\n : findNearestBoundary(matches, actionMatch.route.id);\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n unstable_dataStrategy,\n skipLoaderErrorBubbling,\n null,\n [boundaryMatch.route.id, result]\n );\n\n // action status codes take precedence over loader status codes\n return {\n ...context,\n statusCode: isRouteErrorResponse(result.error)\n ? result.error.status\n : result.statusCode != null\n ? result.statusCode\n : 500,\n actionData: null,\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n unstable_dataStrategy,\n skipLoaderErrorBubbling,\n null\n );\n\n return {\n ...context,\n actionData: {\n [actionMatch.route.id]: result.data,\n },\n // action status codes take precedence over loader status codes\n ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n actionHeaders: result.headers\n ? { [actionMatch.route.id]: result.headers }\n : {},\n };\n }\n\n async function loadRouteData(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n unstable_dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null,\n pendingActionResult?: PendingActionResult\n ): Promise<\n | Omit<\n StaticHandlerContext,\n \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n >\n | Response\n > {\n let isRouteRequest = routeMatch != null;\n\n // Short circuit if we have no loaders to run (queryRoute())\n if (\n isRouteRequest &&\n !routeMatch?.route.loader &&\n !routeMatch?.route.lazy\n ) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id,\n });\n }\n\n let requestMatches = routeMatch\n ? [routeMatch]\n : pendingActionResult && isErrorResult(pendingActionResult[1])\n ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0])\n : matches;\n let matchesToLoad = requestMatches.filter(\n (m) => m.route.loader || m.route.lazy\n );\n\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce(\n (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n {}\n ),\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? {\n [pendingActionResult[0]]: pendingActionResult[1].error,\n }\n : null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let results = await callDataStrategy(\n \"loader\",\n request,\n matchesToLoad,\n matches,\n isRouteRequest,\n requestContext,\n unstable_dataStrategy\n );\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n\n // Process and commit output from loaders\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(\n matches,\n matchesToLoad,\n results,\n pendingActionResult,\n activeDeferreds,\n skipLoaderErrorBubbling\n );\n\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set(\n matchesToLoad.map((match) => match.route.id)\n );\n matches.forEach((match) => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n\n return {\n ...context,\n matches,\n activeDeferreds:\n activeDeferreds.size > 0\n ? Object.fromEntries(activeDeferreds.entries())\n : null,\n };\n }\n\n // Utility wrapper for calling dataStrategy server-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n isRouteRequest: boolean,\n requestContext: unknown,\n unstable_dataStrategy: DataStrategyFunction | null\n ): Promise {\n let results = await callDataStrategyImpl(\n unstable_dataStrategy || defaultDataStrategy,\n type,\n request,\n matchesToLoad,\n matches,\n manifest,\n mapRouteProperties,\n requestContext\n );\n\n return await Promise.all(\n results.map((result, i) => {\n if (isRedirectHandlerResult(result)) {\n let response = result.result as Response;\n // Throw redirects and let the server handle them with an HTTP redirect\n throw normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n matchesToLoad[i].route.id,\n matches,\n basename,\n future.v7_relativeSplatPath\n );\n }\n if (isResponse(result.result) && isRouteRequest) {\n // For SSR single-route requests, we want to hand Responses back\n // directly without unwrapping\n throw result;\n }\n\n return convertHandlerResultToDataResult(result);\n })\n );\n }\n\n return {\n dataRoutes,\n query,\n queryRoute,\n };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n routes: AgnosticDataRouteObject[],\n context: StaticHandlerContext,\n error: any\n) {\n let newContext: StaticHandlerContext = {\n ...context,\n statusCode: isRouteErrorResponse(error) ? error.status : 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error,\n },\n };\n return newContext;\n}\n\nfunction throwStaticHandlerAbortedError(\n request: Request,\n isRouteRequest: boolean,\n future: StaticHandlerFutureConfig\n) {\n if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n throw request.signal.reason;\n }\n\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(`${method}() call aborted: ${request.method} ${request.url}`);\n}\n\nfunction isSubmissionNavigation(\n opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n return (\n opts != null &&\n ((\"formData\" in opts && opts.formData != null) ||\n (\"body\" in opts && opts.body !== undefined))\n );\n}\n\nfunction normalizeTo(\n location: Path,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n prependBasename: boolean,\n to: To | null,\n v7_relativeSplatPath: boolean,\n fromRouteId?: string,\n relative?: RelativeRoutingType\n) {\n let contextualMatches: AgnosticDataRouteMatch[];\n let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n if (fromRouteId) {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n\n // Resolve the relative path\n let path = resolveTo(\n to ? to : \".\",\n getResolveToMatches(contextualMatches, v7_relativeSplatPath),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n\n // Add an ?index param for matched index routes if we don't already have one\n if (\n (to == null || to === \"\" || to === \".\") &&\n activeRouteMatch &&\n activeRouteMatch.route.index &&\n !hasNakedIndexQuery(path.search)\n ) {\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n }\n\n // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n normalizeFormMethod: boolean,\n isFetcher: boolean,\n path: string,\n opts?: BaseNavigateOrFetchOptions\n): {\n path: string;\n submission?: Submission;\n error?: ErrorResponseImpl;\n} {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod }),\n };\n }\n\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" }),\n });\n\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = normalizeFormMethod\n ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n : (rawFormMethod.toLowerCase() as FormMethod);\n let formAction = stripHashFromPath(path);\n\n if (opts.body !== undefined) {\n if (opts.formEncType === \"text/plain\") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n let text =\n typeof opts.body === \"string\"\n ? opts.body\n : opts.body instanceof FormData ||\n opts.body instanceof URLSearchParams\n ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n \"\"\n )\n : String(opts.body);\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text,\n },\n };\n } else if (opts.formEncType === \"application/json\") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n try {\n let json =\n typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined,\n },\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n\n let searchParams: URLSearchParams;\n let formData: FormData;\n\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n\n let submission: Submission = {\n formMethod,\n formAction,\n formEncType:\n (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n formData,\n json: undefined,\n text: undefined,\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n\n return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n matches: AgnosticDataRouteMatch[],\n boundaryId: string\n) {\n let boundaryMatches = matches;\n if (boundaryId) {\n let index = matches.findIndex((m) => m.route.id === boundaryId);\n if (index >= 0) {\n boundaryMatches = matches.slice(0, index);\n }\n }\n return boundaryMatches;\n}\n\nfunction getMatchesToLoad(\n history: History,\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n submission: Submission | undefined,\n location: Location,\n isInitialLoad: boolean,\n skipActionErrorRevalidation: boolean,\n isRevalidationRequired: boolean,\n cancelledDeferredRoutes: string[],\n cancelledFetcherLoads: string[],\n deletedFetchers: Set,\n fetchLoadMatches: Map,\n fetchRedirectIds: Set,\n routesToUse: AgnosticDataRouteObject[],\n basename: string | undefined,\n pendingActionResult?: PendingActionResult\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n let actionResult = pendingActionResult\n ? isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : pendingActionResult[1].data\n : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryId =\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? pendingActionResult[0]\n : undefined;\n let boundaryMatches = boundaryId\n ? getLoaderMatchesUntilBoundary(matches, boundaryId)\n : matches;\n\n // Don't revalidate loaders by default after action 4xx/5xx responses\n // when the flag is enabled. They can still opt-into revalidation via\n // `shouldRevalidate` via `actionResult`\n let actionStatus = pendingActionResult\n ? pendingActionResult[1].statusCode\n : undefined;\n let shouldSkipRevalidation =\n skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n\n let navigationMatches = boundaryMatches.filter((match, index) => {\n let { route } = match;\n if (route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n\n if (route.loader == null) {\n return false;\n }\n\n if (isInitialLoad) {\n if (typeof route.loader !== \"function\" || route.loader.hydrate) {\n return true;\n }\n return (\n state.loaderData[route.id] === undefined &&\n // Don't re-run if the loader ran and threw an error\n (!state.errors || state.errors[route.id] === undefined)\n );\n }\n\n // Always call the loader on new route instances and pending defer cancellations\n if (\n isNewLoader(state.loaderData, state.matches[index], match) ||\n cancelledDeferredRoutes.some((id) => id === match.route.id)\n ) {\n return true;\n }\n\n // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n\n return shouldRevalidateLoader(match, {\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params,\n ...submission,\n actionResult,\n unstable_actionStatus: actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n currentUrl.pathname + currentUrl.search ===\n nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search ||\n isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n });\n });\n\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers: RevalidatingFetcher[] = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate:\n // - on initial load (shouldn't be any fetchers then anyway)\n // - if fetcher won't be present in the subsequent render\n // - no longer matches the URL (v7_fetcherPersist=false)\n // - was unmounted but persisted due to v7_fetcherPersist=true\n if (\n isInitialLoad ||\n !matches.some((m) => m.route.id === f.routeId) ||\n deletedFetchers.has(key)\n ) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null,\n });\n return;\n }\n\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.includes(key)) {\n // Always revalidate if the fetcher was cancelled\n shouldRevalidate = true;\n } else if (\n fetcher &&\n fetcher.state !== \"idle\" &&\n fetcher.data === undefined\n ) {\n // If the fetcher hasn't ever completed loading yet, then this isn't a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params,\n ...submission,\n actionResult,\n unstable_actionStatus: actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : isRevalidationRequired,\n });\n }\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController(),\n });\n }\n });\n\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction isNewLoader(\n currentLoaderData: RouteData,\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n\n // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n // Always load if this is a net-new route or we don't yet have data\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n (currentPath != null &&\n currentPath.endsWith(\"*\") &&\n currentMatch.params[\"*\"] !== match.params[\"*\"])\n );\n}\n\nfunction shouldRevalidateLoader(\n loaderMatch: AgnosticDataRouteMatch,\n arg: ShouldRevalidateFunctionArgs\n) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n route: AgnosticDataRouteObject,\n mapRouteProperties: MapRoutePropertiesFunction,\n manifest: RouteManifest\n) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy();\n\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n\n // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n let routeUpdates: Record = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue =\n routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n let isPropertyStaticallyDefined =\n staticRouteValue !== undefined &&\n // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n\n warning(\n !isPropertyStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n `defined but its lazy function is also returning a value for this property. ` +\n `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n\n if (\n !isPropertyStaticallyDefined &&\n !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n ) {\n routeUpdates[lazyRouteProperty] =\n lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n }\n }\n\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided\n // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n // the logic will differ between frameworks.\n ...mapRouteProperties(routeToUpdate),\n lazy: undefined,\n });\n}\n\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nfunction defaultDataStrategy(\n opts: DataStrategyFunctionArgs\n): ReturnType {\n return Promise.all(opts.matches.map((m) => m.resolve()));\n}\n\nasync function callDataStrategyImpl(\n dataStrategyImpl: DataStrategyFunction,\n type: \"loader\" | \"action\",\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n requestContext?: unknown\n): Promise {\n let routeIdsToLoad = matchesToLoad.reduce(\n (acc, m) => acc.add(m.route.id),\n new Set()\n );\n let loadedMatches = new Set();\n\n // Send all matches here to allow for a middleware-type implementation.\n // handler will be a no-op for unneeded routes and we filter those results\n // back out below.\n let results = await dataStrategyImpl({\n matches: matches.map((match) => {\n let shouldLoad = routeIdsToLoad.has(match.route.id);\n // `resolve` encapsulates the route.lazy, executing the\n // loader/action, and mapping return values/thrown errors to a\n // HandlerResult. Users can pass a callback to take fine-grained control\n // over the execution of the loader/action\n let resolve: DataStrategyMatch[\"resolve\"] = (handlerOverride) => {\n loadedMatches.add(match.route.id);\n return shouldLoad\n ? callLoaderOrAction(\n type,\n request,\n match,\n manifest,\n mapRouteProperties,\n handlerOverride,\n requestContext\n )\n : Promise.resolve({ type: ResultType.data, result: undefined });\n };\n\n return {\n ...match,\n shouldLoad,\n resolve,\n };\n }),\n request,\n params: matches[0].params,\n context: requestContext,\n });\n\n // Throw if any loadRoute implementations not called since they are what\n // ensures a route is fully loaded\n matches.forEach((m) =>\n invariant(\n loadedMatches.has(m.route.id),\n `\\`match.resolve()\\` was not called for route id \"${m.route.id}\". ` +\n \"You must call `match.resolve()` on every match passed to \" +\n \"`dataStrategy` to ensure all routes are properly loaded.\"\n )\n );\n\n // Filter out any middleware-only matches for which we didn't need to run handlers\n return results.filter((_, i) => routeIdsToLoad.has(matches[i].route.id));\n}\n\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(\n type: \"loader\" | \"action\",\n request: Request,\n match: AgnosticDataRouteMatch,\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n handlerOverride: Parameters[0],\n staticContext?: unknown\n): Promise {\n let result: HandlerResult;\n let onReject: (() => void) | undefined;\n\n let runHandler = (\n handler: AgnosticRouteObject[\"loader\"] | AgnosticRouteObject[\"action\"]\n ): Promise => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject: () => void;\n // This will never resolve so safe to type it as Promise to\n // satisfy the function return value\n let abortPromise = new Promise((_, r) => (reject = r));\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n\n let actualHandler = (ctx?: unknown) => {\n if (typeof handler !== \"function\") {\n return Promise.reject(\n new Error(\n `You cannot call the handler for a route which defines a boolean ` +\n `\"${type}\" [routeId: ${match.route.id}]`\n )\n );\n }\n return handler(\n {\n request,\n params: match.params,\n context: staticContext,\n },\n ...(ctx !== undefined ? [ctx] : [])\n );\n };\n\n let handlerPromise: Promise;\n if (handlerOverride) {\n handlerPromise = handlerOverride((ctx: unknown) => actualHandler(ctx));\n } else {\n handlerPromise = (async () => {\n try {\n let val = await actualHandler();\n return { type: \"data\", result: val };\n } catch (e) {\n return { type: \"error\", result: e };\n }\n })();\n }\n\n return Promise.race([handlerPromise, abortPromise]);\n };\n\n try {\n let handler = match.route[type];\n\n if (match.route.lazy) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let handlerError;\n let [value] = await Promise.all([\n // If the handler throws, don't let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch((e) => {\n handlerError = e;\n }),\n loadLazyRouteModule(match.route, mapRouteProperties, manifest),\n ]);\n if (handlerError !== undefined) {\n throw handlerError;\n }\n result = value!;\n } else {\n // Load lazy route module, then run any returned handler\n await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n\n handler = match.route[type];\n if (handler) {\n // Handler still runs even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id,\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return { type: ResultType.data, result: undefined };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname,\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(\n result.result !== undefined,\n `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n `function. Please return a value or \\`null\\`.`\n );\n } catch (e) {\n // We should already be catching and converting normal handler executions to\n // HandlerResults and returning them, so anything that throws here is an\n // unexpected error we still need to wrap\n return { type: ResultType.error, result: e };\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n return result;\n}\n\nasync function convertHandlerResultToDataResult(\n handlerResult: HandlerResult\n): Promise {\n let { result, type, status } = handlerResult;\n\n if (isResponse(result)) {\n let data: any;\n\n try {\n let contentType = result.headers.get(\"Content-Type\");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n if (result.body == null) {\n data = null;\n } else {\n data = await result.json();\n }\n } else {\n data = await result.text();\n }\n } catch (e) {\n return { type: ResultType.error, error: e };\n }\n\n if (type === ResultType.error) {\n return {\n type: ResultType.error,\n error: new ErrorResponseImpl(result.status, result.statusText, data),\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n if (type === ResultType.error) {\n return {\n type: ResultType.error,\n error: result,\n statusCode: isRouteErrorResponse(result) ? result.status : status,\n };\n }\n\n if (isDeferredData(result)) {\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: result.init?.status,\n headers: result.init?.headers && new Headers(result.init.headers),\n };\n }\n\n return { type: ResultType.data, data: result, statusCode: status };\n}\n\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(\n response: Response,\n request: Request,\n routeId: string,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n v7_relativeSplatPath: boolean\n) {\n let location = response.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n let trimmedMatches = matches.slice(\n 0,\n matches.findIndex((m) => m.route.id === routeId) + 1\n );\n location = normalizeTo(\n new URL(request.url),\n trimmedMatches,\n basename,\n true,\n location,\n v7_relativeSplatPath\n );\n response.headers.set(\"Location\", location);\n }\n\n return response;\n}\n\nfunction normalizeRedirectLocation(\n location: string,\n currentUrl: URL,\n basename: string\n): string {\n if (ABSOLUTE_URL_REGEX.test(location)) {\n // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n let normalizedLocation = location;\n let url = normalizedLocation.startsWith(\"//\")\n ? new URL(currentUrl.protocol + normalizedLocation)\n : new URL(normalizedLocation);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n return url.pathname + url.search + url.hash;\n }\n }\n return location;\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n history: History,\n location: string | Location,\n signal: AbortSignal,\n submission?: Submission\n): Request {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init: RequestInit = { signal };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (\n formEncType === \"application/x-www-form-urlencoded\" &&\n submission.formData\n ) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n\n return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n searchParams: URLSearchParams\n): FormData {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\n\nfunction processRouteLoaderData(\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n results: DataResult[],\n pendingActionResult: PendingActionResult | undefined,\n activeDeferreds: Map,\n skipLoaderErrorBubbling: boolean\n): {\n loaderData: RouterState[\"loaderData\"];\n errors: RouterState[\"errors\"] | null;\n statusCode: number;\n loaderHeaders: Record;\n} {\n // Fill in loaderData/errors from our loaders\n let loaderData: RouterState[\"loaderData\"] = {};\n let errors: RouterState[\"errors\"] | null = null;\n let statusCode: number | undefined;\n let foundError = false;\n let loaderHeaders: Record = {};\n let pendingError =\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : undefined;\n\n // Process loader results into state.loaderData/state.errors\n results.forEach((result, index) => {\n let id = matchesToLoad[index].route.id;\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError !== undefined) {\n error = pendingError;\n pendingError = undefined;\n }\n\n errors = errors || {};\n\n if (skipLoaderErrorBubbling) {\n errors[id] = error;\n } else {\n // Look upwards from the matched route for the closest ancestor error\n // boundary, defaulting to the root match. Prefer higher error values\n // if lower errors bubble to the same boundary\n let boundaryMatch = findNearestBoundary(matches, id);\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n }\n\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error)\n ? result.error.status\n : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (\n result.statusCode != null &&\n result.statusCode !== 200 &&\n !foundError\n ) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n loaderData[id] = result.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (result.statusCode && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n }\n });\n\n // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError !== undefined && pendingActionResult) {\n errors = { [pendingActionResult[0]]: pendingError };\n loaderData[pendingActionResult[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders,\n };\n}\n\nfunction processLoaderData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n results: DataResult[],\n pendingActionResult: PendingActionResult | undefined,\n revalidatingFetchers: RevalidatingFetcher[],\n fetcherResults: DataResult[],\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors?: RouterState[\"errors\"];\n} {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n matchesToLoad,\n results,\n pendingActionResult,\n activeDeferreds,\n false // This method is only called client side so we always want to bubble\n );\n\n // Process results from our revalidating fetchers\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let { key, match, controller } = revalidatingFetchers[index];\n invariant(\n fetcherResults !== undefined && fetcherResults[index] !== undefined,\n \"Did not find corresponding fetcher result\"\n );\n let result = fetcherResults[index];\n\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n continue;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error,\n };\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n loaderData: RouteData,\n newLoaderData: RouteData,\n matches: AgnosticDataRouteMatch[],\n errors: RouteData | null | undefined\n): RouteData {\n let mergedLoaderData = { ...newLoaderData };\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n } else {\n // No-op - this is so we ignore existing data if we have a key in the\n // incoming object with an undefined value, which is how we unset a prior\n // loaderData if we encounter a loader error\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n\nfunction getActionDataForCommit(\n pendingActionResult: PendingActionResult | undefined\n) {\n if (!pendingActionResult) {\n return {};\n }\n return isErrorResult(pendingActionResult[1])\n ? {\n // Clear out prior actionData on errors\n actionData: {},\n }\n : {\n actionData: {\n [pendingActionResult[0]]: pendingActionResult[1].data,\n },\n };\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n matches: AgnosticDataRouteMatch[],\n routeId?: string\n): AgnosticDataRouteMatch {\n let eligibleMatches = routeId\n ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n : [...matches];\n return (\n eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n matches[0]\n );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n matches: AgnosticDataRouteMatch[];\n route: AgnosticDataRouteObject;\n} {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route =\n routes.length === 1\n ? routes[0]\n : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`,\n };\n\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route,\n },\n ],\n route,\n };\n}\n\nfunction getInternalRouterError(\n status: number,\n {\n pathname,\n routeId,\n method,\n type,\n }: {\n pathname?: string;\n routeId?: string;\n method?: string;\n type?: \"defer-action\" | \"invalid-body\";\n } = {}\n) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method} request to \"${pathname}\" but ` +\n `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n `did not provide an \\`action\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n\n return new ErrorResponseImpl(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n results: DataResult[]\n): { result: RedirectResult; idx: number } | undefined {\n for (let i = results.length - 1; i >= 0; i--) {\n let result = results[i];\n if (isRedirectResult(result)) {\n return { result, idx: i };\n }\n }\n}\n\nfunction stripHashFromPath(path: To) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n }\n\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\n\nfunction isHandlerResult(result: unknown): result is HandlerResult {\n return (\n result != null &&\n typeof result === \"object\" &&\n \"type\" in result &&\n \"result\" in result &&\n (result.type === ResultType.data || result.type === ResultType.error)\n );\n}\n\nfunction isRedirectHandlerResult(result: HandlerResult) {\n return (\n isResponse(result.result) && redirectStatusCodes.has(result.result.status)\n );\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n let deferred: DeferredData = value;\n return (\n deferred &&\n typeof deferred === \"object\" &&\n typeof deferred.data === \"object\" &&\n typeof deferred.subscribe === \"function\" &&\n typeof deferred.cancel === \"function\" &&\n typeof deferred.resolveData === \"function\"\n );\n}\n\nfunction isResponse(value: any): value is Response {\n return (\n value != null &&\n typeof value.status === \"number\" &&\n typeof value.statusText === \"string\" &&\n typeof value.headers === \"object\" &&\n typeof value.body !== \"undefined\"\n );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveDeferredResults(\n currentMatches: AgnosticDataRouteMatch[],\n matchesToLoad: (AgnosticDataRouteMatch | null)[],\n results: DataResult[],\n signals: (AbortSignal | null)[],\n isFetcher: boolean,\n currentLoaderData?: RouteData\n) {\n for (let index = 0; index < results.length; index++) {\n let result = results[index];\n let match = matchesToLoad[index];\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(\n (m) => m.route.id === match!.route.id\n );\n let isRevalidatingLoader =\n currentMatch != null &&\n !isNewRouteInstance(currentMatch, match) &&\n (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n let signal = signals[index];\n invariant(\n signal,\n \"Expected an AbortSignal for revalidating fetcher deferred result\"\n );\n await resolveDeferredData(result, signal, isFetcher).then((result) => {\n if (result) {\n results[index] = result || results[index];\n }\n });\n }\n }\n}\n\nasync function resolveDeferredData(\n result: DeferredResult,\n signal: AbortSignal,\n unwrap = false\n): Promise {\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData,\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e,\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data,\n };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n matches: AgnosticDataRouteMatch[],\n location: Location | string\n) {\n let search =\n typeof location === \"string\" ? parsePath(location).search : location.search;\n if (\n matches[matches.length - 1].route.index &&\n hasNakedIndexQuery(search || \"\")\n ) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n navigation: Navigation\n): Submission | undefined {\n let { formMethod, formAction, formEncType, text, formData, json } =\n navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text,\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined,\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined,\n };\n }\n}\n\nfunction getLoadingNavigation(\n location: Location,\n submission?: Submission\n): NavigationStates[\"Loading\"] {\n if (submission) {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n } else {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n };\n return navigation;\n }\n}\n\nfunction getSubmittingNavigation(\n location: Location,\n submission: Submission\n): NavigationStates[\"Submitting\"] {\n let navigation: NavigationStates[\"Submitting\"] = {\n state: \"submitting\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n}\n\nfunction getLoadingFetcher(\n submission?: Submission,\n data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n if (submission) {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data,\n };\n return fetcher;\n } else {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n }\n}\n\nfunction getSubmittingFetcher(\n submission: Submission,\n existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n let fetcher: FetcherStates[\"Submitting\"] = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined,\n };\n return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n let fetcher: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(\n TRANSITIONS_STORAGE_KEY\n );\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n // no-op, use default empty object\n }\n}\n\nfunction persistAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n if (transitions.size > 0) {\n let json: Record = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(\n TRANSITIONS_STORAGE_KEY,\n JSON.stringify(json)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save applied view transitions in sessionStorage (${error}).`\n );\n }\n }\n}\n\n//#endregion\n","import * as React from \"react\";\nimport type {\n AgnosticIndexRouteObject,\n AgnosticNonIndexRouteObject,\n AgnosticRouteMatch,\n History,\n LazyRouteFunction,\n Location,\n Action as NavigationType,\n RelativeRoutingType,\n Router,\n StaticHandlerContext,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticIndexRouteObject[\"path\"];\n id?: AgnosticIndexRouteObject[\"id\"];\n loader?: AgnosticIndexRouteObject[\"loader\"];\n action?: AgnosticIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticIndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport interface NonIndexRouteObject {\n caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticNonIndexRouteObject[\"path\"];\n id?: AgnosticNonIndexRouteObject[\"id\"];\n loader?: AgnosticNonIndexRouteObject[\"loader\"];\n action?: AgnosticNonIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticNonIndexRouteObject[\"handle\"];\n index?: false;\n children?: RouteObject[];\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n children?: DataRouteObject[];\n id: string;\n};\n\nexport interface RouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch {}\n\nexport interface DataRouteMatch extends RouteMatch {}\n\nexport interface DataRouterContextObject\n // Omit `future` since those can be pulled from the `router`\n // `NavigationContext` needs future since it doesn't have a `router` in all cases\n extends Omit {\n router: Router;\n staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n React.createContext(null);\nif (__DEV__) {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext(null);\nif (__DEV__) {\n AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n unstable_flushSync?: boolean;\n unstable_viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n createHref: History[\"createHref\"];\n // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n encodeLocation?: History[\"encodeLocation\"];\n go: History[\"go\"];\n push(to: To, state?: any, opts?: NavigateOptions): void;\n replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n basename: string;\n navigator: Navigator;\n static: boolean;\n future: {\n v7_relativeSplatPath: boolean;\n };\n}\n\nexport const NavigationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n location: Location;\n navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n outlet: React.ReactElement | null;\n matches: RouteMatch[];\n isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false,\n});\n\nif (__DEV__) {\n RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext(null);\n\nif (__DEV__) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n Blocker,\n BlockerFunction,\n Location,\n ParamParseKey,\n Params,\n Path,\n PathMatch,\n PathPattern,\n RelativeRoutingType,\n Router as RemixRouter,\n RevalidationState,\n To,\n UIMatch,\n} from \"@remix-run/router\";\nimport {\n IDLE_BLOCKER,\n Action as NavigationType,\n UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n DataRouteMatch,\n NavigateOptions,\n RouteContextObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\nexport function useHref(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a component.`\n );\n\n let { basename, navigator } = React.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n let joinedPathname = pathname;\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname =\n pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a ``.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\nexport function useLocation(): Location {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a component.`\n );\n\n return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * ``.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\nexport function useMatch<\n ParamKey extends ParamParseKey,\n Path extends string\n>(pattern: PathPattern | Path): PathMatch | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a component.`\n );\n\n let { pathname } = useLocation();\n return React.useMemo(\n () => matchPath(pattern, pathname),\n [pathname, pattern]\n );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n (to: To, options?: NavigateOptions): void;\n (delta: number): void;\n}\n\nconst navigateEffectWarning =\n `You should call navigate() in a React.useEffect(), not when ` +\n `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n cb: Parameters[0]\n) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by ``s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n let { isDataRoute } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a component.`\n );\n\n let dataRouterContext = React.useContext(DataRouterContext);\n let { basename, future, navigator } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\"\n ? basename\n : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext,\n ]\n );\n\n return navigate;\n}\n\nconst OutletContext = React.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\nexport function useOutletContext(): Context {\n return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `` to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n let outlet = React.useContext(RouteContext).outlet;\n if (outlet) {\n return (\n {outlet}\n );\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\nexport function useParams<\n ParamsOrKey extends string | Record = string\n>(): Readonly<\n [ParamsOrKey] extends [string] ? Params : Partial\n> {\n let { matches } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n let { future } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n return React.useMemo(\n () =>\n resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\nexport function useRoutes(\n routes: RouteObject[],\n locationArg?: Partial | string\n): React.ReactElement | null {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n routes: RouteObject[],\n locationArg?: Partial | string,\n dataRouterState?: RemixRouter[\"state\"],\n future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a component.`\n );\n\n let { navigator } = React.useContext(NavigationContext);\n let { matches: parentMatches } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (__DEV__) {\n // You won't get a warning about 2 different under a \n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // \n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // } />\n // } />\n // \n //\n // function Blog() {\n // return (\n // \n // } />\n // \n // );\n // }\n let parentPath = (parentRoute && parentRoute.path) || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\"),\n `You rendered descendant (or called \\`useRoutes()\\`) at ` +\n `\"${parentPathname}\" (under ) but the ` +\n `parent route path has no trailing \"*\". This means if you navigate ` +\n `deeper, the parent won't match anymore and therefore the child ` +\n `routes will never render.\\n\\n` +\n `Please change the parent to .`\n );\n }\n\n let locationFromContext = useLocation();\n\n let location;\n if (locationArg) {\n let parsedLocationArg =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n invariant(\n parentPathnameBase === \"/\" ||\n parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`\\` or \\`useRoutes(routes, location)\\`, ` +\n `the location pathname must begin with the portion of the URL pathname that was ` +\n `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n // Determine the remaining pathname by removing the # of URL segments the\n // parentPathnameBase has, instead of removing based on character count.\n // This is because we can't guarantee that incoming/outgoing encodings/\n // decodings will match exactly.\n // We decode paths before matching on a per-segment basis with\n // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n // match what `window.location.pathname` would reflect. Those don't 100%\n // align when it comes to encoded URI characters such as % and &.\n //\n // So we may end up with:\n // pathname: \"/descendant/a%25b/match\"\n // parentPathnameBase: \"/descendant/a%b\"\n //\n // And the direct substring removal approach won't work :/\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n\n let matches = matchRoutes(routes, { pathname: remainingPathname });\n\n if (__DEV__) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n\n warning(\n matches == null ||\n matches[matches.length - 1].route.element !== undefined ||\n matches[matches.length - 1].route.Component !== undefined ||\n matches[matches.length - 1].route.lazy !== undefined,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n `does not have an element or Component. This means it will render an with a ` +\n `null value by default resulting in an \"empty\" page.`\n );\n }\n\n let renderedMatches = _renderMatches(\n matches &&\n matches.map((match) =>\n Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathname).pathname\n : match.pathname,\n ]),\n pathnameBase:\n match.pathnameBase === \"/\"\n ? parentPathnameBase\n : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathnameBase).pathname\n : match.pathnameBase,\n ]),\n })\n ),\n parentMatches,\n dataRouterState,\n future\n );\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return (\n \n {renderedMatches}\n \n );\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error)\n ? `${error.status} ${error.statusText}`\n : error instanceof Error\n ? error.message\n : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n let devInfo = null;\n if (__DEV__) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n\n devInfo = (\n <>\n

💿 Hey developer 👋

\n

\n You can provide a way better UX than this when your app throws errors\n by providing your own ErrorBoundary or{\" \"}\n errorElement prop on your route.\n

\n \n );\n }\n\n return (\n <>\n

Unexpected Application Error!

\n

{message}

\n {stack ?
{stack}
: null}\n {devInfo}\n \n );\n}\n\nconst defaultErrorElement = ;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n location: Location;\n revalidation: RevalidationState;\n error: any;\n component: React.ReactNode;\n routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n location: Location;\n revalidation: RevalidationState;\n error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n RenderErrorBoundaryProps,\n RenderErrorBoundaryState\n> {\n constructor(props: RenderErrorBoundaryProps) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error,\n };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error: error };\n }\n\n static getDerivedStateFromProps(\n props: RenderErrorBoundaryProps,\n state: RenderErrorBoundaryState\n ) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (\n state.location !== props.location ||\n (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n ) {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation,\n };\n }\n\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error !== undefined ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation,\n };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"React Router caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n return this.state.error !== undefined ? (\n \n \n \n ) : (\n this.props.children\n );\n }\n}\n\ninterface RenderedRouteProps {\n routeContext: RouteContextObject;\n match: RouteMatch;\n children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n let dataRouterContext = React.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (\n dataRouterContext &&\n dataRouterContext.static &&\n dataRouterContext.staticContext &&\n (match.route.errorElement || match.route.ErrorBoundary)\n ) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return (\n \n {children}\n \n );\n}\n\nexport function _renderMatches(\n matches: RouteMatch[] | null,\n parentMatches: RouteMatch[] = [],\n dataRouterState: RemixRouter[\"state\"] | null = null,\n future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n if (matches == null) {\n if (dataRouterState?.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches as DataRouteMatch[];\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id] !== undefined\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n\n // If we're in a partial hydration mode, detect if we need to render down to\n // a given HydrateFallback while we load the rest of the hydration data\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n // Track the deepest fallback up until the first route without data\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n\n if (match.route.id) {\n let { loaderData, errors } = dataRouterState;\n let needsToRunLoader =\n match.route.loader &&\n loaderData[match.route.id] === undefined &&\n (!errors || errors[match.route.id] === undefined);\n if (match.route.lazy || needsToRunLoader) {\n // We found the first route that's not ready to render (waiting on\n // lazy, or has a loader that hasn't run yet). Flag that we need to\n // render a fallback and render up until the appropriate fallback\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n // Only data routers handle errors/fallbacks\n let error: any;\n let shouldRenderHydrateFallback = false;\n let errorElement: React.ReactNode | null = null;\n let hydrateFallbackElement: React.ReactNode | null = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : undefined;\n errorElement = match.route.errorElement || defaultErrorElement;\n\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\n \"route-fallback\",\n false,\n \"No `HydrateFallback` element provided to render during initial hydration\"\n );\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children: React.ReactNode;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `` in `` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = ;\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return (\n \n );\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState &&\n (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n \n ) : (\n getChildren()\n );\n }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n UseBlocker = \"useBlocker\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n UseBlocker = \"useBlocker\",\n UseLoaderData = \"useLoaderData\",\n UseActionData = \"useActionData\",\n UseRouteError = \"useRouteError\",\n UseNavigation = \"useNavigation\",\n UseRouteLoaderData = \"useRouteLoaderData\",\n UseMatches = \"useMatches\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n let route = React.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(\n () => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation,\n }),\n [dataRouterContext.router.revalidate, state.revalidation]\n );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n let { matches, loaderData } = useDataRouterState(\n DataRouterStateHook.UseMatches\n );\n return React.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\n `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n );\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error !== undefined) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `` value\n */\nexport function useAsyncValue(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `` value\n */\nexport function useAsyncError(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n let [blockerKey, setBlockerKey] = React.useState(\"\");\n let blockerFunction = React.useCallback(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname:\n stripBasename(currentLocation.pathname, basename) ||\n currentLocation.pathname,\n },\n nextLocation: {\n ...nextLocation,\n pathname:\n stripBasename(nextLocation.pathname, basename) ||\n nextLocation.pathname,\n },\n historyAction,\n });\n },\n [basename, shouldBlock]\n );\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey)\n ? state.blockers.get(blockerKey)!\n : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n\n return navigate;\n}\n\nconst alreadyWarned: Record = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\n","import type {\n InitialEntry,\n LazyRouteFunction,\n Location,\n MemoryHistory,\n RelativeRoutingType,\n Router as RemixRouter,\n RouterState,\n RouterSubscriber,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n AbortedDeferredError,\n Action as NavigationType,\n createMemoryHistory,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n DataRouteObject,\n IndexRouteObject,\n Navigator,\n NonIndexRouteObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n} from \"./context\";\nimport {\n _renderMatches,\n useAsyncValue,\n useInRouterContext,\n useLocation,\n useNavigate,\n useOutlet,\n useRoutes,\n useRoutesImpl,\n} from \"./hooks\";\n\nexport interface FutureConfig {\n v7_relativeSplatPath: boolean;\n v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n fallbackElement?: React.ReactNode;\n router: RemixRouter;\n // Only accept future flags relevant to rendering behavior\n // routing flags should be accessed via router.future\n future?: Partial>;\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let { v7_startTransition } = future || {};\n\n let setState = React.useCallback(\n (newState: RouterState) => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n },\n [setStateImpl, v7_startTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n React.useEffect(() => {\n warning(\n fallbackElement == null || !router.future.v7_partialHydration,\n \"`` is deprecated when using \" +\n \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n );\n // Only log this once on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a