@remix-run/router
Advanced tools
Comparing version 0.0.0-experimental-63b6834e to 0.0.0-experimental-ba938b84
# `@remix-run/router` | ||
## 1.3.3-pre.1 | ||
### Patch Changes | ||
- Correctly perform a "hard" redirect for same-origin absolute URLs outside of the router basename ([#10076](https://github.com/remix-run/react-router/pull/10076)) | ||
## 1.3.3-pre.0 | ||
### Patch Changes | ||
- Change `invariant` to an `UNSAFE_` export since it's only intended for internal use ([#10066](https://github.com/remix-run/react-router/pull/10066)) | ||
- Ensure status code and headers are maintained for `defer` loader responses in `createStaticHandler`'s `query()` method ([#10077](https://github.com/remix-run/react-router/pull/10077)) | ||
- Add internal API for custom HMR implementations ([#9996](https://github.com/remix-run/react-router/pull/9996)) | ||
## 1.3.2 | ||
@@ -4,0 +18,0 @@ |
@@ -1,8 +0,8 @@ | ||
export type { ActionFunction, ActionFunctionArgs, AgnosticDataIndexRouteObject, AgnosticDataNonIndexRouteObject, AgnosticDataRouteMatch, AgnosticDataRouteObject, AgnosticIndexRouteObject, AgnosticNonIndexRouteObject, AgnosticRouteMatch, AgnosticRouteObject, LazyRouteFunction, TrackedPromise, FormEncType, FormMethod, JsonFunction, LoaderFunction, LoaderFunctionArgs, ParamParseKey, Params, PathMatch, PathPattern, RedirectFunction, ShouldRevalidateFunction, Submission, } from "./utils"; | ||
export type { ActionFunction, ActionFunctionArgs, AgnosticDataIndexRouteObject, AgnosticDataNonIndexRouteObject, AgnosticDataRouteMatch, AgnosticDataRouteObject, AgnosticIndexRouteObject, AgnosticNonIndexRouteObject, AgnosticRouteMatch, AgnosticRouteObject, TrackedPromise, FormEncType, FormMethod, JsonFunction, LoaderFunction, LoaderFunctionArgs, ParamParseKey, Params, PathMatch, PathPattern, RedirectFunction, ShouldRevalidateFunction, Submission, } from "./utils"; | ||
export { AbortedDeferredError, ErrorResponse, defer, generatePath, getToPathname, isRouteErrorResponse, joinPaths, json, matchPath, matchRoutes, normalizePathname, redirect, resolvePath, resolveTo, stripBasename, warning, } from "./utils"; | ||
export type { BrowserHistory, BrowserHistoryOptions, HashHistory, HashHistoryOptions, History, InitialEntry, Location, MemoryHistory, MemoryHistoryOptions, Path, To, } from "./history"; | ||
export { Action, createBrowserHistory, createPath, createHashHistory, createMemoryHistory, invariant, parsePath, } from "./history"; | ||
export { Action, createBrowserHistory, createPath, createHashHistory, createMemoryHistory, parsePath, } from "./history"; | ||
export * from "./router"; | ||
/** @internal */ | ||
export type { RouteManifest as UNSAFE_RouteManifest } from "./utils"; | ||
export { DeferredData as UNSAFE_DeferredData, convertRoutesToDataRoutes as UNSAFE_convertRoutesToDataRoutes, getPathContributingMatches as UNSAFE_getPathContributingMatches, } from "./utils"; | ||
export { invariant as UNSAFE_invariant } from "./history"; |
import type { History, Location, Path, To } from "./history"; | ||
import { Action as HistoryAction } from "./history"; | ||
import type { AgnosticDataRouteMatch, AgnosticDataRouteObject, FormEncType, FormMethod, HasErrorBoundaryFunction, RouteData, AgnosticRouteObject, AgnosticRouteMatch } from "./utils"; | ||
import type { AgnosticDataRouteMatch, AgnosticDataRouteObject, FormEncType, FormMethod, RouteData, AgnosticRouteObject, AgnosticRouteMatch } from "./utils"; | ||
import { DeferredData } from "./utils"; | ||
@@ -154,2 +154,10 @@ /** | ||
* | ||
* HMR needs to pass in-flight route updates to React Router | ||
* TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute) | ||
*/ | ||
_internalSetRoutes(routes: AgnosticRouteObject[]): void; | ||
/** | ||
* @internal | ||
* PRIVATE - DO NOT USE | ||
* | ||
* Internal fetch AbortControllers accessed by unit tests | ||
@@ -240,6 +248,2 @@ */ | ||
hydrationData?: HydrationState; | ||
hasErrorBoundary?: HasErrorBoundaryFunction; | ||
onInitialize?: (args: { | ||
router: Router; | ||
}) => void; | ||
} | ||
@@ -424,7 +428,5 @@ /** | ||
export declare const UNSAFE_DEFERRED_SYMBOL: unique symbol; | ||
export interface CreateStaticHandlerOptions { | ||
export declare function createStaticHandler(routes: AgnosticRouteObject[], opts?: { | ||
basename?: string; | ||
hasErrorBoundary?: HasErrorBoundaryFunction; | ||
} | ||
export declare function createStaticHandler(routes: AgnosticRouteObject[], opts?: CreateStaticHandlerOptions): StaticHandler; | ||
}): StaticHandler; | ||
/** | ||
@@ -431,0 +433,0 @@ * Given an existing StaticHandlerContext and an error thrown at render time, |
/** | ||
* @remix-run/router v0.0.0-experimental-63b6834e | ||
* @remix-run/router v0.0.0-experimental-ba938b84 | ||
* | ||
@@ -11,3 +11,3 @@ * Copyright (c) Remix Software Inc. | ||
*/ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).RemixRouter={})}(this,(function(e){"use strict";function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},t.apply(this,arguments)}var r;e.Action=void 0,(r=e.Action||(e.Action={})).Pop="POP",r.Push="PUSH",r.Replace="REPLACE";const a="popstate";function o(e,t){if(!1===e||null==e)throw new Error(t)}function n(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function i(e,t){return{usr:e.state,key:e.key,idx:t}}function s(e,r,a,o){return void 0===a&&(a=null),t({pathname:"string"==typeof e?e:e.pathname,search:"",hash:""},"string"==typeof r?c(r):r,{state:a,key:r&&r.key||o||Math.random().toString(36).substr(2,8)})}function l(e){let{pathname:t="/",search:r="",hash:a=""}=e;return r&&"?"!==r&&(t+="?"===r.charAt(0)?r:"?"+r),a&&"#"!==a&&(t+="#"===a.charAt(0)?a:"#"+a),t}function c(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let a=e.indexOf("?");a>=0&&(t.search=e.substr(a),e=e.substr(0,a)),e&&(t.pathname=e)}return t}function d(r,n,c,d){void 0===d&&(d={});let{window:u=document.defaultView,v5Compat:h=!1}=d,f=u.history,p=e.Action.Pop,m=null,g=y();function y(){return(f.state||{idx:null}).idx}function v(){p=e.Action.Pop;let t=y(),r=null==t?null:t-g;g=t,m&&m({action:p,location:w.location,delta:r})}function b(e){let t="null"!==u.location.origin?u.location.origin:u.location.href,r="string"==typeof e?e:l(e);return o(t,"No window.location.(origin|href) available to create URL for href: "+r),new URL(r,t)}null==g&&(g=0,f.replaceState(t({},f.state,{idx:g}),""));let w={get action(){return p},get location(){return r(u,f)},listen(e){if(m)throw new Error("A history only accepts one active listener");return u.addEventListener(a,v),m=e,()=>{u.removeEventListener(a,v),m=null}},createHref:e=>n(u,e),createURL:b,encodeLocation(e){let t=b(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(t,r){p=e.Action.Push;let a=s(w.location,t,r);c&&c(a,t),g=y()+1;let o=i(a,g),n=w.createHref(a);try{f.pushState(o,"",n)}catch(e){u.location.assign(n)}h&&m&&m({action:p,location:w.location,delta:1})},replace:function(t,r){p=e.Action.Replace;let a=s(w.location,t,r);c&&c(a,t),g=y();let o=i(a,g),n=w.createHref(a);f.replaceState(o,"",n),h&&m&&m({action:p,location:w.location,delta:0})},go:e=>f.go(e)};return w}let u;!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(u||(u={}));const h=new Set(["caseSensitive","path","id","index","children"]);function f(e,r,a,n){return void 0===a&&(a=[]),void 0===n&&(n={}),e.map(((e,i)=>{let s=[...a,i],l="string"==typeof e.id?e.id:s.join("-");if(o(!0!==e.index||!e.children,"Cannot specify children on an index route"),o(!n[l],'Found a route id collision on id "'+l+"\". Route id's must be globally unique within Data Router usages"),function(e){return!0===e.index}(e)){let a=t({},e,{hasErrorBoundary:r(e),id:l});return n[l]=a,a}{let a=t({},e,{id:l,hasErrorBoundary:r(e),children:void 0});return n[l]=a,e.children&&(a.children=f(e.children,r,s,n)),a}}))}function p(e,t,r){void 0===r&&(r="/");let a=R(("string"==typeof t?c(t):t).pathname||"/",r);if(null==a)return null;let o=m(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){return e.length===t.length&&e.slice(0,-1).every(((e,r)=>e===t[r]))?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(o);let n=null;for(let e=0;null==n&&e<o.length;++e)n=w(o[e],A(a));return n}function m(e,t,r,a){void 0===t&&(t=[]),void 0===r&&(r=[]),void 0===a&&(a="");let n=(e,n,i)=>{let s={relativePath:void 0===i?e.path||"":i,caseSensitive:!0===e.caseSensitive,childrenIndex:n,route:e};s.relativePath.startsWith("/")&&(o(s.relativePath.startsWith(a),'Absolute route path "'+s.relativePath+'" nested under path "'+a+'" is not valid. An absolute child route path must start with the combined path of all its parent routes.'),s.relativePath=s.relativePath.slice(a.length));let l=k([a,s.relativePath]),c=r.concat(s);e.children&&e.children.length>0&&(o(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+l+'".'),m(e.children,t,c,l)),(null!=e.path||e.index)&&t.push({path:l,score:b(l,e.index),routesMeta:c})};return e.forEach(((e,t)=>{var r;if(""!==e.path&&null!=(r=e.path)&&r.includes("?"))for(let r of g(e.path))n(e,t,r);else n(e,t)})),t}function g(e){let t=e.split("/");if(0===t.length)return[];let[r,...a]=t,o=r.endsWith("?"),n=r.replace(/\?$/,"");if(0===a.length)return o?[n,""]:[n];let i=g(a.join("/")),s=[];return s.push(...i.map((e=>""===e?n:[n,e].join("/")))),o&&s.push(...i),s.map((t=>e.startsWith("/")&&""===t?"/":t))}const y=/^:\w+$/,v=e=>"*"===e;function b(e,t){let r=e.split("/"),a=r.length;return r.some(v)&&(a+=-2),t&&(a+=2),r.filter((e=>!v(e))).reduce(((e,t)=>e+(y.test(t)?3:""===t?1:10)),a)}function w(e,t){let{routesMeta:r}=e,a={},o="/",n=[];for(let e=0;e<r.length;++e){let i=r[e],s=e===r.length-1,l="/"===o?t:t.slice(o.length)||"/",c=D({path:i.relativePath,caseSensitive:i.caseSensitive,end:s},l);if(!c)return null;Object.assign(a,c.params);let d=i.route;n.push({params:a,pathname:k([o,c.pathname]),pathnameBase:x(k([o,c.pathnameBase])),route:d}),"/"!==c.pathnameBase&&(o=k([o,c.pathnameBase]))}return n}function D(e,t){"string"==typeof e&&(e={path:e,caseSensitive:!1,end:!0});let[r,a]=function(e,t,r){void 0===t&&(t=!1);void 0===r&&(r=!0);E("*"===e||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were "'+e.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+e.replace(/\*$/,"/*")+'".');let a=[],o="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,((e,t)=>(a.push(t),"/([^\\/]+)")));e.endsWith("*")?(a.push("*"),o+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?o+="\\/*$":""!==e&&"/"!==e&&(o+="(?:(?=\\/|$))");return[new RegExp(o,t?void 0:"i"),a]}(e.path,e.caseSensitive,e.end),o=t.match(r);if(!o)return null;let n=o[0],i=n.replace(/(.)\/+$/,"$1"),s=o.slice(1);return{params:a.reduce(((e,t,r)=>{if("*"===t){let e=s[r]||"";i=n.slice(0,n.length-e.length).replace(/(.)\/+$/,"$1")}return e[t]=function(e,t){try{return decodeURIComponent(e)}catch(r){return E(!1,'The value for the URL param "'+t+'" will not be decoded because the string "'+e+'" is a malformed URL segment. This is probably due to a bad percent encoding ('+r+")."),e}}(s[r]||"",t),e}),{}),pathname:n,pathnameBase:i,pattern:e}}function A(e){try{return decodeURI(e)}catch(t){return E(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent encoding ('+t+")."),e}}function R(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,a=e.charAt(r);return a&&"/"!==a?null:e.slice(r)||"/"}function E(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function P(e,t){void 0===t&&(t="/");let{pathname:r,search:a="",hash:o=""}="string"==typeof e?c(e):e,n=r?r.startsWith("/")?r:function(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?r.length>1&&r.pop():"."!==e&&r.push(e)})),r.length>1?r.join("/"):"/"}(r,t):t;return{pathname:n,search:C(a),hash:U(o)}}function S(e,t,r,a){return"Cannot include a '"+e+"' character in a manually specified `to."+t+"` field ["+JSON.stringify(a)+"]. Please separate it out to the `to."+r+'` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.'}function M(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}function L(e,r,a,n){let i;void 0===n&&(n=!1),"string"==typeof e?i=c(e):(i=t({},e),o(!i.pathname||!i.pathname.includes("?"),S("?","pathname","search",i)),o(!i.pathname||!i.pathname.includes("#"),S("#","pathname","hash",i)),o(!i.search||!i.search.includes("#"),S("#","search","hash",i)));let s,l=""===e||""===i.pathname,d=l?"/":i.pathname;if(n||null==d)s=a;else{let e=r.length-1;if(d.startsWith("..")){let t=d.split("/");for(;".."===t[0];)t.shift(),e-=1;i.pathname=t.join("/")}s=e>=0?r[e]:"/"}let u=P(i,s),h=d&&"/"!==d&&d.endsWith("/"),f=(l||"."===d)&&a.endsWith("/");return u.pathname.endsWith("/")||!h&&!f||(u.pathname+="/"),u}const k=e=>e.join("/").replace(/\/\/+/g,"/"),x=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),C=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",U=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";class j extends Error{}class O{constructor(e,t){let r;this.pendingKeysSet=new Set,this.subscribers=new Set,this.deferredKeys=[],o(e&&"object"==typeof e&&!Array.isArray(e),"defer() only accepts plain objects"),this.abortPromise=new Promise(((e,t)=>r=t)),this.controller=new AbortController;let a=()=>r(new j("Deferred data aborted"));this.unlistenAbortSignal=()=>this.controller.signal.removeEventListener("abort",a),this.controller.signal.addEventListener("abort",a),this.data=Object.entries(e).reduce(((e,t)=>{let[r,a]=t;return Object.assign(e,{[r]:this.trackPromise(r,a)})}),{}),this.done&&this.unlistenAbortSignal(),this.init=t}trackPromise(e,t){if(!(t instanceof Promise))return t;this.deferredKeys.push(e),this.pendingKeysSet.add(e);let r=Promise.race([t,this.abortPromise]).then((t=>this.onSettle(r,e,null,t)),(t=>this.onSettle(r,e,t)));return r.catch((()=>{})),Object.defineProperty(r,"_tracked",{get:()=>!0}),r}onSettle(e,t,r,a){return this.controller.signal.aborted&&r instanceof j?(this.unlistenAbortSignal(),Object.defineProperty(e,"_error",{get:()=>r}),Promise.reject(r)):(this.pendingKeysSet.delete(t),this.done&&this.unlistenAbortSignal(),r?(Object.defineProperty(e,"_error",{get:()=>r}),this.emit(!1,t),Promise.reject(r)):(Object.defineProperty(e,"_data",{get:()=>a}),this.emit(!1,t),a))}emit(e,t){this.subscribers.forEach((r=>r(e,t)))}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}cancel(){this.controller.abort(),this.pendingKeysSet.forEach(((e,t)=>this.pendingKeysSet.delete(t))),this.emit(!0)}async resolveData(e){let t=!1;if(!this.done){let r=()=>this.cancel();e.addEventListener("abort",r),t=await new Promise((t=>{this.subscribe((a=>{e.removeEventListener("abort",r),(a||this.done)&&t(a)}))}))}return t}get done(){return 0===this.pendingKeysSet.size}get unwrappedData(){return o(null!==this.data&&this.done,"Can only unwrap data on initialized and settled deferreds"),Object.entries(this.data).reduce(((e,t)=>{let[r,a]=t;return Object.assign(e,{[r]:T(a)})}),{})}get pendingKeys(){return Array.from(this.pendingKeysSet)}}function T(e){if(!function(e){return e instanceof Promise&&!0===e._tracked}(e))return e;if(e._error)throw e._error;return e._data}class _{constructor(e,t,r,a){void 0===a&&(a=!1),this.status=e,this.statusText=t||"",this.internal=a,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function z(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}const I=["post","put","patch","delete"],F=new Set(I),H=["get",...I],q=new Set(H),B=new Set([301,302,303,307,308]),W=new Set([307,308]),$={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},N={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},K={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Y=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,J="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,V=!J,G=e=>Boolean(e.hasErrorBoundary);const X=Symbol("deferred");function Q(e,t,r){void 0===r&&(r=!1);let a,o="string"==typeof e?e:l(e);if(!t||!function(e){return null!=e&&"formData"in e}(t))return{path:o};if(t.formMethod&&!we(t.formMethod))return{path:o,error:he(405,{method:t.formMethod})};if(t.formData&&(a={formMethod:t.formMethod||"get",formAction:pe(o),formEncType:t&&t.formEncType||"application/x-www-form-urlencoded",formData:t.formData},De(a.formMethod)))return{path:o,submission:a};let n=c(o),i=ie(t.formData);return r&&n.search&&Ee(n.search)&&i.append("index",""),n.search="?"+i,{path:l(n),submission:a}}function Z(e,t){let r=e;if(t){let a=e.findIndex((e=>e.route.id===t));a>=0&&(r=e.slice(0,a))}return r}function ee(e,r,a,o,n,i,s,l,c,d,u){let h=d?Object.values(d)[0]:c?Object.values(c)[0]:void 0,f=e.createURL(r.location),p=e.createURL(n),m=i||f.toString()===p.toString()||f.search!==p.search,g=d?Object.keys(d)[0]:void 0,y=Z(a,g).filter(((e,a)=>{if(e.route.lazy)return!0;if(null==e.route.loader)return!1;if(function(e,t,r){let a=!t||r.route.id!==t.route.id,o=void 0===e[r.route.id];return a||o}(r.loaderData,r.matches[a],e)||s.some((t=>t===e.route.id)))return!0;let n=r.matches[a],i=e;return re(e,t({currentUrl:f,currentParams:n.params,nextUrl:p,nextParams:i.params},o,{actionResult:h,defaultShouldRevalidate:m||te(n,i)}))})),v=[];return u&&u.forEach(((e,n)=>{if(a.some((t=>t.route.id===e.routeId)))if(l.includes(n))v.push(t({key:n},e));else{re(e.match,t({currentUrl:f,currentParams:r.matches[r.matches.length-1].params,nextUrl:p,nextParams:a[a.length-1].params},o,{actionResult:h,defaultShouldRevalidate:m}))&&v.push(t({key:n},e))}})),[y,v]}function te(e,t){let r=e.route.path;return e.pathname!==t.pathname||null!=r&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function re(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if("boolean"==typeof r)return r}return t.defaultShouldRevalidate}async function ae(e,r,a){await Promise.all(e.map((async e=>{let n=await e.route.lazy();if(!e.route.lazy)return;let i=a[e.route.id];o(i,"No route found in manifest");let s={};for(let e in n)h.has(e)||(s[e]=n[e]);Object.assign(i,s),Object.assign(i,{hasErrorBoundary:r(t({},i)),lazy:void 0})})))}async function oe(e,t,r,a,n,i,s,c){let d,h,f;void 0===n&&(n="/"),void 0===i&&(i=!1),void 0===s&&(s=!1);let p=new Promise(((e,t)=>f=t)),m=()=>f();t.signal.addEventListener("abort",m);try{let a=r.route[e];o(a,"Could not find the "+e+' to run on the "'+r.route.id+'" route'),h=await Promise.race([a({request:t,params:r.params,context:c}),p]),o(void 0!==h,"You defined "+("action"===e?"an action":"a loader")+' for route "'+r.route.id+"\" but didn't return anything from your `"+e+"` function. Please return a value or `null`.")}catch(e){d=u.error,h=e}finally{t.signal.removeEventListener("abort",m)}if(ve(h)){let e,c=h.status;if(B.has(c)){let e=h.headers.get("Location");if(o(e,"Redirects returned/thrown from loaders/actions must have a Location header"),Y.test(e)){if(!i){let r=new URL(t.url),a=e.startsWith("//")?new URL(r.protocol+e):new URL(e);a.origin===r.origin&&(e=a.pathname+a.search+a.hash)}}else{let i=L(e,M(a.slice(0,a.indexOf(r)+1)).map((e=>e.pathnameBase)),new URL(t.url).pathname);if(o(l(i),"Unable to resolve redirect location: "+e),n){let e=i.pathname;i.pathname="/"===e?n:k([n,e])}e=l(i)}if(i)throw h.headers.set("Location",e),h;return{type:u.redirect,status:c,location:e,revalidate:null!==h.headers.get("X-Remix-Revalidate")}}if(s)throw{type:d||u.data,response:h};let f=h.headers.get("Content-Type");return e=f&&/\bapplication\/json\b/.test(f)?await h.json():await h.text(),d===u.error?{type:d,error:new _(c,h.statusText,e),headers:h.headers}:{type:u.data,data:e,statusCode:h.status,headers:h.headers}}return d===u.error?{type:d,error:h}:h instanceof O?{type:u.deferred,deferredData:h}:{type:u.data,data:h}}function ne(e,t,r,a){let o=e.createURL(pe(t)).toString(),n={signal:r};if(a&&De(a.formMethod)){let{formMethod:e,formEncType:t,formData:r}=a;n.method=e.toUpperCase(),n.body="application/x-www-form-urlencoded"===t?ie(r):r}return new Request(o,n)}function ie(e){let t=new URLSearchParams;for(let[r,a]of e.entries())t.append(r,a instanceof File?a.name:a);return t}function se(e,t,r,a,n){let i,s={},l=null,c=!1,d={};return r.forEach(((r,u)=>{let h=t[u].route.id;if(o(!ye(r),"Cannot handle redirect results in processLoaderData"),ge(r)){let t=de(e,h),o=r.error;a&&(o=Object.values(a)[0],a=void 0),l=l||{},null==l[t.route.id]&&(l[t.route.id]=o),s[h]=void 0,c||(c=!0,i=z(r.error)?r.error.status:500),r.headers&&(d[h]=r.headers)}else me(r)?(n.set(h,r.deferredData),s[h]=r.deferredData.data):s[h]=r.data,null==r.statusCode||200===r.statusCode||c||(i=r.statusCode),r.headers&&(d[h]=r.headers)})),a&&(l=a,s[Object.keys(a)[0]]=void 0),{loaderData:s,errors:l,statusCode:i||200,loaderHeaders:d}}function le(e,r,a,n,i,s,l,c){let{loaderData:d,errors:u}=se(r,a,n,i,c);for(let r=0;r<s.length;r++){let{key:a,match:n}=s[r];o(void 0!==l&&void 0!==l[r],"Did not find corresponding fetcher result");let i=l[r];if(ge(i)){let r=de(e.matches,n.route.id);u&&u[r.route.id]||(u=t({},u,{[r.route.id]:i.error})),e.fetchers.delete(a)}else if(ye(i))o(!1,"Unhandled fetcher revalidation redirect");else if(me(i))o(!1,"Unhandled fetcher deferred data");else{let t={state:"idle",data:i.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};e.fetchers.set(a,t)}}return{loaderData:d,errors:u}}function ce(e,r,a,o){let n=t({},r);for(let t of a){let a=t.route.id;if(r.hasOwnProperty(a)?void 0!==r[a]&&(n[a]=r[a]):void 0!==e[a]&&(n[a]=e[a]),o&&o.hasOwnProperty(a))break}return n}function de(e,t){return(t?e.slice(0,e.findIndex((e=>e.route.id===t))+1):[...e]).reverse().find((e=>!0===e.route.hasErrorBoundary))||e[0]}function ue(e){let t=e.find((e=>e.index||!e.path||"/"===e.path))||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function he(e,t){let{pathname:r,routeId:a,method:o,type:n}=void 0===t?{}:t,i="Unknown Server Error",s="Unknown @remix-run/router error";return 400===e?(i="Bad Request",o&&r&&a?s="You made a "+o+' request to "'+r+'" but did not provide a `loader` for route "'+a+'", so there is no way to handle the request.':"defer-action"===n&&(s="defer() is not supported in actions")):403===e?(i="Forbidden",s='Route "'+a+'" does not match URL "'+r+'"'):404===e?(i="Not Found",s='No route matches URL "'+r+'"'):405===e&&(i="Method Not Allowed",o&&r&&a?s="You made a "+o.toUpperCase()+' request to "'+r+'" but did not provide an `action` for route "'+a+'", so there is no way to handle the request.':o&&(s='Invalid request method "'+o.toUpperCase()+'"')),new _(e||500,i,new Error(s),!0)}function fe(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(ye(r))return r}}function pe(e){return l(t({},"string"==typeof e?c(e):e,{hash:""}))}function me(e){return e.type===u.deferred}function ge(e){return e.type===u.error}function ye(e){return(e&&e.type)===u.redirect}function ve(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"object"==typeof e.headers&&void 0!==e.body}function be(e){if(!ve(e))return!1;let t=e.status,r=e.headers.get("Location");return t>=300&&t<=399&&null!=r}function we(e){return q.has(e)}function De(e){return F.has(e)}async function Ae(e,t,r,a,o,n){for(let i=0;i<r.length;i++){let s=r[i],l=t[i],c=e.find((e=>e.route.id===l.route.id)),d=null!=c&&!te(c,l)&&void 0!==(n&&n[l.route.id]);me(s)&&(o||d)&&await Re(s,a,o).then((e=>{e&&(r[i]=e||r[i])}))}}async function Re(e,t,r){if(void 0===r&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:u.data,data:e.deferredData.unwrappedData}}catch(e){return{type:u.error,error:e}}return{type:u.data,data:e.deferredData.data}}}function Ee(e){return new URLSearchParams(e).getAll("index").some((e=>""===e))}function Pe(e,t){let{route:r,pathname:a,params:o}=e;return{id:r.id,pathname:a,params:o,data:t[r.id],handle:r.handle}}function Se(e,t){let r="string"==typeof t?c(t).search:t.search;if(e[e.length-1].route.index&&Ee(r||""))return e[e.length-1];let a=M(e);return a[a.length-1]}e.AbortedDeferredError=j,e.ErrorResponse=_,e.IDLE_BLOCKER=K,e.IDLE_FETCHER=N,e.IDLE_NAVIGATION=$,e.UNSAFE_DEFERRED_SYMBOL=X,e.UNSAFE_DeferredData=O,e.UNSAFE_convertRoutesToDataRoutes=f,e.UNSAFE_getPathContributingMatches=M,e.createBrowserHistory=function(e){return void 0===e&&(e={}),d((function(e,t){let{pathname:r,search:a,hash:o}=e.location;return s("",{pathname:r,search:a,hash:o},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){return"string"==typeof t?t:l(t)}),null,e)},e.createHashHistory=function(e){return void 0===e&&(e={}),d((function(e,t){let{pathname:r="/",search:a="",hash:o=""}=c(e.location.hash.substr(1));return s("",{pathname:r,search:a,hash:o},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){let r=e.document.querySelector("base"),a="";if(r&&r.getAttribute("href")){let t=e.location.href,r=t.indexOf("#");a=-1===r?t:t.slice(0,r)}return a+"#"+("string"==typeof t?t:l(t))}),(function(e,t){n("/"===e.pathname.charAt(0),"relative pathnames are not supported in hash history.push("+JSON.stringify(t)+")")}),e)},e.createMemoryHistory=function(t){void 0===t&&(t={});let r,{initialEntries:a=["/"],initialIndex:o,v5Compat:i=!1}=t;r=a.map(((e,t)=>m(e,"string"==typeof e?null:e.state,0===t?"default":void 0)));let d=f(null==o?r.length-1:o),u=e.Action.Pop,h=null;function f(e){return Math.min(Math.max(e,0),r.length-1)}function p(){return r[d]}function m(e,t,a){void 0===t&&(t=null);let o=s(r?p().pathname:"/",e,t,a);return n("/"===o.pathname.charAt(0),"relative pathnames are not supported in memory history: "+JSON.stringify(e)),o}function g(e){return"string"==typeof e?e:l(e)}return{get index(){return d},get action(){return u},get location(){return p()},createHref:g,createURL:e=>new URL(g(e),"http://localhost"),encodeLocation(e){let t="string"==typeof e?c(e):e;return{pathname:t.pathname||"",search:t.search||"",hash:t.hash||""}},push(t,a){u=e.Action.Push;let o=m(t,a);d+=1,r.splice(d,r.length,o),i&&h&&h({action:u,location:o,delta:1})},replace(t,a){u=e.Action.Replace;let o=m(t,a);r[d]=o,i&&h&&h({action:u,location:o,delta:0})},go(t){u=e.Action.Pop;let a=f(d+t),o=r[a];d=a,h&&h({action:u,location:o,delta:t})},listen:e=>(h=e,()=>{h=null})}},e.createPath=l,e.createRouter=function(r){o(r.routes.length>0,"You must provide a non-empty routes array to createRouter");let a=r.hasErrorBoundary||G,n={},i=f(r.routes,a,void 0,n),l=null,c=new Set,d=null,h=null,m=null,g=null!=r.hydrationData,y=p(i,r.history.location,r.basename),v=null;if(null==y){let e=he(404,{pathname:r.history.location.pathname}),{matches:t,route:a}=ue(i);y=t,v={[a.id]:e}}let b,w,D=!(y.some((e=>e.route.lazy))||y.some((e=>e.route.loader))&&null==r.hydrationData),A={historyAction:r.history.action,location:r.history.location,matches:y,initialized:D,navigation:$,restoreScrollPosition:null==r.hydrationData&&null,preventScrollReset:!1,revalidation:"idle",loaderData:r.hydrationData&&r.hydrationData.loaderData||{},actionData:r.hydrationData&&r.hydrationData.actionData||null,errors:r.hydrationData&&r.hydrationData.errors||v,fetchers:new Map,blockers:new Map},R=e.Action.Pop,P=!1,S=!1,M=!1,L=[],k=[],x=new Map,C=0,U=-1,j=new Map,O=new Set,T=new Map,_=new Map,z=new Map,I=!1;function F(e){return c.add(e),()=>c.delete(e)}function H(e){A=t({},A,e),c.forEach((e=>e(A)))}function q(a,o){var n,i;let s,l=null!=A.actionData&&null!=A.navigation.formMethod&&De(A.navigation.formMethod)&&"loading"===A.navigation.state&&!0!==(null==(n=a.state)?void 0:n._isRedirect);s=o.actionData?Object.keys(o.actionData).length>0?o.actionData:null:l?A.actionData:null;let c=o.loaderData?ce(A.loaderData,o.loaderData,o.matches||[],o.errors):A.loaderData;for(let[e]of z)we(e);let d=!0===P||null!=A.navigation.formMethod&&De(A.navigation.formMethod)&&!0!==(null==(i=a.state)?void 0:i._isRedirect);H(t({},o,{actionData:s,loaderData:c,historyAction:R,location:a,initialized:!0,navigation:$,revalidation:"idle",restoreScrollPosition:ke(a,o.matches||A.matches),preventScrollReset:d,blockers:new Map(A.blockers)})),S||R===e.Action.Pop||(R===e.Action.Push?r.history.push(a,a.state):R===e.Action.Replace&&r.history.replace(a,a.state)),R=e.Action.Pop,P=!1,S=!1,M=!1,L=[],k=[]}async function B(s,l,c){w&&w.abort(),w=null,R=s,S=!0===(c&&c.startUninterruptedRevalidation),function(e,t){if(d&&h&&m){let r=t.map((e=>Pe(e,A.loaderData))),a=h(e,r)||e.key;d[a]=m()}}(A.location,A.matches),P=!0===(c&&c.preventScrollReset);let f=c&&c.overrideNavigation,g=p(i,l,r.basename);if(!g){let e=he(404,{pathname:l.pathname}),{matches:t,route:r}=ue(i);return Le(),void q(l,{matches:t,loaderData:{},errors:{[r.id]:e}})}if(!(y=A.location,v=l,y.pathname!==v.pathname||y.search!==v.search||y.hash===v.hash||c&&c.submission&&De(c.submission.formMethod)))return void q(l,{matches:g});var y,v;w=new AbortController;let D,E,j=ne(r.history,l,w.signal,c&&c.submission);if(c&&c.pendingError)E={[de(g).route.id]:c.pendingError};else if(c&&c.submission&&De(c.submission.formMethod)){let r=await async function(r,o,i,s,l){let c;re(),H({navigation:t({state:"submitting",location:o},i)});let d=Se(s,o);if(d.route.lazy&&(await ae([d],a,n),r.signal.aborted))return{shortCircuited:!0};if(d.route.action){if(c=await oe("action",r,d,s,b.basename),r.signal.aborted)return{shortCircuited:!0}}else c={type:u.error,error:he(405,{method:r.method,pathname:o.pathname,routeId:d.route.id})};if(ye(c)){let e;return e=l&&null!=l.replace?l.replace:c.location===A.location.pathname+A.location.search,await Z(A,c,{submission:i,replace:e}),{shortCircuited:!0}}if(ge(c)){let t=de(s,d.route.id);return!0!==(l&&l.replace)&&(R=e.Action.Push),{pendingActionData:{},pendingActionError:{[t.route.id]:c.error}}}if(me(c))throw he(400,{type:"defer-action"});return{pendingActionData:{[d.route.id]:c.data}}}(j,l,c.submission,g,{replace:c.replace});if(r.shortCircuited)return;D=r.pendingActionData,E=r.pendingActionError,f=t({state:"loading",location:l},c.submission),j=new Request(j.url,{signal:j.signal})}let{shortCircuited:z,loaderData:I,errors:F}=await async function(e,i,s,l,c,d,u,h){let f=l;if(!f){f=t({state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},c)}let p=c||(f.formMethod&&f.formAction&&f.formData&&f.formEncType?{formMethod:f.formMethod,formAction:f.formAction,formData:f.formData,formEncType:f.formEncType}:void 0),[m,g]=ee(r.history,A,s,p,i,M,L,k,u,h,T);if(Le((e=>!(s&&s.some((t=>t.route.id===e)))||m&&m.some((t=>t.route.id===e)))),0===m.length&&0===g.length)return q(i,t({matches:s,loaderData:{},errors:h||null},u?{actionData:u}:{})),{shortCircuited:!0};if(!S){g.forEach((e=>{let t=A.fetchers.get(e.key),r={state:"loading",data:t&&t.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};A.fetchers.set(e.key,r)}));let e=u||A.actionData;H(t({navigation:f},e?0===Object.keys(e).length?{actionData:null}:{actionData:e}:{},g.length>0?{fetchers:new Map(A.fetchers)}:{}))}U=++C,g.forEach((e=>x.set(e.key,w)));let y=s.filter((e=>e.route.lazy));if(y.length>0&&(await ae(y,a,n),e.signal.aborted))return{shortCircuited:!0};let{results:v,loaderResults:b,fetcherResults:D}=await te(A.matches,s,m,g,e);if(e.signal.aborted)return{shortCircuited:!0};g.forEach((e=>x.delete(e.key)));let R=fe(v);if(R)return await Z(A,R,{replace:d}),{shortCircuited:!0};let{loaderData:E,errors:P}=le(A,s,m,b,h,g,D,_);_.forEach(((e,t)=>{e.subscribe((r=>{(r||e.done)&&_.delete(t)}))})),function(){let e=[];for(let t of O){let r=A.fetchers.get(t);o(r,"Expected fetcher: "+t),"loading"===r.state&&(O.delete(t),e.push(t))}ve(e)}();let j=be(U);return t({loaderData:E,errors:P},j||g.length>0?{fetchers:new Map(A.fetchers)}:{})}(j,l,g,f,c&&c.submission,c&&c.replace,D,E);z||(w=null,q(l,t({matches:g},D?{actionData:D}:{},{loaderData:I,errors:F})))}function X(e){return A.fetchers.get(e)||N}async function Z(a,n,i){var l;let{submission:c,replace:d,isFetchActionRedirect:u}=void 0===i?{}:i;n.revalidate&&(M=!0);let h=s(a.location,n.location,t({_isRedirect:!0},u?{_isFetchActionRedirect:!0}:{}));if(o(h,"Expected a location on the redirect navigation"),Y.test(n.location)&&J&&void 0!==(null==(l=window)?void 0:l.location)){let e=r.history.createURL(n.location).origin;if(window.location.origin!==e)return void(d?window.location.replace(n.location):window.location.assign(n.location))}w=null;let f=!0===d?e.Action.Replace:e.Action.Push,{formMethod:p,formAction:m,formEncType:g,formData:y}=a.navigation;!c&&p&&m&&y&&g&&(c={formMethod:p,formAction:m,formEncType:g,formData:y}),W.has(n.status)&&c&&De(c.formMethod)?await B(f,h,{submission:t({},c,{formAction:n.location}),preventScrollReset:P}):await B(f,h,{overrideNavigation:{state:"loading",location:h,formMethod:c?c.formMethod:void 0,formAction:c?c.formAction:void 0,formEncType:c?c.formEncType:void 0,formData:c?c.formData:void 0},preventScrollReset:P})}async function te(e,t,a,o,n){let i=await Promise.all([...a.map((e=>oe("loader",n,e,t,b.basename))),...o.map((e=>oe("loader",ne(r.history,e.path,n.signal),e.match,e.matches,b.basename)))]),s=i.slice(0,a.length),l=i.slice(a.length);return await Promise.all([Ae(e,a,s,n.signal,!1,A.loaderData),Ae(e,o.map((e=>e.match)),l,n.signal,!0)]),{results:i,loaderResults:s,fetcherResults:l}}function re(){M=!0,L.push(...Le()),T.forEach(((e,t)=>{x.has(t)&&(k.push(t),pe(t))}))}function ie(e,t,r){let a=de(A.matches,t);se(e),H({errors:{[a.route.id]:r},fetchers:new Map(A.fetchers)})}function se(e){x.has(e)&&pe(e),T.delete(e),j.delete(e),O.delete(e),A.fetchers.delete(e)}function pe(e){let t=x.get(e);o(t,"Expected fetch controller: "+e),t.abort(),x.delete(e)}function ve(e){for(let t of e){let e={state:"idle",data:X(t).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};A.fetchers.set(t,e)}}function be(e){let t=[];for(let[r,a]of j)if(a<e){let e=A.fetchers.get(r);o(e,"Expected fetcher: "+r),"loading"===e.state&&(pe(r),j.delete(r),t.push(r))}return ve(t),t.length>0}function we(e){A.blockers.delete(e),z.delete(e)}function Ee(e,t){let r=A.blockers.get(e)||K;o("unblocked"===r.state&&"blocked"===t.state||"blocked"===r.state&&"blocked"===t.state||"blocked"===r.state&&"proceeding"===t.state||"blocked"===r.state&&"unblocked"===t.state||"proceeding"===r.state&&"unblocked"===t.state,"Invalid blocker state transition: "+r.state+" -> "+t.state),A.blockers.set(e,t),H({blockers:new Map(A.blockers)})}function Me(e){let{currentLocation:t,nextLocation:r,historyAction:a}=e;if(0===z.size)return;z.size>1&&E(!1,"A router only supports one blocker at a time");let o=Array.from(z.entries()),[n,i]=o[o.length-1],s=A.blockers.get(n);return s&&"proceeding"===s.state?void 0:i({currentLocation:t,nextLocation:r,historyAction:a})?n:void 0}function Le(e){let t=[];return _.forEach(((r,a)=>{e&&!e(a)||(r.cancel(),t.push(a),_.delete(a))})),t}function ke(e,t){if(d&&h&&m){let r=t.map((e=>Pe(e,A.loaderData))),a=h(e,r)||e.key,o=d[a];if("number"==typeof o)return o}return null}return b={get basename(){return r.basename},get state(){return A},get routes(){return i},initialize:function(){if(l=r.history.listen((e=>{let{action:t,location:a,delta:o}=e;if(I)return void(I=!1);E(0===z.size||null!=o,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let n=Me({currentLocation:A.location,nextLocation:a,historyAction:t});return n&&null!=o?(I=!0,r.history.go(-1*o),void Ee(n,{state:"blocked",location:a,proceed(){Ee(n,{state:"proceeding",proceed:void 0,reset:void 0,location:a}),r.history.go(o)},reset(){we(n),H({blockers:new Map(b.state.blockers)})}})):B(t,a)})),r.onInitialize)if(A.initialized)Promise.resolve().then((()=>r.onInitialize({router:b})));else{let e=F((t=>{t.initialized&&(e(),r.onInitialize({router:b}))}))}if(A.initialized)return b;let t=A.matches.filter((e=>e.route.lazy));return 0===t.length?(B(e.Action.Pop,A.location),b):(ae(t,a,n).then((()=>{!A.matches.some((e=>e.route.loader))||null!=r.hydrationData?H({initialized:!0}):B(e.Action.Pop,A.location)})),b)},subscribe:F,enableScrollRestoration:function(e,t,r){if(d=e,m=t,h=r||(e=>e.key),!g&&A.navigation===$){g=!0;let e=ke(A.location,A.matches);null!=e&&H({restoreScrollPosition:e})}return()=>{d=null,m=null,h=null}},navigate:async function a(o,n){if("number"==typeof o)return void r.history.go(o);let{path:i,submission:l,error:c}=Q(o,n),d=A.location,u=s(A.location,i,n&&n.state);u=t({},u,r.history.encodeLocation(u));let h=n&&null!=n.replace?n.replace:void 0,f=e.Action.Push;!0===h?f=e.Action.Replace:!1===h||null!=l&&De(l.formMethod)&&l.formAction===A.location.pathname+A.location.search&&(f=e.Action.Replace);let p=n&&"preventScrollReset"in n?!0===n.preventScrollReset:void 0,m=Me({currentLocation:d,nextLocation:u,historyAction:f});if(!m)return await B(f,u,{submission:l,pendingError:c,preventScrollReset:p,replace:n&&n.replace});Ee(m,{state:"blocked",location:u,proceed(){Ee(m,{state:"proceeding",proceed:void 0,reset:void 0,location:u}),a(o,n)},reset(){we(m),H({blockers:new Map(A.blockers)})}})},fetch:function(e,s,l,c){if(V)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");x.has(e)&&pe(e);let d=p(i,l,r.basename);if(!d)return void ie(e,s,he(404,{pathname:l}));let{path:u,submission:h}=Q(l,c,!0),f=Se(d,u);P=!0===(c&&c.preventScrollReset),h&&De(h.formMethod)?async function(e,s,l,c,d,u){if(re(),T.delete(e),!c.route.lazy&&!c.route.action){let t=he(405,{method:u.formMethod,pathname:l,routeId:s});return void ie(e,s,t)}let h=A.fetchers.get(e),f=t({state:"submitting"},u,{data:h&&h.data," _hasFetcherDoneAnything ":!0});A.fetchers.set(e,f),H({fetchers:new Map(A.fetchers)});let m=new AbortController,g=ne(r.history,l,m.signal,u);if(x.set(e,m),c.route.lazy){if(await ae([c],a,n),g.signal.aborted)return;if(!c.route.action){let t=he(405,{method:u.formMethod,pathname:l,routeId:s});return void ie(e,s,t)}}let y=await oe("action",g,c,d,b.basename);if(g.signal.aborted)return void(x.get(e)===m&&x.delete(e));if(ye(y)){x.delete(e),O.add(e);let r=t({state:"loading"},u,{data:void 0," _hasFetcherDoneAnything ":!0});return A.fetchers.set(e,r),H({fetchers:new Map(A.fetchers)}),Z(A,y,{isFetchActionRedirect:!0})}if(ge(y))return void ie(e,s,y.error);if(me(y))throw he(400,{type:"defer-action"});let v=A.navigation.location||A.location,D=ne(r.history,v,m.signal),E="idle"!==A.navigation.state?p(i,A.navigation.location,r.basename):A.matches;o(E,"Didn't find any matches after fetcher action");let P=++C;j.set(e,P);let S=t({state:"loading",data:y.data},u,{" _hasFetcherDoneAnything ":!0});A.fetchers.set(e,S);let[z,I]=ee(r.history,A,E,u,v,M,L,k,{[c.route.id]:y.data},void 0,T);I.filter((t=>t.key!==e)).forEach((e=>{let t=e.key,r=A.fetchers.get(t),a={state:"loading",data:r&&r.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};A.fetchers.set(t,a),x.set(t,m)})),H({fetchers:new Map(A.fetchers)});let F=E.filter((e=>e.route.lazy));if(c.route.lazy&&(await ae(F,a,n),D.signal.aborted))return;let{results:B,loaderResults:W,fetcherResults:$}=await te(A.matches,E,z,I,D);if(m.signal.aborted)return;j.delete(e),x.delete(e),I.forEach((e=>x.delete(e.key)));let N=fe(B);if(N)return Z(A,N);let{loaderData:K,errors:Y}=le(A,A.matches,z,W,void 0,I,$,_),J={state:"idle",data:y.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};A.fetchers.set(e,J);let V=be(P);"loading"===A.navigation.state&&P>U?(o(R,"Expected pending action"),w&&w.abort(),q(A.navigation.location,{matches:E,loaderData:K,errors:Y,fetchers:new Map(A.fetchers)})):(H(t({errors:Y,loaderData:ce(A.loaderData,K,E,Y)},V?{fetchers:new Map(A.fetchers)}:{})),M=!1)}(e,s,u,f,d,h):(T.set(e,{routeId:s,path:u,match:f,matches:d}),async function(e,i,s,l,c,d){let u=A.fetchers.get(e),h=t({state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},d,{data:u&&u.data," _hasFetcherDoneAnything ":!0});A.fetchers.set(e,h),H({fetchers:new Map(A.fetchers)});let f=new AbortController,p=ne(r.history,s,f.signal);if(x.set(e,f),l.route.lazy&&(await ae([l],a,n),p.signal.aborted))return;let m=await oe("loader",p,l,c,b.basename);me(m)&&(m=await Re(m,p.signal,!0)||m);x.get(e)===f&&x.delete(e);if(p.signal.aborted)return;if(ye(m))return void await Z(A,m);if(ge(m)){let t=de(A.matches,i);return A.fetchers.delete(e),void H({fetchers:new Map(A.fetchers),errors:{[t.route.id]:m.error}})}o(!me(m),"Unhandled fetcher deferred data");let g={state:"idle",data:m.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};A.fetchers.set(e,g),H({fetchers:new Map(A.fetchers)})}(e,s,u,f,d,h))},revalidate:function(){re(),H({revalidation:"loading"}),"submitting"!==A.navigation.state&&("idle"!==A.navigation.state?B(R||A.historyAction,A.navigation.location,{overrideNavigation:A.navigation}):B(A.historyAction,A.location,{startUninterruptedRevalidation:!0}))},createHref:e=>r.history.createHref(e),encodeLocation:e=>r.history.encodeLocation(e),getFetcher:X,deleteFetcher:se,dispose:function(){l&&l(),c.clear(),w&&w.abort(),A.fetchers.forEach(((e,t)=>se(t))),A.blockers.forEach(((e,t)=>we(t)))},getBlocker:function(e,t){let r=A.blockers.get(e)||K;return z.get(e)!==t&&z.set(e,t),r},deleteBlocker:we,_internalFetchControllers:x,_internalActiveDeferreds:_},b},e.createStaticHandler=function(e,r){o(e.length>0,"You must provide a non-empty routes array to createStaticHandler");let a={},n=(null==r?void 0:r.hasErrorBoundary)||G,i=f(e,n,void 0,a),c=(r?r.basename:null)||"/";async function d(e,r,i,s,l){o(e.signal,"query()/queryRoute() requests must contain an AbortController signal");let d=i.filter((e=>e.route.lazy));if(d.length>0&&(await ae(d,n,a),e.signal.aborted)){throw new Error((null!=l?"queryRoute":"query")+"() call aborted")}try{if(De(e.method.toLowerCase())){let a=await async function(e,r,a,o,n){let i;if(a.route.action){if(i=await oe("action",e,a,r,c,!0,n,o),e.signal.aborted){throw new Error((n?"queryRoute":"query")+"() call aborted")}}else{let t=he(405,{method:e.method,pathname:new URL(e.url).pathname,routeId:a.route.id});if(n)throw t;i={type:u.error,error:t}}if(ye(i))throw new Response(null,{status:i.status,headers:{Location:i.location}});if(me(i)){let e=he(400,{type:"defer-action"});if(n)throw e;i={type:u.error,error:e}}if(n){if(ge(i))throw i.error;return{matches:[a],loaderData:{},actionData:{[a.route.id]:i.data},errors:null,statusCode:200,loaderHeaders:{},actionHeaders:{},activeDeferreds:null}}if(ge(i)){let n=de(r,a.route.id);return t({},await h(e,r,o,void 0,{[n.route.id]:i.error}),{statusCode:z(i.error)?i.error.status:500,actionData:null,actionHeaders:t({},i.headers?{[a.route.id]:i.headers}:{})})}let s=new Request(e.url,{headers:e.headers,redirect:e.redirect,signal:e.signal});return t({},await h(s,r,o),i.statusCode?{statusCode:i.statusCode}:{},{actionData:{[a.route.id]:i.data},actionHeaders:t({},i.headers?{[a.route.id]:i.headers}:{})})}(e,i,l||Se(i,r),s,null!=l);return a}let a=await h(e,i,s,l);return ve(a)?a:t({},a,{actionData:null,actionHeaders:{}})}catch(e){if((f=e)&&ve(f.response)&&(f.type===u.data||u.error)){if(e.type===u.error&&!be(e.response))throw e.response;return e.response}if(be(e))return e;throw e}var f}async function h(e,r,a,o,n){let i=null!=o;if(i&&(null==o||!o.route.loader))throw he(400,{method:e.method,pathname:new URL(e.url).pathname,routeId:null==o?void 0:o.route.id});let s=(o?[o]:Z(r,Object.keys(n||{})[0])).filter((e=>e.route.loader));if(0===s.length)return{matches:r,loaderData:r.reduce(((e,t)=>Object.assign(e,{[t.route.id]:null})),{}),errors:n||null,statusCode:200,loaderHeaders:{},activeDeferreds:null};let l=await Promise.all([...s.map((t=>oe("loader",e,t,r,c,!0,i,a)))]);if(e.signal.aborted){throw new Error((i?"queryRoute":"query")+"() call aborted")}let d=new Map,u=se(r,s,l,n,d),h=new Set(s.map((e=>e.route.id)));return r.forEach((e=>{h.has(e.route.id)||(u.loaderData[e.route.id]=null)})),t({},u,{matches:r,activeDeferreds:d.size>0?Object.fromEntries(d.entries()):null})}return{dataRoutes:i,query:async function(e,r){let{requestContext:a}=void 0===r?{}:r,o=new URL(e.url),n=e.method.toLowerCase(),u=s("",l(o),null,"default"),h=p(i,u,c);if(!we(n)&&"head"!==n){let e=he(405,{method:n}),{matches:t,route:r}=ue(i);return{basename:c,location:u,matches:t,loaderData:{},actionData:null,errors:{[r.id]:e},statusCode:e.status,loaderHeaders:{},actionHeaders:{},activeDeferreds:null}}if(!h){let e=he(404,{pathname:u.pathname}),{matches:t,route:r}=ue(i);return{basename:c,location:u,matches:t,loaderData:{},actionData:null,errors:{[r.id]:e},statusCode:e.status,loaderHeaders:{},actionHeaders:{},activeDeferreds:null}}let f=await d(e,u,h,a);return ve(f)?f:t({location:u,basename:c},f)},queryRoute:async function(e,t){let{routeId:r,requestContext:a}=void 0===t?{}:t,o=new URL(e.url),n=e.method.toLowerCase(),u=s("",l(o),null,"default"),h=p(i,u,c);if(!we(n)&&"head"!==n&&"options"!==n)throw he(405,{method:n});if(!h)throw he(404,{pathname:u.pathname});let f=r?h.find((e=>e.route.id===r)):Se(h,u);if(r&&!f)throw he(403,{pathname:u.pathname,routeId:r});if(!f)throw he(404,{pathname:u.pathname});let m=await d(e,u,h,a,f);if(ve(m))return m;let g=m.errors?Object.values(m.errors)[0]:void 0;if(void 0!==g)throw g;if(m.actionData)return Object.values(m.actionData)[0];if(m.loaderData){var y;let e=Object.values(m.loaderData)[0];return null!=(y=m.activeDeferreds)&&y[f.route.id]&&(e[X]=m.activeDeferreds[f.route.id]),e}}}},e.defer=function(e,t){return void 0===t&&(t={}),new O(e,"number"==typeof t?{status:t}:t)},e.generatePath=function(e,t){void 0===t&&(t={});let r=e;return r.endsWith("*")&&"*"!==r&&!r.endsWith("/*")&&(E(!1,'Route path "'+r+'" will be treated as if it were "'+r.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+r.replace(/\*$/,"/*")+'".'),r=r.replace(/\*$/,"/*")),r.replace(/^:(\w+)(\??)/g,((e,r,a)=>{let n=t[r];return"?"===a?null==n?"":n:(null==n&&o(!1,'Missing ":'+r+'" param'),n)})).replace(/\/:(\w+)(\??)/g,((e,r,a)=>{let n=t[r];return"?"===a?null==n?"":"/"+n:(null==n&&o(!1,'Missing ":'+r+'" param'),"/"+n)})).replace(/\?/g,"").replace(/(\/?)\*/,((e,r,a,o)=>null==t["*"]?"/*"===o?"/":"":""+r+t["*"]))},e.getStaticContextFromError=function(e,r,a){return t({},r,{statusCode:500,errors:{[r._deepestRenderedBoundaryId||e[0].id]:a}})},e.getToPathname=function(e){return""===e||""===e.pathname?"/":"string"==typeof e?c(e).pathname:e.pathname},e.invariant=o,e.isRouteErrorResponse=z,e.joinPaths=k,e.json=function(e,r){void 0===r&&(r={});let a="number"==typeof r?{status:r}:r,o=new Headers(a.headers);return o.has("Content-Type")||o.set("Content-Type","application/json; charset=utf-8"),new Response(JSON.stringify(e),t({},a,{headers:o}))},e.matchPath=D,e.matchRoutes=p,e.normalizePathname=x,e.parsePath=c,e.redirect=function(e,r){void 0===r&&(r=302);let a=r;"number"==typeof a?a={status:a}:void 0===a.status&&(a.status=302);let o=new Headers(a.headers);return o.set("Location",e),new Response(null,t({},a,{headers:o}))},e.resolvePath=P,e.resolveTo=L,e.stripBasename=R,e.warning=E,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).RemixRouter={})}(this,(function(e){"use strict";function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},t.apply(this,arguments)}var r;e.Action=void 0,(r=e.Action||(e.Action={})).Pop="POP",r.Push="PUSH",r.Replace="REPLACE";const a="popstate";function n(e,t){if(!1===e||null==e)throw new Error(t)}function o(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function i(e,t){return{usr:e.state,key:e.key,idx:t}}function s(e,r,a,n){return void 0===a&&(a=null),t({pathname:"string"==typeof e?e:e.pathname,search:"",hash:""},"string"==typeof r?c(r):r,{state:a,key:r&&r.key||n||Math.random().toString(36).substr(2,8)})}function l(e){let{pathname:t="/",search:r="",hash:a=""}=e;return r&&"?"!==r&&(t+="?"===r.charAt(0)?r:"?"+r),a&&"#"!==a&&(t+="#"===a.charAt(0)?a:"#"+a),t}function c(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let a=e.indexOf("?");a>=0&&(t.search=e.substr(a),e=e.substr(0,a)),e&&(t.pathname=e)}return t}function d(r,o,c,d){void 0===d&&(d={});let{window:u=document.defaultView,v5Compat:h=!1}=d,f=u.history,p=e.Action.Pop,m=null,g=v();function v(){return(f.state||{idx:null}).idx}function y(){p=e.Action.Pop;let t=v(),r=null==t?null:t-g;g=t,m&&m({action:p,location:w.location,delta:r})}function b(e){let t="null"!==u.location.origin?u.location.origin:u.location.href,r="string"==typeof e?e:l(e);return n(t,"No window.location.(origin|href) available to create URL for href: "+r),new URL(r,t)}null==g&&(g=0,f.replaceState(t({},f.state,{idx:g}),""));let w={get action(){return p},get location(){return r(u,f)},listen(e){if(m)throw new Error("A history only accepts one active listener");return u.addEventListener(a,y),m=e,()=>{u.removeEventListener(a,y),m=null}},createHref:e=>o(u,e),createURL:b,encodeLocation(e){let t=b(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(t,r){p=e.Action.Push;let a=s(w.location,t,r);c&&c(a,t),g=v()+1;let n=i(a,g),o=w.createHref(a);try{f.pushState(n,"",o)}catch(e){u.location.assign(o)}h&&m&&m({action:p,location:w.location,delta:1})},replace:function(t,r){p=e.Action.Replace;let a=s(w.location,t,r);c&&c(a,t),g=v();let n=i(a,g),o=w.createHref(a);f.replaceState(n,"",o),h&&m&&m({action:p,location:w.location,delta:0})},go:e=>f.go(e)};return w}let u;function h(e,r,a){return void 0===r&&(r=[]),void 0===a&&(a=new Set),e.map(((e,o)=>{let i=[...r,o],s="string"==typeof e.id?e.id:i.join("-");if(n(!0!==e.index||!e.children,"Cannot specify children on an index route"),n(!a.has(s),'Found a route id collision on id "'+s+"\". Route id's must be globally unique within Data Router usages"),a.add(s),function(e){return!0===e.index}(e)){return t({},e,{id:s})}return t({},e,{id:s,children:e.children?h(e.children,i,a):void 0})}))}function f(e,t,r){void 0===r&&(r="/");let a=A(("string"==typeof t?c(t):t).pathname||"/",r);if(null==a)return null;let n=p(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){return e.length===t.length&&e.slice(0,-1).every(((e,r)=>e===t[r]))?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(n);let o=null;for(let e=0;null==o&&e<n.length;++e)o=b(n[e],D(a));return o}function p(e,t,r,a){void 0===t&&(t=[]),void 0===r&&(r=[]),void 0===a&&(a="");let o=(e,o,i)=>{let s={relativePath:void 0===i?e.path||"":i,caseSensitive:!0===e.caseSensitive,childrenIndex:o,route:e};s.relativePath.startsWith("/")&&(n(s.relativePath.startsWith(a),'Absolute route path "'+s.relativePath+'" nested under path "'+a+'" is not valid. An absolute child route path must start with the combined path of all its parent routes.'),s.relativePath=s.relativePath.slice(a.length));let l=L([a,s.relativePath]),c=r.concat(s);e.children&&e.children.length>0&&(n(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+l+'".'),p(e.children,t,c,l)),(null!=e.path||e.index)&&t.push({path:l,score:y(l,e.index),routesMeta:c})};return e.forEach(((e,t)=>{var r;if(""!==e.path&&null!=(r=e.path)&&r.includes("?"))for(let r of m(e.path))o(e,t,r);else o(e,t)})),t}function m(e){let t=e.split("/");if(0===t.length)return[];let[r,...a]=t,n=r.endsWith("?"),o=r.replace(/\?$/,"");if(0===a.length)return n?[o,""]:[o];let i=m(a.join("/")),s=[];return s.push(...i.map((e=>""===e?o:[o,e].join("/")))),n&&s.push(...i),s.map((t=>e.startsWith("/")&&""===t?"/":t))}!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(u||(u={}));const g=/^:\w+$/,v=e=>"*"===e;function y(e,t){let r=e.split("/"),a=r.length;return r.some(v)&&(a+=-2),t&&(a+=2),r.filter((e=>!v(e))).reduce(((e,t)=>e+(g.test(t)?3:""===t?1:10)),a)}function b(e,t){let{routesMeta:r}=e,a={},n="/",o=[];for(let e=0;e<r.length;++e){let i=r[e],s=e===r.length-1,l="/"===n?t:t.slice(n.length)||"/",c=w({path:i.relativePath,caseSensitive:i.caseSensitive,end:s},l);if(!c)return null;Object.assign(a,c.params);let d=i.route;o.push({params:a,pathname:L([n,c.pathname]),pathnameBase:k(L([n,c.pathnameBase])),route:d}),"/"!==c.pathnameBase&&(n=L([n,c.pathnameBase]))}return o}function w(e,t){"string"==typeof e&&(e={path:e,caseSensitive:!1,end:!0});let[r,a]=function(e,t,r){void 0===t&&(t=!1);void 0===r&&(r=!0);R("*"===e||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were "'+e.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+e.replace(/\*$/,"/*")+'".');let a=[],n="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,((e,t)=>(a.push(t),"/([^\\/]+)")));e.endsWith("*")?(a.push("*"),n+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?n+="\\/*$":""!==e&&"/"!==e&&(n+="(?:(?=\\/|$))");return[new RegExp(n,t?void 0:"i"),a]}(e.path,e.caseSensitive,e.end),n=t.match(r);if(!n)return null;let o=n[0],i=o.replace(/(.)\/+$/,"$1"),s=n.slice(1);return{params:a.reduce(((e,t,r)=>{if("*"===t){let e=s[r]||"";i=o.slice(0,o.length-e.length).replace(/(.)\/+$/,"$1")}return e[t]=function(e,t){try{return decodeURIComponent(e)}catch(r){return R(!1,'The value for the URL param "'+t+'" will not be decoded because the string "'+e+'" is a malformed URL segment. This is probably due to a bad percent encoding ('+r+")."),e}}(s[r]||"",t),e}),{}),pathname:o,pathnameBase:i,pattern:e}}function D(e){try{return decodeURI(e)}catch(t){return R(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent encoding ('+t+")."),e}}function A(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,a=e.charAt(r);return a&&"/"!==a?null:e.slice(r)||"/"}function R(e,t){if(!e){"undefined"!=typeof console&&console.warn(t);try{throw new Error(t)}catch(e){}}}function E(e,t){void 0===t&&(t="/");let{pathname:r,search:a="",hash:n=""}="string"==typeof e?c(e):e,o=r?r.startsWith("/")?r:function(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?r.length>1&&r.pop():"."!==e&&r.push(e)})),r.length>1?r.join("/"):"/"}(r,t):t;return{pathname:o,search:x(a),hash:C(n)}}function P(e,t,r,a){return"Cannot include a '"+e+"' character in a manually specified `to."+t+"` field ["+JSON.stringify(a)+"]. Please separate it out to the `to."+r+'` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.'}function S(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}function M(e,r,a,o){let i;void 0===o&&(o=!1),"string"==typeof e?i=c(e):(i=t({},e),n(!i.pathname||!i.pathname.includes("?"),P("?","pathname","search",i)),n(!i.pathname||!i.pathname.includes("#"),P("#","pathname","hash",i)),n(!i.search||!i.search.includes("#"),P("#","search","hash",i)));let s,l=""===e||""===i.pathname,d=l?"/":i.pathname;if(o||null==d)s=a;else{let e=r.length-1;if(d.startsWith("..")){let t=d.split("/");for(;".."===t[0];)t.shift(),e-=1;i.pathname=t.join("/")}s=e>=0?r[e]:"/"}let u=E(i,s),h=d&&"/"!==d&&d.endsWith("/"),f=(l||"."===d)&&a.endsWith("/");return u.pathname.endsWith("/")||!h&&!f||(u.pathname+="/"),u}const L=e=>e.join("/").replace(/\/\/+/g,"/"),k=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),x=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",C=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";class U extends Error{}class T{constructor(e,t){let r;this.pendingKeysSet=new Set,this.subscribers=new Set,this.deferredKeys=[],n(e&&"object"==typeof e&&!Array.isArray(e),"defer() only accepts plain objects"),this.abortPromise=new Promise(((e,t)=>r=t)),this.controller=new AbortController;let a=()=>r(new U("Deferred data aborted"));this.unlistenAbortSignal=()=>this.controller.signal.removeEventListener("abort",a),this.controller.signal.addEventListener("abort",a),this.data=Object.entries(e).reduce(((e,t)=>{let[r,a]=t;return Object.assign(e,{[r]:this.trackPromise(r,a)})}),{}),this.done&&this.unlistenAbortSignal(),this.init=t}trackPromise(e,t){if(!(t instanceof Promise))return t;this.deferredKeys.push(e),this.pendingKeysSet.add(e);let r=Promise.race([t,this.abortPromise]).then((t=>this.onSettle(r,e,null,t)),(t=>this.onSettle(r,e,t)));return r.catch((()=>{})),Object.defineProperty(r,"_tracked",{get:()=>!0}),r}onSettle(e,t,r,a){return this.controller.signal.aborted&&r instanceof U?(this.unlistenAbortSignal(),Object.defineProperty(e,"_error",{get:()=>r}),Promise.reject(r)):(this.pendingKeysSet.delete(t),this.done&&this.unlistenAbortSignal(),r?(Object.defineProperty(e,"_error",{get:()=>r}),this.emit(!1,t),Promise.reject(r)):(Object.defineProperty(e,"_data",{get:()=>a}),this.emit(!1,t),a))}emit(e,t){this.subscribers.forEach((r=>r(e,t)))}subscribe(e){return this.subscribers.add(e),()=>this.subscribers.delete(e)}cancel(){this.controller.abort(),this.pendingKeysSet.forEach(((e,t)=>this.pendingKeysSet.delete(t))),this.emit(!0)}async resolveData(e){let t=!1;if(!this.done){let r=()=>this.cancel();e.addEventListener("abort",r),t=await new Promise((t=>{this.subscribe((a=>{e.removeEventListener("abort",r),(a||this.done)&&t(a)}))}))}return t}get done(){return 0===this.pendingKeysSet.size}get unwrappedData(){return n(null!==this.data&&this.done,"Can only unwrap data on initialized and settled deferreds"),Object.entries(this.data).reduce(((e,t)=>{let[r,a]=t;return Object.assign(e,{[r]:j(a)})}),{})}get pendingKeys(){return Array.from(this.pendingKeysSet)}}function j(e){if(!function(e){return e instanceof Promise&&!0===e._tracked}(e))return e;if(e._error)throw e._error;return e._data}class O{constructor(e,t,r,a){void 0===a&&(a=!1),this.status=e,this.statusText=t||"",this.internal=a,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function _(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"boolean"==typeof e.internal&&"data"in e}const F=["post","put","patch","delete"],H=new Set(F),I=["get",...F],q=new Set(I),W=new Set([301,302,303,307,308]),$=new Set([307,308]),N={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},B={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},z={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},K=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Y="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,J=!Y;const V=Symbol("deferred");function G(e,t,r){void 0===r&&(r=!1);let a,n="string"==typeof e?e:l(e);if(!t||!function(e){return null!=e&&"formData"in e}(t))return{path:n};if(t.formMethod&&!ve(t.formMethod))return{path:n,error:ce(405,{method:t.formMethod})};if(t.formData&&(a={formMethod:t.formMethod||"get",formAction:ue(n),formEncType:t&&t.formEncType||"application/x-www-form-urlencoded",formData:t.formData},ye(a.formMethod)))return{path:n,submission:a};let o=c(n),i=ae(t.formData);return r&&o.search&&De(o.search)&&i.append("index",""),o.search="?"+i,{path:l(o),submission:a}}function X(e,t){let r=e;if(t){let a=e.findIndex((e=>e.route.id===t));a>=0&&(r=e.slice(0,a))}return r}function Q(e,r,a,n,o,i,s,l,c,d,u,h,p){let m=p?Object.values(p)[0]:h?Object.values(h)[0]:void 0,g=e.createURL(r.location),v=e.createURL(o),y=i||g.toString()===v.toString()||g.search!==v.search,b=p?Object.keys(p)[0]:void 0,w=X(a,b).filter(((e,a)=>{if(null==e.route.loader)return!1;if(function(e,t,r){let a=!t||r.route.id!==t.route.id,n=void 0===e[r.route.id];return a||n}(r.loaderData,r.matches[a],e)||s.some((t=>t===e.route.id)))return!0;let o=r.matches[a],i=e;return ee(e,t({currentUrl:g,currentParams:o.params,nextUrl:v,nextParams:i.params},n,{actionResult:m,defaultShouldRevalidate:y||Z(o,i)}))})),D=[];return c.forEach(((e,o)=>{if(!a.some((t=>t.route.id===e.routeId)))return;let i=f(d,e.path,u);if(!i)return void D.push(t({key:o},e,{matches:null,match:null}));let s=Re(i,e.path);(l.includes(o)||ee(s,t({currentUrl:g,currentParams:r.matches[r.matches.length-1].params,nextUrl:v,nextParams:a[a.length-1].params},n,{actionResult:m,defaultShouldRevalidate:y})))&&D.push(t({key:o,matches:i,match:s},e))})),[w,D]}function Z(e,t){let r=e.route.path;return e.pathname!==t.pathname||null!=r&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function ee(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if("boolean"==typeof r)return r}return t.defaultShouldRevalidate}async function te(e,t,r,a,o,i,s,c){let d,h,f;void 0===o&&(o="/"),void 0===i&&(i=!1),void 0===s&&(s=!1);let p=new Promise(((e,t)=>f=t)),m=()=>f();t.signal.addEventListener("abort",m);try{let a=r.route[e];n(a,"Could not find the "+e+' to run on the "'+r.route.id+'" route'),h=await Promise.race([a({request:t,params:r.params,context:c}),p]),n(void 0!==h,"You defined "+("action"===e?"an action":"a loader")+' for route "'+r.route.id+"\" but didn't return anything from your `"+e+"` function. Please return a value or `null`.")}catch(e){d=u.error,h=e}finally{t.signal.removeEventListener("abort",m)}if(me(h)){let e,c=h.status;if(W.has(c)){let e=h.headers.get("Location");if(n(e,"Redirects returned/thrown from loaders/actions must have a Location header"),K.test(e)){if(!i){let r=new URL(t.url),a=e.startsWith("//")?new URL(r.protocol+e):new URL(e),n=null!=A(a.pathname,o);a.origin===r.origin&&n&&(e=a.pathname+a.search+a.hash)}}else{let i=M(e,S(a.slice(0,a.indexOf(r)+1)).map((e=>e.pathnameBase)),new URL(t.url).pathname);if(n(l(i),"Unable to resolve redirect location: "+e),o){let e=i.pathname;i.pathname="/"===e?o:L([o,e])}e=l(i)}if(i)throw h.headers.set("Location",e),h;return{type:u.redirect,status:c,location:e,revalidate:null!==h.headers.get("X-Remix-Revalidate")}}if(s)throw{type:d||u.data,response:h};let f=h.headers.get("Content-Type");return e=f&&/\bapplication\/json\b/.test(f)?await h.json():await h.text(),d===u.error?{type:d,error:new O(c,h.statusText,e),headers:h.headers}:{type:u.data,data:e,statusCode:h.status,headers:h.headers}}return d===u.error?{type:d,error:h}:h instanceof T?{type:u.deferred,deferredData:h,statusCode:null==(g=h.init)?void 0:g.status,headers:(null==(v=h.init)?void 0:v.headers)&&new Headers(h.init.headers)}:{type:u.data,data:h};var g,v}function re(e,t,r,a){let n=e.createURL(ue(t)).toString(),o={signal:r};if(a&&ye(a.formMethod)){let{formMethod:e,formEncType:t,formData:r}=a;o.method=e.toUpperCase(),o.body="application/x-www-form-urlencoded"===t?ae(r):r}return new Request(n,o)}function ae(e){let t=new URLSearchParams;for(let[r,a]of e.entries())t.append(r,a instanceof File?a.name:a);return t}function ne(e,t,r,a,o){let i,s={},l=null,c=!1,d={};return r.forEach(((r,u)=>{let h=t[u].route.id;if(n(!pe(r),"Cannot handle redirect results in processLoaderData"),fe(r)){let t=se(e,h),n=r.error;a&&(n=Object.values(a)[0],a=void 0),l=l||{},null==l[t.route.id]&&(l[t.route.id]=n),s[h]=void 0,c||(c=!0,i=_(r.error)?r.error.status:500),r.headers&&(d[h]=r.headers)}else he(r)?(o.set(h,r.deferredData),s[h]=r.deferredData.data):s[h]=r.data,null==r.statusCode||200===r.statusCode||c||(i=r.statusCode),r.headers&&(d[h]=r.headers)})),a&&(l=a,s[Object.keys(a)[0]]=void 0),{loaderData:s,errors:l,statusCode:i||200,loaderHeaders:d}}function oe(e,r,a,o,i,s,l,c){let{loaderData:d,errors:u}=ne(r,a,o,i,c);for(let r=0;r<s.length;r++){let{key:a,match:o}=s[r];n(void 0!==l&&void 0!==l[r],"Did not find corresponding fetcher result");let i=l[r];if(fe(i)){let r=se(e.matches,null==o?void 0:o.route.id);u&&u[r.route.id]||(u=t({},u,{[r.route.id]:i.error})),e.fetchers.delete(a)}else if(pe(i))n(!1,"Unhandled fetcher revalidation redirect");else if(he(i))n(!1,"Unhandled fetcher deferred data");else{let t={state:"idle",data:i.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};e.fetchers.set(a,t)}}return{loaderData:d,errors:u}}function ie(e,r,a,n){let o=t({},r);for(let t of a){let a=t.route.id;if(r.hasOwnProperty(a)?void 0!==r[a]&&(o[a]=r[a]):void 0!==e[a]&&t.route.loader&&(o[a]=e[a]),n&&n.hasOwnProperty(a))break}return o}function se(e,t){return(t?e.slice(0,e.findIndex((e=>e.route.id===t))+1):[...e]).reverse().find((e=>!0===e.route.hasErrorBoundary))||e[0]}function le(e){let t=e.find((e=>e.index||!e.path||"/"===e.path))||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function ce(e,t){let{pathname:r,routeId:a,method:n,type:o}=void 0===t?{}:t,i="Unknown Server Error",s="Unknown @remix-run/router error";return 400===e?(i="Bad Request",n&&r&&a?s="You made a "+n+' request to "'+r+'" but did not provide a `loader` for route "'+a+'", so there is no way to handle the request.':"defer-action"===o&&(s="defer() is not supported in actions")):403===e?(i="Forbidden",s='Route "'+a+'" does not match URL "'+r+'"'):404===e?(i="Not Found",s='No route matches URL "'+r+'"'):405===e&&(i="Method Not Allowed",n&&r&&a?s="You made a "+n.toUpperCase()+' request to "'+r+'" but did not provide an `action` for route "'+a+'", so there is no way to handle the request.':n&&(s='Invalid request method "'+n.toUpperCase()+'"')),new O(e||500,i,new Error(s),!0)}function de(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(pe(r))return r}}function ue(e){return l(t({},"string"==typeof e?c(e):e,{hash:""}))}function he(e){return e.type===u.deferred}function fe(e){return e.type===u.error}function pe(e){return(e&&e.type)===u.redirect}function me(e){return null!=e&&"number"==typeof e.status&&"string"==typeof e.statusText&&"object"==typeof e.headers&&void 0!==e.body}function ge(e){if(!me(e))return!1;let t=e.status,r=e.headers.get("Location");return t>=300&&t<=399&&null!=r}function ve(e){return q.has(e)}function ye(e){return H.has(e)}async function be(e,t,r,a,n,o){for(let i=0;i<r.length;i++){let s=r[i],l=t[i];if(!l)continue;let c=e.find((e=>e.route.id===l.route.id)),d=null!=c&&!Z(c,l)&&void 0!==(o&&o[l.route.id]);he(s)&&(n||d)&&await we(s,a,n).then((e=>{e&&(r[i]=e||r[i])}))}}async function we(e,t,r){if(void 0===r&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:u.data,data:e.deferredData.unwrappedData}}catch(e){return{type:u.error,error:e}}return{type:u.data,data:e.deferredData.data}}}function De(e){return new URLSearchParams(e).getAll("index").some((e=>""===e))}function Ae(e,t){let{route:r,pathname:a,params:n}=e;return{id:r.id,pathname:a,params:n,data:t[r.id],handle:r.handle}}function Re(e,t){let r="string"==typeof t?c(t).search:t.search;if(e[e.length-1].route.index&&De(r||""))return e[e.length-1];let a=S(e);return a[a.length-1]}e.AbortedDeferredError=U,e.ErrorResponse=O,e.IDLE_BLOCKER=z,e.IDLE_FETCHER=B,e.IDLE_NAVIGATION=N,e.UNSAFE_DEFERRED_SYMBOL=V,e.UNSAFE_DeferredData=T,e.UNSAFE_convertRoutesToDataRoutes=h,e.UNSAFE_getPathContributingMatches=S,e.UNSAFE_invariant=n,e.createBrowserHistory=function(e){return void 0===e&&(e={}),d((function(e,t){let{pathname:r,search:a,hash:n}=e.location;return s("",{pathname:r,search:a,hash:n},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){return"string"==typeof t?t:l(t)}),null,e)},e.createHashHistory=function(e){return void 0===e&&(e={}),d((function(e,t){let{pathname:r="/",search:a="",hash:n=""}=c(e.location.hash.substr(1));return s("",{pathname:r,search:a,hash:n},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){let r=e.document.querySelector("base"),a="";if(r&&r.getAttribute("href")){let t=e.location.href,r=t.indexOf("#");a=-1===r?t:t.slice(0,r)}return a+"#"+("string"==typeof t?t:l(t))}),(function(e,t){o("/"===e.pathname.charAt(0),"relative pathnames are not supported in hash history.push("+JSON.stringify(t)+")")}),e)},e.createMemoryHistory=function(t){void 0===t&&(t={});let r,{initialEntries:a=["/"],initialIndex:n,v5Compat:i=!1}=t;r=a.map(((e,t)=>m(e,"string"==typeof e?null:e.state,0===t?"default":void 0)));let d=f(null==n?r.length-1:n),u=e.Action.Pop,h=null;function f(e){return Math.min(Math.max(e,0),r.length-1)}function p(){return r[d]}function m(e,t,a){void 0===t&&(t=null);let n=s(r?p().pathname:"/",e,t,a);return o("/"===n.pathname.charAt(0),"relative pathnames are not supported in memory history: "+JSON.stringify(e)),n}function g(e){return"string"==typeof e?e:l(e)}return{get index(){return d},get action(){return u},get location(){return p()},createHref:g,createURL:e=>new URL(g(e),"http://localhost"),encodeLocation(e){let t="string"==typeof e?c(e):e;return{pathname:t.pathname||"",search:t.search||"",hash:t.hash||""}},push(t,a){u=e.Action.Push;let n=m(t,a);d+=1,r.splice(d,r.length,n),i&&h&&h({action:u,location:n,delta:1})},replace(t,a){u=e.Action.Replace;let n=m(t,a);r[d]=n,i&&h&&h({action:u,location:n,delta:0})},go(t){u=e.Action.Pop;let a=f(d+t),n=r[a];d=a,h&&h({action:u,location:n,delta:t})},listen:e=>(h=e,()=>{h=null})}},e.createPath=l,e.createRouter=function(r){n(r.routes.length>0,"You must provide a non-empty routes array to createRouter");let a,o=h(r.routes),i=null,l=new Set,c=null,d=null,p=null,m=null!=r.hydrationData,g=f(o,r.history.location,r.basename),v=null;if(null==g){let e=ce(404,{pathname:r.history.location.pathname}),{matches:t,route:a}=le(o);g=t,v={[a.id]:e}}let y,b,w=!g.some((e=>e.route.loader))||null!=r.hydrationData,D={historyAction:r.history.action,location:r.history.location,matches:g,initialized:w,navigation:N,restoreScrollPosition:null==r.hydrationData&&null,preventScrollReset:!1,revalidation:"idle",loaderData:r.hydrationData&&r.hydrationData.loaderData||{},actionData:r.hydrationData&&r.hydrationData.actionData||null,errors:r.hydrationData&&r.hydrationData.errors||v,fetchers:new Map,blockers:new Map},E=e.Action.Pop,P=!1,S=!1,M=!1,L=[],k=[],x=new Map,C=0,U=-1,T=new Map,j=new Set,O=new Map,_=new Map,F=new Map,H=!1;function I(e){D=t({},D,e),l.forEach((e=>e(D)))}function q(n,i){var s,l;let c,d=null!=D.actionData&&null!=D.navigation.formMethod&&ye(D.navigation.formMethod)&&"loading"===D.navigation.state&&!0!==(null==(s=n.state)?void 0:s._isRedirect);c=i.actionData?Object.keys(i.actionData).length>0?i.actionData:null:d?D.actionData:null;let u=i.loaderData?ie(D.loaderData,i.loaderData,i.matches||[],i.errors):D.loaderData;for(let[e]of F)ve(e);let h=!0===P||null!=D.navigation.formMethod&&ye(D.navigation.formMethod)&&!0!==(null==(l=n.state)?void 0:l._isRedirect);a&&(o=a,a=void 0),I(t({},i,{actionData:c,loaderData:u,historyAction:E,location:n,initialized:!0,navigation:N,revalidation:"idle",restoreScrollPosition:Se(n,i.matches||D.matches),preventScrollReset:h,blockers:new Map(D.blockers)})),S||E===e.Action.Pop||(E===e.Action.Push?r.history.push(n,n.state):E===e.Action.Replace&&r.history.replace(n,n.state)),E=e.Action.Pop,P=!1,S=!1,M=!1,L=[],k=[]}async function W(i,s,l){b&&b.abort(),b=null,E=i,S=!0===(l&&l.startUninterruptedRevalidation),function(e,t){if(c&&d&&p){let r=t.map((e=>Ae(e,D.loaderData))),a=d(e,r)||e.key;c[a]=p()}}(D.location,D.matches),P=!0===(l&&l.preventScrollReset);let h=a||o,m=l&&l.overrideNavigation,g=f(h,s,r.basename);if(!g){let e=ce(404,{pathname:s.pathname}),{matches:t,route:r}=le(h);return Pe(),void q(s,{matches:t,loaderData:{},errors:{[r.id]:e}})}if(!(v=D.location,w=s,v.pathname!==w.pathname||v.search!==w.search||v.hash===w.hash||l&&l.submission&&ye(l.submission.formMethod)))return void q(s,{matches:g});var v,w;b=new AbortController;let A,R,T=re(r.history,s,b.signal,l&&l.submission);if(l&&l.pendingError)R={[se(g).route.id]:l.pendingError};else if(l&&l.submission&&ye(l.submission.formMethod)){let r=await async function(r,a,n,o,i){let s;ee(),I({navigation:t({state:"submitting",location:a},n)});let l=Re(o,a);if(l.route.action){if(s=await te("action",r,l,o,y.basename),r.signal.aborted)return{shortCircuited:!0}}else s={type:u.error,error:ce(405,{method:r.method,pathname:a.pathname,routeId:l.route.id})};if(pe(s)){let e;return e=i&&null!=i.replace?i.replace:s.location===D.location.pathname+D.location.search,await X(D,s,{submission:n,replace:e}),{shortCircuited:!0}}if(fe(s)){let t=se(o,l.route.id);return!0!==(i&&i.replace)&&(E=e.Action.Push),{pendingActionData:{},pendingActionError:{[t.route.id]:s.error}}}if(he(s))throw ce(400,{type:"defer-action"});return{pendingActionData:{[l.route.id]:s.data}}}(T,s,l.submission,g,{replace:l.replace});if(r.shortCircuited)return;A=r.pendingActionData,R=r.pendingActionError,m=t({state:"loading",location:s},l.submission),T=new Request(T.url,{signal:T.signal})}let{shortCircuited:F,loaderData:H,errors:W}=await async function(e,i,s,l,c,d,u,h){let f=l;if(!f){f=t({state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},c)}let p=c||(f.formMethod&&f.formAction&&f.formData&&f.formEncType?{formMethod:f.formMethod,formAction:f.formAction,formData:f.formData,formEncType:f.formEncType}:void 0),m=a||o,[g,v]=Q(r.history,D,s,p,i,M,L,k,O,m,r.basename,u,h);if(Pe((e=>!(s&&s.some((t=>t.route.id===e)))||g&&g.some((t=>t.route.id===e)))),0===g.length&&0===v.length)return q(i,t({matches:s,loaderData:{},errors:h||null},u?{actionData:u}:{})),{shortCircuited:!0};if(!S){v.forEach((e=>{let t=D.fetchers.get(e.key),r={state:"loading",data:t&&t.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};D.fetchers.set(e.key,r)}));let e=u||D.actionData;I(t({navigation:f},e?0===Object.keys(e).length?{actionData:null}:{actionData:e}:{},v.length>0?{fetchers:new Map(D.fetchers)}:{}))}U=++C,v.forEach((e=>x.set(e.key,b)));let{results:y,loaderResults:w,fetcherResults:A}=await Z(D.matches,s,g,v,e);if(e.signal.aborted)return{shortCircuited:!0};v.forEach((e=>x.delete(e.key)));let R=de(y);if(R)return await X(D,R,{replace:d}),{shortCircuited:!0};let{loaderData:E,errors:P}=oe(D,s,g,w,h,v,A,_);_.forEach(((e,t)=>{e.subscribe((r=>{(r||e.done)&&_.delete(t)}))})),function(){let e=[];for(let t of j){let r=D.fetchers.get(t);n(r,"Expected fetcher: "+t),"loading"===r.state&&(j.delete(t),e.push(t))}me(e)}();let T=ge(U);return t({loaderData:E,errors:P},T||v.length>0?{fetchers:new Map(D.fetchers)}:{})}(T,s,g,m,l&&l.submission,l&&l.replace,A,R);F||(b=null,q(s,t({matches:g},A?{actionData:A}:{},{loaderData:H,errors:W})))}function V(e){return D.fetchers.get(e)||B}async function X(a,o,i){var l;let{submission:c,replace:d,isFetchActionRedirect:u}=void 0===i?{}:i;o.revalidate&&(M=!0);let h=s(a.location,o.location,t({_isRedirect:!0},u?{_isFetchActionRedirect:!0}:{}));if(n(h,"Expected a location on the redirect navigation"),K.test(o.location)&&Y&&void 0!==(null==(l=window)?void 0:l.location)){let e=r.history.createURL(o.location),t=null==A(e.pathname,r.basename||"/");if(window.location.origin!==e.origin||t)return void(d?window.location.replace(o.location):window.location.assign(o.location))}b=null;let f=!0===d?e.Action.Replace:e.Action.Push,{formMethod:p,formAction:m,formEncType:g,formData:v}=a.navigation;!c&&p&&m&&v&&g&&(c={formMethod:p,formAction:m,formEncType:g,formData:v}),$.has(o.status)&&c&&ye(c.formMethod)?await W(f,h,{submission:t({},c,{formAction:o.location}),preventScrollReset:P}):await W(f,h,{overrideNavigation:{state:"loading",location:h,formMethod:c?c.formMethod:void 0,formAction:c?c.formAction:void 0,formEncType:c?c.formEncType:void 0,formData:c?c.formData:void 0},preventScrollReset:P})}async function Z(e,t,a,n,o){let i=await Promise.all([...a.map((e=>te("loader",o,e,t,y.basename))),...n.map((e=>{if(e.matches&&e.match)return te("loader",re(r.history,e.path,o.signal),e.match,e.matches,y.basename);return{type:u.error,error:ce(404,{pathname:e.path})}}))]),s=i.slice(0,a.length),l=i.slice(a.length);return await Promise.all([be(e,a,s,o.signal,!1,D.loaderData),be(e,n.map((e=>e.match)),l,o.signal,!0)]),{results:i,loaderResults:s,fetcherResults:l}}function ee(){M=!0,L.push(...Pe()),O.forEach(((e,t)=>{x.has(t)&&(k.push(t),ue(t))}))}function ae(e,t,r){let a=se(D.matches,t);ne(e),I({errors:{[a.route.id]:r},fetchers:new Map(D.fetchers)})}function ne(e){x.has(e)&&ue(e),O.delete(e),T.delete(e),j.delete(e),D.fetchers.delete(e)}function ue(e){let t=x.get(e);n(t,"Expected fetch controller: "+e),t.abort(),x.delete(e)}function me(e){for(let t of e){let e={state:"idle",data:V(t).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};D.fetchers.set(t,e)}}function ge(e){let t=[];for(let[r,a]of T)if(a<e){let e=D.fetchers.get(r);n(e,"Expected fetcher: "+r),"loading"===e.state&&(ue(r),T.delete(r),t.push(r))}return me(t),t.length>0}function ve(e){D.blockers.delete(e),F.delete(e)}function De(e,t){let r=D.blockers.get(e)||z;n("unblocked"===r.state&&"blocked"===t.state||"blocked"===r.state&&"blocked"===t.state||"blocked"===r.state&&"proceeding"===t.state||"blocked"===r.state&&"unblocked"===t.state||"proceeding"===r.state&&"unblocked"===t.state,"Invalid blocker state transition: "+r.state+" -> "+t.state),D.blockers.set(e,t),I({blockers:new Map(D.blockers)})}function Ee(e){let{currentLocation:t,nextLocation:r,historyAction:a}=e;if(0===F.size)return;F.size>1&&R(!1,"A router only supports one blocker at a time");let n=Array.from(F.entries()),[o,i]=n[n.length-1],s=D.blockers.get(o);return s&&"proceeding"===s.state?void 0:i({currentLocation:t,nextLocation:r,historyAction:a})?o:void 0}function Pe(e){let t=[];return _.forEach(((r,a)=>{e&&!e(a)||(r.cancel(),t.push(a),_.delete(a))})),t}function Se(e,t){if(c&&d&&p){let r=t.map((e=>Ae(e,D.loaderData))),a=d(e,r)||e.key,n=c[a];if("number"==typeof n)return n}return null}return y={get basename(){return r.basename},get state(){return D},get routes(){return o},initialize:function(){return i=r.history.listen((e=>{let{action:t,location:a,delta:n}=e;if(H)return void(H=!1);R(0===F.size||null!=n,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let o=Ee({currentLocation:D.location,nextLocation:a,historyAction:t});return o&&null!=n?(H=!0,r.history.go(-1*n),void De(o,{state:"blocked",location:a,proceed(){De(o,{state:"proceeding",proceed:void 0,reset:void 0,location:a}),r.history.go(n)},reset(){ve(o),I({blockers:new Map(y.state.blockers)})}})):W(t,a)})),D.initialized||W(e.Action.Pop,D.location),y},subscribe:function(e){return l.add(e),()=>l.delete(e)},enableScrollRestoration:function(e,t,r){if(c=e,p=t,d=r||(e=>e.key),!m&&D.navigation===N){m=!0;let e=Se(D.location,D.matches);null!=e&&I({restoreScrollPosition:e})}return()=>{c=null,p=null,d=null}},navigate:async function a(n,o){if("number"==typeof n)return void r.history.go(n);let{path:i,submission:l,error:c}=G(n,o),d=D.location,u=s(D.location,i,o&&o.state);u=t({},u,r.history.encodeLocation(u));let h=o&&null!=o.replace?o.replace:void 0,f=e.Action.Push;!0===h?f=e.Action.Replace:!1===h||null!=l&&ye(l.formMethod)&&l.formAction===D.location.pathname+D.location.search&&(f=e.Action.Replace);let p=o&&"preventScrollReset"in o?!0===o.preventScrollReset:void 0,m=Ee({currentLocation:d,nextLocation:u,historyAction:f});if(!m)return await W(f,u,{submission:l,pendingError:c,preventScrollReset:p,replace:o&&o.replace});De(m,{state:"blocked",location:u,proceed(){De(m,{state:"proceeding",proceed:void 0,reset:void 0,location:u}),a(n,o)},reset(){ve(m),I({blockers:new Map(D.blockers)})}})},fetch:function(e,i,s,l){if(J)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");x.has(e)&&ue(e);let c=f(a||o,s,r.basename);if(!c)return void ae(e,i,ce(404,{pathname:s}));let{path:d,submission:u}=G(s,l,!0),h=Re(c,d);P=!0===(l&&l.preventScrollReset),u&&ye(u.formMethod)?async function(e,i,s,l,c,d){if(ee(),O.delete(e),!l.route.action){let t=ce(405,{method:d.formMethod,pathname:s,routeId:i});return void ae(e,i,t)}let u=D.fetchers.get(e),h=t({state:"submitting"},d,{data:u&&u.data," _hasFetcherDoneAnything ":!0});D.fetchers.set(e,h),I({fetchers:new Map(D.fetchers)});let p=new AbortController,m=re(r.history,s,p.signal,d);x.set(e,p);let g=await te("action",m,l,c,y.basename);if(m.signal.aborted)return void(x.get(e)===p&&x.delete(e));if(pe(g)){x.delete(e),j.add(e);let r=t({state:"loading"},d,{data:void 0," _hasFetcherDoneAnything ":!0});return D.fetchers.set(e,r),I({fetchers:new Map(D.fetchers)}),X(D,g,{isFetchActionRedirect:!0})}if(fe(g))return void ae(e,i,g.error);if(he(g))throw ce(400,{type:"defer-action"});let v=D.navigation.location||D.location,w=re(r.history,v,p.signal),A=a||o,R="idle"!==D.navigation.state?f(A,D.navigation.location,r.basename):D.matches;n(R,"Didn't find any matches after fetcher action");let P=++C;T.set(e,P);let S=t({state:"loading",data:g.data},d,{" _hasFetcherDoneAnything ":!0});D.fetchers.set(e,S);let[F,H]=Q(r.history,D,R,d,v,M,L,k,O,A,r.basename,{[l.route.id]:g.data},void 0);H.filter((t=>t.key!==e)).forEach((e=>{let t=e.key,r=D.fetchers.get(t),a={state:"loading",data:r&&r.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};D.fetchers.set(t,a),x.set(t,p)})),I({fetchers:new Map(D.fetchers)});let{results:W,loaderResults:$,fetcherResults:N}=await Z(D.matches,R,F,H,w);if(p.signal.aborted)return;T.delete(e),x.delete(e),H.forEach((e=>x.delete(e.key)));let B=de(W);if(B)return X(D,B);let{loaderData:z,errors:K}=oe(D,D.matches,F,$,void 0,H,N,_),Y={state:"idle",data:g.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};D.fetchers.set(e,Y);let J=ge(P);"loading"===D.navigation.state&&P>U?(n(E,"Expected pending action"),b&&b.abort(),q(D.navigation.location,{matches:R,loaderData:z,errors:K,fetchers:new Map(D.fetchers)})):(I(t({errors:K,loaderData:ie(D.loaderData,z,R,K)},J?{fetchers:new Map(D.fetchers)}:{})),M=!1)}(e,i,d,h,c,u):(O.set(e,{routeId:i,path:d}),async function(e,a,o,i,s,l){let c=D.fetchers.get(e),d=t({state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},l,{data:c&&c.data," _hasFetcherDoneAnything ":!0});D.fetchers.set(e,d),I({fetchers:new Map(D.fetchers)});let u=new AbortController,h=re(r.history,o,u.signal);x.set(e,u);let f=await te("loader",h,i,s,y.basename);he(f)&&(f=await we(f,h.signal,!0)||f);x.get(e)===u&&x.delete(e);if(h.signal.aborted)return;if(pe(f))return void await X(D,f);if(fe(f)){let t=se(D.matches,a);return D.fetchers.delete(e),void I({fetchers:new Map(D.fetchers),errors:{[t.route.id]:f.error}})}n(!he(f),"Unhandled fetcher deferred data");let p={state:"idle",data:f.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};D.fetchers.set(e,p),I({fetchers:new Map(D.fetchers)})}(e,i,d,h,c,u))},revalidate:function(){ee(),I({revalidation:"loading"}),"submitting"!==D.navigation.state&&("idle"!==D.navigation.state?W(E||D.historyAction,D.navigation.location,{overrideNavigation:D.navigation}):W(D.historyAction,D.location,{startUninterruptedRevalidation:!0}))},createHref:e=>r.history.createHref(e),encodeLocation:e=>r.history.encodeLocation(e),getFetcher:V,deleteFetcher:ne,dispose:function(){i&&i(),l.clear(),b&&b.abort(),D.fetchers.forEach(((e,t)=>ne(t))),D.blockers.forEach(((e,t)=>ve(t)))},getBlocker:function(e,t){let r=D.blockers.get(e)||z;return F.get(e)!==t&&F.set(e,t),r},deleteBlocker:ve,_internalFetchControllers:x,_internalActiveDeferreds:_,_internalSetRoutes:function(e){a=e}},y},e.createStaticHandler=function(e,r){n(e.length>0,"You must provide a non-empty routes array to createStaticHandler");let a=h(e),o=(r?r.basename:null)||"/";async function i(e,r,a,i,s){n(e.signal,"query()/queryRoute() requests must contain an AbortController signal");try{if(ye(e.method.toLowerCase())){let n=await async function(e,r,a,n,i){let s;if(a.route.action){if(s=await te("action",e,a,r,o,!0,i,n),e.signal.aborted){throw new Error((i?"queryRoute":"query")+"() call aborted")}}else{let t=ce(405,{method:e.method,pathname:new URL(e.url).pathname,routeId:a.route.id});if(i)throw t;s={type:u.error,error:t}}if(pe(s))throw new Response(null,{status:s.status,headers:{Location:s.location}});if(he(s)){let e=ce(400,{type:"defer-action"});if(i)throw e;s={type:u.error,error:e}}if(i){if(fe(s))throw s.error;return{matches:[a],loaderData:{},actionData:{[a.route.id]:s.data},errors:null,statusCode:200,loaderHeaders:{},actionHeaders:{},activeDeferreds:null}}if(fe(s)){let o=se(r,a.route.id);return t({},await c(e,r,n,void 0,{[o.route.id]:s.error}),{statusCode:_(s.error)?s.error.status:500,actionData:null,actionHeaders:t({},s.headers?{[a.route.id]:s.headers}:{})})}let l=new Request(e.url,{headers:e.headers,redirect:e.redirect,signal:e.signal});return t({},await c(l,r,n),s.statusCode?{statusCode:s.statusCode}:{},{actionData:{[a.route.id]:s.data},actionHeaders:t({},s.headers?{[a.route.id]:s.headers}:{})})}(e,a,s||Re(a,r),i,null!=s);return n}let n=await c(e,a,i,s);return me(n)?n:t({},n,{actionData:null,actionHeaders:{}})}catch(e){if((l=e)&&me(l.response)&&(l.type===u.data||u.error)){if(e.type===u.error&&!ge(e.response))throw e.response;return e.response}if(ge(e))return e;throw e}var l}async function c(e,r,a,n,i){let s=null!=n;if(s&&(null==n||!n.route.loader))throw ce(400,{method:e.method,pathname:new URL(e.url).pathname,routeId:null==n?void 0:n.route.id});let l=(n?[n]:X(r,Object.keys(i||{})[0])).filter((e=>e.route.loader));if(0===l.length)return{matches:r,loaderData:r.reduce(((e,t)=>Object.assign(e,{[t.route.id]:null})),{}),errors:i||null,statusCode:200,loaderHeaders:{},activeDeferreds:null};let c=await Promise.all([...l.map((t=>te("loader",e,t,r,o,!0,s,a)))]);if(e.signal.aborted){throw new Error((s?"queryRoute":"query")+"() call aborted")}let d=new Map,u=ne(r,l,c,i,d),h=new Set(l.map((e=>e.route.id)));return r.forEach((e=>{h.has(e.route.id)||(u.loaderData[e.route.id]=null)})),t({},u,{matches:r,activeDeferreds:d.size>0?Object.fromEntries(d.entries()):null})}return{dataRoutes:a,query:async function(e,r){let{requestContext:n}=void 0===r?{}:r,c=new URL(e.url),d=e.method.toLowerCase(),u=s("",l(c),null,"default"),h=f(a,u,o);if(!ve(d)&&"head"!==d){let e=ce(405,{method:d}),{matches:t,route:r}=le(a);return{basename:o,location:u,matches:t,loaderData:{},actionData:null,errors:{[r.id]:e},statusCode:e.status,loaderHeaders:{},actionHeaders:{},activeDeferreds:null}}if(!h){let e=ce(404,{pathname:u.pathname}),{matches:t,route:r}=le(a);return{basename:o,location:u,matches:t,loaderData:{},actionData:null,errors:{[r.id]:e},statusCode:e.status,loaderHeaders:{},actionHeaders:{},activeDeferreds:null}}let p=await i(e,u,h,n);return me(p)?p:t({location:u,basename:o},p)},queryRoute:async function(e,t){let{routeId:r,requestContext:n}=void 0===t?{}:t,c=new URL(e.url),d=e.method.toLowerCase(),u=s("",l(c),null,"default"),h=f(a,u,o);if(!ve(d)&&"head"!==d&&"options"!==d)throw ce(405,{method:d});if(!h)throw ce(404,{pathname:u.pathname});let p=r?h.find((e=>e.route.id===r)):Re(h,u);if(r&&!p)throw ce(403,{pathname:u.pathname,routeId:r});if(!p)throw ce(404,{pathname:u.pathname});let m=await i(e,u,h,n,p);if(me(m))return m;let g=m.errors?Object.values(m.errors)[0]:void 0;if(void 0!==g)throw g;if(m.actionData)return Object.values(m.actionData)[0];if(m.loaderData){var v;let e=Object.values(m.loaderData)[0];return null!=(v=m.activeDeferreds)&&v[p.route.id]&&(e[V]=m.activeDeferreds[p.route.id]),e}}}},e.defer=function(e,t){return void 0===t&&(t={}),new T(e,"number"==typeof t?{status:t}:t)},e.generatePath=function(e,t){void 0===t&&(t={});let r=e;return r.endsWith("*")&&"*"!==r&&!r.endsWith("/*")&&(R(!1,'Route path "'+r+'" will be treated as if it were "'+r.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+r.replace(/\*$/,"/*")+'".'),r=r.replace(/\*$/,"/*")),r.replace(/^:(\w+)(\??)/g,((e,r,a)=>{let o=t[r];return"?"===a?null==o?"":o:(null==o&&n(!1,'Missing ":'+r+'" param'),o)})).replace(/\/:(\w+)(\??)/g,((e,r,a)=>{let o=t[r];return"?"===a?null==o?"":"/"+o:(null==o&&n(!1,'Missing ":'+r+'" param'),"/"+o)})).replace(/\?/g,"").replace(/(\/?)\*/,((e,r,a,n)=>null==t["*"]?"/*"===n?"/":"":""+r+t["*"]))},e.getStaticContextFromError=function(e,r,a){return t({},r,{statusCode:500,errors:{[r._deepestRenderedBoundaryId||e[0].id]:a}})},e.getToPathname=function(e){return""===e||""===e.pathname?"/":"string"==typeof e?c(e).pathname:e.pathname},e.isRouteErrorResponse=_,e.joinPaths=L,e.json=function(e,r){void 0===r&&(r={});let a="number"==typeof r?{status:r}:r,n=new Headers(a.headers);return n.has("Content-Type")||n.set("Content-Type","application/json; charset=utf-8"),new Response(JSON.stringify(e),t({},a,{headers:n}))},e.matchPath=w,e.matchRoutes=f,e.normalizePathname=k,e.parsePath=c,e.redirect=function(e,r){void 0===r&&(r=302);let a=r;"number"==typeof a?a={status:a}:void 0===a.status&&(a.status=302);let n=new Headers(a.headers);return n.set("Location",e),new Response(null,t({},a,{headers:n}))},e.resolvePath=E,e.resolveTo=M,e.stripBasename=A,e.warning=R,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=router.umd.min.js.map |
@@ -121,23 +121,2 @@ import type { Location, Path, To } from "./history"; | ||
/** | ||
* Function provided by the framework-aware layers to set `hasErrorBoundary` | ||
* from the framework-aware `errorElement` prop | ||
*/ | ||
export interface HasErrorBoundaryFunction { | ||
(route: AgnosticRouteObject): boolean; | ||
} | ||
/** | ||
* Keys we cannot change from within a lazy() function. We spread all other keys | ||
* onto the route. Either they're meaningful to the router, or they'll get | ||
* ignored. | ||
*/ | ||
export declare type ImmutableRouteKey = "caseSensitive" | "path" | "id" | "index" | "children"; | ||
export declare const immutableRouteKeys: Set<ImmutableRouteKey>; | ||
/** | ||
* lazy() function to load a route definition, which can add non-matching | ||
* related properties to a route | ||
*/ | ||
export interface LazyRouteFunction<R extends AgnosticRouteObject> { | ||
(): Promise<Omit<R, ImmutableRouteKey>>; | ||
} | ||
/** | ||
* Base RouteObject with common props shared by all types of routes | ||
@@ -154,3 +133,2 @@ */ | ||
handle?: any; | ||
lazy?: LazyRouteFunction<AgnosticBaseRouteObject>; | ||
}; | ||
@@ -187,3 +165,2 @@ /** | ||
export declare type AgnosticDataRouteObject = AgnosticDataIndexRouteObject | AgnosticDataNonIndexRouteObject; | ||
export declare type RouteManifest = Record<string, AgnosticDataRouteObject | undefined>; | ||
declare type _PathParam<Path extends string> = Path extends `${infer L}/${infer R}` ? _PathParam<L> | _PathParam<R> : Path extends `:${infer Param}` ? Param extends `${infer Optional}?` ? Optional : Param : never; | ||
@@ -232,3 +209,3 @@ /** | ||
} | ||
export declare function convertRoutesToDataRoutes(routes: AgnosticRouteObject[], hasErrorBoundary: HasErrorBoundaryFunction, parentPath?: number[], manifest?: RouteManifest): AgnosticDataRouteObject[]; | ||
export declare function convertRoutesToDataRoutes(routes: AgnosticRouteObject[], parentPath?: number[], allIds?: Set<string>): AgnosticDataRouteObject[]; | ||
/** | ||
@@ -235,0 +212,0 @@ * Matches the given routes to a location and returns the match data. |
@@ -12,3 +12,2 @@ export type { | ||
AgnosticRouteObject, | ||
LazyRouteFunction, | ||
TrackedPromise, | ||
@@ -68,3 +67,2 @@ FormEncType, | ||
createMemoryHistory, | ||
invariant, | ||
parsePath, | ||
@@ -83,3 +81,2 @@ } from "./history"; | ||
/** @internal */ | ||
export type { RouteManifest as UNSAFE_RouteManifest } from "./utils"; | ||
export { | ||
@@ -90,1 +87,3 @@ DeferredData as UNSAFE_DeferredData, | ||
} from "./utils"; | ||
export { invariant as UNSAFE_invariant } from "./history"; |
{ | ||
"name": "@remix-run/router", | ||
"version": "0.0.0-experimental-63b6834e", | ||
"version": "0.0.0-experimental-ba938b84", | ||
"description": "Nested/Data-driven/Framework-agnostic Routing", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
68
utils.ts
@@ -143,38 +143,2 @@ import type { Location, Path, To } from "./history"; | ||
/** | ||
* Function provided by the framework-aware layers to set `hasErrorBoundary` | ||
* from the framework-aware `errorElement` prop | ||
*/ | ||
export interface HasErrorBoundaryFunction { | ||
(route: AgnosticRouteObject): boolean; | ||
} | ||
/** | ||
* Keys we cannot change from within a lazy() function. We spread all other keys | ||
* onto the route. Either they're meaningful to the router, or they'll get | ||
* ignored. | ||
*/ | ||
export type ImmutableRouteKey = | ||
| "caseSensitive" | ||
| "path" | ||
| "id" | ||
| "index" | ||
| "children"; | ||
export const immutableRouteKeys = new Set<ImmutableRouteKey>([ | ||
"caseSensitive", | ||
"path", | ||
"id", | ||
"index", | ||
"children", | ||
]); | ||
/** | ||
* lazy() function to load a route definition, which can add non-matching | ||
* related properties to a route | ||
*/ | ||
export interface LazyRouteFunction<R extends AgnosticRouteObject> { | ||
(): Promise<Omit<R, ImmutableRouteKey>>; | ||
} | ||
/** | ||
* Base RouteObject with common props shared by all types of routes | ||
@@ -191,3 +155,2 @@ */ | ||
handle?: any; | ||
lazy?: LazyRouteFunction<AgnosticBaseRouteObject>; | ||
}; | ||
@@ -235,4 +198,2 @@ | ||
export type RouteManifest = Record<string, AgnosticDataRouteObject | undefined>; | ||
// Recursive helper for finding path parameters in the absence of wildcards | ||
@@ -322,5 +283,4 @@ type _PathParam<Path extends string> = | ||
routes: AgnosticRouteObject[], | ||
hasErrorBoundary: HasErrorBoundaryFunction, | ||
parentPath: number[] = [], | ||
manifest: RouteManifest = {} | ||
allIds: Set<string> = new Set<string>() | ||
): AgnosticDataRouteObject[] { | ||
@@ -335,14 +295,10 @@ return routes.map((route, index) => { | ||
invariant( | ||
!manifest[id], | ||
!allIds.has(id), | ||
`Found a route id collision on id "${id}". Route ` + | ||
"id's must be globally unique within Data Router usages" | ||
); | ||
allIds.add(id); | ||
if (isIndexRoute(route)) { | ||
let indexRoute: AgnosticDataIndexRouteObject = { | ||
...route, | ||
hasErrorBoundary: hasErrorBoundary(route), | ||
id, | ||
}; | ||
manifest[id] = indexRoute; | ||
let indexRoute: AgnosticDataIndexRouteObject = { ...route, id }; | ||
return indexRoute; | ||
@@ -353,16 +309,6 @@ } else { | ||
id, | ||
hasErrorBoundary: hasErrorBoundary(route), | ||
children: undefined, | ||
children: route.children | ||
? convertRoutesToDataRoutes(route.children, treePath, allIds) | ||
: undefined, | ||
}; | ||
manifest[id] = pathOrLayoutRoute; | ||
if (route.children) { | ||
pathOrLayoutRoute.children = convertRoutesToDataRoutes( | ||
route.children, | ||
hasErrorBoundary, | ||
treePath, | ||
manifest | ||
); | ||
} | ||
return pathOrLayoutRoute; | ||
@@ -369,0 +315,0 @@ } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1871226
16846