@tanstack/router-core 0.0.1-beta.50 → 0.0.1-beta.52

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.
@@ -19,7 +19,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
19
19
 
20
20
  var invariant__default = /*#__PURE__*/_interopDefaultLegacy(invariant);
21
21
 
22
- // createRouterAction is a constrained identify function that takes options: key, action, onSuccess, onError, onSettled, etc
22
+ // RouterAction is a constrained identify function that takes options: key, action, onSuccess, onError, onSettled, etc
23
23
  function createAction(options) {
24
24
  const store$1 = store.createStore({
25
25
  submissions: []
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sources":["../../src/actions.ts"],"sourcesContent":["// createRouterAction is a constrained identify function that takes options: key, action, onSuccess, onError, onSettled, etc\n\nimport invariant from 'tiny-invariant'\nimport { batch, createStore, Store } from './store'\n\nexport interface ActionOptions<\n TKey extends string = string,\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n key?: TKey\n action: (payload: TPayload) => TResponse | Promise<TResponse>\n onLatestSuccess?: ActionCallback<TPayload, TResponse, TError>\n onEachSuccess?: ActionCallback<TPayload, TResponse, TError>\n onLatestError?: ActionCallback<TPayload, TResponse, TError>\n onEachError?: ActionCallback<TPayload, TResponse, TError>\n onLatestSettled?: ActionCallback<TPayload, TResponse, TError>\n onEachSettled?: ActionCallback<TPayload, TResponse, TError>\n maxSubmissions?: number\n debug?: boolean\n}\n\ntype ActionCallback<TPayload, TResponse, TError> = (\n submission: ActionSubmission<TPayload, TResponse, TError>,\n) => void | Promise<void>\n\nexport interface Action<\n TKey extends string = string,\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n options: ActionOptions<TKey, TPayload, TResponse, TError>\n submit: (payload?: TPayload) => Promise<TResponse>\n reset: () => void\n store: Store<ActionStore<TPayload, TResponse, TError>>\n}\n\nexport interface ActionStore<\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n submissions: ActionSubmission<TPayload, TResponse, TError>[]\n}\n\nexport type ActionFn<TActionPayload = unknown, TActionResponse = unknown> = (\n submission: TActionPayload,\n) => TActionResponse | Promise<TActionResponse>\n\nexport interface ActionSubmission<\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n submittedAt: number\n status: 'idle' | 'pending' | 'success' | 'error'\n payload: TPayload\n response?: TResponse\n error?: TError\n isInvalid?: boolean\n invalidate: () => void\n getIsLatest: () => boolean\n}\n\nexport function createAction<TKey extends string, TPayload, TResponse, TError>(\n options: ActionOptions<TKey, TPayload, TResponse, TError>,\n): Action<TKey, TPayload, TResponse, TError> {\n const store = createStore<ActionStore<TPayload, TResponse, TError>>(\n {\n submissions: [],\n },\n options.debug,\n )\n\n return {\n options,\n store,\n reset: () => {\n store.setState((s) => {\n s.submissions = []\n })\n },\n submit: async (payload) => {\n const submission: ActionSubmission<TPayload, TResponse, TError> = {\n submittedAt: Date.now(),\n status: 'pending',\n payload: payload as TPayload,\n invalidate: () => {\n setSubmission((s) => {\n s.isInvalid = true\n })\n },\n getIsLatest: () =>\n store.state.submissions[store.state.submissions.length - 1]\n ?.submittedAt === submission.submittedAt,\n }\n\n const setSubmission = (\n updater: (\n submission: ActionSubmission<TPayload, TResponse, TError>,\n ) => void,\n ) => {\n store.setState((s) => {\n const a = s.submissions.find(\n (d) => d.submittedAt === submission.submittedAt,\n )\n\n invariant(a, 'Could not find submission in store')\n\n updater(a)\n })\n }\n\n store.setState((s) => {\n s.submissions.push(submission)\n s.submissions.reverse()\n s.submissions = s.submissions.slice(0, options.maxSubmissions ?? 10)\n s.submissions.reverse()\n })\n\n const after = async () => {\n options.onEachSettled?.(submission)\n if (submission.getIsLatest())\n await options.onLatestSettled?.(submission)\n }\n\n try {\n const res = await options.action?.(submission.payload)\n setSubmission((s) => {\n s.response = res\n })\n await options.onEachSuccess?.(submission)\n if (submission.getIsLatest())\n await options.onLatestSuccess?.(submission)\n await after()\n setSubmission((s) => {\n s.status = 'success'\n })\n return res\n } catch (err: any) {\n console.error(err)\n setSubmission((s) => {\n s.error = err\n })\n await options.onEachError?.(submission)\n if (submission.getIsLatest()) await options.onLatestError?.(submission)\n await after()\n setSubmission((s) => {\n s.status = 'error'\n })\n throw err\n }\n },\n }\n}\n"],"names":["createAction","options","store","createStore","submissions","debug","reset","setState","s","submit","payload","submission","submittedAt","Date","now","status","invalidate","setSubmission","isInvalid","getIsLatest","state","length","updater","a","find","d","invariant","push","reverse","slice","maxSubmissions","after","onEachSettled","onLatestSettled","res","action","response","onEachSuccess","onLatestSuccess","err","console","error","onEachError","onLatestError"],"mappings":"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"}
1
+ {"version":3,"file":"actions.js","sources":["../../src/actions.ts"],"sourcesContent":["// RouterAction is a constrained identify function that takes options: key, action, onSuccess, onError, onSettled, etc\n\nimport invariant from 'tiny-invariant'\nimport { batch, createStore, Store } from './store'\n\nexport interface ActionOptions<\n TKey extends string = string,\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n key?: TKey\n action: (payload: TPayload) => TResponse | Promise<TResponse>\n onLatestSuccess?: ActionCallback<TPayload, TResponse, TError>\n onEachSuccess?: ActionCallback<TPayload, TResponse, TError>\n onLatestError?: ActionCallback<TPayload, TResponse, TError>\n onEachError?: ActionCallback<TPayload, TResponse, TError>\n onLatestSettled?: ActionCallback<TPayload, TResponse, TError>\n onEachSettled?: ActionCallback<TPayload, TResponse, TError>\n maxSubmissions?: number\n debug?: boolean\n}\n\ntype ActionCallback<TPayload, TResponse, TError> = (\n submission: ActionSubmission<TPayload, TResponse, TError>,\n) => void | Promise<void>\n\nexport interface Action<\n TKey extends string = string,\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n options: ActionOptions<TKey, TPayload, TResponse, TError>\n submit: (payload?: TPayload) => Promise<TResponse>\n reset: () => void\n store: Store<ActionStore<TPayload, TResponse, TError>>\n}\n\nexport interface ActionStore<\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n submissions: ActionSubmission<TPayload, TResponse, TError>[]\n}\n\nexport type ActionFn<TActionPayload = unknown, TActionResponse = unknown> = (\n submission: TActionPayload,\n) => TActionResponse | Promise<TActionResponse>\n\nexport interface ActionSubmission<\n TPayload = unknown,\n TResponse = unknown,\n TError = Error,\n> {\n submittedAt: number\n status: 'idle' | 'pending' | 'success' | 'error'\n payload: TPayload\n response?: TResponse\n error?: TError\n isInvalid?: boolean\n invalidate: () => void\n getIsLatest: () => boolean\n}\n\nexport function createAction<TKey extends string, TPayload, TResponse, TError>(\n options: ActionOptions<TKey, TPayload, TResponse, TError>,\n): Action<TKey, TPayload, TResponse, TError> {\n const store = createStore<ActionStore<TPayload, TResponse, TError>>(\n {\n submissions: [],\n },\n options.debug,\n )\n\n return {\n options,\n store,\n reset: () => {\n store.setState((s) => {\n s.submissions = []\n })\n },\n submit: async (payload) => {\n const submission: ActionSubmission<TPayload, TResponse, TError> = {\n submittedAt: Date.now(),\n status: 'pending',\n payload: payload as TPayload,\n invalidate: () => {\n setSubmission((s) => {\n s.isInvalid = true\n })\n },\n getIsLatest: () =>\n store.state.submissions[store.state.submissions.length - 1]\n ?.submittedAt === submission.submittedAt,\n }\n\n const setSubmission = (\n updater: (\n submission: ActionSubmission<TPayload, TResponse, TError>,\n ) => void,\n ) => {\n store.setState((s) => {\n const a = s.submissions.find(\n (d) => d.submittedAt === submission.submittedAt,\n )\n\n invariant(a, 'Could not find submission in store')\n\n updater(a)\n })\n }\n\n store.setState((s) => {\n s.submissions.push(submission)\n s.submissions.reverse()\n s.submissions = s.submissions.slice(0, options.maxSubmissions ?? 10)\n s.submissions.reverse()\n })\n\n const after = async () => {\n options.onEachSettled?.(submission)\n if (submission.getIsLatest())\n await options.onLatestSettled?.(submission)\n }\n\n try {\n const res = await options.action?.(submission.payload)\n setSubmission((s) => {\n s.response = res\n })\n await options.onEachSuccess?.(submission)\n if (submission.getIsLatest())\n await options.onLatestSuccess?.(submission)\n await after()\n setSubmission((s) => {\n s.status = 'success'\n })\n return res\n } catch (err: any) {\n console.error(err)\n setSubmission((s) => {\n s.error = err\n })\n await options.onEachError?.(submission)\n if (submission.getIsLatest()) await options.onLatestError?.(submission)\n await after()\n setSubmission((s) => {\n s.status = 'error'\n })\n throw err\n }\n },\n }\n}\n"],"names":["createAction","options","store","createStore","submissions","debug","reset","setState","s","submit","payload","submission","submittedAt","Date","now","status","invalidate","setSubmission","isInvalid","getIsLatest","state","length","updater","a","find","d","invariant","push","reverse","slice","maxSubmissions","after","onEachSettled","onLatestSettled","res","action","response","onEachSuccess","onLatestSuccess","err","console","error","onEachError","onLatestError"],"mappings":"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"}
@@ -107,13 +107,8 @@ function createMemoryHistory(opts = {
107
107
  const getLocation = () => parseLocation(entries[index], currentState);
108
108
  return createHistory({
109
109
  getLocation,
110
- listener: onUpdate => {
111
- window.addEventListener(popStateEvent, onUpdate);
112
- // We might need to handle the hashchange event in the future
113
- // window.addEventListener(hashChangeEvent, onUpdate)
114
- return () => {
115
- window.removeEventListener(popStateEvent, onUpdate);
116
- };
110
+ listener: () => {
111
+ return () => {};
117
112
  },
118
113
  pushState: (path, state) => {
119
114
  currentState = {
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sources":["../../src/history.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: RouterLocation\n listen: (cb: () => void) => () => void\n push: (path: string, state: any) => void\n replace: (path: string, state: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface RouterLocation extends ParsedPath {\n state: any\n}\n\nconst popStateEvent = 'popstate'\n\nfunction createHistory(opts: {\n getLocation: () => RouterLocation\n listener: (onUpdate: () => void) => () => void\n pushState: (path: string, state: any) => void\n replaceState: (path: string, state: any) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n}): RouterHistory {\n let currentLocation = opts.getLocation()\n let unsub = () => {}\n let listeners = new Set<() => void>()\n\n const onUpdate = () => {\n currentLocation = opts.getLocation()\n\n listeners.forEach((listener) => listener())\n }\n\n return {\n get location() {\n return currentLocation\n },\n listen: (cb: () => void) => {\n if (listeners.size === 0) {\n unsub = opts.listener(onUpdate)\n }\n listeners.add(cb)\n\n return () => {\n listeners.delete(cb)\n if (listeners.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n opts.pushState(path, state)\n onUpdate()\n },\n replace: (path: string, state: any) => {\n opts.replaceState(path, state)\n onUpdate()\n },\n go: (index) => {\n opts.go(index)\n onUpdate()\n },\n back: () => {\n opts.back()\n onUpdate()\n },\n forward: () => {\n opts.forward()\n onUpdate()\n },\n }\n}\n\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.hash}${window.location.search}`)\n const createHref = opts?.createHref ?? ((path) => path)\n const getLocation = () => parseLocation(getHref(), history.state)\n\n return createHistory({\n getLocation,\n listener: (onUpdate) => {\n window.addEventListener(popStateEvent, onUpdate)\n return () => {\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state) => {\n window.history.pushState(\n { ...state, key: createRandomKey() },\n '',\n createHref(path),\n )\n },\n replaceState: (path, state) => {\n window.history.replaceState(\n { ...state, key: createRandomKey() },\n '',\n createHref(path),\n )\n },\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {}\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n listener: (onUpdate) => {\n window.addEventListener(popStateEvent, onUpdate)\n // We might need to handle the hashchange event in the future\n // window.addEventListener(hashChangeEvent, onUpdate)\n return () => {\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state) => {\n currentState = {\n ...state,\n key: createRandomKey(),\n }\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = {\n ...state,\n key: createRandomKey(),\n }\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => window.history.go(n),\n })\n}\n\nfunction parseLocation(href: string, state: any): RouterLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n const pathEnd = Math.min(hashIndex, searchIndex)\n\n return {\n href,\n pathname: pathEnd > -1 ? href.substring(0, pathEnd) : href,\n hash: hashIndex > -1 ? href.substring(hashIndex, searchIndex) : '',\n search: searchIndex > -1 ? href.substring(searchIndex) : '',\n state,\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["popStateEvent","createHistory","opts","currentLocation","getLocation","unsub","listeners","Set","onUpdate","forEach","listener","location","listen","cb","size","add","delete","push","path","state","pushState","replace","replaceState","go","index","back","forward","createBrowserHistory","getHref","window","pathname","hash","search","createHref","parseLocation","history","addEventListener","removeEventListener","key","createRandomKey","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","length","currentState","Math","min","href","hashIndex","indexOf","searchIndex","pathEnd","random","toString"],"mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;;AAuBA,MAAMA,aAAa,GAAG,UAAU,CAAA;AAEhC,SAASC,aAAa,CAACC,IAQtB,EAAiB;AAChB,EAAA,IAAIC,eAAe,GAAGD,IAAI,CAACE,WAAW,EAAE,CAAA;AACxC,EAAA,IAAIC,KAAK,GAAG,MAAM,EAAE,CAAA;AACpB,EAAA,IAAIC,SAAS,GAAG,IAAIC,GAAG,EAAc,CAAA;EAErC,MAAMC,QAAQ,GAAG,MAAM;AACrBL,IAAAA,eAAe,GAAGD,IAAI,CAACE,WAAW,EAAE,CAAA;AAEpCE,IAAAA,SAAS,CAACG,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,EAAE,CAAC,CAAA;GAC5C,CAAA;EAED,OAAO;AACL,IAAA,IAAIC,QAAQ,GAAG;AACb,MAAA,OAAOR,eAAe,CAAA;KACvB;IACDS,MAAM,EAAGC,EAAc,IAAK;AAC1B,MAAA,IAAIP,SAAS,CAACQ,IAAI,KAAK,CAAC,EAAE;AACxBT,QAAAA,KAAK,GAAGH,IAAI,CAACQ,QAAQ,CAACF,QAAQ,CAAC,CAAA;AACjC,OAAA;AACAF,MAAAA,SAAS,CAACS,GAAG,CAACF,EAAE,CAAC,CAAA;AAEjB,MAAA,OAAO,MAAM;AACXP,QAAAA,SAAS,CAACU,MAAM,CAACH,EAAE,CAAC,CAAA;AACpB,QAAA,IAAIP,SAAS,CAACQ,IAAI,KAAK,CAAC,EAAE;AACxBT,UAAAA,KAAK,EAAE,CAAA;AACT,SAAA;OACD,CAAA;KACF;AACDY,IAAAA,IAAI,EAAE,CAACC,IAAY,EAAEC,KAAU,KAAK;AAClCjB,MAAAA,IAAI,CAACkB,SAAS,CAACF,IAAI,EAAEC,KAAK,CAAC,CAAA;AAC3BX,MAAAA,QAAQ,EAAE,CAAA;KACX;AACDa,IAAAA,OAAO,EAAE,CAACH,IAAY,EAAEC,KAAU,KAAK;AACrCjB,MAAAA,IAAI,CAACoB,YAAY,CAACJ,IAAI,EAAEC,KAAK,CAAC,CAAA;AAC9BX,MAAAA,QAAQ,EAAE,CAAA;KACX;IACDe,EAAE,EAAGC,KAAK,IAAK;AACbtB,MAAAA,IAAI,CAACqB,EAAE,CAACC,KAAK,CAAC,CAAA;AACdhB,MAAAA,QAAQ,EAAE,CAAA;KACX;AACDiB,IAAAA,IAAI,EAAE,MAAM;MACVvB,IAAI,CAACuB,IAAI,EAAE,CAAA;AACXjB,MAAAA,QAAQ,EAAE,CAAA;KACX;AACDkB,IAAAA,OAAO,EAAE,MAAM;MACbxB,IAAI,CAACwB,OAAO,EAAE,CAAA;AACdlB,MAAAA,QAAQ,EAAE,CAAA;AACZ,KAAA;GACD,CAAA;AACH,CAAA;AAEO,SAASmB,oBAAoB,CAACzB,IAGpC,EAAiB;EAChB,MAAM0B,OAAO,GACX1B,IAAI,EAAE0B,OAAO,KACZ,MACE,CAAEC,EAAAA,MAAM,CAAClB,QAAQ,CAACmB,QAAS,GAAED,MAAM,CAAClB,QAAQ,CAACoB,IAAK,CAAA,EAAEF,MAAM,CAAClB,QAAQ,CAACqB,MAAO,CAAA,CAAC,CAAC,CAAA;EAClF,MAAMC,UAAU,GAAG/B,IAAI,EAAE+B,UAAU,KAAMf,IAAI,IAAKA,IAAI,CAAC,CAAA;EACvD,MAAMd,WAAW,GAAG,MAAM8B,aAAa,CAACN,OAAO,EAAE,EAAEO,OAAO,CAAChB,KAAK,CAAC,CAAA;AAEjE,EAAA,OAAOlB,aAAa,CAAC;IACnBG,WAAW;IACXM,QAAQ,EAAGF,QAAQ,IAAK;AACtBqB,MAAAA,MAAM,CAACO,gBAAgB,CAACpC,aAAa,EAAEQ,QAAQ,CAAC,CAAA;AAChD,MAAA,OAAO,MAAM;AACXqB,QAAAA,MAAM,CAACQ,mBAAmB,CAACrC,aAAa,EAAEQ,QAAQ,CAAC,CAAA;OACpD,CAAA;KACF;AACDY,IAAAA,SAAS,EAAE,CAACF,IAAI,EAAEC,KAAK,KAAK;AAC1BU,MAAAA,MAAM,CAACM,OAAO,CAACf,SAAS,CACtB;AAAE,QAAA,GAAGD,KAAK;AAAEmB,QAAAA,GAAG,EAAEC,eAAe,EAAA;AAAG,OAAC,EACpC,EAAE,EACFN,UAAU,CAACf,IAAI,CAAC,CACjB,CAAA;KACF;AACDI,IAAAA,YAAY,EAAE,CAACJ,IAAI,EAAEC,KAAK,KAAK;AAC7BU,MAAAA,MAAM,CAACM,OAAO,CAACb,YAAY,CACzB;AAAE,QAAA,GAAGH,KAAK;AAAEmB,QAAAA,GAAG,EAAEC,eAAe,EAAA;AAAG,OAAC,EACpC,EAAE,EACFN,UAAU,CAACf,IAAI,CAAC,CACjB,CAAA;KACF;AACDO,IAAAA,IAAI,EAAE,MAAMI,MAAM,CAACM,OAAO,CAACV,IAAI,EAAE;AACjCC,IAAAA,OAAO,EAAE,MAAMG,MAAM,CAACM,OAAO,CAACT,OAAO,EAAE;IACvCH,EAAE,EAAGiB,CAAC,IAAKX,MAAM,CAACM,OAAO,CAACZ,EAAE,CAACiB,CAAC,CAAA;AAChC,GAAC,CAAC,CAAA;AACJ,CAAA;AAEO,SAASC,iBAAiB,GAAkB;AACjD,EAAA,OAAOd,oBAAoB,CAAC;IAC1BC,OAAO,EAAE,MAAMC,MAAM,CAAClB,QAAQ,CAACoB,IAAI,CAACW,SAAS,CAAC,CAAC,CAAC;AAChDT,IAAAA,UAAU,EAAGf,IAAI,IAAM,CAAA,CAAA,EAAGA,IAAK,CAAA,CAAA;AACjC,GAAC,CAAC,CAAA;AACJ,CAAA;AAEO,SAASyB,mBAAmB,CACjCzC,IAGC,GAAG;EACF0C,cAAc,EAAE,CAAC,GAAG,CAAA;AACtB,CAAC,EACc;AACf,EAAA,MAAMC,OAAO,GAAG3C,IAAI,CAAC0C,cAAc,CAAA;EACnC,IAAIpB,KAAK,GAAGtB,IAAI,CAAC4C,YAAY,IAAID,OAAO,CAACE,MAAM,GAAG,CAAC,CAAA;EACnD,IAAIC,YAAY,GAAG,EAAE,CAAA;EAErB,MAAM5C,WAAW,GAAG,MAAM8B,aAAa,CAACW,OAAO,CAACrB,KAAK,CAAC,EAAGwB,YAAY,CAAC,CAAA;AAEtE,EAAA,OAAO/C,aAAa,CAAC;IACnBG,WAAW;IACXM,QAAQ,EAAGF,QAAQ,IAAK;AACtBqB,MAAAA,MAAM,CAACO,gBAAgB,CAACpC,aAAa,EAAEQ,QAAQ,CAAC,CAAA;AAChD;AACA;AACA,MAAA,OAAO,MAAM;AACXqB,QAAAA,MAAM,CAACQ,mBAAmB,CAACrC,aAAa,EAAEQ,QAAQ,CAAC,CAAA;OACpD,CAAA;KACF;AACDY,IAAAA,SAAS,EAAE,CAACF,IAAI,EAAEC,KAAK,KAAK;AAC1B6B,MAAAA,YAAY,GAAG;AACb,QAAA,GAAG7B,KAAK;AACRmB,QAAAA,GAAG,EAAEC,eAAe,EAAA;OACrB,CAAA;AACDM,MAAAA,OAAO,CAAC5B,IAAI,CAACC,IAAI,CAAC,CAAA;AAClBM,MAAAA,KAAK,EAAE,CAAA;KACR;AACDF,IAAAA,YAAY,EAAE,CAACJ,IAAI,EAAEC,KAAK,KAAK;AAC7B6B,MAAAA,YAAY,GAAG;AACb,QAAA,GAAG7B,KAAK;AACRmB,QAAAA,GAAG,EAAEC,eAAe,EAAA;OACrB,CAAA;AACDM,MAAAA,OAAO,CAACrB,KAAK,CAAC,GAAGN,IAAI,CAAA;KACtB;AACDO,IAAAA,IAAI,EAAE,MAAM;AACVD,MAAAA,KAAK,EAAE,CAAA;KACR;AACDE,IAAAA,OAAO,EAAE,MAAM;AACbF,MAAAA,KAAK,GAAGyB,IAAI,CAACC,GAAG,CAAC1B,KAAK,GAAG,CAAC,EAAEqB,OAAO,CAACE,MAAM,GAAG,CAAC,CAAC,CAAA;KAChD;IACDxB,EAAE,EAAGiB,CAAC,IAAKX,MAAM,CAACM,OAAO,CAACZ,EAAE,CAACiB,CAAC,CAAA;AAChC,GAAC,CAAC,CAAA;AACJ,CAAA;AAEA,SAASN,aAAa,CAACiB,IAAY,EAAEhC,KAAU,EAAkB;AAC/D,EAAA,IAAIiC,SAAS,GAAGD,IAAI,CAACE,OAAO,CAAC,GAAG,CAAC,CAAA;AACjC,EAAA,IAAIC,WAAW,GAAGH,IAAI,CAACE,OAAO,CAAC,GAAG,CAAC,CAAA;EACnC,MAAME,OAAO,GAAGN,IAAI,CAACC,GAAG,CAACE,SAAS,EAAEE,WAAW,CAAC,CAAA;EAEhD,OAAO;IACLH,IAAI;AACJrB,IAAAA,QAAQ,EAAEyB,OAAO,GAAG,CAAC,CAAC,GAAGJ,IAAI,CAACT,SAAS,CAAC,CAAC,EAAEa,OAAO,CAAC,GAAGJ,IAAI;AAC1DpB,IAAAA,IAAI,EAAEqB,SAAS,GAAG,CAAC,CAAC,GAAGD,IAAI,CAACT,SAAS,CAACU,SAAS,EAAEE,WAAW,CAAC,GAAG,EAAE;AAClEtB,IAAAA,MAAM,EAAEsB,WAAW,GAAG,CAAC,CAAC,GAAGH,IAAI,CAACT,SAAS,CAACY,WAAW,CAAC,GAAG,EAAE;AAC3DnC,IAAAA,KAAAA;GACD,CAAA;AACH,CAAA;;AAEA;AACA,SAASoB,eAAe,GAAG;AACzB,EAAA,OAAO,CAACU,IAAI,CAACO,MAAM,EAAE,GAAG,CAAC,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACf,SAAS,CAAC,CAAC,CAAC,CAAA;AACtD;;;;;;"}
1
+ {"version":3,"file":"history.js","sources":["../../src/history.ts"],"sourcesContent":["// While the public API was clearly inspired by the \"history\" npm package,\n// This implementation attempts to be more lightweight by\n// making assumptions about the way TanStack Router works\n\nexport interface RouterHistory {\n location: RouterLocation\n listen: (cb: () => void) => () => void\n push: (path: string, state: any) => void\n replace: (path: string, state: any) => void\n go: (index: number) => void\n back: () => void\n forward: () => void\n}\n\nexport interface ParsedPath {\n href: string\n pathname: string\n search: string\n hash: string\n}\n\nexport interface RouterLocation extends ParsedPath {\n state: any\n}\n\nconst popStateEvent = 'popstate'\n\nfunction createHistory(opts: {\n getLocation: () => RouterLocation\n listener: (onUpdate: () => void) => () => void\n pushState: (path: string, state: any) => void\n replaceState: (path: string, state: any) => void\n go: (n: number) => void\n back: () => void\n forward: () => void\n}): RouterHistory {\n let currentLocation = opts.getLocation()\n let unsub = () => {}\n let listeners = new Set<() => void>()\n\n const onUpdate = () => {\n currentLocation = opts.getLocation()\n\n listeners.forEach((listener) => listener())\n }\n\n return {\n get location() {\n return currentLocation\n },\n listen: (cb: () => void) => {\n if (listeners.size === 0) {\n unsub = opts.listener(onUpdate)\n }\n listeners.add(cb)\n\n return () => {\n listeners.delete(cb)\n if (listeners.size === 0) {\n unsub()\n }\n }\n },\n push: (path: string, state: any) => {\n opts.pushState(path, state)\n onUpdate()\n },\n replace: (path: string, state: any) => {\n opts.replaceState(path, state)\n onUpdate()\n },\n go: (index) => {\n opts.go(index)\n onUpdate()\n },\n back: () => {\n opts.back()\n onUpdate()\n },\n forward: () => {\n opts.forward()\n onUpdate()\n },\n }\n}\n\nexport function createBrowserHistory(opts?: {\n getHref?: () => string\n createHref?: (path: string) => string\n}): RouterHistory {\n const getHref =\n opts?.getHref ??\n (() =>\n `${window.location.pathname}${window.location.hash}${window.location.search}`)\n const createHref = opts?.createHref ?? ((path) => path)\n const getLocation = () => parseLocation(getHref(), history.state)\n\n return createHistory({\n getLocation,\n listener: (onUpdate) => {\n window.addEventListener(popStateEvent, onUpdate)\n return () => {\n window.removeEventListener(popStateEvent, onUpdate)\n }\n },\n pushState: (path, state) => {\n window.history.pushState(\n { ...state, key: createRandomKey() },\n '',\n createHref(path),\n )\n },\n replaceState: (path, state) => {\n window.history.replaceState(\n { ...state, key: createRandomKey() },\n '',\n createHref(path),\n )\n },\n back: () => window.history.back(),\n forward: () => window.history.forward(),\n go: (n) => window.history.go(n),\n })\n}\n\nexport function createHashHistory(): RouterHistory {\n return createBrowserHistory({\n getHref: () => window.location.hash.substring(1),\n createHref: (path) => `#${path}`,\n })\n}\n\nexport function createMemoryHistory(\n opts: {\n initialEntries: string[]\n initialIndex?: number\n } = {\n initialEntries: ['/'],\n },\n): RouterHistory {\n const entries = opts.initialEntries\n let index = opts.initialIndex ?? entries.length - 1\n let currentState = {}\n\n const getLocation = () => parseLocation(entries[index]!, currentState)\n\n return createHistory({\n getLocation,\n listener: () => {\n return () => {}\n },\n pushState: (path, state) => {\n currentState = {\n ...state,\n key: createRandomKey(),\n }\n entries.push(path)\n index++\n },\n replaceState: (path, state) => {\n currentState = {\n ...state,\n key: createRandomKey(),\n }\n entries[index] = path\n },\n back: () => {\n index--\n },\n forward: () => {\n index = Math.min(index + 1, entries.length - 1)\n },\n go: (n) => window.history.go(n),\n })\n}\n\nfunction parseLocation(href: string, state: any): RouterLocation {\n let hashIndex = href.indexOf('#')\n let searchIndex = href.indexOf('?')\n const pathEnd = Math.min(hashIndex, searchIndex)\n\n return {\n href,\n pathname: pathEnd > -1 ? href.substring(0, pathEnd) : href,\n hash: hashIndex > -1 ? href.substring(hashIndex, searchIndex) : '',\n search: searchIndex > -1 ? href.substring(searchIndex) : '',\n state,\n }\n}\n\n// Thanks co-pilot!\nfunction createRandomKey() {\n return (Math.random() + 1).toString(36).substring(7)\n}\n"],"names":["popStateEvent","createHistory","opts","currentLocation","getLocation","unsub","listeners","Set","onUpdate","forEach","listener","location","listen","cb","size","add","delete","push","path","state","pushState","replace","replaceState","go","index","back","forward","createBrowserHistory","getHref","window","pathname","hash","search","createHref","parseLocation","history","addEventListener","removeEventListener","key","createRandomKey","n","createHashHistory","substring","createMemoryHistory","initialEntries","entries","initialIndex","length","currentState","Math","min","href","hashIndex","indexOf","searchIndex","pathEnd","random","toString"],"mappings":"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"}
@@ -25,7 +25,7 @@ class RouteMatch {
25
25
  Object.assign(this, {
26
26
  route,
27
27
  router,
28
- matchId: opts.matchId,
28
+ id: opts.id,
29
29
  pathname: opts.pathname,
30
30
  params: opts.params,
31
31
  store: store.createStore({
@@ -43,7 +43,7 @@ class RouteMatch {
43
43
  this.store.setState(s => s.status = 'success');
44
44
  }
45
45
  }
46
- #setLoaderData = loaderData => {
46
+ setLoaderData = loaderData => {
47
47
  store.batch(() => {
48
48
  this.store.setState(s => {
49
49
  s.routeLoaderData = loaderData;
@@ -118,7 +118,7 @@ class RouteMatch {
118
118
  if (this.route.options.loader) {
119
119
  const data = await this.router.loadMatchData(this);
120
120
  if (latestPromise = checkLatest()) return latestPromise;
121
- this.#setLoaderData(data);
121
+ this.setLoaderData(data);
122
122
  }
123
123
  this.store.setState(s => {
124
124
  s.error = undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"routeMatch.js","sources":["../../src/routeMatch.ts"],"sourcesContent":["import { GetFrameworkGeneric } from './frameworks'\nimport { Route } from './route'\nimport {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { AnyRouter, Router } from './router'\nimport { batch, createStore, Store } from './store'\nimport { Expand } from './utils'\nimport { replaceEqualDeep } from './interop'\n\nexport interface RouteMatchStore<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\n routeSearch: TRouteInfo['searchSchema']\n search: Expand<\n TAllRouteInfo['fullSearchSchema'] & TRouteInfo['fullSearchSchema']\n >\n status: 'idle' | 'loading' | 'success' | 'error'\n updatedAt?: number\n error?: unknown\n invalid: boolean\n loaderData: TRouteInfo['loaderData']\n routeLoaderData: TRouteInfo['routeLoaderData']\n isFetching: boolean\n invalidAt: number\n}\n\nconst componentTypes = [\n 'component',\n 'errorComponent',\n 'pendingComponent',\n] as const\n\nexport class RouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\n route!: Route<TAllRouteInfo, TRouteInfo>\n router!: Router<TAllRouteInfo['routeConfig'], TAllRouteInfo>\n store!: Store<RouteMatchStore<TAllRouteInfo, TRouteInfo>>\n id!: string\n pathname!: string\n params!: TRouteInfo['allParams']\n\n component: GetFrameworkGeneric<'Component'>\n errorComponent: GetFrameworkGeneric<'ErrorComponent'>\n pendingComponent: GetFrameworkGeneric<'Component'>\n abortController = new AbortController()\n #latestId = ''\n #resolve = () => {}\n onLoaderDataListeners = new Set<() => void>()\n parentMatch?: RouteMatch\n\n __loadPromise?: Promise<void>\n __onExit?:\n | void\n | ((matchContext: {\n params: TRouteInfo['allParams']\n search: TRouteInfo['fullSearchSchema']\n }) => void)\n\n constructor(\n router: AnyRouter,\n route: Route<TAllRouteInfo, TRouteInfo>,\n opts: {\n matchId: string\n params: TRouteInfo['allParams']\n pathname: string\n },\n ) {\n Object.assign(this, {\n route,\n router,\n matchId: opts.matchId,\n pathname: opts.pathname,\n params: opts.params,\n store: createStore<RouteMatchStore<TAllRouteInfo, TRouteInfo>>({\n routeSearch: {},\n search: {} as any,\n status: 'idle',\n routeLoaderData: {} as TRouteInfo['routeLoaderData'],\n loaderData: {} as TRouteInfo['loaderData'],\n isFetching: false,\n invalid: false,\n invalidAt: Infinity,\n }),\n })\n\n if (!this.__hasLoaders()) {\n this.store.setState((s) => (s.status = 'success'))\n }\n }\n\n #setLoaderData = (loaderData: TRouteInfo['routeLoaderData']) => {\n batch(() => {\n this.store.setState((s) => {\n s.routeLoaderData = loaderData\n })\n this.#updateLoaderData()\n })\n }\n\n cancel = () => {\n this.abortController?.abort()\n }\n\n load = async (\n loaderOpts?:\n | { preload: true; maxAge: number; gcMaxAge: number }\n | { preload?: false; maxAge?: never; gcMaxAge?: never },\n ): Promise<void> => {\n const now = Date.now()\n const minMaxAge = loaderOpts?.preload\n ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge)\n : 0\n\n // If this is a preload, add it to the preload cache\n if (loaderOpts?.preload && minMaxAge > 0) {\n // If the match is currently active, don't preload it\n if (\n this.router.store.state.currentMatches.find((d) => d.id === this.id)\n ) {\n return\n }\n\n this.router.store.setState((s) => {\n s.matchCache[this.id] = {\n gc: now + loaderOpts.gcMaxAge,\n match: this as RouteMatch<any, any>,\n }\n })\n }\n\n // If the match is invalid, errored or idle, trigger it to load\n if (\n (this.store.state.status === 'success' && this.getIsInvalid()) ||\n this.store.state.status === 'error' ||\n this.store.state.status === 'idle'\n ) {\n const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined\n await this.fetch({ maxAge })\n }\n }\n\n fetch = async (opts?: {\n maxAge?: number\n }): Promise<TRouteInfo['routeLoaderData']> => {\n this.__loadPromise = new Promise(async (resolve) => {\n const loadId = '' + Date.now() + Math.random()\n this.#latestId = loadId\n\n const checkLatest = () =>\n loadId !== this.#latestId\n ? this.__loadPromise?.then(() => resolve())\n : undefined\n\n let latestPromise\n\n batch(() => {\n // If the match was in an error state, set it\n // to a loading state again. Otherwise, keep it\n // as loading or resolved\n if (this.store.state.status === 'idle') {\n this.store.setState((s) => (s.status = 'loading'))\n }\n\n // We started loading the route, so it's no longer invalid\n this.store.setState((s) => (s.invalid = false))\n })\n\n // We are now fetching, even if it's in the background of a\n // resolved state\n this.store.setState((s) => (s.isFetching = true))\n this.#resolve = resolve as () => void\n\n const componentsPromise = (async () => {\n // then run all component and data loaders in parallel\n // For each component type, potentially load it asynchronously\n\n await Promise.all(\n componentTypes.map(async (type) => {\n const component = this.route.options[type]\n\n if (this[type]?.preload) {\n this[type] = await this.router.options.loadComponent!(component)\n }\n }),\n )\n })()\n\n const dataPromise = Promise.resolve().then(async () => {\n try {\n if (this.route.options.loader) {\n const data = await this.router.loadMatchData(this)\n if ((latestPromise = checkLatest())) return latestPromise\n\n this.#setLoaderData(data)\n }\n\n this.store.setState((s) => {\n s.error = undefined\n s.status = 'success'\n s.updatedAt = Date.now()\n s.invalidAt =\n s.updatedAt +\n (opts?.maxAge ??\n this.route.options.loaderMaxAge ??\n this.router.options.defaultLoaderMaxAge ??\n 0)\n })\n\n return this.store.state.routeLoaderData\n } catch (err) {\n if ((latestPromise = checkLatest())) return latestPromise\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n\n this.store.setState((s) => {\n s.error = err\n s.status = 'error'\n s.updatedAt = Date.now()\n })\n\n throw err\n }\n })\n\n const after = async () => {\n if ((latestPromise = checkLatest())) return latestPromise\n this.store.setState((s) => (s.isFetching = false))\n this.#resolve()\n delete this.__loadPromise\n }\n\n try {\n await Promise.all([componentsPromise, dataPromise.catch(() => {})])\n after()\n } catch {\n after()\n }\n })\n\n return this.__loadPromise\n }\n invalidate = async () => {\n this.store.setState((s) => (s.invalid = true))\n if (this.router.store.state.currentMatches.find((d) => d.id === this.id)) {\n await this.load()\n }\n }\n __hasLoaders = () => {\n return !!(\n this.route.options.loader ||\n componentTypes.some((d) => this.route.options[d]?.preload)\n )\n }\n getIsInvalid = () => {\n const now = Date.now()\n return this.store.state.invalid || this.store.state.invalidAt < now\n }\n\n #updateLoaderData = () => {\n this.store.setState((s) => {\n s.loaderData = replaceEqualDeep(s.loaderData, {\n ...this.parentMatch?.store.state.loaderData,\n ...s.routeLoaderData,\n }) as TRouteInfo['loaderData']\n })\n this.onLoaderDataListeners.forEach((listener) => listener())\n }\n\n __setParentMatch = (parentMatch?: RouteMatch) => {\n if (!this.parentMatch && parentMatch) {\n this.parentMatch = parentMatch\n this.parentMatch.__onLoaderData(() => {\n this.#updateLoaderData()\n })\n }\n }\n\n __onLoaderData = (listener: () => void) => {\n this.onLoaderDataListeners.add(listener)\n // return () => this.onLoaderDataListeners.delete(listener)\n }\n\n __validate = () => {\n // Validate the search params and stabilize them\n const parentSearch =\n this.parentMatch?.store.state.search ??\n this.router.store.state.latestLocation.search\n\n try {\n const prevSearch = this.store.state.routeSearch\n\n const validator =\n typeof this.route.options.validateSearch === 'object'\n ? this.route.options.validateSearch.parse\n : this.route.options.validateSearch\n\n let nextSearch = validator?.(parentSearch) ?? {}\n\n batch(() => {\n // Invalidate route matches when search param stability changes\n if (prevSearch !== nextSearch) {\n this.store.setState((s) => (s.invalid = true))\n }\n\n this.store.setState((s) => {\n s.routeSearch = nextSearch\n s.search = {\n ...parentSearch,\n ...nextSearch,\n } as any\n })\n })\n\n componentTypes.map(async (type) => {\n const component = this.route.options[type]\n\n if (typeof this[type] !== 'function') {\n this[type] = component\n }\n })\n } catch (err: any) {\n console.error(err)\n const error = new (Error as any)('Invalid search params found', {\n cause: err,\n })\n error.code = 'INVALID_SEARCH_PARAMS'\n\n this.store.setState((s) => {\n s.status = 'error'\n s.error = error\n })\n\n // Do not proceed with loading the route\n return\n }\n }\n}\n"],"names":["componentTypes","RouteMatch","abortController","AbortController","onLoaderDataListeners","Set","constructor","router","route","opts","Object","assign","matchId","pathname","params","store","createStore","routeSearch","search","status","routeLoaderData","loaderData","isFetching","invalid","invalidAt","Infinity","__hasLoaders","setState","s","batch","cancel","abort","load","loaderOpts","now","Date","minMaxAge","preload","Math","max","maxAge","gcMaxAge","state","currentMatches","find","d","id","matchCache","gc","match","getIsInvalid","undefined","fetch","__loadPromise","Promise","resolve","loadId","random","checkLatest","then","latestPromise","componentsPromise","all","map","type","component","options","loadComponent","dataPromise","loader","data","loadMatchData","error","updatedAt","loaderMaxAge","defaultLoaderMaxAge","err","process","env","NODE_ENV","console","after","catch","invalidate","some","replaceEqualDeep","parentMatch","forEach","listener","__setParentMatch","__onLoaderData","add","__validate","parentSearch","latestLocation","prevSearch","validator","validateSearch","parse","nextSearch","Error","cause","code"],"mappings":"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"}
1
+ {"version":3,"file":"routeMatch.js","sources":["../../src/routeMatch.ts"],"sourcesContent":["import { GetFrameworkGeneric } from './frameworks'\nimport { Route } from './route'\nimport {\n AnyAllRouteInfo,\n AnyRouteInfo,\n DefaultAllRouteInfo,\n RouteInfo,\n} from './routeInfo'\nimport { AnyRouter, Router } from './router'\nimport { batch, createStore, Store } from './store'\nimport { Expand } from './utils'\nimport { replaceEqualDeep } from './interop'\n\nexport interface RouteMatchStore<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\n routeSearch: TRouteInfo['searchSchema']\n search: Expand<\n TAllRouteInfo['fullSearchSchema'] & TRouteInfo['fullSearchSchema']\n >\n status: 'idle' | 'loading' | 'success' | 'error'\n updatedAt?: number\n error?: unknown\n invalid: boolean\n loaderData: TRouteInfo['loaderData']\n routeLoaderData: TRouteInfo['routeLoaderData']\n isFetching: boolean\n invalidAt: number\n}\n\nconst componentTypes = [\n 'component',\n 'errorComponent',\n 'pendingComponent',\n] as const\n\nexport class RouteMatch<\n TAllRouteInfo extends AnyAllRouteInfo = DefaultAllRouteInfo,\n TRouteInfo extends AnyRouteInfo = RouteInfo,\n> {\n route!: Route<TAllRouteInfo, TRouteInfo>\n router!: Router<TAllRouteInfo['routeConfig'], TAllRouteInfo>\n store!: Store<RouteMatchStore<TAllRouteInfo, TRouteInfo>>\n id!: string\n pathname!: string\n params!: TRouteInfo['allParams']\n\n component: GetFrameworkGeneric<'Component'>\n errorComponent: GetFrameworkGeneric<'ErrorComponent'>\n pendingComponent: GetFrameworkGeneric<'Component'>\n abortController = new AbortController()\n #latestId = ''\n #resolve = () => {}\n onLoaderDataListeners = new Set<() => void>()\n parentMatch?: RouteMatch\n\n __loadPromise?: Promise<void>\n __onExit?:\n | void\n | ((matchContext: {\n params: TRouteInfo['allParams']\n search: TRouteInfo['fullSearchSchema']\n }) => void)\n\n constructor(\n router: AnyRouter,\n route: Route<TAllRouteInfo, TRouteInfo>,\n opts: {\n id: string\n params: TRouteInfo['allParams']\n pathname: string\n },\n ) {\n Object.assign(this, {\n route,\n router,\n id: opts.id,\n pathname: opts.pathname,\n params: opts.params,\n store: createStore<RouteMatchStore<TAllRouteInfo, TRouteInfo>>({\n routeSearch: {},\n search: {} as any,\n status: 'idle',\n routeLoaderData: {} as TRouteInfo['routeLoaderData'],\n loaderData: {} as TRouteInfo['loaderData'],\n isFetching: false,\n invalid: false,\n invalidAt: Infinity,\n }),\n })\n\n if (!this.__hasLoaders()) {\n this.store.setState((s) => (s.status = 'success'))\n }\n }\n\n setLoaderData = (loaderData: TRouteInfo['routeLoaderData']) => {\n batch(() => {\n this.store.setState((s) => {\n s.routeLoaderData = loaderData\n })\n this.#updateLoaderData()\n })\n }\n\n cancel = () => {\n this.abortController?.abort()\n }\n\n load = async (\n loaderOpts?:\n | { preload: true; maxAge: number; gcMaxAge: number }\n | { preload?: false; maxAge?: never; gcMaxAge?: never },\n ): Promise<void> => {\n const now = Date.now()\n const minMaxAge = loaderOpts?.preload\n ? Math.max(loaderOpts?.maxAge, loaderOpts?.gcMaxAge)\n : 0\n\n // If this is a preload, add it to the preload cache\n if (loaderOpts?.preload && minMaxAge > 0) {\n // If the match is currently active, don't preload it\n if (\n this.router.store.state.currentMatches.find((d) => d.id === this.id)\n ) {\n return\n }\n\n this.router.store.setState((s) => {\n s.matchCache[this.id] = {\n gc: now + loaderOpts.gcMaxAge,\n match: this as RouteMatch<any, any>,\n }\n })\n }\n\n // If the match is invalid, errored or idle, trigger it to load\n if (\n (this.store.state.status === 'success' && this.getIsInvalid()) ||\n this.store.state.status === 'error' ||\n this.store.state.status === 'idle'\n ) {\n const maxAge = loaderOpts?.preload ? loaderOpts?.maxAge : undefined\n await this.fetch({ maxAge })\n }\n }\n\n fetch = async (opts?: {\n maxAge?: number\n }): Promise<TRouteInfo['routeLoaderData']> => {\n this.__loadPromise = new Promise(async (resolve) => {\n const loadId = '' + Date.now() + Math.random()\n this.#latestId = loadId\n\n const checkLatest = () =>\n loadId !== this.#latestId\n ? this.__loadPromise?.then(() => resolve())\n : undefined\n\n let latestPromise\n\n batch(() => {\n // If the match was in an error state, set it\n // to a loading state again. Otherwise, keep it\n // as loading or resolved\n if (this.store.state.status === 'idle') {\n this.store.setState((s) => (s.status = 'loading'))\n }\n\n // We started loading the route, so it's no longer invalid\n this.store.setState((s) => (s.invalid = false))\n })\n\n // We are now fetching, even if it's in the background of a\n // resolved state\n this.store.setState((s) => (s.isFetching = true))\n this.#resolve = resolve as () => void\n\n const componentsPromise = (async () => {\n // then run all component and data loaders in parallel\n // For each component type, potentially load it asynchronously\n\n await Promise.all(\n componentTypes.map(async (type) => {\n const component = this.route.options[type]\n\n if (this[type]?.preload) {\n this[type] = await this.router.options.loadComponent!(component)\n }\n }),\n )\n })()\n\n const dataPromise = Promise.resolve().then(async () => {\n try {\n if (this.route.options.loader) {\n const data = await this.router.loadMatchData(this)\n if ((latestPromise = checkLatest())) return latestPromise\n this.setLoaderData(data)\n }\n\n this.store.setState((s) => {\n s.error = undefined\n s.status = 'success'\n s.updatedAt = Date.now()\n s.invalidAt =\n s.updatedAt +\n (opts?.maxAge ??\n this.route.options.loaderMaxAge ??\n this.router.options.defaultLoaderMaxAge ??\n 0)\n })\n\n return this.store.state.routeLoaderData\n } catch (err) {\n if ((latestPromise = checkLatest())) return latestPromise\n\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n }\n\n this.store.setState((s) => {\n s.error = err\n s.status = 'error'\n s.updatedAt = Date.now()\n })\n\n throw err\n }\n })\n\n const after = async () => {\n if ((latestPromise = checkLatest())) return latestPromise\n this.store.setState((s) => (s.isFetching = false))\n this.#resolve()\n delete this.__loadPromise\n }\n\n try {\n await Promise.all([componentsPromise, dataPromise.catch(() => {})])\n after()\n } catch {\n after()\n }\n })\n\n return this.__loadPromise\n }\n invalidate = async () => {\n this.store.setState((s) => (s.invalid = true))\n if (this.router.store.state.currentMatches.find((d) => d.id === this.id)) {\n await this.load()\n }\n }\n __hasLoaders = () => {\n return !!(\n this.route.options.loader ||\n componentTypes.some((d) => this.route.options[d]?.preload)\n )\n }\n getIsInvalid = () => {\n const now = Date.now()\n return this.store.state.invalid || this.store.state.invalidAt < now\n }\n\n #updateLoaderData = () => {\n this.store.setState((s) => {\n s.loaderData = replaceEqualDeep(s.loaderData, {\n ...this.parentMatch?.store.state.loaderData,\n ...s.routeLoaderData,\n }) as TRouteInfo['loaderData']\n })\n this.onLoaderDataListeners.forEach((listener) => listener())\n }\n\n __setParentMatch = (parentMatch?: RouteMatch) => {\n if (!this.parentMatch && parentMatch) {\n this.parentMatch = parentMatch\n this.parentMatch.__onLoaderData(() => {\n this.#updateLoaderData()\n })\n }\n }\n\n __onLoaderData = (listener: () => void) => {\n this.onLoaderDataListeners.add(listener)\n // return () => this.onLoaderDataListeners.delete(listener)\n }\n\n __validate = () => {\n // Validate the search params and stabilize them\n const parentSearch =\n this.parentMatch?.store.state.search ??\n this.router.store.state.latestLocation.search\n\n try {\n const prevSearch = this.store.state.routeSearch\n\n const validator =\n typeof this.route.options.validateSearch === 'object'\n ? this.route.options.validateSearch.parse\n : this.route.options.validateSearch\n\n let nextSearch = validator?.(parentSearch) ?? {}\n\n batch(() => {\n // Invalidate route matches when search param stability changes\n if (prevSearch !== nextSearch) {\n this.store.setState((s) => (s.invalid = true))\n }\n\n this.store.setState((s) => {\n s.routeSearch = nextSearch\n s.search = {\n ...parentSearch,\n ...nextSearch,\n } as any\n })\n })\n\n componentTypes.map(async (type) => {\n const component = this.route.options[type]\n\n if (typeof this[type] !== 'function') {\n this[type] = component\n }\n })\n } catch (err: any) {\n console.error(err)\n const error = new (Error as any)('Invalid search params found', {\n cause: err,\n })\n error.code = 'INVALID_SEARCH_PARAMS'\n\n this.store.setState((s) => {\n s.status = 'error'\n s.error = error\n })\n\n // Do not proceed with loading the route\n return\n }\n }\n}\n"],"names":["componentTypes","RouteMatch","abortController","AbortController","onLoaderDataListeners","Set","constructor","router","route","opts","Object","assign","id","pathname","params","store","createStore","routeSearch","search","status","routeLoaderData","loaderData","isFetching","invalid","invalidAt","Infinity","__hasLoaders","setState","s","setLoaderData","batch","cancel","abort","load","loaderOpts","now","Date","minMaxAge","preload","Math","max","maxAge","gcMaxAge","state","currentMatches","find","d","matchCache","gc","match","getIsInvalid","undefined","fetch","__loadPromise","Promise","resolve","loadId","random","checkLatest","then","latestPromise","componentsPromise","all","map","type","component","options","loadComponent","dataPromise","loader","data","loadMatchData","error","updatedAt","loaderMaxAge","defaultLoaderMaxAge","err","process","env","NODE_ENV","console","after","catch","invalidate","some","replaceEqualDeep","parentMatch","forEach","listener","__setParentMatch","__onLoaderData","add","__validate","parentSearch","latestLocation","prevSearch","validator","validateSearch","parse","nextSearch","Error","cause","code"],"mappings":"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"}
@@ -49,8 +49,7 @@ const defaultFetchServerDataFn = async ({
49
49
  throw new Error('Failed to fetch match data');
50
50
  };
51
51
  class Router {
52
- // __location: Location<TAllRouteInfo['fullSearchSchema']>
53
-
52
+ #unsubHistory;
54
53
  startedLoadingAt = Date.now();
55
54
  resolveNavigation = () => {};
56
55
  constructor(options) {
@@ -65,13 +64,12 @@ class Router {
65
64
  parseSearch: options?.parseSearch ?? searchParams.defaultParseSearch,
66
65
  fetchServerDataFn: options?.fetchServerDataFn ?? defaultFetchServerDataFn
67
66
  };
68
- this.history = this.options?.history ?? history.createBrowserHistory();
69
67
  this.store = store.createStore(getInitialRouterState());
70
68
  this.basepath = '';
71
69
  this.update(options);
72
70
 
73
71
  // Allow frameworks to hook into the router creation
74
- this.options.createRouter?.(this);
72
+ this.options.Router?.(this);
75
73
  }
76
74
  reset = () => {
77
75
  this.store.setState(s => Object.assign(s, getInitialRouterState()));
@@ -83,9 +81,6 @@ class Router {
83
81
  if (!this.store.state.currentMatches.length) {
84
82
  this.load();
85
83
  }
86
- const unsubHistory = this.history.listen(() => {
87
- this.load(this.#parseLocation(this.store.state.latestLocation));
88
- });
89
84
  const visibilityChangeEvent = 'visibilitychange';
90
85
  const focusEvent = 'focus';
91
86
 
@@ -98,7 +93,6 @@ class Router {
98
93
  window.addEventListener(focusEvent, this.#onFocus, false);
99
94
  }
100
95
  return () => {
101
- unsubHistory();
102
96
  if (window.removeEventListener) {
103
97
  // Be sure to unsubscribe if a new handler is set
104
98
 
@@ -110,13 +104,20 @@ class Router {
110
104
  return () => {};
111
105
  };
112
106
  update = opts => {
113
- if (!this.store.state.latestLocation) {
107
+ Object.assign(this.options, opts);
108
+ if (!this.history || this.options.history && this.options.history !== this.history) {
109
+ if (this.#unsubHistory) {
110
+ this.#unsubHistory();
111
+ }
112
+ this.history = this.options.history ?? (isServer ? history.createMemoryHistory() : history.createBrowserHistory());
114
113
  this.store.setState(s => {
115
114
  s.latestLocation = this.#parseLocation();
116
115
  s.currentLocation = s.latestLocation;
117
116
  });
117
+ this.#unsubHistory = this.history.listen(() => {
118
+ this.load(this.#parseLocation(this.store.state.latestLocation));
119
+ });
118
120
  }
119
- Object.assign(this.options, opts);
120
121
  const {
121
122
  basepath,
122
123
  routeConfig
@@ -341,7 +342,7 @@ class Router {
341
342
  const interpolatedPath = path.interpolatePath(foundRoute.path, params);
342
343
  const matchId = path.interpolatePath(foundRoute.id, params, true);
343
344
  const match = existingMatches.find(d => d.id === matchId) || this.store.state.matchCache[matchId]?.match || new routeMatch.RouteMatch(this, foundRoute, {
344
- matchId,
345
+ id: matchId,
345
346
  params,
346
347
  pathname: path.joinPaths([this.basepath, interpolatedPath])
347
348
  });
@@ -413,10 +414,11 @@ class Router {
413
414
 
414
415
  // TODO: batch requests when possible
415
416
 
416
- return this.options.fetchServerDataFn({
417
+ const res = await this.options.fetchServerDataFn({
417
418
  router: this,
418
419
  routeMatch
419
420
  });
421
+ return res;
420
422
  }
421
423
  };
422
424
  invalidateRoute = async opts => {
@@ -607,7 +609,7 @@ class Router {
607
609
  state: {
608
610
  ...utils.pick(this.store.state, ['latestLocation', 'currentLocation', 'status', 'lastUpdated']),
609
611
  currentMatches: this.store.state.currentMatches.map(match => ({
610
- matchId: match.id,
612
+ id: match.id,
611
613
  state: {
612
614
  ...utils.pick(match.store.state, ['status', 'routeLoaderData', 'invalidAt', 'invalid'])
613
615
  }
@@ -627,8 +629,11 @@ class Router {
627
629
  });
628
630
  currentMatches.forEach((match, index) => {
629
631
  const dehydratedMatch = dehydratedRouter.state.currentMatches[index];
630
- invariant__default["default"](dehydratedMatch && dehydratedMatch.matchId === match.id, 'Oh no! There was a hydration mismatch when attempting to rethis.store the state of the router! 😬');
631
- Object.assign(match, dehydratedMatch);
632
+ invariant__default["default"](dehydratedMatch && dehydratedMatch.id === match.id, 'Oh no! There was a hydration mismatch when attempting to rethis.store the state of the router! 😬');
633
+ match.store.setState(s => {
634
+ Object.assign(s, dehydratedMatch.state);
635
+ });
636
+ match.setLoaderData(dehydratedMatch.state.routeLoaderData);
632
637
  });
633
638
  currentMatches.forEach(match => match.__validate());
634
639
  Object.assign(s, {
@@ -774,7 +779,9 @@ class Router {
774
779
  id,
775
780
  ...next.state
776
781
  });
777
- this.load(this.#parseLocation(this.store.state.latestLocation));
782
+
783
+ // this.load(this.#parseLocation(this.store.state.latestLocation))
784
+
778
785
  return this.navigationPromise = new Promise(resolve => {
779
786
  const previousNavigationResolve = this.resolveNavigation;
780
787
  this.resolveNavigation = () => {