@tanstack/react-router 1.34.5 → 1.34.7
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/Matches.cjs.map +1 -1
- package/dist/cjs/Matches.d.cts +5 -8
- package/dist/cjs/fileRoute.cjs.map +1 -1
- package/dist/cjs/fileRoute.d.cts +2 -2
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/route.d.cts +11 -11
- package/dist/cjs/routeInfo.d.cts +6 -13
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +2 -2
- package/dist/cjs/useBlocker.cjs +15 -14
- package/dist/cjs/useBlocker.cjs.map +1 -1
- package/dist/cjs/useLoaderData.cjs.map +1 -1
- package/dist/cjs/useLoaderData.d.cts +3 -2
- package/dist/cjs/useMatch.cjs.map +1 -1
- package/dist/cjs/useMatch.d.cts +3 -2
- package/dist/cjs/useParams.cjs.map +1 -1
- package/dist/cjs/useParams.d.cts +4 -3
- package/dist/cjs/useRouteContext.cjs.map +1 -1
- package/dist/cjs/useRouteContext.d.cts +5 -4
- package/dist/cjs/useSearch.cjs.map +1 -1
- package/dist/cjs/useSearch.d.cts +3 -2
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +12 -9
- package/dist/esm/Matches.d.ts +5 -8
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/fileRoute.d.ts +2 -2
- package/dist/esm/fileRoute.js.map +1 -1
- package/dist/esm/route.d.ts +11 -11
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/routeInfo.d.ts +6 -13
- package/dist/esm/router.d.ts +2 -2
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/useBlocker.js +15 -14
- package/dist/esm/useBlocker.js.map +1 -1
- package/dist/esm/useLoaderData.d.ts +3 -2
- package/dist/esm/useLoaderData.js.map +1 -1
- package/dist/esm/useMatch.d.ts +3 -2
- package/dist/esm/useMatch.js.map +1 -1
- package/dist/esm/useParams.d.ts +4 -3
- package/dist/esm/useParams.js.map +1 -1
- package/dist/esm/useRouteContext.d.ts +5 -4
- package/dist/esm/useRouteContext.js.map +1 -1
- package/dist/esm/useSearch.d.ts +3 -2
- package/dist/esm/useSearch.js.map +1 -1
- package/dist/esm/utils.d.ts +12 -9
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/Matches.tsx +21 -27
- package/src/fileRoute.ts +1 -1
- package/src/route.ts +13 -17
- package/src/routeInfo.ts +17 -23
- package/src/router.ts +2 -2
- package/src/useBlocker.tsx +14 -17
- package/src/useLoaderData.tsx +18 -9
- package/src/useMatch.tsx +12 -7
- package/src/useParams.tsx +14 -10
- package/src/useRouteContext.ts +16 -6
- package/src/useSearch.tsx +15 -10
- package/src/utils.ts +40 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBlocker.js","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as React from 'react'\nimport { useRouter } from './useRouter'\nimport type { BlockerFn } from '@tanstack/history'\nimport type { ReactNode } from './route'\n\ntype BlockerResolver = {\n status: 'idle' | 'blocked'\n proceed: () => void\n reset: () => void\n}\n\ntype BlockerOpts = {\n blockerFn?: BlockerFn\n condition?: boolean | any\n}\n\nexport function useBlocker(blockerFnOrOpts?: BlockerOpts): BlockerResolver\n\n/**\n * @deprecated Use the BlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: BlockerFn,\n condition?: boolean | any,\n): BlockerResolver\n\nexport function useBlocker(\n blockerFnOrOpts?: BlockerFn | BlockerOpts,\n condition?: boolean | any,\n): BlockerResolver {\n const { blockerFn, blockerCondition } = blockerFnOrOpts\n ? typeof blockerFnOrOpts === 'function'\n ? { blockerFn: blockerFnOrOpts, blockerCondition: condition ?? true }\n : {\n blockerFn: blockerFnOrOpts.blockerFn,\n blockerCondition: blockerFnOrOpts.condition ?? true,\n }\n : { blockerFn: undefined, blockerCondition: condition ?? true }\n const { history } = useRouter()\n\n const [resolver, setResolver] = React.useState<BlockerResolver>({\n status: 'idle',\n proceed: () => {},\n reset: () => {},\n })\n\n
|
|
1
|
+
{"version":3,"file":"useBlocker.js","sources":["../../src/useBlocker.tsx"],"sourcesContent":["import * as React from 'react'\nimport { useRouter } from './useRouter'\nimport type { BlockerFn } from '@tanstack/history'\nimport type { ReactNode } from './route'\n\ntype BlockerResolver = {\n status: 'idle' | 'blocked'\n proceed: () => void\n reset: () => void\n}\n\ntype BlockerOpts = {\n blockerFn?: BlockerFn\n condition?: boolean | any\n}\n\nexport function useBlocker(blockerFnOrOpts?: BlockerOpts): BlockerResolver\n\n/**\n * @deprecated Use the BlockerOpts object syntax instead\n */\nexport function useBlocker(\n blockerFn?: BlockerFn,\n condition?: boolean | any,\n): BlockerResolver\n\nexport function useBlocker(\n blockerFnOrOpts?: BlockerFn | BlockerOpts,\n condition?: boolean | any,\n): BlockerResolver {\n const { blockerFn, blockerCondition } = blockerFnOrOpts\n ? typeof blockerFnOrOpts === 'function'\n ? { blockerFn: blockerFnOrOpts, blockerCondition: condition ?? true }\n : {\n blockerFn: blockerFnOrOpts.blockerFn,\n blockerCondition: blockerFnOrOpts.condition ?? true,\n }\n : { blockerFn: undefined, blockerCondition: condition ?? true }\n const { history } = useRouter()\n\n const [resolver, setResolver] = React.useState<BlockerResolver>({\n status: 'idle',\n proceed: () => {},\n reset: () => {},\n })\n\n React.useEffect(() => {\n const blockerFnComposed = async () => {\n // If a function is provided, it takes precedence over the promise blocker\n if (blockerFn) {\n return await blockerFn()\n }\n\n const promise = new Promise<boolean>((resolve) => {\n setResolver({\n status: 'blocked',\n proceed: () => resolve(true),\n reset: () => resolve(false),\n })\n })\n\n const canNavigateAsync = await promise\n\n setResolver({\n status: 'idle',\n proceed: () => {},\n reset: () => {},\n })\n\n return canNavigateAsync\n }\n\n return !blockerCondition ? undefined : history.block(blockerFnComposed)\n }, [blockerFn, blockerCondition, history])\n\n return resolver\n}\n\nexport function Block({ blockerFn, condition, children }: PromptProps) {\n const resolver = useBlocker({ blockerFn, condition })\n return children\n ? typeof children === 'function'\n ? children(resolver)\n : children\n : null\n}\n\nexport type PromptProps = {\n blockerFn?: BlockerFn\n condition?: boolean | any\n children?: ReactNode | (({ proceed, reset }: BlockerResolver) => ReactNode)\n}\n"],"names":[],"mappings":";;AA0BgB,SAAA,WACd,iBACA,WACiB;AACjB,QAAM,EAAE,WAAW,qBAAqB,kBACpC,OAAO,oBAAoB,aACzB,EAAE,WAAW,iBAAiB,kBAAkB,aAAa,SAC7D;AAAA,IACE,WAAW,gBAAgB;AAAA,IAC3B,kBAAkB,gBAAgB,aAAa;AAAA,EAAA,IAEnD,EAAE,WAAW,QAAW,kBAAkB,aAAa;AACrD,QAAA,EAAE,YAAY;AAEpB,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA0B;AAAA,IAC9D,QAAQ;AAAA,IACR,SAAS,MAAM;AAAA,IAAC;AAAA,IAChB,OAAO,MAAM;AAAA,IAAC;AAAA,EAAA,CACf;AAED,QAAM,UAAU,MAAM;AACpB,UAAM,oBAAoB,YAAY;AAEpC,UAAI,WAAW;AACb,eAAO,MAAM,UAAU;AAAA,MACzB;AAEA,YAAM,UAAU,IAAI,QAAiB,CAAC,YAAY;AACpC,oBAAA;AAAA,UACV,QAAQ;AAAA,UACR,SAAS,MAAM,QAAQ,IAAI;AAAA,UAC3B,OAAO,MAAM,QAAQ,KAAK;AAAA,QAAA,CAC3B;AAAA,MAAA,CACF;AAED,YAAM,mBAAmB,MAAM;AAEnB,kBAAA;AAAA,QACV,QAAQ;AAAA,QACR,SAAS,MAAM;AAAA,QAAC;AAAA,QAChB,OAAO,MAAM;AAAA,QAAC;AAAA,MAAA,CACf;AAEM,aAAA;AAAA,IAAA;AAGT,WAAO,CAAC,mBAAmB,SAAY,QAAQ,MAAM,iBAAiB;AAAA,EACrE,GAAA,CAAC,WAAW,kBAAkB,OAAO,CAAC;AAElC,SAAA;AACT;AAEO,SAAS,MAAM,EAAE,WAAW,WAAW,YAAyB;AACrE,QAAM,WAAW,WAAW,EAAE,WAAW,UAAW,CAAA;AACpD,SAAO,WACH,OAAO,aAAa,aAClB,SAAS,QAAQ,IACjB,WACF;AACN;"}
|
|
@@ -4,6 +4,7 @@ import { MakeRouteMatch } from './Matches.js';
|
|
|
4
4
|
import { RouteIds } from './routeInfo.js';
|
|
5
5
|
import { StrictOrFrom } from './utils.js';
|
|
6
6
|
|
|
7
|
-
export
|
|
7
|
+
export type UseLoaderDataOptions<TFrom, TStrict extends boolean, TRouteMatch, TSelected> = StrictOrFrom<TFrom, TStrict> & {
|
|
8
8
|
select?: (match: TRouteMatch) => TSelected;
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
|
+
export declare function useLoaderData<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>, TStrict extends boolean = true, TRouteMatch extends MakeRouteMatch<TRouteTree, TFrom, TStrict> = MakeRouteMatch<TRouteTree, TFrom, TStrict>, TSelected = Required<TRouteMatch>['loaderData']>(opts: UseLoaderDataOptions<TFrom, TStrict, TRouteMatch, TSelected>): TSelected;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLoaderData.js","sources":["../../src/useLoaderData.tsx"],"sourcesContent":["import { type RegisteredRouter } from './router'\nimport { type AnyRoute } from './route'\nimport { useMatch } from './useMatch'\nimport type { MakeRouteMatch } from './Matches'\nimport type { RouteIds } from './routeInfo'\nimport type { StrictOrFrom } from './utils'\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n
|
|
1
|
+
{"version":3,"file":"useLoaderData.js","sources":["../../src/useLoaderData.tsx"],"sourcesContent":["import { type RegisteredRouter } from './router'\nimport { type AnyRoute } from './route'\nimport { useMatch } from './useMatch'\nimport type { MakeRouteMatch } from './Matches'\nimport type { RouteIds } from './routeInfo'\nimport type { StrictOrFrom } from './utils'\n\nexport type UseLoaderDataOptions<\n TFrom,\n TStrict extends boolean,\n TRouteMatch,\n TSelected,\n> = StrictOrFrom<TFrom, TStrict> & {\n select?: (match: TRouteMatch) => TSelected\n}\n\nexport function useLoaderData<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteMatch extends MakeRouteMatch<\n TRouteTree,\n TFrom,\n TStrict\n > = MakeRouteMatch<TRouteTree, TFrom, TStrict>,\n TSelected = Required<TRouteMatch>['loaderData'],\n>(\n opts: UseLoaderDataOptions<TFrom, TStrict, TRouteMatch, TSelected>,\n): TSelected {\n return useMatch<TRouteTree, TFrom, TStrict, TRouteMatch, TSelected>({\n ...opts,\n select: (s) => {\n return typeof opts.select === 'function'\n ? opts.select(s.loaderData as TRouteMatch)\n : (s.loaderData as TSelected)\n },\n })\n}\n"],"names":[],"mappings":";AAgBO,SAAS,cAWd,MACW;AACX,SAAO,SAA6D;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,CAAC,MAAM;AACN,aAAA,OAAO,KAAK,WAAW,aAC1B,KAAK,OAAO,EAAE,UAAyB,IACtC,EAAE;AAAA,IACT;AAAA,EAAA,CACD;AACH;"}
|
package/dist/esm/useMatch.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { MakeRouteMatch } from './Matches.js';
|
|
|
4
4
|
import { RouteIds } from './routeInfo.js';
|
|
5
5
|
import { StrictOrFrom } from './utils.js';
|
|
6
6
|
|
|
7
|
-
export
|
|
7
|
+
export type UseMatchOptions<TFrom, TStrict extends boolean, TRouteMatch, TSelected> = StrictOrFrom<TFrom, TStrict> & {
|
|
8
8
|
select?: (match: TRouteMatch) => TSelected;
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
|
+
export declare function useMatch<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>, TStrict extends boolean = true, TRouteMatch = MakeRouteMatch<TRouteTree, TFrom, TStrict>, TSelected = TRouteMatch>(opts: UseMatchOptions<TFrom, TStrict, TRouteMatch, TSelected>): TSelected;
|
package/dist/esm/useMatch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMatch.js","sources":["../../src/useMatch.tsx"],"sourcesContent":["import * as React from 'react'\nimport invariant from 'tiny-invariant'\nimport { useRouterState } from './useRouterState'\nimport { type RegisteredRouter } from './router'\nimport { type AnyRoute } from './route'\nimport { matchContext } from './Matches'\nimport type { MakeRouteMatch } from './Matches'\nimport type { RouteIds } from './routeInfo'\nimport type { StrictOrFrom } from './utils'\n\nexport function useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n
|
|
1
|
+
{"version":3,"file":"useMatch.js","sources":["../../src/useMatch.tsx"],"sourcesContent":["import * as React from 'react'\nimport invariant from 'tiny-invariant'\nimport { useRouterState } from './useRouterState'\nimport { type RegisteredRouter } from './router'\nimport { type AnyRoute } from './route'\nimport { matchContext } from './Matches'\nimport type { MakeRouteMatch } from './Matches'\nimport type { RouteIds } from './routeInfo'\nimport type { StrictOrFrom } from './utils'\n\nexport type UseMatchOptions<\n TFrom,\n TStrict extends boolean,\n TRouteMatch,\n TSelected,\n> = StrictOrFrom<TFrom, TStrict> & {\n select?: (match: TRouteMatch) => TSelected\n}\n\nexport function useMatch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteMatch = MakeRouteMatch<TRouteTree, TFrom, TStrict>,\n TSelected = TRouteMatch,\n>(opts: UseMatchOptions<TFrom, TStrict, TRouteMatch, TSelected>): TSelected {\n const nearestMatchId = React.useContext(matchContext)\n\n const matchSelection = useRouterState({\n select: (state) => {\n const match = state.matches.find((d) =>\n opts.from ? opts.from === d.routeId : d.id === nearestMatchId,\n )\n\n invariant(\n match,\n `Could not find ${opts.from ? `an active match from \"${opts.from}\"` : 'a nearest match!'}`,\n )\n\n return opts.select ? opts.select(match as any) : match\n },\n })\n\n return matchSelection as TSelected\n}\n"],"names":[],"mappings":";;;;AAmBO,SAAS,SAMd,MAA0E;AACpE,QAAA,iBAAiB,MAAM,WAAW,YAAY;AAEpD,QAAM,iBAAiB,eAAe;AAAA,IACpC,QAAQ,CAAC,UAAU;AACX,YAAA,QAAQ,MAAM,QAAQ;AAAA,QAAK,CAAC,MAChC,KAAK,OAAO,KAAK,SAAS,EAAE,UAAU,EAAE,OAAO;AAAA,MAAA;AAGjD;AAAA,QACE;AAAA,QACA,kBAAkB,KAAK,OAAO,yBAAyB,KAAK,IAAI,MAAM,kBAAkB;AAAA,MAAA;AAG1F,aAAO,KAAK,SAAS,KAAK,OAAO,KAAY,IAAI;AAAA,IACnD;AAAA,EAAA,CACD;AAEM,SAAA;AACT;"}
|
package/dist/esm/useParams.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AnyRoute } from './route.js';
|
|
2
2
|
import { AllParams, RouteById, RouteIds } from './routeInfo.js';
|
|
3
3
|
import { RegisteredRouter } from './router.js';
|
|
4
|
-
import {
|
|
4
|
+
import { StrictOrFrom } from './utils.js';
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type UseParamsOptions<TFrom, TStrict extends boolean, TParams, TSelected> = StrictOrFrom<TFrom, TStrict> & {
|
|
7
7
|
select?: (params: TParams) => TSelected;
|
|
8
|
-
}
|
|
8
|
+
};
|
|
9
|
+
export declare function useParams<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>, TStrict extends boolean = true, TParams = TStrict extends false ? AllParams<TRouteTree> : RouteById<TRouteTree, TFrom>['types']['allParams'], TSelected = TParams>(opts: UseParamsOptions<TFrom, TStrict, TParams, TSelected>): TSelected;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useParams.js","sources":["../../src/useParams.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { AnyRoute } from './route'\nimport type { AllParams, RouteById, RouteIds } from './routeInfo'\nimport type { RegisteredRouter } from './router'\nimport type {
|
|
1
|
+
{"version":3,"file":"useParams.js","sources":["../../src/useParams.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { AnyRoute } from './route'\nimport type { AllParams, RouteById, RouteIds } from './routeInfo'\nimport type { RegisteredRouter } from './router'\nimport type { StrictOrFrom } from './utils'\n\nexport type UseParamsOptions<\n TFrom,\n TStrict extends boolean,\n TParams,\n TSelected,\n> = StrictOrFrom<TFrom, TStrict> & {\n select?: (params: TParams) => TSelected\n}\n\nexport function useParams<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TParams = TStrict extends false\n ? AllParams<TRouteTree>\n : RouteById<TRouteTree, TFrom>['types']['allParams'],\n TSelected = TParams,\n>(opts: UseParamsOptions<TFrom, TStrict, TParams, TSelected>): TSelected {\n return useMatch({\n ...opts,\n select: (match) => {\n return opts.select ? opts.select(match.params as TParams) : match.params\n },\n }) as TSelected\n}\n"],"names":[],"mappings":";AAeO,SAAS,UAQd,MAAuE;AACvE,SAAO,SAAS;AAAA,IACd,GAAG;AAAA,IACH,QAAQ,CAAC,UAAU;AACjB,aAAO,KAAK,SAAS,KAAK,OAAO,MAAM,MAAiB,IAAI,MAAM;AAAA,IACpE;AAAA,EAAA,CACD;AACH;"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AnyRoute } from './route.js';
|
|
2
|
-
import { RouteById, RouteIds } from './routeInfo.js';
|
|
2
|
+
import { AllContext, RouteById, RouteIds } from './routeInfo.js';
|
|
3
3
|
import { RegisteredRouter } from './router.js';
|
|
4
|
-
import { StrictOrFrom } from './utils.js';
|
|
4
|
+
import { Expand, StrictOrFrom } from './utils.js';
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type UseRouteContextOptions<TFrom, TStrict extends boolean, TRouteContext, TSelected> = StrictOrFrom<TFrom, TStrict> & {
|
|
7
7
|
select?: (search: TRouteContext) => TSelected;
|
|
8
|
-
}
|
|
8
|
+
};
|
|
9
|
+
export declare function useRouteContext<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>, TStrict extends boolean = true, TRouteContext = TStrict extends false ? AllContext<TRouteTree> : Expand<RouteById<TRouteTree, TFrom>['types']['allContext']>, TSelected = TRouteContext>(opts: UseRouteContextOptions<TFrom, TStrict, TRouteContext, TSelected>): TSelected;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRouteContext.js","sources":["../../src/useRouteContext.ts"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { MakeRouteMatch } from './Matches'\nimport type { AnyRoute } from './route'\nimport type { RouteById, RouteIds } from './routeInfo'\nimport type { RegisteredRouter } from './router'\nimport type { StrictOrFrom } from './utils'\n\nexport function useRouteContext<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TRouteContext = RouteById<TRouteTree, TFrom>['types']['allContext']
|
|
1
|
+
{"version":3,"file":"useRouteContext.js","sources":["../../src/useRouteContext.ts"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { MakeRouteMatch } from './Matches'\nimport type { AnyRoute } from './route'\nimport type { AllContext, RouteById, RouteIds } from './routeInfo'\nimport type { RegisteredRouter } from './router'\nimport type { Expand, StrictOrFrom } from './utils'\n\nexport type UseRouteContextOptions<\n TFrom,\n TStrict extends boolean,\n TRouteContext,\n TSelected,\n> = StrictOrFrom<TFrom, TStrict> & {\n select?: (search: TRouteContext) => TSelected\n}\n\nexport function useRouteContext<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TRouteContext = TStrict extends false\n ? AllContext<TRouteTree>\n : Expand<RouteById<TRouteTree, TFrom>['types']['allContext']>,\n TSelected = TRouteContext,\n>(\n opts: UseRouteContextOptions<TFrom, TStrict, TRouteContext, TSelected>,\n): TSelected {\n return useMatch({\n ...(opts as any),\n select: (match: MakeRouteMatch<TRouteTree, TFrom>) =>\n opts.select ? opts.select(match.context) : match.context,\n })\n}\n"],"names":[],"mappings":";AAgBO,SAAS,gBASd,MACW;AACX,SAAO,SAAS;AAAA,IACd,GAAI;AAAA,IACJ,QAAQ,CAAC,UACP,KAAK,SAAS,KAAK,OAAO,MAAM,OAAO,IAAI,MAAM;AAAA,EAAA,CACpD;AACH;"}
|
package/dist/esm/useSearch.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { FullSearchSchema, RouteById, RouteIds } from './routeInfo.js';
|
|
|
3
3
|
import { RegisteredRouter } from './router.js';
|
|
4
4
|
import { StrictOrFrom } from './utils.js';
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type UseSearchOptions<TFrom, TStrict extends boolean, TSearch, TSelected> = StrictOrFrom<TFrom, TStrict> & {
|
|
7
7
|
select?: (search: TSearch) => TSelected;
|
|
8
|
-
}
|
|
8
|
+
};
|
|
9
|
+
export declare function useSearch<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>, TStrict extends boolean = true, TSearch = TStrict extends false ? FullSearchSchema<TRouteTree> : Exclude<RouteById<TRouteTree, TFrom>['types']['fullSearchSchema'], RootSearchSchema>, TSelected = TSearch>(opts: UseSearchOptions<TFrom, TStrict, TSearch, TSelected>): TSelected;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSearch.js","sources":["../../src/useSearch.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { AnyRoute, RootSearchSchema } from './route'\nimport type { FullSearchSchema, RouteById, RouteIds } from './routeInfo'\nimport type { RegisteredRouter } from './router'\nimport type { MakeRouteMatch } from './Matches'\nimport type { StrictOrFrom } from './utils'\n\nexport function useSearch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n
|
|
1
|
+
{"version":3,"file":"useSearch.js","sources":["../../src/useSearch.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type { AnyRoute, RootSearchSchema } from './route'\nimport type { FullSearchSchema, RouteById, RouteIds } from './routeInfo'\nimport type { RegisteredRouter } from './router'\nimport type { MakeRouteMatch } from './Matches'\nimport type { StrictOrFrom } from './utils'\n\nexport type UseSearchOptions<\n TFrom,\n TStrict extends boolean,\n TSearch,\n TSelected,\n> = StrictOrFrom<TFrom, TStrict> & {\n select?: (search: TSearch) => TSelected\n}\n\nexport function useSearch<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RouteIds<TRouteTree> = RouteIds<TRouteTree>,\n TStrict extends boolean = true,\n TSearch = TStrict extends false\n ? FullSearchSchema<TRouteTree>\n : Exclude<\n RouteById<TRouteTree, TFrom>['types']['fullSearchSchema'],\n RootSearchSchema\n >,\n TSelected = TSearch,\n>(opts: UseSearchOptions<TFrom, TStrict, TSearch, TSelected>): TSelected {\n return useMatch({\n ...opts,\n select: (match: MakeRouteMatch<TRouteTree, TFrom>) => {\n return opts.select ? opts.select(match.search) : match.search\n },\n })\n}\n"],"names":[],"mappings":";AAgBO,SAAS,UAWd,MAAuE;AACvE,SAAO,SAAS;AAAA,IACd,GAAG;AAAA,IACH,QAAQ,CAAC,UAA6C;AACpD,aAAO,KAAK,SAAS,KAAK,OAAO,MAAM,MAAM,IAAI,MAAM;AAAA,IACzD;AAAA,EAAA,CACD;AACH;"}
|
package/dist/esm/utils.d.ts
CHANGED
|
@@ -21,8 +21,13 @@ export type Assign<TLeft, TRight> = keyof TLeft extends never ? TRight : keyof T
|
|
|
21
21
|
export type Timeout = ReturnType<typeof setTimeout>;
|
|
22
22
|
export type Updater<TPrevious, TResult = TPrevious> = TResult | ((prev?: TPrevious) => TResult);
|
|
23
23
|
export type NonNullableUpdater<TPrevious, TResult = TPrevious> = TResult | ((prev: TPrevious) => TResult);
|
|
24
|
-
type
|
|
25
|
-
export type
|
|
24
|
+
export type MergeUnionObjects<TUnion> = TUnion extends MergeUnionPrimitive ? never : TUnion;
|
|
25
|
+
export type MergeUnionObject<TUnion> = MergeUnionObjects<TUnion> extends infer TObj ? {
|
|
26
|
+
[TKey in TObj extends any ? keyof TObj : never]?: TObj extends any ? TKey extends keyof TObj ? TObj[TKey] : never : never;
|
|
27
|
+
} : never;
|
|
28
|
+
export type MergeUnionPrimitive = ReadonlyArray<any> | number | string | bigint | boolean | symbol;
|
|
29
|
+
export type MergeUnionPrimitives<TUnion> = TUnion extends MergeUnionPrimitive ? TUnion : TUnion extends object ? never : TUnion;
|
|
30
|
+
export type MergeUnion<TUnion> = MergeUnionPrimitives<TUnion> | MergeUnionObject<MergeUnionObjects<TUnion>>;
|
|
26
31
|
export declare function last<T>(arr: Array<T>): T | undefined;
|
|
27
32
|
export declare function functionalUpdate<TResult>(updater: Updater<TResult> | NonNullableUpdater<TResult>, previous: TResult): TResult;
|
|
28
33
|
export declare function pick<TValue, TKey extends keyof TValue>(parent: TValue, keys: Array<TKey>): Pick<TValue, TKey>;
|
|
@@ -39,13 +44,12 @@ export declare function deepEqual(a: any, b: any, partial?: boolean): boolean;
|
|
|
39
44
|
export declare function useStableCallback<T extends (...args: Array<any>) => any>(fn: T): T;
|
|
40
45
|
export declare function shallow<T>(objA: T, objB: T): boolean;
|
|
41
46
|
export type StringLiteral<T> = T extends string ? string extends T ? string : T : never;
|
|
42
|
-
export type StrictOrFrom<TFrom,
|
|
43
|
-
from: StringLiteral<TFrom> | TFrom;
|
|
44
|
-
strict?: true;
|
|
45
|
-
} | {
|
|
47
|
+
export type StrictOrFrom<TFrom, TStrict extends boolean = true> = TStrict extends false ? {
|
|
46
48
|
from?: never;
|
|
47
|
-
strict:
|
|
48
|
-
|
|
49
|
+
strict: TStrict;
|
|
50
|
+
} : {
|
|
51
|
+
from: StringLiteral<TFrom> | TFrom;
|
|
52
|
+
strict?: TStrict;
|
|
49
53
|
};
|
|
50
54
|
export declare const useLayoutEffect: typeof React.useLayoutEffect;
|
|
51
55
|
/**
|
|
@@ -65,4 +69,3 @@ export declare function createControlledPromise<T>(onResolve?: () => void): Cont
|
|
|
65
69
|
* Taken from https://www.developerway.com/posts/implementing-advanced-use-previous-hook#part3
|
|
66
70
|
*/
|
|
67
71
|
export declare function usePrevious<T>(value: T): T | null;
|
|
68
|
-
export {};
|
package/dist/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as React from 'react'\n\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\nexport type IsAny<TValue, TYesResult, TNoResult = TValue> = 1 extends 0 & TValue\n ? TYesResult\n : TNoResult\nexport type PickAsRequired<TValue, TKey extends keyof TValue> = Omit<\n TValue,\n TKey\n> &\n Required<Pick<TValue, TKey>>\n\nexport type PickRequired<T> = {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K]\n}\n\n// from https://stackoverflow.com/a/76458160\nexport type WithoutEmpty<T> = T extends any ? ({} extends T ? never : T) : never\n\n// export type Expand<T> = T\nexport type Expand<T> = T extends object\n ? T extends infer O\n ? O extends Function\n ? O\n : { [K in keyof O]: O[K] }\n : never\n : T\n\nexport type UnionToIntersection<T> = (\n T extends any ? (k: T) => void : never\n) extends (k: infer I) => any\n ? I\n : never\n\nexport type DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>\n }\n : T\n\nexport type MakeDifferenceOptional<TLeft, TRight> = Omit<\n TRight,\n keyof TLeft\n> & {\n [K in keyof TLeft & keyof TRight]?: TRight[K]\n}\n\n// from https://stackoverflow.com/a/53955431\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type IsUnion<T, U extends T = T> = (\n T extends any ? (U extends T ? false : true) : never\n) extends false\n ? false\n : true\n\nexport type Assign<TLeft, TRight> = keyof TLeft extends never\n ? TRight\n : keyof TRight extends never\n ? TLeft\n : Omit<TLeft, keyof TRight> & TRight\n\nexport type Timeout = ReturnType<typeof setTimeout>\n\nexport type Updater<TPrevious, TResult = TPrevious> =\n | TResult\n | ((prev?: TPrevious) => TResult)\n\nexport type NonNullableUpdater<TPrevious, TResult = TPrevious> =\n | TResult\n | ((prev: TPrevious) => TResult)\n\n// from https://github.com/type-challenges/type-challenges/issues/737\ntype LastInUnion<T> =\n UnionToIntersection<T extends unknown ? (x: T) => 0 : never> extends (\n x: infer L,\n ) => 0\n ? L\n : never\nexport type UnionToTuple<T, TLast = LastInUnion<T>> = [T] extends [never]\n ? []\n : [...UnionToTuple<Exclude<T, TLast>>, TLast]\n\n//\n\nexport function last<T>(arr: Array<T>) {\n return arr[arr.length - 1]\n}\n\nfunction isFunction(d: any): d is Function {\n return typeof d === 'function'\n}\n\nexport function functionalUpdate<TResult>(\n updater: Updater<TResult> | NonNullableUpdater<TResult>,\n previous: TResult,\n): TResult {\n if (isFunction(updater)) {\n return updater(previous)\n }\n\n return updater\n}\n\nexport function pick<TValue, TKey extends keyof TValue>(\n parent: TValue,\n keys: Array<TKey>,\n): Pick<TValue, TKey> {\n return keys.reduce((obj: any, key: TKey) => {\n obj[key] = parent[key]\n return obj\n }, {} as any)\n}\n\n/**\n * This function returns `prev` if `_next` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between immutable JSON values for example.\n * Do not use this with signals\n */\nexport function replaceEqualDeep<T>(prev: any, _next: T): T {\n if (prev === _next) {\n return prev\n }\n\n const next = _next as any\n\n const array = isPlainArray(prev) && isPlainArray(next)\n\n if (array || (isPlainObject(prev) && isPlainObject(next))) {\n const prevItems = array ? prev : Object.keys(prev)\n const prevSize = prevItems.length\n const nextItems = array ? next : Object.keys(next)\n const nextSize = nextItems.length\n const copy: any = array ? [] : {}\n\n let equalItems = 0\n\n for (let i = 0; i < nextSize; i++) {\n const key = array ? i : nextItems[i]\n if (\n ((!array && prevItems.includes(key)) || array) &&\n prev[key] === undefined &&\n next[key] === undefined\n ) {\n copy[key] = undefined\n equalItems++\n } else {\n copy[key] = replaceEqualDeep(prev[key], next[key])\n if (copy[key] === prev[key] && prev[key] !== undefined) {\n equalItems++\n }\n }\n }\n\n return prevSize === nextSize && equalItems === prevSize ? prev : copy\n }\n\n return next\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any) {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has modified constructor\n const ctor = o.constructor\n if (typeof ctor === 'undefined') {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any) {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function isPlainArray(value: unknown) {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\nexport function deepEqual(a: any, b: any, partial: boolean = false): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n\n if (!partial && aKeys.length !== bKeys.length) {\n return false\n }\n\n return !bKeys.some(\n (key) => !(key in a) || !deepEqual(a[key], b[key], partial),\n )\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return !a.some((item, index) => !deepEqual(item, b[index], partial))\n }\n\n return false\n}\n\nexport function useStableCallback<T extends (...args: Array<any>) => any>(\n fn: T,\n): T {\n const fnRef = React.useRef(fn)\n fnRef.current = fn\n\n const ref = React.useRef((...args: Array<any>) => fnRef.current(...args))\n return ref.current as T\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (const item of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, item) ||\n !Object.is(objA[item as keyof T], objB[item as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\nexport type StringLiteral<T> = T extends string\n ? string extends T\n ? string\n : T\n : never\n\nexport type StrictOrFrom<TFrom, TReturnIntersection extends boolean = false> =\n | {\n from: StringLiteral<TFrom> | TFrom\n strict?: true\n }\n | {\n from?: never\n strict: false\n experimental_returnIntersection?: TReturnIntersection\n }\n\nexport const useLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\n/**\n *\n * @deprecated use `jsesc` instead\n */\nexport function escapeJSON(jsonString: string) {\n return jsonString\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/'/g, \"\\\\'\") // Escape single quotes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n}\n\nexport function removeTrailingSlash(value: string): string {\n if (value.endsWith('/') && value !== '/') {\n return value.slice(0, -1)\n }\n return value\n}\n\n// intended to only compare path name\n// see the usage in the isActive under useLinkProps\n// /sample/path1 = /sample/path1/\n// /sample/path1/some <> /sample/path1\nexport function exactPathTest(pathName1: string, pathName2: string): boolean {\n return removeTrailingSlash(pathName1) === removeTrailingSlash(pathName2)\n}\n\nexport type ControlledPromise<T> = Promise<T> & {\n resolve: (value: T) => void\n reject: (value: any) => void\n status: 'pending' | 'resolved' | 'rejected'\n}\n\nexport function createControlledPromise<T>(onResolve?: () => void) {\n let resolveLoadPromise!: () => void\n let rejectLoadPromise!: (value: any) => void\n\n const controlledPromise = new Promise<void>((resolve, reject) => {\n resolveLoadPromise = resolve\n rejectLoadPromise = reject\n }) as ControlledPromise<T>\n\n controlledPromise.status = 'pending'\n\n controlledPromise.resolve = () => {\n controlledPromise.status = 'resolved'\n resolveLoadPromise()\n onResolve?.()\n }\n\n controlledPromise.reject = (e) => {\n controlledPromise.status = 'rejected'\n rejectLoadPromise(e)\n }\n\n return controlledPromise\n}\n\n/**\n * Taken from https://www.developerway.com/posts/implementing-advanced-use-previous-hook#part3\n */\nexport function usePrevious<T>(value: T): T | null {\n // initialise the ref with previous and current values\n const ref = React.useRef<{ value: T; prev: T | null }>({\n value: value,\n prev: null,\n })\n\n const current = ref.current.value\n\n // if the value passed into hook doesn't match what we store as \"current\"\n // move the \"current\" to the \"previous\"\n // and store the passed value as \"current\"\n if (value !== current) {\n ref.current = {\n value: value,\n prev: current,\n }\n }\n\n // return the previous value only\n return ref.current.prev\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as React from 'react'\n\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\nexport type IsAny<TValue, TYesResult, TNoResult = TValue> = 1 extends 0 & TValue\n ? TYesResult\n : TNoResult\nexport type PickAsRequired<TValue, TKey extends keyof TValue> = Omit<\n TValue,\n TKey\n> &\n Required<Pick<TValue, TKey>>\n\nexport type PickRequired<T> = {\n [K in keyof T as undefined extends T[K] ? never : K]: T[K]\n}\n\n// from https://stackoverflow.com/a/76458160\nexport type WithoutEmpty<T> = T extends any ? ({} extends T ? never : T) : never\n\n// export type Expand<T> = T\nexport type Expand<T> = T extends object\n ? T extends infer O\n ? O extends Function\n ? O\n : { [K in keyof O]: O[K] }\n : never\n : T\n\nexport type UnionToIntersection<T> = (\n T extends any ? (k: T) => void : never\n) extends (k: infer I) => any\n ? I\n : never\n\nexport type DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>\n }\n : T\n\nexport type MakeDifferenceOptional<TLeft, TRight> = Omit<\n TRight,\n keyof TLeft\n> & {\n [K in keyof TLeft & keyof TRight]?: TRight[K]\n}\n\n// from https://stackoverflow.com/a/53955431\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type IsUnion<T, U extends T = T> = (\n T extends any ? (U extends T ? false : true) : never\n) extends false\n ? false\n : true\n\nexport type Assign<TLeft, TRight> = keyof TLeft extends never\n ? TRight\n : keyof TRight extends never\n ? TLeft\n : Omit<TLeft, keyof TRight> & TRight\n\nexport type Timeout = ReturnType<typeof setTimeout>\n\nexport type Updater<TPrevious, TResult = TPrevious> =\n | TResult\n | ((prev?: TPrevious) => TResult)\n\nexport type NonNullableUpdater<TPrevious, TResult = TPrevious> =\n | TResult\n | ((prev: TPrevious) => TResult)\n\nexport type MergeUnionObjects<TUnion> = TUnion extends MergeUnionPrimitive\n ? never\n : TUnion\n\nexport type MergeUnionObject<TUnion> =\n MergeUnionObjects<TUnion> extends infer TObj\n ? {\n [TKey in TObj extends any ? keyof TObj : never]?: TObj extends any\n ? TKey extends keyof TObj\n ? TObj[TKey]\n : never\n : never\n }\n : never\n\nexport type MergeUnionPrimitive =\n | ReadonlyArray<any>\n | number\n | string\n | bigint\n | boolean\n | symbol\n\nexport type MergeUnionPrimitives<TUnion> = TUnion extends MergeUnionPrimitive\n ? TUnion\n : TUnion extends object\n ? never\n : TUnion\n\nexport type MergeUnion<TUnion> =\n | MergeUnionPrimitives<TUnion>\n | MergeUnionObject<MergeUnionObjects<TUnion>>\n\nexport function last<T>(arr: Array<T>) {\n return arr[arr.length - 1]\n}\n\nfunction isFunction(d: any): d is Function {\n return typeof d === 'function'\n}\n\nexport function functionalUpdate<TResult>(\n updater: Updater<TResult> | NonNullableUpdater<TResult>,\n previous: TResult,\n): TResult {\n if (isFunction(updater)) {\n return updater(previous)\n }\n\n return updater\n}\n\nexport function pick<TValue, TKey extends keyof TValue>(\n parent: TValue,\n keys: Array<TKey>,\n): Pick<TValue, TKey> {\n return keys.reduce((obj: any, key: TKey) => {\n obj[key] = parent[key]\n return obj\n }, {} as any)\n}\n\n/**\n * This function returns `prev` if `_next` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between immutable JSON values for example.\n * Do not use this with signals\n */\nexport function replaceEqualDeep<T>(prev: any, _next: T): T {\n if (prev === _next) {\n return prev\n }\n\n const next = _next as any\n\n const array = isPlainArray(prev) && isPlainArray(next)\n\n if (array || (isPlainObject(prev) && isPlainObject(next))) {\n const prevItems = array ? prev : Object.keys(prev)\n const prevSize = prevItems.length\n const nextItems = array ? next : Object.keys(next)\n const nextSize = nextItems.length\n const copy: any = array ? [] : {}\n\n let equalItems = 0\n\n for (let i = 0; i < nextSize; i++) {\n const key = array ? i : nextItems[i]\n if (\n ((!array && prevItems.includes(key)) || array) &&\n prev[key] === undefined &&\n next[key] === undefined\n ) {\n copy[key] = undefined\n equalItems++\n } else {\n copy[key] = replaceEqualDeep(prev[key], next[key])\n if (copy[key] === prev[key] && prev[key] !== undefined) {\n equalItems++\n }\n }\n }\n\n return prevSize === nextSize && equalItems === prevSize ? prev : copy\n }\n\n return next\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\nexport function isPlainObject(o: any) {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has modified constructor\n const ctor = o.constructor\n if (typeof ctor === 'undefined') {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\nfunction hasObjectPrototype(o: any) {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n\nexport function isPlainArray(value: unknown) {\n return Array.isArray(value) && value.length === Object.keys(value).length\n}\n\nexport function deepEqual(a: any, b: any, partial: boolean = false): boolean {\n if (a === b) {\n return true\n }\n\n if (typeof a !== typeof b) {\n return false\n }\n\n if (isPlainObject(a) && isPlainObject(b)) {\n const aKeys = Object.keys(a)\n const bKeys = Object.keys(b)\n\n if (!partial && aKeys.length !== bKeys.length) {\n return false\n }\n\n return !bKeys.some(\n (key) => !(key in a) || !deepEqual(a[key], b[key], partial),\n )\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return !a.some((item, index) => !deepEqual(item, b[index], partial))\n }\n\n return false\n}\n\nexport function useStableCallback<T extends (...args: Array<any>) => any>(\n fn: T,\n): T {\n const fnRef = React.useRef(fn)\n fnRef.current = fn\n\n const ref = React.useRef((...args: Array<any>) => fnRef.current(...args))\n return ref.current as T\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (const item of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, item) ||\n !Object.is(objA[item as keyof T], objB[item as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\nexport type StringLiteral<T> = T extends string\n ? string extends T\n ? string\n : T\n : never\n\nexport type StrictOrFrom<\n TFrom,\n TStrict extends boolean = true,\n> = TStrict extends false\n ? {\n from?: never\n strict: TStrict\n }\n : {\n from: StringLiteral<TFrom> | TFrom\n strict?: TStrict\n }\n\nexport const useLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\n/**\n *\n * @deprecated use `jsesc` instead\n */\nexport function escapeJSON(jsonString: string) {\n return jsonString\n .replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n .replace(/'/g, \"\\\\'\") // Escape single quotes\n .replace(/\"/g, '\\\\\"') // Escape double quotes\n}\n\nexport function removeTrailingSlash(value: string): string {\n if (value.endsWith('/') && value !== '/') {\n return value.slice(0, -1)\n }\n return value\n}\n\n// intended to only compare path name\n// see the usage in the isActive under useLinkProps\n// /sample/path1 = /sample/path1/\n// /sample/path1/some <> /sample/path1\nexport function exactPathTest(pathName1: string, pathName2: string): boolean {\n return removeTrailingSlash(pathName1) === removeTrailingSlash(pathName2)\n}\n\nexport type ControlledPromise<T> = Promise<T> & {\n resolve: (value: T) => void\n reject: (value: any) => void\n status: 'pending' | 'resolved' | 'rejected'\n}\n\nexport function createControlledPromise<T>(onResolve?: () => void) {\n let resolveLoadPromise!: () => void\n let rejectLoadPromise!: (value: any) => void\n\n const controlledPromise = new Promise<void>((resolve, reject) => {\n resolveLoadPromise = resolve\n rejectLoadPromise = reject\n }) as ControlledPromise<T>\n\n controlledPromise.status = 'pending'\n\n controlledPromise.resolve = () => {\n controlledPromise.status = 'resolved'\n resolveLoadPromise()\n onResolve?.()\n }\n\n controlledPromise.reject = (e) => {\n controlledPromise.status = 'rejected'\n rejectLoadPromise(e)\n }\n\n return controlledPromise\n}\n\n/**\n * Taken from https://www.developerway.com/posts/implementing-advanced-use-previous-hook#part3\n */\nexport function usePrevious<T>(value: T): T | null {\n // initialise the ref with previous and current values\n const ref = React.useRef<{ value: T; prev: T | null }>({\n value: value,\n prev: null,\n })\n\n const current = ref.current.value\n\n // if the value passed into hook doesn't match what we store as \"current\"\n // move the \"current\" to the \"previous\"\n // and store the passed value as \"current\"\n if (value !== current) {\n ref.current = {\n value: value,\n prev: current,\n }\n }\n\n // return the previous value only\n return ref.current.prev\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Matches.tsx
CHANGED
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
import { rootRouteId } from './root'
|
|
18
18
|
import type { ResolveRelativePath, ToOptions } from './link'
|
|
19
19
|
import type {
|
|
20
|
+
AllContext,
|
|
21
|
+
AllLoaderData,
|
|
20
22
|
AllParams,
|
|
21
23
|
FullSearchSchema,
|
|
22
24
|
ParseRoute,
|
|
@@ -72,16 +74,20 @@ export interface RouteMatch<
|
|
|
72
74
|
export type MakeRouteMatch<
|
|
73
75
|
TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
|
|
74
76
|
TRouteId = ParseRoute<TRouteTree>['id'],
|
|
75
|
-
|
|
77
|
+
TStrict extends boolean = true,
|
|
76
78
|
TTypes extends AnyRoute['types'] = RouteById<TRouteTree, TRouteId>['types'],
|
|
77
|
-
TAllParams =
|
|
78
|
-
?
|
|
79
|
-
:
|
|
80
|
-
TFullSearchSchema =
|
|
81
|
-
?
|
|
82
|
-
:
|
|
83
|
-
TLoaderData =
|
|
84
|
-
|
|
79
|
+
TAllParams = TStrict extends false
|
|
80
|
+
? AllParams<TRouteTree>
|
|
81
|
+
: TTypes['allParams'],
|
|
82
|
+
TFullSearchSchema = TStrict extends false
|
|
83
|
+
? FullSearchSchema<TRouteTree>
|
|
84
|
+
: TTypes['fullSearchSchema'],
|
|
85
|
+
TLoaderData = TStrict extends false
|
|
86
|
+
? AllLoaderData<TRouteTree>
|
|
87
|
+
: TTypes['loaderData'],
|
|
88
|
+
TAllContext = TStrict extends false
|
|
89
|
+
? AllContext<TRouteTree>
|
|
90
|
+
: TTypes['allContext'],
|
|
85
91
|
TRouteContext = TTypes['routeContext'],
|
|
86
92
|
TLoaderDeps = TTypes['loaderDeps'],
|
|
87
93
|
> = RouteMatch<
|
|
@@ -549,13 +555,9 @@ export function MatchRoute<
|
|
|
549
555
|
export function useMatches<
|
|
550
556
|
TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
|
|
551
557
|
TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],
|
|
552
|
-
|
|
553
|
-
TRouteMatch = MakeRouteMatch<TRouteTree, TRouteId, TReturnIntersection>,
|
|
558
|
+
TRouteMatch = MakeRouteMatch<TRouteTree, TRouteId>,
|
|
554
559
|
T = Array<TRouteMatch>,
|
|
555
|
-
>(opts?: {
|
|
556
|
-
select?: (matches: Array<TRouteMatch>) => T
|
|
557
|
-
experimental_returnIntersection?: TReturnIntersection
|
|
558
|
-
}): T {
|
|
560
|
+
>(opts?: { select?: (matches: Array<TRouteMatch>) => T }): T {
|
|
559
561
|
return useRouterState({
|
|
560
562
|
select: (state) => {
|
|
561
563
|
const matches = state.matches
|
|
@@ -569,13 +571,9 @@ export function useMatches<
|
|
|
569
571
|
export function useParentMatches<
|
|
570
572
|
TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
|
|
571
573
|
TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],
|
|
572
|
-
|
|
573
|
-
TRouteMatch = MakeRouteMatch<TRouteTree, TRouteId, TReturnIntersection>,
|
|
574
|
+
TRouteMatch = MakeRouteMatch<TRouteTree, TRouteId>,
|
|
574
575
|
T = Array<TRouteMatch>,
|
|
575
|
-
>(opts?: {
|
|
576
|
-
select?: (matches: Array<TRouteMatch>) => T
|
|
577
|
-
experimental_returnIntersection?: TReturnIntersection
|
|
578
|
-
}): T {
|
|
576
|
+
>(opts?: { select?: (matches: Array<TRouteMatch>) => T }): T {
|
|
579
577
|
const contextMatchId = React.useContext(matchContext)
|
|
580
578
|
|
|
581
579
|
return useMatches({
|
|
@@ -594,13 +592,9 @@ export function useParentMatches<
|
|
|
594
592
|
export function useChildMatches<
|
|
595
593
|
TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],
|
|
596
594
|
TRouteId extends RouteIds<TRouteTree> = ParseRoute<TRouteTree>['id'],
|
|
597
|
-
|
|
598
|
-
TRouteMatch = MakeRouteMatch<TRouteTree, TRouteId, TReturnIntersection>,
|
|
595
|
+
TRouteMatch = MakeRouteMatch<TRouteTree, TRouteId>,
|
|
599
596
|
T = Array<TRouteMatch>,
|
|
600
|
-
>(opts?: {
|
|
601
|
-
select?: (matches: Array<TRouteMatch>) => T
|
|
602
|
-
experimental_returnIntersection?: TReturnIntersection
|
|
603
|
-
}): T {
|
|
597
|
+
>(opts?: { select?: (matches: Array<TRouteMatch>) => T }): T {
|
|
604
598
|
const contextMatchId = React.useContext(matchContext)
|
|
605
599
|
|
|
606
600
|
return useMatches({
|
package/src/fileRoute.ts
CHANGED
|
@@ -94,7 +94,7 @@ export class FileRoute<
|
|
|
94
94
|
TAllContext = ResolveAllContext<TParentRoute, TRouteContext>,
|
|
95
95
|
TRouterContext = AnyContext,
|
|
96
96
|
TLoaderDeps extends Record<string, any> = {},
|
|
97
|
-
TLoaderDataReturn =
|
|
97
|
+
TLoaderDataReturn = {},
|
|
98
98
|
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
99
99
|
TChildren = unknown,
|
|
100
100
|
>(
|
package/src/route.ts
CHANGED
|
@@ -71,10 +71,8 @@ export type RouteOptions<
|
|
|
71
71
|
TRouterContext = AnyContext,
|
|
72
72
|
TAllContext = AnyContext,
|
|
73
73
|
TLoaderDeps extends Record<string, any> = {},
|
|
74
|
-
TLoaderDataReturn =
|
|
75
|
-
TLoaderData =
|
|
76
|
-
? undefined
|
|
77
|
-
: TLoaderDataReturn,
|
|
74
|
+
TLoaderDataReturn = {},
|
|
75
|
+
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
78
76
|
> = BaseRouteOptions<
|
|
79
77
|
TParentRoute,
|
|
80
78
|
TCustomId,
|
|
@@ -121,7 +119,7 @@ export type FileBaseRouteOptions<
|
|
|
121
119
|
TRouterContext = AnyContext,
|
|
122
120
|
TAllContext = AnyContext,
|
|
123
121
|
TLoaderDeps extends Record<string, any> = {},
|
|
124
|
-
TLoaderDataReturn =
|
|
122
|
+
TLoaderDataReturn = {},
|
|
125
123
|
> = {
|
|
126
124
|
validateSearch?: SearchSchemaValidator<TSearchSchemaInput, TSearchSchema>
|
|
127
125
|
shouldReload?:
|
|
@@ -187,7 +185,7 @@ export type BaseRouteOptions<
|
|
|
187
185
|
TRouterContext = AnyContext,
|
|
188
186
|
TAllContext = AnyContext,
|
|
189
187
|
TLoaderDeps extends Record<string, any> = {},
|
|
190
|
-
TLoaderDataReturn =
|
|
188
|
+
TLoaderDataReturn = {},
|
|
191
189
|
> = RoutePathOptions<TCustomId, TPath> &
|
|
192
190
|
FileBaseRouteOptions<
|
|
193
191
|
TParentRoute,
|
|
@@ -344,7 +342,7 @@ export type RouteLoaderFn<
|
|
|
344
342
|
in out TLoaderDeps extends Record<string, any> = {},
|
|
345
343
|
in out TAllContext = AnyContext,
|
|
346
344
|
in out TRouteContext = AnyContext,
|
|
347
|
-
TLoaderData =
|
|
345
|
+
TLoaderData = undefined,
|
|
348
346
|
> = (
|
|
349
347
|
match: LoaderFnContext<TAllParams, TLoaderDeps, TAllContext, TRouteContext>,
|
|
350
348
|
) => Promise<TLoaderData> | TLoaderData
|
|
@@ -629,7 +627,7 @@ export class Route<
|
|
|
629
627
|
>,
|
|
630
628
|
in out TRouterContext = AnyContext,
|
|
631
629
|
in out TLoaderDeps extends Record<string, any> = {},
|
|
632
|
-
TLoaderDataReturn =
|
|
630
|
+
TLoaderDataReturn = {},
|
|
633
631
|
in out TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
634
632
|
in out TChildren = unknown,
|
|
635
633
|
> {
|
|
@@ -971,7 +969,7 @@ export function createRoute<
|
|
|
971
969
|
>,
|
|
972
970
|
TRouterContext = AnyContext,
|
|
973
971
|
TLoaderDeps extends Record<string, any> = {},
|
|
974
|
-
TLoaderDataReturn =
|
|
972
|
+
TLoaderDataReturn = {},
|
|
975
973
|
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
976
974
|
TChildren = unknown,
|
|
977
975
|
>(
|
|
@@ -1029,7 +1027,7 @@ export type RootRouteOptions<
|
|
|
1029
1027
|
TRouteContext = ResolveRouteContext<TRouteContextReturn>,
|
|
1030
1028
|
TRouterContext = {},
|
|
1031
1029
|
TLoaderDeps extends Record<string, any> = {},
|
|
1032
|
-
TLoaderDataReturn =
|
|
1030
|
+
TLoaderDataReturn = {},
|
|
1033
1031
|
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
1034
1032
|
> = Omit<
|
|
1035
1033
|
RouteOptions<
|
|
@@ -1069,10 +1067,8 @@ export function createRootRouteWithContext<TRouterContext extends {}>() {
|
|
|
1069
1067
|
? RouteContext
|
|
1070
1068
|
: TRouteContextReturn,
|
|
1071
1069
|
TLoaderDeps extends Record<string, any> = {},
|
|
1072
|
-
TLoaderDataReturn =
|
|
1073
|
-
TLoaderData =
|
|
1074
|
-
? undefined
|
|
1075
|
-
: TLoaderDataReturn,
|
|
1070
|
+
TLoaderDataReturn = {},
|
|
1071
|
+
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
1076
1072
|
>(
|
|
1077
1073
|
options?: RootRouteOptions<
|
|
1078
1074
|
TSearchSchemaInput,
|
|
@@ -1116,7 +1112,7 @@ export class RootRoute<
|
|
|
1116
1112
|
in out TRouteContext = ResolveRouteContext<TRouteContextReturn>,
|
|
1117
1113
|
in out TRouterContext = {},
|
|
1118
1114
|
TLoaderDeps extends Record<string, any> = {},
|
|
1119
|
-
TLoaderDataReturn =
|
|
1115
|
+
TLoaderDataReturn = {},
|
|
1120
1116
|
in out TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
1121
1117
|
> extends Route<
|
|
1122
1118
|
any, // TParentRoute
|
|
@@ -1168,7 +1164,7 @@ export function createRootRoute<
|
|
|
1168
1164
|
TRouteContext = ResolveRouteContext<TRouteContextReturn>,
|
|
1169
1165
|
TRouterContext = {},
|
|
1170
1166
|
TLoaderDeps extends Record<string, any> = {},
|
|
1171
|
-
TLoaderDataReturn =
|
|
1167
|
+
TLoaderDataReturn = {},
|
|
1172
1168
|
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
1173
1169
|
>(
|
|
1174
1170
|
options?: Omit<
|
|
@@ -1326,7 +1322,7 @@ export class NotFoundRoute<
|
|
|
1326
1322
|
>,
|
|
1327
1323
|
TRouterContext = AnyContext,
|
|
1328
1324
|
TLoaderDeps extends Record<string, any> = {},
|
|
1329
|
-
TLoaderDataReturn =
|
|
1325
|
+
TLoaderDataReturn = {},
|
|
1330
1326
|
TLoaderData = ResolveLoaderData<TLoaderDataReturn>,
|
|
1331
1327
|
TChildren = unknown,
|
|
1332
1328
|
> extends Route<
|
package/src/routeInfo.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AnyRoute } from './route'
|
|
2
|
-
import type { AnyRouter,
|
|
3
|
-
import type {
|
|
1
|
+
import type { AnyRoute, RootSearchSchema } from './route'
|
|
2
|
+
import type { AnyRouter, TrailingSlashOption } from './router'
|
|
3
|
+
import type { Expand, MergeUnion } from './utils'
|
|
4
4
|
|
|
5
5
|
export type ParseRoute<TRouteTree, TAcc = TRouteTree> = TRouteTree extends {
|
|
6
6
|
types: { children: infer TChildren }
|
|
@@ -114,26 +114,20 @@ export type RouteByToPath<TRouter extends AnyRouter, TTo> = Extract<
|
|
|
114
114
|
AnyRoute
|
|
115
115
|
>
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
]
|
|
130
|
-
? Reduce<Rest, Reducer<TResult, First>>
|
|
131
|
-
: TResult
|
|
132
|
-
|
|
133
|
-
export type FullSearchSchema<TRouteTree extends AnyRoute> = Partial<
|
|
134
|
-
Reduce<UnionToTuple<ParseRoute<TRouteTree>['types']['fullSearchSchema']>>
|
|
117
|
+
export type FullSearchSchema<TRouteTree extends AnyRoute> = Expand<
|
|
118
|
+
MergeUnion<
|
|
119
|
+
Exclude<ParseRoute<TRouteTree>['types']['searchSchema'], RootSearchSchema>
|
|
120
|
+
>
|
|
121
|
+
>
|
|
122
|
+
|
|
123
|
+
export type AllParams<TRouteTree extends AnyRoute> = Expand<
|
|
124
|
+
MergeUnion<ParseRoute<TRouteTree>['types']['params']>
|
|
125
|
+
>
|
|
126
|
+
|
|
127
|
+
export type AllContext<TRouteTree extends AnyRoute> = Expand<
|
|
128
|
+
MergeUnion<ParseRoute<TRouteTree>['types']['allContext']>
|
|
135
129
|
>
|
|
136
130
|
|
|
137
|
-
export type
|
|
138
|
-
ParseRoute<TRouteTree>['types']['
|
|
131
|
+
export type AllLoaderData<TRouteTree extends AnyRoute> = Expand<
|
|
132
|
+
MergeUnion<ParseRoute<TRouteTree>['types']['loaderData']>
|
|
139
133
|
>
|
package/src/router.ts
CHANGED
|
@@ -509,7 +509,7 @@ export class Router<
|
|
|
509
509
|
'stringifySearch' | 'parseSearch' | 'context'
|
|
510
510
|
>
|
|
511
511
|
history!: RouterHistory
|
|
512
|
-
latestLocation!: ParsedLocation
|
|
512
|
+
latestLocation!: ParsedLocation<FullSearchSchema<TRouteTree>>
|
|
513
513
|
basepath!: string
|
|
514
514
|
routeTree!: TRouteTree
|
|
515
515
|
routesById!: RoutesById<TRouteTree>
|
|
@@ -770,7 +770,7 @@ export class Router<
|
|
|
770
770
|
}
|
|
771
771
|
|
|
772
772
|
parseLocation = (
|
|
773
|
-
previousLocation?: ParsedLocation
|
|
773
|
+
previousLocation?: ParsedLocation<FullSearchSchema<TRouteTree>>,
|
|
774
774
|
): ParsedLocation<FullSearchSchema<TRouteTree>> => {
|
|
775
775
|
const parse = ({
|
|
776
776
|
pathname,
|
package/src/useBlocker.tsx
CHANGED
|
@@ -44,17 +44,6 @@ export function useBlocker(
|
|
|
44
44
|
reset: () => {},
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
const createPromise = () =>
|
|
48
|
-
new Promise<boolean>((resolve) => {
|
|
49
|
-
setResolver({
|
|
50
|
-
status: 'idle',
|
|
51
|
-
proceed: () => resolve(true),
|
|
52
|
-
reset: () => resolve(false),
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
const [promise, setPromise] = React.useState(createPromise)
|
|
57
|
-
|
|
58
47
|
React.useEffect(() => {
|
|
59
48
|
const blockerFnComposed = async () => {
|
|
60
49
|
// If a function is provided, it takes precedence over the promise blocker
|
|
@@ -62,19 +51,27 @@ export function useBlocker(
|
|
|
62
51
|
return await blockerFn()
|
|
63
52
|
}
|
|
64
53
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
54
|
+
const promise = new Promise<boolean>((resolve) => {
|
|
55
|
+
setResolver({
|
|
56
|
+
status: 'blocked',
|
|
57
|
+
proceed: () => resolve(true),
|
|
58
|
+
reset: () => resolve(false),
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
69
62
|
const canNavigateAsync = await promise
|
|
70
63
|
|
|
71
|
-
|
|
64
|
+
setResolver({
|
|
65
|
+
status: 'idle',
|
|
66
|
+
proceed: () => {},
|
|
67
|
+
reset: () => {},
|
|
68
|
+
})
|
|
72
69
|
|
|
73
70
|
return canNavigateAsync
|
|
74
71
|
}
|
|
75
72
|
|
|
76
73
|
return !blockerCondition ? undefined : history.block(blockerFnComposed)
|
|
77
|
-
}, [blockerFn, blockerCondition, history
|
|
74
|
+
}, [blockerFn, blockerCondition, history])
|
|
78
75
|
|
|
79
76
|
return resolver
|
|
80
77
|
}
|