@tanstack/react-router 1.4.0 → 1.4.2

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.
@@ -166,7 +166,7 @@ function useRouterState(opts) {
166
166
  function useRouter(opts) {
167
167
  const resolvedContext = typeof document !== 'undefined' ? window.__TSR_ROUTER_CONTEXT__ || exports.routerContext : exports.routerContext;
168
168
  const value = React__namespace.useContext(resolvedContext);
169
- warning(opts?.warn && value, 'useRouter must be used inside a <RouterProvider> component!');
169
+ warning(!((opts?.warn ?? true) && !value), 'useRouter must be used inside a <RouterProvider> component!');
170
170
  return value;
171
171
  }
172
172
 
@@ -1 +1 @@
1
- {"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { useStore } from '@tanstack/react-store'\nimport { Matches } from './Matches'\nimport { NavigateOptions, ResolveRelativePath, ToOptions } from './link'\nimport { ParsedLocation } from './location'\nimport { AnyRoute } from './route'\nimport { RouteById, RoutePaths } from './routeInfo'\nimport {\n BuildNextOptions,\n RegisteredRouter,\n Router,\n RouterOptions,\n RouterState,\n} from './router'\nimport { NoInfer, pick, useLayoutEffect } from './utils'\nimport { MatchRouteOptions } from './Matches'\nimport { RouteMatch } from './Matches'\n\nconst useTransition =\n React.useTransition ||\n (() => [\n false,\n (cb) => {\n cb()\n },\n ])\n\nexport interface CommitLocationOptions {\n replace?: boolean\n resetScroll?: boolean\n startTransition?: boolean\n}\n\nexport interface MatchLocation {\n to?: string | number | null\n fuzzy?: boolean\n caseSensitive?: boolean\n from?: string\n}\n\nexport type NavigateFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Promise<void>\n\nexport type MatchRouteFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n>(\n location: ToOptions<TRouteTree, TFrom, TTo>,\n opts?: MatchRouteOptions,\n) => false | RouteById<TRouteTree, TResolved>['types']['allParams']\n\nexport type BuildLocationFn<TRouteTree extends AnyRoute> = (\n opts: ToOptions<TRouteTree>,\n) => ParsedLocation\n\nexport type InjectedHtmlEntry = string | (() => Promise<string> | string)\n\nexport let routerContext = React.createContext<Router<any>>(null!)\n\nif (typeof document !== 'undefined') {\n if (window.__TSR_ROUTER_CONTEXT__) {\n routerContext = window.__TSR_ROUTER_CONTEXT__\n } else {\n window.__TSR_ROUTER_CONTEXT__ = routerContext as any\n }\n}\n\nexport function RouterProvider<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouteTree, TDehydrated>) {\n // Allow the router to update options on the router instance\n router.update({\n ...router.options,\n ...rest,\n context: {\n ...router.options.context,\n ...rest?.context,\n },\n } as any)\n\n const matches = router.options.InnerWrap ? (\n <router.options.InnerWrap>\n <Matches />\n </router.options.InnerWrap>\n ) : (\n <Matches />\n )\n\n const provider = (\n <routerContext.Provider value={router}>\n {matches}\n <Transitioner />\n </routerContext.Provider>\n )\n\n if (router.options.Wrap) {\n return <router.options.Wrap>{provider}</router.options.Wrap>\n }\n\n return provider\n}\n\nfunction Transitioner() {\n const mountLoadCount = React.useRef(0)\n const router = useRouter()\n const routerState = useRouterState({\n select: (s) =>\n pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning']),\n })\n\n const [isTransitioning, startReactTransition] = useTransition()\n\n router.startReactTransition = startReactTransition\n\n React.useEffect(() => {\n if (isTransitioning) {\n router.__store.setState((s) => ({\n ...s,\n isTransitioning,\n }))\n }\n }, [isTransitioning])\n\n const tryLoad = () => {\n const apply = (cb: () => void) => {\n if (!routerState.isTransitioning) {\n startReactTransition(() => cb())\n } else {\n cb()\n }\n }\n\n apply(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n })\n }\n\n useLayoutEffect(() => {\n const unsub = router.history.subscribe(() => {\n router.latestLocation = router.parseLocation(router.latestLocation)\n if (routerState.location !== router.latestLocation) {\n tryLoad()\n }\n })\n\n const nextLocation = router.buildLocation({\n search: true,\n params: true,\n hash: true,\n state: true,\n })\n\n if (routerState.location.href !== nextLocation.href) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n\n return () => {\n unsub()\n }\n }, [router.history])\n\n useLayoutEffect(() => {\n if (\n (React.useTransition as any)\n ? routerState.isTransitioning && !isTransitioning\n : true &&\n !routerState.isLoading &&\n routerState.resolvedLocation !== routerState.location\n ) {\n router.emit({\n type: 'onResolved',\n fromLocation: routerState.resolvedLocation,\n toLocation: routerState.location,\n pathChanged:\n routerState.location!.href !== routerState.resolvedLocation?.href,\n })\n\n if ((document as any).querySelector) {\n if (routerState.location.hash !== '') {\n const el = document.getElementById(\n routerState.location.hash,\n ) as HTMLElement | null\n if (el) {\n el.scrollIntoView()\n }\n }\n }\n\n router.__store.setState((s) => ({\n ...s,\n isTransitioning: false,\n resolvedLocation: s.location,\n }))\n }\n }, [\n routerState.isTransitioning,\n isTransitioning,\n routerState.isLoading,\n routerState.resolvedLocation,\n routerState.location,\n ])\n\n useLayoutEffect(() => {\n if (!window.__TSR_DEHYDRATED__ && !mountLoadCount.current) {\n mountLoadCount.current++\n tryLoad()\n }\n }, [])\n\n return null\n}\n\nexport function getRouteMatch<TRouteTree extends AnyRoute>(\n state: RouterState<TRouteTree>,\n id: string,\n): undefined | RouteMatch<TRouteTree> {\n return [\n ...state.cachedMatches,\n ...(state.pendingMatches ?? []),\n ...state.matches,\n ].find((d) => d.id === id)\n}\n\nexport function useRouterState<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TSelected = RouterState<TRouteTree>,\n>(opts?: {\n router?: Router<TRouteTree>\n select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected\n}): TSelected {\n const contextRouter = useRouter<TRouteTree>({\n warn: opts?.router === undefined,\n })\n return useStore((opts?.router || contextRouter).__store, opts?.select as any)\n}\n\nexport type RouterProps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<RouterOptions<TRouteTree, TDehydrated>, 'context'> & {\n router: Router<TRouteTree>\n context?: Partial<RouterOptions<TRouteTree, TDehydrated>['context']>\n}\n\nexport function useRouter<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(opts?: { warn?: boolean }): Router<TRouteTree> {\n const resolvedContext =\n typeof document !== 'undefined'\n ? window.__TSR_ROUTER_CONTEXT__ || routerContext\n : routerContext\n const value = React.useContext(resolvedContext)\n warning(\n opts?.warn && value,\n 'useRouter must be used inside a <RouterProvider> component!',\n )\n return value as any\n}\n"],"names":["useTransition","React","cb","routerContext","createContext","document","window","__TSR_ROUTER_CONTEXT__","RouterProvider","router","rest","update","options","context","matches","InnerWrap","createElement","Matches","provider","Provider","value","Transitioner","Wrap","mountLoadCount","useRef","useRouter","routerState","useRouterState","select","s","pick","isTransitioning","startReactTransition","useEffect","__store","setState","tryLoad","apply","load","err","console","error","useLayoutEffect","unsub","history","subscribe","latestLocation","parseLocation","location","nextLocation","buildLocation","search","params","hash","state","href","commitLocation","replace","isLoading","resolvedLocation","emit","type","fromLocation","toLocation","pathChanged","querySelector","el","getElementById","scrollIntoView","__TSR_DEHYDRATED__","current","getRouteMatch","id","cachedMatches","pendingMatches","find","d","opts","contextRouter","warn","undefined","useStore","resolvedContext","useContext","warning"],"mappings":"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"}
1
+ {"version":3,"file":"RouterProvider.js","sources":["../../src/RouterProvider.tsx"],"sourcesContent":["import * as React from 'react'\nimport warning from 'tiny-warning'\nimport { useStore } from '@tanstack/react-store'\nimport { Matches } from './Matches'\nimport { NavigateOptions, ResolveRelativePath, ToOptions } from './link'\nimport { ParsedLocation } from './location'\nimport { AnyRoute } from './route'\nimport { RouteById, RoutePaths } from './routeInfo'\nimport {\n BuildNextOptions,\n RegisteredRouter,\n Router,\n RouterOptions,\n RouterState,\n} from './router'\nimport { NoInfer, pick, useLayoutEffect } from './utils'\nimport { MatchRouteOptions } from './Matches'\nimport { RouteMatch } from './Matches'\n\nconst useTransition =\n React.useTransition ||\n (() => [\n false,\n (cb) => {\n cb()\n },\n ])\n\nexport interface CommitLocationOptions {\n replace?: boolean\n resetScroll?: boolean\n startTransition?: boolean\n}\n\nexport interface MatchLocation {\n to?: string | number | null\n fuzzy?: boolean\n caseSensitive?: boolean\n from?: string\n}\n\nexport type NavigateFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> | string = string,\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom,\n TMaskTo extends string = '',\n>(\n opts: NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n) => Promise<void>\n\nexport type MatchRouteFn<TRouteTree extends AnyRoute> = <\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>,\n>(\n location: ToOptions<TRouteTree, TFrom, TTo>,\n opts?: MatchRouteOptions,\n) => false | RouteById<TRouteTree, TResolved>['types']['allParams']\n\nexport type BuildLocationFn<TRouteTree extends AnyRoute> = (\n opts: ToOptions<TRouteTree>,\n) => ParsedLocation\n\nexport type InjectedHtmlEntry = string | (() => Promise<string> | string)\n\nexport let routerContext = React.createContext<Router<any>>(null!)\n\nif (typeof document !== 'undefined') {\n if (window.__TSR_ROUTER_CONTEXT__) {\n routerContext = window.__TSR_ROUTER_CONTEXT__\n } else {\n window.__TSR_ROUTER_CONTEXT__ = routerContext as any\n }\n}\n\nexport function RouterProvider<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n>({ router, ...rest }: RouterProps<TRouteTree, TDehydrated>) {\n // Allow the router to update options on the router instance\n router.update({\n ...router.options,\n ...rest,\n context: {\n ...router.options.context,\n ...rest?.context,\n },\n } as any)\n\n const matches = router.options.InnerWrap ? (\n <router.options.InnerWrap>\n <Matches />\n </router.options.InnerWrap>\n ) : (\n <Matches />\n )\n\n const provider = (\n <routerContext.Provider value={router}>\n {matches}\n <Transitioner />\n </routerContext.Provider>\n )\n\n if (router.options.Wrap) {\n return <router.options.Wrap>{provider}</router.options.Wrap>\n }\n\n return provider\n}\n\nfunction Transitioner() {\n const mountLoadCount = React.useRef(0)\n const router = useRouter()\n const routerState = useRouterState({\n select: (s) =>\n pick(s, ['isLoading', 'location', 'resolvedLocation', 'isTransitioning']),\n })\n\n const [isTransitioning, startReactTransition] = useTransition()\n\n router.startReactTransition = startReactTransition\n\n React.useEffect(() => {\n if (isTransitioning) {\n router.__store.setState((s) => ({\n ...s,\n isTransitioning,\n }))\n }\n }, [isTransitioning])\n\n const tryLoad = () => {\n const apply = (cb: () => void) => {\n if (!routerState.isTransitioning) {\n startReactTransition(() => cb())\n } else {\n cb()\n }\n }\n\n apply(() => {\n try {\n router.load()\n } catch (err) {\n console.error(err)\n }\n })\n }\n\n useLayoutEffect(() => {\n const unsub = router.history.subscribe(() => {\n router.latestLocation = router.parseLocation(router.latestLocation)\n if (routerState.location !== router.latestLocation) {\n tryLoad()\n }\n })\n\n const nextLocation = router.buildLocation({\n search: true,\n params: true,\n hash: true,\n state: true,\n })\n\n if (routerState.location.href !== nextLocation.href) {\n router.commitLocation({ ...nextLocation, replace: true })\n }\n\n return () => {\n unsub()\n }\n }, [router.history])\n\n useLayoutEffect(() => {\n if (\n (React.useTransition as any)\n ? routerState.isTransitioning && !isTransitioning\n : true &&\n !routerState.isLoading &&\n routerState.resolvedLocation !== routerState.location\n ) {\n router.emit({\n type: 'onResolved',\n fromLocation: routerState.resolvedLocation,\n toLocation: routerState.location,\n pathChanged:\n routerState.location!.href !== routerState.resolvedLocation?.href,\n })\n\n if ((document as any).querySelector) {\n if (routerState.location.hash !== '') {\n const el = document.getElementById(\n routerState.location.hash,\n ) as HTMLElement | null\n if (el) {\n el.scrollIntoView()\n }\n }\n }\n\n router.__store.setState((s) => ({\n ...s,\n isTransitioning: false,\n resolvedLocation: s.location,\n }))\n }\n }, [\n routerState.isTransitioning,\n isTransitioning,\n routerState.isLoading,\n routerState.resolvedLocation,\n routerState.location,\n ])\n\n useLayoutEffect(() => {\n if (!window.__TSR_DEHYDRATED__ && !mountLoadCount.current) {\n mountLoadCount.current++\n tryLoad()\n }\n }, [])\n\n return null\n}\n\nexport function getRouteMatch<TRouteTree extends AnyRoute>(\n state: RouterState<TRouteTree>,\n id: string,\n): undefined | RouteMatch<TRouteTree> {\n return [\n ...state.cachedMatches,\n ...(state.pendingMatches ?? []),\n ...state.matches,\n ].find((d) => d.id === id)\n}\n\nexport function useRouterState<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TSelected = RouterState<TRouteTree>,\n>(opts?: {\n router?: Router<TRouteTree>\n select: (state: RouterState<RegisteredRouter['routeTree']>) => TSelected\n}): TSelected {\n const contextRouter = useRouter<TRouteTree>({\n warn: opts?.router === undefined,\n })\n return useStore((opts?.router || contextRouter).__store, opts?.select as any)\n}\n\nexport type RouterProps<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TDehydrated extends Record<string, any> = Record<string, any>,\n> = Omit<RouterOptions<TRouteTree, TDehydrated>, 'context'> & {\n router: Router<TRouteTree>\n context?: Partial<RouterOptions<TRouteTree, TDehydrated>['context']>\n}\n\nexport function useRouter<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n>(opts?: { warn?: boolean }): Router<TRouteTree> {\n const resolvedContext =\n typeof document !== 'undefined'\n ? window.__TSR_ROUTER_CONTEXT__ || routerContext\n : routerContext\n const value = React.useContext(resolvedContext)\n warning(\n !((opts?.warn ?? true) && !value),\n 'useRouter must be used inside a <RouterProvider> component!',\n )\n return value as any\n}\n"],"names":["useTransition","React","cb","routerContext","createContext","document","window","__TSR_ROUTER_CONTEXT__","RouterProvider","router","rest","update","options","context","matches","InnerWrap","createElement","Matches","provider","Provider","value","Transitioner","Wrap","mountLoadCount","useRef","useRouter","routerState","useRouterState","select","s","pick","isTransitioning","startReactTransition","useEffect","__store","setState","tryLoad","apply","load","err","console","error","useLayoutEffect","unsub","history","subscribe","latestLocation","parseLocation","location","nextLocation","buildLocation","search","params","hash","state","href","commitLocation","replace","isLoading","resolvedLocation","emit","type","fromLocation","toLocation","pathChanged","querySelector","el","getElementById","scrollIntoView","__TSR_DEHYDRATED__","current","getRouteMatch","id","cachedMatches","pendingMatches","find","d","opts","contextRouter","warn","undefined","useStore","resolvedContext","useContext","warning"],"mappings":"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"}
@@ -114,6 +114,7 @@ exports.useSearch = useSearch.useSearch;
114
114
  exports.deepEqual = utils.deepEqual;
115
115
  exports.escapeJSON = utils.escapeJSON;
116
116
  exports.functionalUpdate = utils.functionalUpdate;
117
+ exports.isPlainArray = utils.isPlainArray;
117
118
  exports.isPlainObject = utils.isPlainObject;
118
119
  exports.isServer = utils.isServer;
119
120
  exports.last = utils.last;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -113,7 +113,7 @@ function pick(parent, keys) {
113
113
  }
114
114
 
115
115
  /**
116
- * This function returns `a` if `b` is deeply equal.
116
+ * This function returns `prev` if `_next` is deeply equal.
117
117
  * If not, it will replace any deeply equal children of `b` with those of `a`.
118
118
  * This can be used for structural sharing between immutable JSON values for example.
119
119
  * Do not use this with signals
@@ -123,7 +123,7 @@ function replaceEqualDeep(prev, _next) {
123
123
  return prev;
124
124
  }
125
125
  const next = _next;
126
- const array = Array.isArray(prev) && Array.isArray(next);
126
+ const array = isPlainArray(prev) && isPlainArray(next);
127
127
  if (array || isPlainObject(prev) && isPlainObject(next)) {
128
128
  const prevSize = array ? prev.length : Object.keys(prev).length;
129
129
  const nextItems = array ? next : Object.keys(next);
@@ -171,6 +171,9 @@ function isPlainObject(o) {
171
171
  function hasObjectPrototype(o) {
172
172
  return Object.prototype.toString.call(o) === '[object Object]';
173
173
  }
174
+ function isPlainArray(value) {
175
+ return Array.isArray(value) && value.length === Object.keys(value).length;
176
+ }
174
177
  function deepEqual(a, b, partial = false) {
175
178
  if (a === b) {
176
179
  return true;
@@ -231,6 +234,7 @@ function escapeJSON(jsonString) {
231
234
  exports.deepEqual = deepEqual;
232
235
  exports.escapeJSON = escapeJSON;
233
236
  exports.functionalUpdate = functionalUpdate;
237
+ exports.isPlainArray = isPlainArray;
234
238
  exports.isPlainObject = isPlainObject;
235
239
  exports.isServer = isServer;
236
240
  exports.last = last;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as React from 'react'\nimport { useMatch } from './Matches'\nimport { RouteMatch } from './Matches'\nimport { AnyRoute } from './route'\nimport { RouteIds, RouteById } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\nexport type IsAny<T, Y, N = T> = 1 extends 0 & T ? Y : N\nexport type PickAsRequired<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\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 T ? ({} 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 ? { [K in keyof O]: O[K] }\n : never\n : T\n\nexport type UnionToIntersection<U> = (\n U extends any ? (k: U) => void : never\n) extends (k: infer I) => any\n ? I\n : never\n\n// type Compute<T> = { [K in keyof T]: T[K] } | never\n\n// type AllKeys<T> = T extends any ? keyof T : never\n\n// export type MergeUnion<T, Keys extends keyof T = keyof T> = Compute<\n// {\n// [K in Keys]: T[Keys]\n// } & {\n// [K in AllKeys<T>]?: T extends any\n// ? K extends keyof T\n// ? T[K]\n// : never\n// : never\n// }\n// >\n\nexport type Assign<Left, Right> = Omit<Left, keyof Right> & Right\n\nexport type AssignAll<T extends any[]> = T extends [infer Left, ...infer Right]\n ? Right extends any[]\n ? Assign<Left, AssignAll<Right>>\n : Left\n : {}\n\n// // Sample types to merge\n// type TypeA = {\n// shared: string\n// onlyInA: string\n// nested: {\n// shared: string\n// aProp: string\n// }\n// array: string[]\n// }\n\n// type TypeB = {\n// shared: number\n// onlyInB: number\n// nested: {\n// shared: number\n// bProp: number\n// }\n// array: number[]\n// }\n\n// type TypeC = {\n// shared: boolean\n// onlyInC: boolean\n// nested: {\n// shared: boolean\n// cProp: boolean\n// }\n// array: boolean[]\n// }\n\n// type Test = Expand<Assign<TypeA, TypeB>>\n\n// // Using DeepMerge to merge TypeA and TypeB\n// type MergedType = Expand<AssignAll<[TypeA, TypeB, TypeC]>>\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<U> = UnionToIntersection<\n U extends unknown ? (x: U) => 0 : never\n> extends (x: infer L) => 0\n ? L\n : never\nexport type UnionToTuple<U, Last = LastInUnion<U>> = [U] extends [never]\n ? []\n : [...UnionToTuple<Exclude<U, Last>>, Last]\n\n//\n\nexport const isServer = typeof document === 'undefined'\n\nexport function last<T>(arr: 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 as TResult)\n }\n\n return updater\n}\n\nexport function pick<T, K extends keyof T>(parent: T, keys: K[]): Pick<T, K> {\n return keys.reduce((obj: any, key: K) => {\n obj[key] = parent[key]\n return obj\n }, {} as any)\n}\n\n/**\n * This function returns `a` if `b` 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 = Array.isArray(prev) && Array.isArray(next)\n\n if (array || (isPlainObject(prev) && isPlainObject(next))) {\n const prevSize = array ? prev.length : Object.keys(prev).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 copy[key] = replaceEqualDeep(prev[key], next[key])\n if (copy[key] === prev[key] && prev[key] !== undefined) {\n equalItems++\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 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: any[]) => any>(fn: T): T {\n const fnRef = React.useRef(fn)\n fnRef.current = fn\n\n const ref = React.useRef((...args: 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 (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\nexport type StrictOrFrom<TFrom> =\n | {\n from: TFrom\n strict?: true\n }\n | {\n from?: never\n strict: false\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 = RouteById<TRouteTree, TFrom>['types']['allContext'],\n TSelected = TRouteContext,\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (search: TRouteContext) => TSelected\n },\n): TStrict extends true ? TSelected : TSelected | undefined {\n return useMatch({\n ...(opts as any),\n select: (match: RouteMatch) =>\n opts?.select\n ? opts.select(match.context as TRouteContext)\n : match.context,\n })\n}\n\nexport const useLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\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"],"names":["isServer","document","last","arr","length","isFunction","d","functionalUpdate","updater","previous","pick","parent","keys","reduce","obj","key","replaceEqualDeep","prev","_next","next","array","Array","isArray","isPlainObject","prevSize","Object","nextItems","nextSize","copy","equalItems","i","undefined","o","hasObjectPrototype","ctor","constructor","prot","prototype","hasOwnProperty","toString","call","deepEqual","a","b","partial","aKeys","bKeys","some","item","index","useStableCallback","fn","fnRef","React","useRef","current","ref","args","shallow","objA","objB","is","keysA","useRouteContext","opts","useMatch","select","match","context","useLayoutEffect","window","useEffect","escapeJSON","jsonString","replace"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["import * as React from 'react'\nimport { useMatch } from './Matches'\nimport { RouteMatch } from './Matches'\nimport { AnyRoute } from './route'\nimport { RouteIds, RouteById } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type NoInfer<T> = [T][T extends any ? 0 : never]\nexport type IsAny<T, Y, N = T> = 1 extends 0 & T ? Y : N\nexport type PickAsRequired<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\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 T ? ({} 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 ? { [K in keyof O]: O[K] }\n : never\n : T\n\nexport type UnionToIntersection<U> = (\n U extends any ? (k: U) => void : never\n) extends (k: infer I) => any\n ? I\n : never\n\n// type Compute<T> = { [K in keyof T]: T[K] } | never\n\n// type AllKeys<T> = T extends any ? keyof T : never\n\n// export type MergeUnion<T, Keys extends keyof T = keyof T> = Compute<\n// {\n// [K in Keys]: T[Keys]\n// } & {\n// [K in AllKeys<T>]?: T extends any\n// ? K extends keyof T\n// ? T[K]\n// : never\n// : never\n// }\n// >\n\nexport type Assign<Left, Right> = Omit<Left, keyof Right> & Right\n\nexport type AssignAll<T extends any[]> = T extends [infer Left, ...infer Right]\n ? Right extends any[]\n ? Assign<Left, AssignAll<Right>>\n : Left\n : {}\n\n// // Sample types to merge\n// type TypeA = {\n// shared: string\n// onlyInA: string\n// nested: {\n// shared: string\n// aProp: string\n// }\n// array: string[]\n// }\n\n// type TypeB = {\n// shared: number\n// onlyInB: number\n// nested: {\n// shared: number\n// bProp: number\n// }\n// array: number[]\n// }\n\n// type TypeC = {\n// shared: boolean\n// onlyInC: boolean\n// nested: {\n// shared: boolean\n// cProp: boolean\n// }\n// array: boolean[]\n// }\n\n// type Test = Expand<Assign<TypeA, TypeB>>\n\n// // Using DeepMerge to merge TypeA and TypeB\n// type MergedType = Expand<AssignAll<[TypeA, TypeB, TypeC]>>\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<U> = UnionToIntersection<\n U extends unknown ? (x: U) => 0 : never\n> extends (x: infer L) => 0\n ? L\n : never\nexport type UnionToTuple<U, Last = LastInUnion<U>> = [U] extends [never]\n ? []\n : [...UnionToTuple<Exclude<U, Last>>, Last]\n\n//\n\nexport const isServer = typeof document === 'undefined'\n\nexport function last<T>(arr: 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 as TResult)\n }\n\n return updater\n}\n\nexport function pick<T, K extends keyof T>(parent: T, keys: K[]): Pick<T, K> {\n return keys.reduce((obj: any, key: K) => {\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 prevSize = array ? prev.length : Object.keys(prev).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 copy[key] = replaceEqualDeep(prev[key], next[key])\n if (copy[key] === prev[key] && prev[key] !== undefined) {\n equalItems++\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: any[]) => any>(fn: T): T {\n const fnRef = React.useRef(fn)\n fnRef.current = fn\n\n const ref = React.useRef((...args: 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 (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\nexport type StrictOrFrom<TFrom> =\n | {\n from: TFrom\n strict?: true\n }\n | {\n from?: never\n strict: false\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 = RouteById<TRouteTree, TFrom>['types']['allContext'],\n TSelected = TRouteContext,\n>(\n opts: StrictOrFrom<TFrom> & {\n select?: (search: TRouteContext) => TSelected\n },\n): TStrict extends true ? TSelected : TSelected | undefined {\n return useMatch({\n ...(opts as any),\n select: (match: RouteMatch) =>\n opts?.select\n ? opts.select(match.context as TRouteContext)\n : match.context,\n })\n}\n\nexport const useLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\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"],"names":["isServer","document","last","arr","length","isFunction","d","functionalUpdate","updater","previous","pick","parent","keys","reduce","obj","key","replaceEqualDeep","prev","_next","next","array","isPlainArray","isPlainObject","prevSize","Object","nextItems","nextSize","copy","equalItems","i","undefined","o","hasObjectPrototype","ctor","constructor","prot","prototype","hasOwnProperty","toString","call","value","Array","isArray","deepEqual","a","b","partial","aKeys","bKeys","some","item","index","useStableCallback","fn","fnRef","React","useRef","current","ref","args","shallow","objA","objB","is","keysA","useRouteContext","opts","useMatch","select","match","context","useLayoutEffect","window","useEffect","escapeJSON","jsonString","replace"],"mappings":"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"}
@@ -190,7 +190,7 @@ function pick(parent, keys) {
190
190
  }
191
191
 
192
192
  /**
193
- * This function returns `a` if `b` is deeply equal.
193
+ * This function returns `prev` if `_next` is deeply equal.
194
194
  * If not, it will replace any deeply equal children of `b` with those of `a`.
195
195
  * This can be used for structural sharing between immutable JSON values for example.
196
196
  * Do not use this with signals
@@ -200,7 +200,7 @@ function replaceEqualDeep(prev, _next) {
200
200
  return prev;
201
201
  }
202
202
  const next = _next;
203
- const array = Array.isArray(prev) && Array.isArray(next);
203
+ const array = isPlainArray(prev) && isPlainArray(next);
204
204
  if (array || isPlainObject(prev) && isPlainObject(next)) {
205
205
  const prevSize = array ? prev.length : Object.keys(prev).length;
206
206
  const nextItems = array ? next : Object.keys(next);
@@ -248,6 +248,9 @@ function isPlainObject(o) {
248
248
  function hasObjectPrototype(o) {
249
249
  return Object.prototype.toString.call(o) === '[object Object]';
250
250
  }
251
+ function isPlainArray(value) {
252
+ return Array.isArray(value) && value.length === Object.keys(value).length;
253
+ }
251
254
  function deepEqual(a, b, partial = false) {
252
255
  if (a === b) {
253
256
  return true;
@@ -619,7 +622,7 @@ function useRouterState(opts) {
619
622
  function useRouter(opts) {
620
623
  const resolvedContext = typeof document !== 'undefined' ? window.__TSR_ROUTER_CONTEXT__ || routerContext : routerContext;
621
624
  const value = React.useContext(resolvedContext);
622
- warning(opts?.warn && value, 'useRouter must be used inside a <RouterProvider> component!');
625
+ warning(!((opts?.warn ?? true) && !value), 'useRouter must be used inside a <RouterProvider> component!');
623
626
  return value;
624
627
  }
625
628
 
@@ -2791,5 +2794,5 @@ function Navigate(props) {
2791
2794
  return null;
2792
2795
  }
2793
2796
 
2794
- export { Await, Block, CatchBoundary, CatchBoundaryImpl, ErrorComponent, FileRoute, FileRouteLoader, Link, Match, MatchRoute, Matches, Navigate, NotFoundRoute, Outlet, PathParamError, RootRoute, Route, RouteApi, Router, RouterProvider, ScrollRestoration, SearchParamError, cleanPath, componentTypes, createRouteMask, decode, deepEqual, defaultParseSearch, defaultStringifySearch, defer, encode, escapeJSON, functionalUpdate, getInitialRouterState, getRenderedMatches, getRouteMatch, interpolatePath, isDehydratedDeferred, isPlainObject, isRedirect, isServer, joinPaths, last, lazyFn, lazyRouteComponent, matchByPath, matchContext, matchPathname, parsePathname, parseSearchWith, pick, redirect, removeBasepath, replaceEqualDeep, resolvePath, rootRouteId, rootRouteWithContext, routerContext, shallow, stringifySearchWith, trimPath, trimPathLeft, trimPathRight, useAwaited, useBlocker, useElementScrollRestoration, useLayoutEffect$1 as useLayoutEffect, useLinkProps, useLoaderData, useLoaderDeps, useMatch, useMatchRoute, useMatches, useNavigate, useParams, useParentMatches, useRouteContext, useRouter, useRouterState, useScrollRestoration, useSearch, useStableCallback };
2797
+ export { Await, Block, CatchBoundary, CatchBoundaryImpl, ErrorComponent, FileRoute, FileRouteLoader, Link, Match, MatchRoute, Matches, Navigate, NotFoundRoute, Outlet, PathParamError, RootRoute, Route, RouteApi, Router, RouterProvider, ScrollRestoration, SearchParamError, cleanPath, componentTypes, createRouteMask, decode, deepEqual, defaultParseSearch, defaultStringifySearch, defer, encode, escapeJSON, functionalUpdate, getInitialRouterState, getRenderedMatches, getRouteMatch, interpolatePath, isDehydratedDeferred, isPlainArray, isPlainObject, isRedirect, isServer, joinPaths, last, lazyFn, lazyRouteComponent, matchByPath, matchContext, matchPathname, parsePathname, parseSearchWith, pick, redirect, removeBasepath, replaceEqualDeep, resolvePath, rootRouteId, rootRouteWithContext, routerContext, shallow, stringifySearchWith, trimPath, trimPathLeft, trimPathRight, useAwaited, useBlocker, useElementScrollRestoration, useLayoutEffect$1 as useLayoutEffect, useLinkProps, useLoaderData, useLoaderDeps, useMatch, useMatchRoute, useMatches, useNavigate, useParams, useParentMatches, useRouteContext, useRouter, useRouterState, useScrollRestoration, useSearch, useStableCallback };
2795
2798
  //# sourceMappingURL=index.js.map