UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

1 lines 3.93 kB
{"version":3,"file":"useRouterState.cjs","names":["useStore","isServer","useRouter","AnyRouter","RegisteredRouter","RouterState","Accessor","deepEqual","a","b","Object","is","keysA","keys","keysB","length","key","prototype","hasOwnProperty","call","UseRouterStateOptions","router","TRouter","select","state","TSelected","UseRouterStateResult","useRouterState","opts","contextRouter","warn","undefined","_isServer","selected","__store","equal"],"sources":["../../src/useRouterState.tsx"],"sourcesContent":["import { useStore } from '@tanstack/solid-store'\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\n// Deep equality check to match behavior of solid-store 0.7.0's reconcile()\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 = (\n opts?.select ? opts.select(state) : state\n ) as UseRouterStateResult<TRouter, TSelected>\n return (() => selected) as Accessor<\n UseRouterStateResult<TRouter, TSelected>\n >\n }\n\n return useStore(\n router.__store,\n (state) => {\n if (opts?.select) return opts.select(state)\n\n return state\n },\n {\n // Use deep equality to match behavior of solid-store 0.7.0 which used\n // reconcile(). This ensures updates work correctly when selectors\n // return new object references but with the same values.\n equal: deepEqual,\n },\n ) as Accessor<UseRouterStateResult<TRouter, TSelected>>\n}\n"],"mappings":";;;;;AAWA,SAASO,UAAUC,GAAQC,GAAiB;AAC1C,KAAIC,OAAOC,GAAGH,GAAGC,EAAE,CAAE,QAAO;AAE5B,KACE,OAAOD,MAAM,YACbA,MAAM,QACN,OAAOC,MAAM,YACbA,MAAM,KAEN,QAAO;CAGT,MAAMG,QAAQF,OAAOG,KAAKL,EAAE;CAC5B,MAAMM,QAAQJ,OAAOG,KAAKJ,EAAE;AAE5B,KAAIG,MAAMG,WAAWD,MAAMC,OAAQ,QAAO;AAE1C,MAAK,MAAMC,OAAOJ,OAAO;AACvB,MAAI,CAACF,OAAOO,UAAUC,eAAeC,KAAKV,GAAGO,IAAI,CAAE,QAAO;AAC1D,MAAI,CAACT,UAAUC,EAAEQ,MAAMP,EAAEO,KAAK,CAAE,QAAO;;AAGzC,QAAO;;AAaT,SAAgBW,eAIdC,MACoD;CACpD,MAAMC,gBAAgB3B,kBAAAA,UAAmB,EACvC4B,MAAMF,MAAMP,WAAWU,KAAAA,GACxB,CAAC;CACF,MAAMV,SAASO,MAAMP,UAAUQ;AAM/B,KADkB5B,+BAAAA,YAAYoB,OAAOpB,UACtB;EACb,MAAMuB,QAAQH,OAAOG;EACrB,MAAMS,WACJL,MAAML,SAASK,KAAKL,OAAOC,MAAM,GAAGA;AAEtC,gBAAcS;;AAKhB,SAAA,GAAA,sBAAA,UACEZ,OAAOa,UACNV,UAAU;AACT,MAAII,MAAML,OAAQ,QAAOK,KAAKL,OAAOC,MAAM;AAE3C,SAAOA;IAET,EAIEW,OAAO5B,WAEX,CAAC"}