@tanstack/solid-router 2.0.0-alpha.1 → 2.0.0-alpha.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.
@@ -5,6 +5,7 @@ const isServer = require("@tanstack/router-core/isServer");
5
5
  const useRouter = require("./useRouter.cjs");
6
6
  function deepEqual(a, b) {
7
7
  if (Object.is(a, b)) return true;
8
+ if (isPromiseLike(a) || isPromiseLike(b)) return false;
8
9
  if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
9
10
  return false;
10
11
  }
@@ -17,6 +18,9 @@ function deepEqual(a, b) {
17
18
  }
18
19
  return true;
19
20
  }
21
+ function isPromiseLike(value) {
22
+ return !!value && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
23
+ }
20
24
  function useRouterState(opts) {
21
25
  const contextRouter = useRouter.useRouter({
22
26
  warn: opts?.router === void 0
@@ -1 +1 @@
1
- {"version":3,"file":"useRouterState.cjs","sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { createMemo, createSignal, onCleanup } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nfunction deepEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true\n\n if (\n typeof a !== 'object' ||\n a === null ||\n typeof b !== 'object' ||\n b === null\n ) {\n return false\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.state as RouterState<TRouter['routeTree']>\n const selected = createMemo(() =>\n opts?.select ? opts.select(state) : state,\n ) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n return selected\n }\n\n const selector = (state: any) => {\n if (opts?.select) return opts.select(state)\n\n return state\n }\n\n // Track the latest store state in a signal that updates via subscription.\n // We store the full state so that the selector (which may read reactive\n // props like props.matchId) re-runs inside a Solid tracking scope (the\n // createMemo below) rather than inside the store subscriber callback\n // where reactive reads would be untracked.\n const [storeState, setStoreState] = createSignal(router.__store.get())\n\n const unsub = router.__store.subscribe((s) => {\n setStoreState(s)\n }).unsubscribe\n\n onCleanup(() => {\n unsub()\n })\n\n // Run the selector inside a memo so that:\n // 1. Reactive values read by the selector (e.g. props.matchId) are tracked\n // 2. The result is memoized and only updates when the selected value changes\n const selected = createMemo(() => selector(storeState()), undefined, {\n equals: (a: any, b: any) => deepEqual(a, b),\n })\n\n return selected as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"names":["deepEqual","a","b","Object","is","keysA","keys","keysB","length","key","prototype","hasOwnProperty","call","useRouterState","opts","contextRouter","useRouter","warn","router","undefined","_isServer","isServer","state","selected","createMemo","select","selector","storeState","setStoreState","createSignal","__store","get","unsub","subscribe","s","unsubscribe","onCleanup","equals"],"mappings":";;;;;AAUA,SAASA,UAAUC,GAAQC,GAAiB;AAC1C,MAAIC,OAAOC,GAAGH,GAAGC,CAAC,EAAG,QAAO;AAE5B,MACE,OAAOD,MAAM,YACbA,MAAM,QACN,OAAOC,MAAM,YACbA,MAAM,MACN;AACA,WAAO;AAAA,EACT;AAEA,QAAMG,QAAQF,OAAOG,KAAKL,CAAC;AAC3B,QAAMM,QAAQJ,OAAOG,KAAKJ,CAAC;AAE3B,MAAIG,MAAMG,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,aAAWC,OAAOJ,OAAO;AACvB,QAAI,CAACF,OAAOO,UAAUC,eAAeC,KAAKV,GAAGO,GAAG,EAAG,QAAO;AAC1D,QAAI,CAACT,UAAUC,EAAEQ,GAAG,GAAGP,EAAEO,GAAG,CAAC,EAAG,QAAO;AAAA,EACzC;AAEA,SAAO;AACT;AAYO,SAASI,eAIdC,MACoD;AACpD,QAAMC,gBAAgBC,UAAAA,UAAmB;AAAA,IACvCC,MAAMH,MAAMI,WAAWC;AAAAA,EAAAA,CACxB;AACD,QAAMD,SAASJ,MAAMI,UAAUH;AAK/B,QAAMK,YAAYC,qBAAYH,OAAOG;AACrC,MAAID,WAAW;AACb,UAAME,QAAQJ,OAAOI;AACrB,UAAMC,YAAWC,iBAAW,MAC1BV,MAAMW,SAASX,KAAKW,OAAOH,KAAK,IAAIA,KACtC;AACA,WAAOC;AAAAA,EACT;AAEA,QAAMG,WAAWA,CAACJ,UAAe;AAC/B,QAAIR,MAAMW,OAAQ,QAAOX,KAAKW,OAAOH,KAAK;AAE1C,WAAOA;AAAAA,EACT;AAOA,QAAM,CAACK,YAAYC,aAAa,IAAIC,MAAAA,aAAaX,OAAOY,QAAQC,KAAK;AAErE,QAAMC,QAAQd,OAAOY,QAAQG,UAAWC,CAAAA,MAAM;AAC5CN,kBAAcM,CAAC;AAAA,EACjB,CAAC,EAAEC;AAEHC,QAAAA,UAAU,MAAM;AACdJ,UAAAA;AAAAA,EACF,CAAC;AAKD,QAAMT,WAAWC,MAAAA,WAAW,MAAME,SAASC,WAAAA,CAAY,GAAGR,QAAW;AAAA,IACnEkB,QAAQA,CAACpC,GAAQC,MAAWF,UAAUC,GAAGC,CAAC;AAAA,EAAA,CAC3C;AAED,SAAOqB;AACT;;"}
1
+ {"version":3,"file":"useRouterState.cjs","sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { createMemo, createSignal, onCleanup } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nfunction deepEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true\n\n if (isPromiseLike(a) || isPromiseLike(b)) return false\n\n if (\n typeof a !== 'object' ||\n a === null ||\n typeof b !== 'object' ||\n b === null\n ) {\n return false\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as PromiseLike<unknown>).then === 'function'\n )\n}\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.state as RouterState<TRouter['routeTree']>\n const selected = createMemo(() =>\n opts?.select ? opts.select(state) : state,\n ) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n return selected\n }\n\n const selector = (state: any) => {\n if (opts?.select) return opts.select(state)\n\n return state\n }\n\n // Track the latest store state in a signal that updates via subscription.\n // We store the full state so that the selector (which may read reactive\n // props like props.matchId) re-runs inside a Solid tracking scope (the\n // createMemo below) rather than inside the store subscriber callback\n // where reactive reads would be untracked.\n const [storeState, setStoreState] = createSignal(router.__store.get())\n\n const unsub = router.__store.subscribe((s) => {\n setStoreState(s)\n }).unsubscribe\n\n onCleanup(() => {\n unsub()\n })\n\n // Run the selector inside a memo so that:\n // 1. Reactive values read by the selector (e.g. props.matchId) are tracked\n // 2. The result is memoized and only updates when the selected value changes\n const selected = createMemo(() => selector(storeState()), undefined, {\n equals: (a: any, b: any) => deepEqual(a, b),\n })\n\n return selected as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"names":["deepEqual","a","b","Object","is","isPromiseLike","keysA","keys","keysB","length","key","prototype","hasOwnProperty","call","value","then","useRouterState","opts","contextRouter","useRouter","warn","router","undefined","_isServer","isServer","state","selected","createMemo","select","selector","storeState","setStoreState","createSignal","__store","get","unsub","subscribe","s","unsubscribe","onCleanup","equals"],"mappings":";;;;;AAUA,SAASA,UAAUC,GAAQC,GAAiB;AAC1C,MAAIC,OAAOC,GAAGH,GAAGC,CAAC,EAAG,QAAO;AAE5B,MAAIG,cAAcJ,CAAC,KAAKI,cAAcH,CAAC,EAAG,QAAO;AAEjD,MACE,OAAOD,MAAM,YACbA,MAAM,QACN,OAAOC,MAAM,YACbA,MAAM,MACN;AACA,WAAO;AAAA,EACT;AAEA,QAAMI,QAAQH,OAAOI,KAAKN,CAAC;AAC3B,QAAMO,QAAQL,OAAOI,KAAKL,CAAC;AAE3B,MAAII,MAAMG,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,aAAWC,OAAOJ,OAAO;AACvB,QAAI,CAACH,OAAOQ,UAAUC,eAAeC,KAAKX,GAAGQ,GAAG,EAAG,QAAO;AAC1D,QAAI,CAACV,UAAUC,EAAES,GAAG,GAAGR,EAAEQ,GAAG,CAAC,EAAG,QAAO;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,SAASL,cAAcS,OAA+C;AACpE,SACE,CAAC,CAACA,UACD,OAAOA,UAAU,YAAY,OAAOA,UAAU,eAC/C,OAAQA,MAA+BC,SAAS;AAEpD;AAYO,SAASC,eAIdC,MACoD;AACpD,QAAMC,gBAAgBC,UAAAA,UAAmB;AAAA,IACvCC,MAAMH,MAAMI,WAAWC;AAAAA,EAAAA,CACxB;AACD,QAAMD,SAASJ,MAAMI,UAAUH;AAK/B,QAAMK,YAAYC,qBAAYH,OAAOG;AACrC,MAAID,WAAW;AACb,UAAME,QAAQJ,OAAOI;AACrB,UAAMC,YAAWC,iBAAW,MAC1BV,MAAMW,SAASX,KAAKW,OAAOH,KAAK,IAAIA,KACtC;AACA,WAAOC;AAAAA,EACT;AAEA,QAAMG,WAAWA,CAACJ,UAAe;AAC/B,QAAIR,MAAMW,OAAQ,QAAOX,KAAKW,OAAOH,KAAK;AAE1C,WAAOA;AAAAA,EACT;AAOA,QAAM,CAACK,YAAYC,aAAa,IAAIC,MAAAA,aAAaX,OAAOY,QAAQC,KAAK;AAErE,QAAMC,QAAQd,OAAOY,QAAQG,UAAWC,CAAAA,MAAM;AAC5CN,kBAAcM,CAAC;AAAA,EACjB,CAAC,EAAEC;AAEHC,QAAAA,UAAU,MAAM;AACdJ,UAAAA;AAAAA,EACF,CAAC;AAKD,QAAMT,WAAWC,MAAAA,WAAW,MAAME,SAASC,WAAAA,CAAY,GAAGR,QAAW;AAAA,IACnEkB,QAAQA,CAACvC,GAAQC,MAAWF,UAAUC,GAAGC,CAAC;AAAA,EAAA,CAC3C;AAED,SAAOwB;AACT;;"}
@@ -3,6 +3,7 @@ import { isServer } from "@tanstack/router-core/isServer";
3
3
  import { useRouter } from "./useRouter.js";
4
4
  function deepEqual(a, b) {
5
5
  if (Object.is(a, b)) return true;
6
+ if (isPromiseLike(a) || isPromiseLike(b)) return false;
6
7
  if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
7
8
  return false;
8
9
  }
@@ -15,6 +16,9 @@ function deepEqual(a, b) {
15
16
  }
16
17
  return true;
17
18
  }
19
+ function isPromiseLike(value) {
20
+ return !!value && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
21
+ }
18
22
  function useRouterState(opts) {
19
23
  const contextRouter = useRouter({
20
24
  warn: opts?.router === void 0
@@ -1 +1 @@
1
- {"version":3,"file":"useRouterState.js","sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { createMemo, createSignal, onCleanup } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nfunction deepEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true\n\n if (\n typeof a !== 'object' ||\n a === null ||\n typeof b !== 'object' ||\n b === null\n ) {\n return false\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.state as RouterState<TRouter['routeTree']>\n const selected = createMemo(() =>\n opts?.select ? opts.select(state) : state,\n ) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n return selected\n }\n\n const selector = (state: any) => {\n if (opts?.select) return opts.select(state)\n\n return state\n }\n\n // Track the latest store state in a signal that updates via subscription.\n // We store the full state so that the selector (which may read reactive\n // props like props.matchId) re-runs inside a Solid tracking scope (the\n // createMemo below) rather than inside the store subscriber callback\n // where reactive reads would be untracked.\n const [storeState, setStoreState] = createSignal(router.__store.get())\n\n const unsub = router.__store.subscribe((s) => {\n setStoreState(s)\n }).unsubscribe\n\n onCleanup(() => {\n unsub()\n })\n\n // Run the selector inside a memo so that:\n // 1. Reactive values read by the selector (e.g. props.matchId) are tracked\n // 2. The result is memoized and only updates when the selected value changes\n const selected = createMemo(() => selector(storeState()), undefined, {\n equals: (a: any, b: any) => deepEqual(a, b),\n })\n\n return selected as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"names":["deepEqual","a","b","Object","is","keysA","keys","keysB","length","key","prototype","hasOwnProperty","call","useRouterState","opts","contextRouter","useRouter","warn","router","undefined","_isServer","isServer","state","selected","createMemo","select","selector","storeState","setStoreState","createSignal","__store","get","unsub","subscribe","s","unsubscribe","onCleanup","equals"],"mappings":";;;AAUA,SAASA,UAAUC,GAAQC,GAAiB;AAC1C,MAAIC,OAAOC,GAAGH,GAAGC,CAAC,EAAG,QAAO;AAE5B,MACE,OAAOD,MAAM,YACbA,MAAM,QACN,OAAOC,MAAM,YACbA,MAAM,MACN;AACA,WAAO;AAAA,EACT;AAEA,QAAMG,QAAQF,OAAOG,KAAKL,CAAC;AAC3B,QAAMM,QAAQJ,OAAOG,KAAKJ,CAAC;AAE3B,MAAIG,MAAMG,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,aAAWC,OAAOJ,OAAO;AACvB,QAAI,CAACF,OAAOO,UAAUC,eAAeC,KAAKV,GAAGO,GAAG,EAAG,QAAO;AAC1D,QAAI,CAACT,UAAUC,EAAEQ,GAAG,GAAGP,EAAEO,GAAG,CAAC,EAAG,QAAO;AAAA,EACzC;AAEA,SAAO;AACT;AAYO,SAASI,eAIdC,MACoD;AACpD,QAAMC,gBAAgBC,UAAmB;AAAA,IACvCC,MAAMH,MAAMI,WAAWC;AAAAA,EAAAA,CACxB;AACD,QAAMD,SAASJ,MAAMI,UAAUH;AAK/B,QAAMK,YAAYC,YAAYH,OAAOG;AACrC,MAAID,WAAW;AACb,UAAME,QAAQJ,OAAOI;AACrB,UAAMC,YAAWC,WAAW,MAC1BV,MAAMW,SAASX,KAAKW,OAAOH,KAAK,IAAIA,KACtC;AACA,WAAOC;AAAAA,EACT;AAEA,QAAMG,WAAWA,CAACJ,UAAe;AAC/B,QAAIR,MAAMW,OAAQ,QAAOX,KAAKW,OAAOH,KAAK;AAE1C,WAAOA;AAAAA,EACT;AAOA,QAAM,CAACK,YAAYC,aAAa,IAAIC,aAAaX,OAAOY,QAAQC,KAAK;AAErE,QAAMC,QAAQd,OAAOY,QAAQG,UAAWC,CAAAA,MAAM;AAC5CN,kBAAcM,CAAC;AAAA,EACjB,CAAC,EAAEC;AAEHC,YAAU,MAAM;AACdJ,UAAAA;AAAAA,EACF,CAAC;AAKD,QAAMT,WAAWC,WAAW,MAAME,SAASC,WAAAA,CAAY,GAAGR,QAAW;AAAA,IACnEkB,QAAQA,CAACpC,GAAQC,MAAWF,UAAUC,GAAGC,CAAC;AAAA,EAAA,CAC3C;AAED,SAAOqB;AACT;"}
1
+ {"version":3,"file":"useRouterState.js","sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { createMemo, createSignal, onCleanup } from 'solid-js'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport type {\n AnyRouter,\n RegisteredRouter,\n RouterState,\n} from '@tanstack/router-core'\nimport type { Accessor } from 'solid-js'\n\nfunction deepEqual(a: any, b: any): boolean {\n if (Object.is(a, b)) return true\n\n if (isPromiseLike(a) || isPromiseLike(b)) return false\n\n if (\n typeof a !== 'object' ||\n a === null ||\n typeof b !== 'object' ||\n b === null\n ) {\n return false\n }\n\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!deepEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n !!value &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as PromiseLike<unknown>).then === 'function'\n )\n}\n\nexport type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {\n router?: TRouter\n select?: (state: RouterState<TRouter['routeTree']>) => TSelected\n}\n\nexport type UseRouterStateResult<\n TRouter extends AnyRouter,\n TSelected,\n> = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected\n\nexport function useRouterState<\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseRouterStateOptions<TRouter, TSelected>,\n): Accessor<UseRouterStateResult<TRouter, TSelected>> {\n const contextRouter = useRouter<TRouter>({\n warn: opts?.router === undefined,\n })\n const router = opts?.router || contextRouter\n\n // During SSR we render exactly once and do not need reactivity.\n // Avoid subscribing to the store on the server since the server store\n // implementation does not provide subscribe() semantics.\n const _isServer = isServer ?? router.isServer\n if (_isServer) {\n const state = router.state as RouterState<TRouter['routeTree']>\n const selected = createMemo(() =>\n opts?.select ? opts.select(state) : state,\n ) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n return selected\n }\n\n const selector = (state: any) => {\n if (opts?.select) return opts.select(state)\n\n return state\n }\n\n // Track the latest store state in a signal that updates via subscription.\n // We store the full state so that the selector (which may read reactive\n // props like props.matchId) re-runs inside a Solid tracking scope (the\n // createMemo below) rather than inside the store subscriber callback\n // where reactive reads would be untracked.\n const [storeState, setStoreState] = createSignal(router.__store.get())\n\n const unsub = router.__store.subscribe((s) => {\n setStoreState(s)\n }).unsubscribe\n\n onCleanup(() => {\n unsub()\n })\n\n // Run the selector inside a memo so that:\n // 1. Reactive values read by the selector (e.g. props.matchId) are tracked\n // 2. The result is memoized and only updates when the selected value changes\n const selected = createMemo(() => selector(storeState()), undefined, {\n equals: (a: any, b: any) => deepEqual(a, b),\n })\n\n return selected as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"names":["deepEqual","a","b","Object","is","isPromiseLike","keysA","keys","keysB","length","key","prototype","hasOwnProperty","call","value","then","useRouterState","opts","contextRouter","useRouter","warn","router","undefined","_isServer","isServer","state","selected","createMemo","select","selector","storeState","setStoreState","createSignal","__store","get","unsub","subscribe","s","unsubscribe","onCleanup","equals"],"mappings":";;;AAUA,SAASA,UAAUC,GAAQC,GAAiB;AAC1C,MAAIC,OAAOC,GAAGH,GAAGC,CAAC,EAAG,QAAO;AAE5B,MAAIG,cAAcJ,CAAC,KAAKI,cAAcH,CAAC,EAAG,QAAO;AAEjD,MACE,OAAOD,MAAM,YACbA,MAAM,QACN,OAAOC,MAAM,YACbA,MAAM,MACN;AACA,WAAO;AAAA,EACT;AAEA,QAAMI,QAAQH,OAAOI,KAAKN,CAAC;AAC3B,QAAMO,QAAQL,OAAOI,KAAKL,CAAC;AAE3B,MAAII,MAAMG,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,aAAWC,OAAOJ,OAAO;AACvB,QAAI,CAACH,OAAOQ,UAAUC,eAAeC,KAAKX,GAAGQ,GAAG,EAAG,QAAO;AAC1D,QAAI,CAACV,UAAUC,EAAES,GAAG,GAAGR,EAAEQ,GAAG,CAAC,EAAG,QAAO;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,SAASL,cAAcS,OAA+C;AACpE,SACE,CAAC,CAACA,UACD,OAAOA,UAAU,YAAY,OAAOA,UAAU,eAC/C,OAAQA,MAA+BC,SAAS;AAEpD;AAYO,SAASC,eAIdC,MACoD;AACpD,QAAMC,gBAAgBC,UAAmB;AAAA,IACvCC,MAAMH,MAAMI,WAAWC;AAAAA,EAAAA,CACxB;AACD,QAAMD,SAASJ,MAAMI,UAAUH;AAK/B,QAAMK,YAAYC,YAAYH,OAAOG;AACrC,MAAID,WAAW;AACb,UAAME,QAAQJ,OAAOI;AACrB,UAAMC,YAAWC,WAAW,MAC1BV,MAAMW,SAASX,KAAKW,OAAOH,KAAK,IAAIA,KACtC;AACA,WAAOC;AAAAA,EACT;AAEA,QAAMG,WAAWA,CAACJ,UAAe;AAC/B,QAAIR,MAAMW,OAAQ,QAAOX,KAAKW,OAAOH,KAAK;AAE1C,WAAOA;AAAAA,EACT;AAOA,QAAM,CAACK,YAAYC,aAAa,IAAIC,aAAaX,OAAOY,QAAQC,KAAK;AAErE,QAAMC,QAAQd,OAAOY,QAAQG,UAAWC,CAAAA,MAAM;AAC5CN,kBAAcM,CAAC;AAAA,EACjB,CAAC,EAAEC;AAEHC,YAAU,MAAM;AACdJ,UAAAA;AAAAA,EACF,CAAC;AAKD,QAAMT,WAAWC,WAAW,MAAME,SAASC,WAAAA,CAAY,GAAGR,QAAW;AAAA,IACnEkB,QAAQA,CAACvC,GAAQC,MAAWF,UAAUC,GAAGC,CAAC;AAAA,EAAA,CAC3C;AAED,SAAOwB;AACT;"}
@@ -4,6 +4,8 @@ import { useRouter } from './useRouter';
4
4
  function deepEqual(a, b) {
5
5
  if (Object.is(a, b))
6
6
  return true;
7
+ if (isPromiseLike(a) || isPromiseLike(b))
8
+ return false;
7
9
  if (typeof a !== 'object' ||
8
10
  a === null ||
9
11
  typeof b !== 'object' ||
@@ -22,6 +24,11 @@ function deepEqual(a, b) {
22
24
  }
23
25
  return true;
24
26
  }
27
+ function isPromiseLike(value) {
28
+ return (!!value &&
29
+ (typeof value === 'object' || typeof value === 'function') &&
30
+ typeof value.then === 'function');
31
+ }
25
32
  export function useRouterState(opts) {
26
33
  const contextRouter = useRouter({
27
34
  warn: opts?.router === undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"useRouterState.jsx","sourceRoot":"","sources":["../../src/useRouterState.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRouterState.jsx","sourceRoot":"","sources":["../../src/useRouterState.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-router",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.0-alpha.2",
4
4
  "description": "Modern and scalable routing for Solid applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -11,6 +11,8 @@ import type { Accessor } from 'solid-js'
11
11
  function deepEqual(a: any, b: any): boolean {
12
12
  if (Object.is(a, b)) return true
13
13
 
14
+ if (isPromiseLike(a) || isPromiseLike(b)) return false
15
+
14
16
  if (
15
17
  typeof a !== 'object' ||
16
18
  a === null ||
@@ -33,6 +35,14 @@ function deepEqual(a: any, b: any): boolean {
33
35
  return true
34
36
  }
35
37
 
38
+ function isPromiseLike(value: unknown): value is PromiseLike<unknown> {
39
+ return (
40
+ !!value &&
41
+ (typeof value === 'object' || typeof value === 'function') &&
42
+ typeof (value as PromiseLike<unknown>).then === 'function'
43
+ )
44
+ }
45
+
36
46
  export type UseRouterStateOptions<TRouter extends AnyRouter, TSelected> = {
37
47
  router?: TRouter
38
48
  select?: (state: RouterState<TRouter['routeTree']>) => TSelected