@tanstack/react-router 1.97.8 → 1.97.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Match.cjs +8 -24
- package/dist/cjs/Match.cjs.map +1 -1
- package/dist/cjs/Matches.cjs +1 -1
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/RouterProvider.cjs.map +1 -1
- package/dist/cjs/RouterProvider.d.cts +0 -1
- package/dist/cjs/ScriptOnce.cjs +19 -4
- package/dist/cjs/ScriptOnce.cjs.map +1 -1
- package/dist/cjs/ScriptOnce.d.cts +2 -1
- package/dist/cjs/Transitioner.cjs +1 -2
- package/dist/cjs/Transitioner.cjs.map +1 -1
- package/dist/cjs/awaited.cjs +1 -22
- package/dist/cjs/awaited.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -7
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +4 -6
- package/dist/cjs/router.cjs +11 -129
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +33 -93
- package/dist/cjs/routerContext.cjs.map +1 -1
- package/dist/cjs/routerContext.d.cts +7 -2
- package/dist/cjs/serializer.d.cts +15 -0
- package/dist/esm/Match.js +9 -25
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.js +1 -1
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.d.ts +0 -1
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/ScriptOnce.d.ts +2 -1
- package/dist/esm/ScriptOnce.js +19 -4
- package/dist/esm/ScriptOnce.js.map +1 -1
- package/dist/esm/Transitioner.js +1 -2
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/awaited.js +1 -22
- package/dist/esm/awaited.js.map +1 -1
- package/dist/esm/index.d.ts +4 -6
- package/dist/esm/index.js +1 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/router.d.ts +33 -93
- package/dist/esm/router.js +11 -129
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/routerContext.d.ts +7 -2
- package/dist/esm/routerContext.js.map +1 -1
- package/dist/esm/serializer.d.ts +15 -0
- package/package.json +1 -1
- package/src/Match.tsx +4 -29
- package/src/Matches.tsx +1 -1
- package/src/RouterProvider.tsx +3 -3
- package/src/ScriptOnce.tsx +22 -4
- package/src/Transitioner.tsx +1 -1
- package/src/awaited.tsx +3 -25
- package/src/index.tsx +12 -34
- package/src/router.ts +44 -271
- package/src/routerContext.tsx +7 -1
- package/src/serializer.ts +24 -0
- package/dist/cjs/isServerSideError.cjs +0 -22
- package/dist/cjs/isServerSideError.cjs.map +0 -1
- package/dist/cjs/isServerSideError.d.cts +0 -5
- package/dist/cjs/transformer.cjs +0 -137
- package/dist/cjs/transformer.cjs.map +0 -1
- package/dist/cjs/transformer.d.cts +0 -16
- package/dist/esm/isServerSideError.d.ts +0 -5
- package/dist/esm/isServerSideError.js +0 -22
- package/dist/esm/isServerSideError.js.map +0 -1
- package/dist/esm/transformer.d.ts +0 -16
- package/dist/esm/transformer.js +0 -137
- package/dist/esm/transformer.js.map +0 -1
- package/src/isServerSideError.tsx +0 -23
- package/src/transformer.ts +0 -192
package/dist/esm/awaited.js
CHANGED
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import warning from "tiny-warning";
|
|
4
|
-
import { useRouter } from "./useRouter.js";
|
|
5
|
-
import { defaultSerializeError } from "./router.js";
|
|
6
3
|
import { defer, TSR_DEFERRED_PROMISE } from "./defer.js";
|
|
7
|
-
import { isServerSideError, defaultDeserializeError } from "./isServerSideError.js";
|
|
8
4
|
function useAwaited({
|
|
9
5
|
promise: _promise
|
|
10
6
|
}) {
|
|
11
|
-
var _a, _b;
|
|
12
|
-
const router = useRouter();
|
|
13
7
|
const promise = defer(_promise);
|
|
14
8
|
if (promise[TSR_DEFERRED_PROMISE].status === "pending") {
|
|
15
9
|
throw promise;
|
|
16
10
|
}
|
|
17
11
|
if (promise[TSR_DEFERRED_PROMISE].status === "error") {
|
|
18
|
-
|
|
19
|
-
if (isServerSideError(promise[TSR_DEFERRED_PROMISE].error)) {
|
|
20
|
-
throw (((_a = router.options.errorSerializer) == null ? void 0 : _a.deserialize) ?? defaultDeserializeError)(promise[TSR_DEFERRED_PROMISE].error.data);
|
|
21
|
-
} else {
|
|
22
|
-
warning(
|
|
23
|
-
false,
|
|
24
|
-
"Encountered a server-side error that doesn't fit the expected shape"
|
|
25
|
-
);
|
|
26
|
-
throw promise[TSR_DEFERRED_PROMISE].error;
|
|
27
|
-
}
|
|
28
|
-
} else {
|
|
29
|
-
throw {
|
|
30
|
-
data: (((_b = router.options.errorSerializer) == null ? void 0 : _b.serialize) ?? defaultSerializeError)(promise[TSR_DEFERRED_PROMISE].error),
|
|
31
|
-
__isServerError: true
|
|
32
|
-
};
|
|
33
|
-
}
|
|
12
|
+
throw promise[TSR_DEFERRED_PROMISE].error;
|
|
34
13
|
}
|
|
35
14
|
return [promise[TSR_DEFERRED_PROMISE].data, promise];
|
|
36
15
|
}
|
package/dist/esm/awaited.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awaited.js","sources":["../../src/awaited.tsx"],"sourcesContent":["import * as React from 'react'\
|
|
1
|
+
{"version":3,"file":"awaited.js","sources":["../../src/awaited.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { TSR_DEFERRED_PROMISE, defer } from './defer'\nimport type { DeferredPromise } from './defer'\n\nexport type AwaitOptions<T> = {\n promise: Promise<T>\n}\n\nexport function useAwaited<T>({\n promise: _promise,\n}: AwaitOptions<T>): [T, DeferredPromise<T>] {\n const promise = defer(_promise)\n\n if (promise[TSR_DEFERRED_PROMISE].status === 'pending') {\n throw promise\n }\n\n if (promise[TSR_DEFERRED_PROMISE].status === 'error') {\n throw promise[TSR_DEFERRED_PROMISE].error\n }\n\n return [promise[TSR_DEFERRED_PROMISE].data, promise]\n}\n\nexport function Await<T>(\n props: AwaitOptions<T> & {\n fallback?: React.ReactNode\n children: (result: T) => React.ReactNode\n },\n) {\n const inner = <AwaitInner {...props} />\n if (props.fallback) {\n return <React.Suspense fallback={props.fallback}>{inner}</React.Suspense>\n }\n return inner\n}\n\nfunction AwaitInner<T>(\n props: AwaitOptions<T> & {\n fallback?: React.ReactNode\n children: (result: T) => React.ReactNode\n },\n): React.JSX.Element {\n const [data] = useAwaited(props)\n\n return props.children(data) as React.JSX.Element\n}\n"],"names":[],"mappings":";;;AASO,SAAS,WAAc;AAAA,EAC5B,SAAS;AACX,GAA6C;AACrC,QAAA,UAAU,MAAM,QAAQ;AAE9B,MAAI,QAAQ,oBAAoB,EAAE,WAAW,WAAW;AAChD,UAAA;AAAA,EAAA;AAGR,MAAI,QAAQ,oBAAoB,EAAE,WAAW,SAAS;AAC9C,UAAA,QAAQ,oBAAoB,EAAE;AAAA,EAAA;AAGtC,SAAO,CAAC,QAAQ,oBAAoB,EAAE,MAAM,OAAO;AACrD;AAEO,SAAS,MACd,OAIA;AACA,QAAM,QAAQ,oBAAC,YAAY,EAAA,GAAG,MAAO,CAAA;AACrC,MAAI,MAAM,UAAU;AAClB,+BAAQ,MAAM,UAAN,EAAe,UAAU,MAAM,UAAW,UAAM,OAAA;AAAA,EAAA;AAEnD,SAAA;AACT;AAEA,SAAS,WACP,OAImB;AACnB,QAAM,CAAC,IAAI,IAAI,WAAW,KAAK;AAExB,SAAA,MAAM,SAAS,IAAI;AAC5B;"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export { default as invariant } from 'tiny-invariant';
|
|
|
4
4
|
export { default as warning } from 'tiny-warning';
|
|
5
5
|
export { useAwaited, Await } from './awaited.js';
|
|
6
6
|
export type { AwaitOptions } from './awaited.js';
|
|
7
|
-
export { ScriptOnce } from './ScriptOnce.js';
|
|
8
7
|
export { defer, TSR_DEFERRED_PROMISE } from './defer.js';
|
|
9
8
|
export type { DeferredPromiseState, DeferredPromise } from './defer.js';
|
|
10
9
|
export { CatchBoundary, ErrorComponent } from './CatchBoundary.js';
|
|
@@ -19,7 +18,6 @@ export { Matches, useMatchRoute, MatchRoute, useMatches, useParentMatches, useCh
|
|
|
19
18
|
export type { RouteMatch, AnyRouteMatch, MatchRouteOptions, UseMatchRouteOptions, MakeMatchRouteOptions, MakeRouteMatch, MakeRouteMatchUnion, } from './Matches.js';
|
|
20
19
|
export { matchContext } from './matchContext.js';
|
|
21
20
|
export { Match, Outlet } from './Match.js';
|
|
22
|
-
export { isServerSideError, defaultDeserializeError } from './isServerSideError.js';
|
|
23
21
|
export { useMatch } from './useMatch.js';
|
|
24
22
|
export { useLoaderDeps } from './useLoaderDeps.js';
|
|
25
23
|
export { useLoaderData } from './useLoaderData.js';
|
|
@@ -34,15 +32,14 @@ export { RouteApi, getRouteApi, Route, createRoute, RootRoute, rootRouteWithCont
|
|
|
34
32
|
export type { AnyPathParams, ResolveParams, SearchSchemaInput, AnyContext, RouteContext, PreloadableObj, RoutePathOptions, StaticDataRouteOption, RoutePathOptionsIntersection, RouteOptions, FileBaseRouteOptions, BaseRouteOptions, UpdatableRouteOptions, UpdatableStaticRouteOption, MetaDescriptor, RouteLinkEntry, ParseParamsFn, RouteLoaderFn, LoaderFnContext, SearchFilter, ResolveId, InferFullSearchSchema, InferFullSearchSchemaInput, ResolveFullSearchSchema, ResolveFullSearchSchemaInput, AnyRoute, RouteConstraints, AnyRootRoute, ResolveFullPath, RouteMask, ErrorRouteProps, ErrorComponentProps, NotFoundRouteProps, ReactNode, SyncRouteComponent, AsyncRouteComponent, RouteComponent, ErrorRouteComponent, NotFoundRouteComponent, TrimPath, TrimPathLeft, TrimPathRight, RootRouteOptions, AnyRouteWithContext, ParseSplatParams, SplatParams, StringifyParamsFn, ParamsOptions, FullSearchSchemaOption, RouteContextFn, RouteContextOptions, BeforeLoadFn, BeforeLoadContextOptions, ContextOptions, InferAllParams, InferAllContext, LooseReturnType, LooseAsyncReturnType, ContextReturnType, ContextAsyncReturnType, RouteContextParameter, BeforeLoadContextParameter, ResolveAllContext, ResolveLoaderData, ResolveAllParamsFromParent, ResolveRouteContext, } from './route.js';
|
|
35
33
|
export type { ParseRoute, RoutesById, RouteById, RouteIds, RoutesByPath, RouteByPath, RoutePaths, FullSearchSchema, AllParams, AllLoaderData, FullSearchSchemaInput, AllContext, } from './routeInfo.js';
|
|
36
34
|
export { componentTypes, createRouter, Router, lazyFn, SearchParamError, PathParamError, getInitialRouterState, defaultSerializeError, } from './router.js';
|
|
37
|
-
export type { Register, AnyRouter, RegisteredRouter,
|
|
35
|
+
export type { Register, AnyRouter, RegisteredRouter, RouterContextOptions, TrailingSlashOption, RouterOptions, RouterErrorSerializer, RouterState, ListenerFn, BuildNextOptions, RouterConstructorOptions, RouterEvents, RouterEvent, RouterListener, AnyRouterWithContext, ControllablePromise, InjectedHtmlEntry, } from './router.js';
|
|
36
|
+
export type { StartSerializer, Serializable, SerializerParse, SerializerParseBy, SerializerStringify, SerializerStringifyBy, } from './serializer.js';
|
|
38
37
|
export { RouterProvider, RouterContextProvider } from './RouterProvider.js';
|
|
39
|
-
export type { RouterProps, CommitLocationOptions, MatchLocation, NavigateFn, BuildLocationFn,
|
|
38
|
+
export type { RouterProps, CommitLocationOptions, MatchLocation, NavigateFn, BuildLocationFn, } from './RouterProvider.js';
|
|
40
39
|
export { useScrollRestoration, useElementScrollRestoration, ScrollRestoration, } from './scroll-restoration.js';
|
|
41
40
|
export type { ScrollRestorationOptions } from './scroll-restoration.js';
|
|
42
41
|
export { defaultParseSearch, defaultStringifySearch, parseSearchWith, stringifySearchWith, } from './searchParams.js';
|
|
43
42
|
export type { SearchSerializer, SearchParser } from './searchParams.js';
|
|
44
|
-
export { defaultTransformer } from './transformer.js';
|
|
45
|
-
export type { RouterTransformer, TransformerParse, TransformerStringify, DefaultSerializable, DefaultTransformerParse, DefaultTransformerStringify, } from './transformer.js';
|
|
46
43
|
export type { UseBlockerOpts, ShouldBlockFn } from './useBlocker.js';
|
|
47
44
|
export { useBlocker, Block } from './useBlocker.js';
|
|
48
45
|
export { useNavigate, Navigate } from './useNavigate.js';
|
|
@@ -66,3 +63,4 @@ export type { ControlledPromise, Constrain, Expand, MergeAll, Assign, } from './
|
|
|
66
63
|
export type { ResolveValidatorInput, ResolveValidatorOutput, AnyValidator, DefaultValidator, ValidatorFn, AnySchema, AnyValidatorAdapter, AnyValidatorFn, AnyValidatorObj, ResolveValidatorInputFn, ResolveValidatorOutputFn, ResolveSearchValidatorInput, ResolveSearchValidatorInputFn, Validator, ValidatorAdapter, ValidatorObj, } from './validators.js';
|
|
67
64
|
export { retainSearchParams, stripSearchParams } from './searchMiddleware.js';
|
|
68
65
|
export * from './typePrimitives.js';
|
|
66
|
+
export { ScriptOnce } from './ScriptOnce.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -2,7 +2,6 @@ import { createBrowserHistory, createHashHistory, createHistory, createMemoryHis
|
|
|
2
2
|
import { default as default2 } from "tiny-invariant";
|
|
3
3
|
import { default as default3 } from "tiny-warning";
|
|
4
4
|
import { Await, useAwaited } from "./awaited.js";
|
|
5
|
-
import { ScriptOnce } from "./ScriptOnce.js";
|
|
6
5
|
import { TSR_DEFERRED_PROMISE, defer } from "./defer.js";
|
|
7
6
|
import { CatchBoundary, ErrorComponent } from "./CatchBoundary.js";
|
|
8
7
|
import { FileRoute, FileRouteLoader, LazyRoute, createFileRoute, createLazyFileRoute, createLazyRoute } from "./fileRoute.js";
|
|
@@ -11,7 +10,6 @@ import { Link, createLink, linkOptions, useLinkProps } from "./link.js";
|
|
|
11
10
|
import { MatchRoute, Matches, isMatch, useChildMatches, useMatchRoute, useMatches, useParentMatches } from "./Matches.js";
|
|
12
11
|
import { matchContext } from "./matchContext.js";
|
|
13
12
|
import { Match, Outlet } from "./Match.js";
|
|
14
|
-
import { defaultDeserializeError, isServerSideError } from "./isServerSideError.js";
|
|
15
13
|
import { useMatch } from "./useMatch.js";
|
|
16
14
|
import { useLoaderDeps } from "./useLoaderDeps.js";
|
|
17
15
|
import { useLoaderData } from "./useLoaderData.js";
|
|
@@ -24,7 +22,6 @@ import { PathParamError, Router, SearchParamError, componentTypes, createRouter,
|
|
|
24
22
|
import { RouterContextProvider, RouterProvider } from "./RouterProvider.js";
|
|
25
23
|
import { ScrollRestoration, useElementScrollRestoration, useScrollRestoration } from "./scroll-restoration.js";
|
|
26
24
|
import { defaultParseSearch, defaultStringifySearch, parseSearchWith, stringifySearchWith } from "./searchParams.js";
|
|
27
|
-
import { defaultTransformer } from "./transformer.js";
|
|
28
25
|
import { Block, useBlocker } from "./useBlocker.js";
|
|
29
26
|
import { Navigate, useNavigate } from "./useNavigate.js";
|
|
30
27
|
import { useParams } from "./useParams.js";
|
|
@@ -38,6 +35,7 @@ import { useCanGoBack } from "./useCanGoBack.js";
|
|
|
38
35
|
import { createControlledPromise, deepEqual, escapeJSON, functionalUpdate, isPlainArray, isPlainObject, pick, replaceEqualDeep, shallow, useLayoutEffect, useStableCallback } from "./utils.js";
|
|
39
36
|
import { CatchNotFound, DefaultGlobalNotFound, isNotFound, notFound } from "./not-found.js";
|
|
40
37
|
import { retainSearchParams, stripSearchParams } from "./searchMiddleware.js";
|
|
38
|
+
import { ScriptOnce } from "./ScriptOnce.js";
|
|
41
39
|
export {
|
|
42
40
|
Await,
|
|
43
41
|
Block,
|
|
@@ -84,11 +82,9 @@ export {
|
|
|
84
82
|
createRouter,
|
|
85
83
|
decode,
|
|
86
84
|
deepEqual,
|
|
87
|
-
defaultDeserializeError,
|
|
88
85
|
defaultParseSearch,
|
|
89
86
|
defaultSerializeError,
|
|
90
87
|
defaultStringifySearch,
|
|
91
|
-
defaultTransformer,
|
|
92
88
|
defer,
|
|
93
89
|
encode,
|
|
94
90
|
escapeJSON,
|
|
@@ -103,7 +99,6 @@ export {
|
|
|
103
99
|
isPlainArray,
|
|
104
100
|
isPlainObject,
|
|
105
101
|
isRedirect,
|
|
106
|
-
isServerSideError,
|
|
107
102
|
joinPaths,
|
|
108
103
|
lazyFn,
|
|
109
104
|
lazyRouteComponent,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/router.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Store, NoInfer } from '@tanstack/react-store';
|
|
2
|
+
import { StartSerializer } from './serializer.js';
|
|
2
3
|
import { HistoryLocation, HistoryState, ParsedHistoryState, RouterHistory } from '@tanstack/history';
|
|
3
4
|
import { Manifest } from './manifest.js';
|
|
4
5
|
import { AnyContext, AnyRoute, AnyRouteWithContext, ErrorRouteComponent, NotFoundRouteComponent, RootRoute, RouteComponent, RouteMask } from './route.js';
|
|
@@ -11,33 +12,13 @@ import { BuildLocationFn, CommitLocationOptions, NavigateFn } from './RouterProv
|
|
|
11
12
|
import { AnyRedirect, ResolvedRedirect } from './redirects.js';
|
|
12
13
|
import { NotFoundError } from './not-found.js';
|
|
13
14
|
import { NavigateOptions, ResolveRelativePath, ToOptions } from './link.js';
|
|
14
|
-
import { RouterTransformer } from './transformer.js';
|
|
15
15
|
import { AnySchema } from './validators.js';
|
|
16
16
|
import type * as React from 'react';
|
|
17
|
-
export interface TSRGlobalMatch {
|
|
18
|
-
index: number;
|
|
19
|
-
__beforeLoadContext?: string;
|
|
20
|
-
loaderData?: string;
|
|
21
|
-
extracted: Record<string, ClientExtractedEntry>;
|
|
22
|
-
}
|
|
23
|
-
export interface TSRGlobal {
|
|
24
|
-
matches: Array<TSRGlobalMatch>;
|
|
25
|
-
streamedValues: Record<string, {
|
|
26
|
-
value: any;
|
|
27
|
-
parsed: any;
|
|
28
|
-
}>;
|
|
29
|
-
cleanScripts: () => void;
|
|
30
|
-
dehydrated?: any;
|
|
31
|
-
}
|
|
32
17
|
declare global {
|
|
33
18
|
interface Window {
|
|
34
|
-
|
|
35
|
-
__TSR_ROUTER_CONTEXT__?: React.Context<Router<any, any, any>>;
|
|
19
|
+
__TSR_ROUTER__?: AnyRouter;
|
|
36
20
|
}
|
|
37
21
|
}
|
|
38
|
-
type RegisteredTSRGlobal = Register extends {
|
|
39
|
-
__TSR__: infer TTSR extends TSRGlobal;
|
|
40
|
-
} ? TTSR : TSRGlobal;
|
|
41
22
|
export interface Register {
|
|
42
23
|
}
|
|
43
24
|
export type AnyRouter = Router<any, any, any, any, any, any>;
|
|
@@ -45,40 +26,19 @@ export type AnyRouterWithContext<TContext> = Router<AnyRouteWithContext<TContext
|
|
|
45
26
|
export type RegisteredRouter = Register extends {
|
|
46
27
|
router: infer TRouter extends AnyRouter;
|
|
47
28
|
} ? TRouter : AnyRouter;
|
|
48
|
-
export type HydrationCtx = {
|
|
49
|
-
router: DehydratedRouter;
|
|
50
|
-
payload: Record<string, any>;
|
|
51
|
-
};
|
|
52
29
|
export type InferRouterContext<TRouteTree extends AnyRoute> = TRouteTree extends RootRoute<any, infer TRouterContext extends AnyContext, any, any, any, any, any, any> ? TRouterContext : AnyContext;
|
|
53
|
-
export interface ClientExtractedBaseEntry {
|
|
54
|
-
type: string;
|
|
55
|
-
path: Array<string>;
|
|
56
|
-
}
|
|
57
30
|
export type ControllablePromise<T = any> = Promise<T> & {
|
|
58
31
|
resolve: (value: T) => void;
|
|
59
32
|
reject: (value?: any) => void;
|
|
60
33
|
};
|
|
61
|
-
export interface ClientExtractedPromise extends ClientExtractedBaseEntry {
|
|
62
|
-
type: 'promise';
|
|
63
|
-
value?: ControllablePromise<any>;
|
|
64
|
-
}
|
|
65
|
-
export interface ClientExtractedStream extends ClientExtractedBaseEntry {
|
|
66
|
-
type: 'stream';
|
|
67
|
-
value?: ReadableStream & {
|
|
68
|
-
controller?: ReadableStreamDefaultController;
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
export type ClientExtractedEntry = ClientExtractedStream | ClientExtractedPromise;
|
|
72
|
-
export type StreamState = {
|
|
73
|
-
promises: Array<ControlledPromise<string | null>>;
|
|
74
|
-
};
|
|
75
34
|
export type RouterContextOptions<TRouteTree extends AnyRoute> = AnyContext extends InferRouterContext<TRouteTree> ? {
|
|
76
35
|
context?: InferRouterContext<TRouteTree>;
|
|
77
36
|
} : {
|
|
78
37
|
context: InferRouterContext<TRouteTree>;
|
|
79
38
|
};
|
|
80
39
|
export type TrailingSlashOption = 'always' | 'never' | 'preserve';
|
|
81
|
-
export
|
|
40
|
+
export type InjectedHtmlEntry = Promise<string>;
|
|
41
|
+
export interface RouterOptions<TRouteTree extends AnyRoute, TTrailingSlashOption extends TrailingSlashOption, TDefaultStructuralSharingOption extends boolean = false, TRouterHistory extends RouterHistory = RouterHistory, TDehydrated extends Record<string, any> = Record<string, any>> {
|
|
82
42
|
/**
|
|
83
43
|
* The history object that will be used to manage the browser history.
|
|
84
44
|
*
|
|
@@ -336,19 +296,6 @@ export interface RouterOptions<TRouteTree extends AnyRoute, TTrailingSlashOption
|
|
|
336
296
|
* @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/not-found-errors#default-router-wide-not-found-handling)
|
|
337
297
|
*/
|
|
338
298
|
defaultNotFoundComponent?: NotFoundRouteComponent;
|
|
339
|
-
/**
|
|
340
|
-
* The transformer that will be used when sending data between the server and the client during SSR.
|
|
341
|
-
*
|
|
342
|
-
* @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#transformer-property)
|
|
343
|
-
* @link [Guide](https://tanstack.com/router/latest/docs/framework/react/guide/ssr#data-transformers)
|
|
344
|
-
*/
|
|
345
|
-
transformer?: RouterTransformer;
|
|
346
|
-
/**
|
|
347
|
-
* The serializer object that will be used to determine how errors are serialized and deserialized between the server and the client.
|
|
348
|
-
*
|
|
349
|
-
* @link [API Docs](https://tanstack.com/router/latest/docs/framework/react/api/router/RouterOptionsType#errorserializer-property)
|
|
350
|
-
*/
|
|
351
|
-
errorSerializer?: RouterErrorSerializer<TSerializedError>;
|
|
352
299
|
/**
|
|
353
300
|
* Configures how trailing slashes are treated.
|
|
354
301
|
*
|
|
@@ -431,18 +378,10 @@ export interface MatchedRoutesResult {
|
|
|
431
378
|
matchedRoutes: Array<AnyRoute>;
|
|
432
379
|
routeParams: Record<string, string>;
|
|
433
380
|
}
|
|
434
|
-
export interface DehydratedRouterState {
|
|
435
|
-
dehydratedMatches: Array<DehydratedRouteMatch>;
|
|
436
|
-
}
|
|
437
|
-
export type DehydratedRouteMatch = Pick<MakeRouteMatch, 'id' | 'status' | 'updatedAt' | 'loaderData'>;
|
|
438
|
-
export interface DehydratedRouter {
|
|
439
|
-
state: DehydratedRouterState;
|
|
440
|
-
manifest?: Manifest;
|
|
441
|
-
}
|
|
442
381
|
export interface ViewTransitionOptions {
|
|
443
382
|
types: Array<string>;
|
|
444
383
|
}
|
|
445
|
-
export type RouterConstructorOptions<TRouteTree extends AnyRoute, TTrailingSlashOption extends TrailingSlashOption, TDefaultStructuralSharingOption extends boolean, TRouterHistory extends RouterHistory, TDehydrated extends Record<string, any
|
|
384
|
+
export type RouterConstructorOptions<TRouteTree extends AnyRoute, TTrailingSlashOption extends TrailingSlashOption, TDefaultStructuralSharingOption extends boolean, TRouterHistory extends RouterHistory, TDehydrated extends Record<string, any>> = Omit<RouterOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated>, 'context'> & RouterContextOptions<TRouteTree>;
|
|
446
385
|
export declare const componentTypes: readonly ["component", "errorComponent", "pendingComponent", "notFoundComponent"];
|
|
447
386
|
export type RouterEvents = {
|
|
448
387
|
onBeforeNavigate: {
|
|
@@ -480,13 +419,17 @@ export type RouterEvents = {
|
|
|
480
419
|
pathChanged: boolean;
|
|
481
420
|
hrefChanged: boolean;
|
|
482
421
|
};
|
|
422
|
+
onInjectedHtml: {
|
|
423
|
+
type: 'onInjectedHtml';
|
|
424
|
+
promise: Promise<string>;
|
|
425
|
+
};
|
|
483
426
|
};
|
|
484
427
|
export type RouterEvent = RouterEvents[keyof RouterEvents];
|
|
485
428
|
export type RouterListener<TRouterEvent extends RouterEvent> = {
|
|
486
429
|
eventType: TRouterEvent['type'];
|
|
487
430
|
fn: ListenerFn<TRouterEvent>;
|
|
488
431
|
};
|
|
489
|
-
export declare function createRouter<TRouteTree extends AnyRoute, TTrailingSlashOption extends TrailingSlashOption, TDefaultStructuralSharingOption extends boolean, TRouterHistory extends RouterHistory = RouterHistory, TDehydrated extends Record<string, any> = Record<string, any>, TSerializedError extends Record<string, any> = Record<string, any>>(options: undefined extends number ? 'strictNullChecks must be enabled in tsconfig.json' : RouterConstructorOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated
|
|
432
|
+
export declare function createRouter<TRouteTree extends AnyRoute, TTrailingSlashOption extends TrailingSlashOption, TDefaultStructuralSharingOption extends boolean, TRouterHistory extends RouterHistory = RouterHistory, TDehydrated extends Record<string, any> = Record<string, any>, TSerializedError extends Record<string, any> = Record<string, any>>(options: undefined extends number ? 'strictNullChecks must be enabled in tsconfig.json' : RouterConstructorOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated>): Router<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated, TSerializedError>;
|
|
490
433
|
type MatchRoutesOpts = {
|
|
491
434
|
preload?: boolean;
|
|
492
435
|
throwOnError?: boolean;
|
|
@@ -499,22 +442,9 @@ export declare class Router<in out TRouteTree extends AnyRoute, in out TTrailing
|
|
|
499
442
|
shouldViewTransition?: boolean | ViewTransitionOptions;
|
|
500
443
|
isViewTransitionTypesSupported?: boolean;
|
|
501
444
|
subscribers: Set<RouterListener<RouterEvent>>;
|
|
502
|
-
dehydratedData?: TDehydrated;
|
|
503
445
|
viewTransitionPromise?: ControlledPromise<true>;
|
|
504
|
-
manifest?: Manifest;
|
|
505
|
-
AfterEachMatch?: (props: {
|
|
506
|
-
match: Pick<AnyRouteMatch, 'id' | 'status' | 'error' | 'loadPromise' | 'minPendingPromise'>;
|
|
507
|
-
matchIndex: number;
|
|
508
|
-
}) => any;
|
|
509
|
-
serializeLoaderData?: (type: '__beforeLoadContext' | 'loaderData', loaderData: any, ctx: {
|
|
510
|
-
router: AnyRouter;
|
|
511
|
-
match: AnyRouteMatch;
|
|
512
|
-
}) => any;
|
|
513
|
-
serializer?: (data: any) => string;
|
|
514
446
|
__store: Store<RouterState<TRouteTree>>;
|
|
515
|
-
options: PickAsRequired<
|
|
516
|
-
transformer: RouterTransformer;
|
|
517
|
-
}, 'stringifySearch' | 'parseSearch' | 'context'>;
|
|
447
|
+
options: PickAsRequired<RouterOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated>, 'stringifySearch' | 'parseSearch' | 'context'>;
|
|
518
448
|
history: TRouterHistory;
|
|
519
449
|
latestLocation: ParsedLocation<FullSearchSchema<TRouteTree>>;
|
|
520
450
|
basepath: string;
|
|
@@ -527,9 +457,9 @@ export declare class Router<in out TRouteTree extends AnyRoute, in out TTrailing
|
|
|
527
457
|
/**
|
|
528
458
|
* @deprecated Use the `createRouter` function instead
|
|
529
459
|
*/
|
|
530
|
-
constructor(options: RouterConstructorOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated
|
|
460
|
+
constructor(options: RouterConstructorOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated>);
|
|
531
461
|
startReactTransition: (fn: () => void) => void;
|
|
532
|
-
update: (newOptions: RouterConstructorOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated
|
|
462
|
+
update: (newOptions: RouterConstructorOptions<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated>) => void;
|
|
533
463
|
get state(): RouterState<TRouteTree, import('./Matches.js').RouteMatch<any, any, any, any, any, any, any>>;
|
|
534
464
|
buildRouteTree: () => void;
|
|
535
465
|
subscribe: <TType extends keyof RouterEvents>(eventType: TType, fn: ListenerFn<RouterEvents[TType]>) => () => void;
|
|
@@ -589,16 +519,26 @@ export declare class Router<in out TRouteTree extends AnyRoute, in out TTrailing
|
|
|
589
519
|
loadRouteChunk: (route: AnyRoute) => Promise<void[]>;
|
|
590
520
|
preloadRoute: <TFrom extends RoutePaths<TRouteTree> | string = string, TTo extends string | undefined = undefined, TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom, TMaskTo extends string = "">(opts: NavigateOptions<Router<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated, TSerializedError>, TFrom, TTo, TMaskFrom, TMaskTo>) => Promise<Array<AnyRouteMatch> | undefined>;
|
|
591
521
|
matchRoute: <TFrom extends RoutePaths<TRouteTree> = "/", TTo extends string | undefined = undefined, TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>>(location: ToOptions<Router<TRouteTree, TTrailingSlashOption, TDefaultStructuralSharingOption, TRouterHistory, TDehydrated, TSerializedError>, TFrom, TTo>, opts?: MatchRouteOptions) => false | RouteById<TRouteTree, TResolved>["types"]["allParams"];
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
522
|
+
ssr?: {
|
|
523
|
+
manifest: Manifest | undefined;
|
|
524
|
+
serializer: StartSerializer;
|
|
525
|
+
};
|
|
526
|
+
serverSsr?: {
|
|
527
|
+
injectedHtml: Array<InjectedHtmlEntry>;
|
|
528
|
+
injectHtml: (getHtml: () => string | Promise<string>) => Promise<void>;
|
|
529
|
+
injectScript: (getScript: () => string | Promise<string>, opts?: {
|
|
530
|
+
logScript?: boolean;
|
|
531
|
+
}) => Promise<void>;
|
|
532
|
+
streamValue: (key: string, value: any) => void;
|
|
533
|
+
streamedKeys: Set<string>;
|
|
534
|
+
onMatchSettled: (opts: {
|
|
535
|
+
router: AnyRouter;
|
|
536
|
+
match: AnyRouteMatch;
|
|
537
|
+
}) => any;
|
|
538
|
+
};
|
|
539
|
+
clientSsr?: {
|
|
540
|
+
getStreamedValue: <T>(key: string) => T | undefined;
|
|
541
|
+
};
|
|
602
542
|
_handleNotFound: (matches: Array<AnyRouteMatch>, err: NotFoundError, { updateMatch, }?: {
|
|
603
543
|
updateMatch?: (id: string, updater: (match: AnyRouteMatch) => AnyRouteMatch) => void;
|
|
604
544
|
}) => void;
|
package/dist/esm/router.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { createMemoryHistory, createBrowserHistory, parseHref } from "@tanstack/history";
|
|
2
2
|
import { Store, batch } from "@tanstack/react-store";
|
|
3
3
|
import invariant from "tiny-invariant";
|
|
4
|
-
import warning from "tiny-warning";
|
|
5
|
-
import jsesc from "jsesc";
|
|
6
4
|
import { rootRouteId } from "./root.js";
|
|
7
5
|
import { defaultStringifySearch, defaultParseSearch } from "./searchParams.js";
|
|
8
6
|
import { pick, createControlledPromise, deepEqual, replaceEqualDeep, last, functionalUpdate } from "./utils.js";
|
|
9
7
|
import { trimPath, trimPathLeft, parsePathname, resolvePath, cleanPath, trimPathRight, matchPathname, interpolatePath, joinPaths } from "./path.js";
|
|
10
8
|
import { isResolvedRedirect, isRedirect } from "./redirects.js";
|
|
11
9
|
import { isNotFound } from "./not-found.js";
|
|
12
|
-
import { defaultTransformer } from "./transformer.js";
|
|
13
10
|
const componentTypes = [
|
|
14
11
|
"component",
|
|
15
12
|
"errorComponent",
|
|
@@ -374,7 +371,7 @@ class Router {
|
|
|
374
371
|
}) ?? {}
|
|
375
372
|
};
|
|
376
373
|
}
|
|
377
|
-
} catch
|
|
374
|
+
} catch {
|
|
378
375
|
}
|
|
379
376
|
});
|
|
380
377
|
search = validatedSearch;
|
|
@@ -423,7 +420,7 @@ class Router {
|
|
|
423
420
|
) ?? {}
|
|
424
421
|
};
|
|
425
422
|
return validatedSearch;
|
|
426
|
-
} catch
|
|
423
|
+
} catch {
|
|
427
424
|
}
|
|
428
425
|
};
|
|
429
426
|
middlewares.push(validate);
|
|
@@ -964,17 +961,7 @@ class Router {
|
|
|
964
961
|
cause: preload ? "preload" : cause,
|
|
965
962
|
matches
|
|
966
963
|
};
|
|
967
|
-
|
|
968
|
-
if (this.serializeLoaderData) {
|
|
969
|
-
beforeLoadContext = this.serializeLoaderData(
|
|
970
|
-
"__beforeLoadContext",
|
|
971
|
-
beforeLoadContext,
|
|
972
|
-
{
|
|
973
|
-
router: this,
|
|
974
|
-
match: this.getMatch(matchId)
|
|
975
|
-
}
|
|
976
|
-
);
|
|
977
|
-
}
|
|
964
|
+
const beforeLoadContext = await ((_c = (_b = route.options).beforeLoad) == null ? void 0 : _c.call(_b, beforeLoadFnContext)) ?? {};
|
|
978
965
|
if (isRedirect(beforeLoadContext) || isNotFound(beforeLoadContext)) {
|
|
979
966
|
handleSerialError(index, beforeLoadContext, "BEFORE_LOAD");
|
|
980
967
|
}
|
|
@@ -1054,7 +1041,7 @@ class Router {
|
|
|
1054
1041
|
preload: !!preload && !this.state.matches.find((d) => d.id === matchId)
|
|
1055
1042
|
}));
|
|
1056
1043
|
const runLoader = async () => {
|
|
1057
|
-
var _a2, _b2, _c2, _d, _e, _f, _g, _h;
|
|
1044
|
+
var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i;
|
|
1058
1045
|
try {
|
|
1059
1046
|
const potentialPendingMinPromise = async () => {
|
|
1060
1047
|
const latestMatch = this.getMatch(matchId);
|
|
@@ -1068,17 +1055,7 @@ class Router {
|
|
|
1068
1055
|
...prev,
|
|
1069
1056
|
isFetching: "loader"
|
|
1070
1057
|
}));
|
|
1071
|
-
|
|
1072
|
-
if (this.serializeLoaderData) {
|
|
1073
|
-
loaderData = this.serializeLoaderData(
|
|
1074
|
-
"loaderData",
|
|
1075
|
-
loaderData,
|
|
1076
|
-
{
|
|
1077
|
-
router: this,
|
|
1078
|
-
match: this.getMatch(matchId)
|
|
1079
|
-
}
|
|
1080
|
-
);
|
|
1081
|
-
}
|
|
1058
|
+
const loaderData = await ((_b2 = (_a2 = route.options).loader) == null ? void 0 : _b2.call(_a2, getLoaderContext()));
|
|
1082
1059
|
handleRedirectAndNotFound(
|
|
1083
1060
|
this.getMatch(matchId),
|
|
1084
1061
|
loaderData
|
|
@@ -1129,6 +1106,10 @@ class Router {
|
|
|
1129
1106
|
isFetching: false
|
|
1130
1107
|
}));
|
|
1131
1108
|
}
|
|
1109
|
+
(_i = this.serverSsr) == null ? void 0 : _i.onMatchSettled({
|
|
1110
|
+
router: this,
|
|
1111
|
+
match: this.getMatch(matchId)
|
|
1112
|
+
});
|
|
1132
1113
|
await route._componentsPromise;
|
|
1133
1114
|
} catch (err) {
|
|
1134
1115
|
updateMatch(matchId, (prev) => ({
|
|
@@ -1369,104 +1350,6 @@ class Router {
|
|
|
1369
1350
|
}
|
|
1370
1351
|
return match;
|
|
1371
1352
|
};
|
|
1372
|
-
this.dehydrate = () => {
|
|
1373
|
-
var _a;
|
|
1374
|
-
const pickError = ((_a = this.options.errorSerializer) == null ? void 0 : _a.serialize) ?? defaultSerializeError;
|
|
1375
|
-
return {
|
|
1376
|
-
state: {
|
|
1377
|
-
dehydratedMatches: this.state.matches.map((d) => {
|
|
1378
|
-
return {
|
|
1379
|
-
...pick(d, ["id", "status", "updatedAt"]),
|
|
1380
|
-
// If an error occurs server-side during SSRing,
|
|
1381
|
-
// send a small subset of the error to the client
|
|
1382
|
-
error: d.error ? {
|
|
1383
|
-
data: pickError(d.error),
|
|
1384
|
-
__isServerError: true
|
|
1385
|
-
} : void 0
|
|
1386
|
-
// NOTE: We don't send the loader data here, because
|
|
1387
|
-
// there is a potential that it needs to be streamed.
|
|
1388
|
-
// Instead, we render it next to the route match in the HTML
|
|
1389
|
-
// which gives us the potential to stream it via suspense.
|
|
1390
|
-
};
|
|
1391
|
-
})
|
|
1392
|
-
},
|
|
1393
|
-
manifest: this.manifest
|
|
1394
|
-
};
|
|
1395
|
-
};
|
|
1396
|
-
this.hydrate = () => {
|
|
1397
|
-
var _a, _b, _c;
|
|
1398
|
-
let ctx;
|
|
1399
|
-
if (typeof document !== "undefined") {
|
|
1400
|
-
ctx = this.options.transformer.parse((_a = window.__TSR__) == null ? void 0 : _a.dehydrated);
|
|
1401
|
-
}
|
|
1402
|
-
invariant(
|
|
1403
|
-
ctx,
|
|
1404
|
-
"Expected to find a dehydrated data on window.__TSR__.dehydrated... but we did not. Please file an issue!"
|
|
1405
|
-
);
|
|
1406
|
-
this.dehydratedData = ctx.payload;
|
|
1407
|
-
(_c = (_b = this.options).hydrate) == null ? void 0 : _c.call(_b, ctx.payload);
|
|
1408
|
-
const dehydratedState = ctx.router.state;
|
|
1409
|
-
const matches = this.matchRoutes(this.state.location).map((match) => {
|
|
1410
|
-
const dehydratedMatch = dehydratedState.dehydratedMatches.find(
|
|
1411
|
-
(d) => d.id === match.id
|
|
1412
|
-
);
|
|
1413
|
-
invariant(
|
|
1414
|
-
dehydratedMatch,
|
|
1415
|
-
`Could not find a client-side match for dehydrated match with id: ${match.id}!`
|
|
1416
|
-
);
|
|
1417
|
-
return {
|
|
1418
|
-
...match,
|
|
1419
|
-
...dehydratedMatch
|
|
1420
|
-
};
|
|
1421
|
-
});
|
|
1422
|
-
this.__store.setState((s) => {
|
|
1423
|
-
return {
|
|
1424
|
-
...s,
|
|
1425
|
-
matches
|
|
1426
|
-
};
|
|
1427
|
-
});
|
|
1428
|
-
this.manifest = ctx.router.manifest;
|
|
1429
|
-
};
|
|
1430
|
-
this.injectedHtml = [];
|
|
1431
|
-
this.injectHtml = (html) => {
|
|
1432
|
-
const cb = () => {
|
|
1433
|
-
this.injectedHtml = this.injectedHtml.filter((d) => d !== cb);
|
|
1434
|
-
return html;
|
|
1435
|
-
};
|
|
1436
|
-
this.injectedHtml.push(cb);
|
|
1437
|
-
};
|
|
1438
|
-
this.injectScript = (script, opts) => {
|
|
1439
|
-
this.injectHtml(
|
|
1440
|
-
`<script class='tsr-once'>${script}${process.env.NODE_ENV === "development" && ((opts == null ? void 0 : opts.logScript) ?? true) ? `; console.info(\`Injected From Server:
|
|
1441
|
-
${jsesc(script, { quotes: "backtick" })}\`)` : ""}; if (typeof __TSR__ !== 'undefined') __TSR__.cleanScripts()<\/script>`
|
|
1442
|
-
);
|
|
1443
|
-
};
|
|
1444
|
-
this.streamedKeys = /* @__PURE__ */ new Set();
|
|
1445
|
-
this.getStreamedValue = (key) => {
|
|
1446
|
-
var _a;
|
|
1447
|
-
if (this.isServer) {
|
|
1448
|
-
return void 0;
|
|
1449
|
-
}
|
|
1450
|
-
const streamedValue = (_a = window.__TSR__) == null ? void 0 : _a.streamedValues[key];
|
|
1451
|
-
if (!streamedValue) {
|
|
1452
|
-
return;
|
|
1453
|
-
}
|
|
1454
|
-
if (!streamedValue.parsed) {
|
|
1455
|
-
streamedValue.parsed = this.options.transformer.parse(streamedValue.value);
|
|
1456
|
-
}
|
|
1457
|
-
return streamedValue.parsed;
|
|
1458
|
-
};
|
|
1459
|
-
this.streamValue = (key, value) => {
|
|
1460
|
-
var _a;
|
|
1461
|
-
warning(
|
|
1462
|
-
!this.streamedKeys.has(key),
|
|
1463
|
-
"Key has already been streamed: " + key
|
|
1464
|
-
);
|
|
1465
|
-
this.streamedKeys.add(key);
|
|
1466
|
-
this.injectScript(
|
|
1467
|
-
`__TSR__.streamedValues['${key}'] = { value: ${(_a = this.serializer) == null ? void 0 : _a.call(this, this.options.transformer.stringify(value))}}`
|
|
1468
|
-
);
|
|
1469
|
-
};
|
|
1470
1353
|
this._handleNotFound = (matches, err, {
|
|
1471
1354
|
updateMatch = this.updateMatch
|
|
1472
1355
|
} = {}) => {
|
|
@@ -1510,11 +1393,10 @@ ${jsesc(script, { quotes: "backtick" })}\`)` : ""}; if (typeof __TSR__ !== 'unde
|
|
|
1510
1393
|
caseSensitive: options.caseSensitive ?? false,
|
|
1511
1394
|
notFoundMode: options.notFoundMode ?? "fuzzy",
|
|
1512
1395
|
stringifySearch: options.stringifySearch ?? defaultStringifySearch,
|
|
1513
|
-
parseSearch: options.parseSearch ?? defaultParseSearch
|
|
1514
|
-
transformer: options.transformer ?? defaultTransformer
|
|
1396
|
+
parseSearch: options.parseSearch ?? defaultParseSearch
|
|
1515
1397
|
});
|
|
1516
1398
|
if (typeof document !== "undefined") {
|
|
1517
|
-
window.
|
|
1399
|
+
window.__TSR_ROUTER__ = this;
|
|
1518
1400
|
}
|
|
1519
1401
|
}
|
|
1520
1402
|
get state() {
|