@tanstack/router-core 0.0.1-beta.156 → 0.0.1-beta.158

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.
@@ -1 +1 @@
1
- {"version":3,"file":"searchParams.js","sources":["../../src/searchParams.ts"],"sourcesContent":["import { decode, encode } from './qss'\nimport { AnySearchSchema } from './route'\n\nexport const defaultParseSearch = parseSearchWith(JSON.parse)\nexport const defaultStringifySearch = stringifySearchWith(JSON.stringify)\n\nexport function parseSearchWith(parser: (str: string) => any) {\n return (searchStr: string): AnySearchSchema => {\n if (searchStr.substring(0, 1) === '?') {\n searchStr = searchStr.substring(1)\n }\n\n let query: Record<string, unknown> = decode(searchStr)\n\n // Try to parse any query params that might be json\n for (let key in query) {\n const value = query[key]\n if (typeof value === 'string') {\n try {\n query[key] = parser(value)\n } catch (err) {\n //\n }\n }\n }\n\n return query\n }\n}\n\nexport function stringifySearchWith(stringify: (search: any) => string) {\n return (search: Record<string, any>) => {\n search = { ...search }\n\n if (search) {\n Object.keys(search).forEach((key) => {\n const val = search[key]\n if (typeof val === 'undefined' || val === undefined) {\n delete search[key]\n } else if (val && typeof val === 'object' && val !== null) {\n try {\n search[key] = stringify(val)\n } catch (err) {\n // silent\n }\n }\n })\n }\n\n const searchStr = encode(search as Record<string, string>).toString()\n\n return searchStr ? `?${searchStr}` : ''\n }\n}\n"],"names":["defaultParseSearch","parseSearchWith","JSON","parse","defaultStringifySearch","stringifySearchWith","stringify","parser","searchStr","substring","query","decode","key","value","err","search","Object","keys","forEach","val","undefined","encode","toString"],"mappings":";;;;;;;;;;;;;;;;AAGO,MAAMA,kBAAkB,GAAGC,eAAe,CAACC,IAAI,CAACC,KAAK,EAAC;AACtD,MAAMC,sBAAsB,GAAGC,mBAAmB,CAACH,IAAI,CAACI,SAAS,EAAC;AAElE,SAASL,eAAeA,CAACM,MAA4B,EAAE;AAC5D,EAAA,OAAQC,SAAiB,IAAsB;IAC7C,IAAIA,SAAS,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE;AACrCD,MAAAA,SAAS,GAAGA,SAAS,CAACC,SAAS,CAAC,CAAC,CAAC,CAAA;AACpC,KAAA;AAEA,IAAA,IAAIC,KAA8B,GAAGC,UAAM,CAACH,SAAS,CAAC,CAAA;;AAEtD;AACA,IAAA,KAAK,IAAII,GAAG,IAAIF,KAAK,EAAE;AACrB,MAAA,MAAMG,KAAK,GAAGH,KAAK,CAACE,GAAG,CAAC,CAAA;AACxB,MAAA,IAAI,OAAOC,KAAK,KAAK,QAAQ,EAAE;QAC7B,IAAI;AACFH,UAAAA,KAAK,CAACE,GAAG,CAAC,GAAGL,MAAM,CAACM,KAAK,CAAC,CAAA;SAC3B,CAAC,OAAOC,GAAG,EAAE;AACZ;AAAA,SAAA;AAEJ,OAAA;AACF,KAAA;AAEA,IAAA,OAAOJ,KAAK,CAAA;GACb,CAAA;AACH,CAAA;AAEO,SAASL,mBAAmBA,CAACC,SAAkC,EAAE;AACtE,EAAA,OAAQS,MAA2B,IAAK;AACtCA,IAAAA,MAAM,GAAG;MAAE,GAAGA,MAAAA;KAAQ,CAAA;AAEtB,IAAA,IAAIA,MAAM,EAAE;MACVC,MAAM,CAACC,IAAI,CAACF,MAAM,CAAC,CAACG,OAAO,CAAEN,GAAG,IAAK;AACnC,QAAA,MAAMO,GAAG,GAAGJ,MAAM,CAACH,GAAG,CAAC,CAAA;QACvB,IAAI,OAAOO,GAAG,KAAK,WAAW,IAAIA,GAAG,KAAKC,SAAS,EAAE;UACnD,OAAOL,MAAM,CAACH,GAAG,CAAC,CAAA;AACpB,SAAC,MAAM,IAAIO,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAIA,GAAG,KAAK,IAAI,EAAE;UACzD,IAAI;AACFJ,YAAAA,MAAM,CAACH,GAAG,CAAC,GAAGN,SAAS,CAACa,GAAG,CAAC,CAAA;WAC7B,CAAC,OAAOL,GAAG,EAAE;AACZ;AAAA,WAAA;AAEJ,SAAA;AACF,OAAC,CAAC,CAAA;AACJ,KAAA;IAEA,MAAMN,SAAS,GAAGa,UAAM,CAACN,MAAgC,CAAC,CAACO,QAAQ,EAAE,CAAA;AAErE,IAAA,OAAOd,SAAS,GAAI,CAAA,CAAA,EAAGA,SAAU,CAAA,CAAC,GAAG,EAAE,CAAA;GACxC,CAAA;AACH;;;;;;;"}
1
+ {"version":3,"file":"searchParams.js","sources":["../../src/searchParams.ts"],"sourcesContent":["import { decode, encode } from './qss'\nimport { AnySearchSchema } from './route'\n\nexport const defaultParseSearch = parseSearchWith(JSON.parse)\nexport const defaultStringifySearch = stringifySearchWith(\n JSON.stringify,\n JSON.parse,\n)\n\nexport function parseSearchWith(parser: (str: string) => any) {\n return (searchStr: string): AnySearchSchema => {\n if (searchStr.substring(0, 1) === '?') {\n searchStr = searchStr.substring(1)\n }\n\n let query: Record<string, unknown> = decode(searchStr)\n\n // Try to parse any query params that might be json\n for (let key in query) {\n const value = query[key]\n if (typeof value === 'string') {\n try {\n query[key] = parser(value)\n } catch (err) {\n //\n }\n }\n }\n\n return query\n }\n}\n\nexport function stringifySearchWith(\n stringify: (search: any) => string,\n parser?: (str: string) => any,\n) {\n function stringifyValue(val: any) {\n if (typeof val === 'object' && val !== null) {\n try {\n return stringify(val)\n } catch (err) {\n // silent\n }\n } else if (typeof val === 'string' && typeof parser === 'function') {\n try {\n // Check if it's a valid parseable string.\n // If it is, then stringify it again.\n parser(val)\n return stringify(val)\n } catch (err) {\n // silent\n }\n }\n return val\n }\n\n return (search: Record<string, any>) => {\n search = { ...search }\n\n if (search) {\n Object.keys(search).forEach((key) => {\n const val = search[key]\n if (typeof val === 'undefined' || val === undefined) {\n delete search[key]\n } else if (Array.isArray(val)) {\n search[key] = val.map(stringifyValue)\n } else {\n search[key] = stringifyValue(val)\n }\n })\n }\n\n const searchStr = encode(search as Record<string, string>).toString()\n\n return searchStr ? `?${searchStr}` : ''\n }\n}\n"],"names":["defaultParseSearch","parseSearchWith","JSON","parse","defaultStringifySearch","stringifySearchWith","stringify","parser","searchStr","substring","query","decode","key","value","err","stringifyValue","val","search","Object","keys","forEach","undefined","Array","isArray","map","encode","toString"],"mappings":";;;;;;;;;;;;;;;;AAGO,MAAMA,kBAAkB,GAAGC,eAAe,CAACC,IAAI,CAACC,KAAK,EAAC;AAChDC,MAAAA,sBAAsB,GAAGC,mBAAmB,CACvDH,IAAI,CAACI,SAAS,EACdJ,IAAI,CAACC,KACP,EAAC;AAEM,SAASF,eAAeA,CAACM,MAA4B,EAAE;AAC5D,EAAA,OAAQC,SAAiB,IAAsB;IAC7C,IAAIA,SAAS,CAACC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE;AACrCD,MAAAA,SAAS,GAAGA,SAAS,CAACC,SAAS,CAAC,CAAC,CAAC,CAAA;AACpC,KAAA;AAEA,IAAA,IAAIC,KAA8B,GAAGC,UAAM,CAACH,SAAS,CAAC,CAAA;;AAEtD;AACA,IAAA,KAAK,IAAII,GAAG,IAAIF,KAAK,EAAE;AACrB,MAAA,MAAMG,KAAK,GAAGH,KAAK,CAACE,GAAG,CAAC,CAAA;AACxB,MAAA,IAAI,OAAOC,KAAK,KAAK,QAAQ,EAAE;QAC7B,IAAI;AACFH,UAAAA,KAAK,CAACE,GAAG,CAAC,GAAGL,MAAM,CAACM,KAAK,CAAC,CAAA;SAC3B,CAAC,OAAOC,GAAG,EAAE;AACZ;AAAA,SAAA;AAEJ,OAAA;AACF,KAAA;AAEA,IAAA,OAAOJ,KAAK,CAAA;GACb,CAAA;AACH,CAAA;AAEO,SAASL,mBAAmBA,CACjCC,SAAkC,EAClCC,MAA6B,EAC7B;EACA,SAASQ,cAAcA,CAACC,GAAQ,EAAE;IAChC,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAIA,GAAG,KAAK,IAAI,EAAE;MAC3C,IAAI;QACF,OAAOV,SAAS,CAACU,GAAG,CAAC,CAAA;OACtB,CAAC,OAAOF,GAAG,EAAE;AACZ;AAAA,OAAA;KAEH,MAAM,IAAI,OAAOE,GAAG,KAAK,QAAQ,IAAI,OAAOT,MAAM,KAAK,UAAU,EAAE;MAClE,IAAI;AACF;AACA;QACAA,MAAM,CAACS,GAAG,CAAC,CAAA;QACX,OAAOV,SAAS,CAACU,GAAG,CAAC,CAAA;OACtB,CAAC,OAAOF,GAAG,EAAE;AACZ;AAAA,OAAA;AAEJ,KAAA;AACA,IAAA,OAAOE,GAAG,CAAA;AACZ,GAAA;AAEA,EAAA,OAAQC,MAA2B,IAAK;AACtCA,IAAAA,MAAM,GAAG;MAAE,GAAGA,MAAAA;KAAQ,CAAA;AAEtB,IAAA,IAAIA,MAAM,EAAE;MACVC,MAAM,CAACC,IAAI,CAACF,MAAM,CAAC,CAACG,OAAO,CAAER,GAAG,IAAK;AACnC,QAAA,MAAMI,GAAG,GAAGC,MAAM,CAACL,GAAG,CAAC,CAAA;QACvB,IAAI,OAAOI,GAAG,KAAK,WAAW,IAAIA,GAAG,KAAKK,SAAS,EAAE;UACnD,OAAOJ,MAAM,CAACL,GAAG,CAAC,CAAA;SACnB,MAAM,IAAIU,KAAK,CAACC,OAAO,CAACP,GAAG,CAAC,EAAE;UAC7BC,MAAM,CAACL,GAAG,CAAC,GAAGI,GAAG,CAACQ,GAAG,CAACT,cAAc,CAAC,CAAA;AACvC,SAAC,MAAM;AACLE,UAAAA,MAAM,CAACL,GAAG,CAAC,GAAGG,cAAc,CAACC,GAAG,CAAC,CAAA;AACnC,SAAA;AACF,OAAC,CAAC,CAAA;AACJ,KAAA;IAEA,MAAMR,SAAS,GAAGiB,UAAM,CAACR,MAAgC,CAAC,CAACS,QAAQ,EAAE,CAAA;AAErE,IAAA,OAAOlB,SAAS,GAAI,CAAA,CAAA,EAAGA,SAAU,CAAA,CAAC,GAAG,EAAE,CAAA;GACxC,CAAA;AACH;;;;;;;"}
@@ -636,7 +636,7 @@ class FileRoute {
636
636
  }
637
637
 
638
638
  const defaultParseSearch = parseSearchWith(JSON.parse);
639
- const defaultStringifySearch = stringifySearchWith(JSON.stringify);
639
+ const defaultStringifySearch = stringifySearchWith(JSON.stringify, JSON.parse);
640
640
  function parseSearchWith(parser) {
641
641
  return searchStr => {
642
642
  if (searchStr.substring(0, 1) === '?') {
@@ -658,7 +658,26 @@ function parseSearchWith(parser) {
658
658
  return query;
659
659
  };
660
660
  }
661
- function stringifySearchWith(stringify) {
661
+ function stringifySearchWith(stringify, parser) {
662
+ function stringifyValue(val) {
663
+ if (typeof val === 'object' && val !== null) {
664
+ try {
665
+ return stringify(val);
666
+ } catch (err) {
667
+ // silent
668
+ }
669
+ } else if (typeof val === 'string' && typeof parser === 'function') {
670
+ try {
671
+ // Check if it's a valid parseable string.
672
+ // If it is, then stringify it again.
673
+ parser(val);
674
+ return stringify(val);
675
+ } catch (err) {
676
+ // silent
677
+ }
678
+ }
679
+ return val;
680
+ }
662
681
  return search => {
663
682
  search = {
664
683
  ...search
@@ -668,12 +687,10 @@ function stringifySearchWith(stringify) {
668
687
  const val = search[key];
669
688
  if (typeof val === 'undefined' || val === undefined) {
670
689
  delete search[key];
671
- } else if (val && typeof val === 'object' && val !== null) {
672
- try {
673
- search[key] = stringify(val);
674
- } catch (err) {
675
- // silent
676
- }
690
+ } else if (Array.isArray(val)) {
691
+ search[key] = val.map(stringifyValue);
692
+ } else {
693
+ search[key] = stringifyValue(val);
677
694
  }
678
695
  });
679
696
  }
@@ -949,42 +966,36 @@ class Router {
949
966
  if (routeCursor) matchedRoutes.unshift(routeCursor);
950
967
  }
951
968
 
952
- // Alright, by now we should have all of our
953
- // matching routes and their param pairs, let's
954
- // Turn them into actual `Match` objects and
955
- // accumulate the params into a single params bag
956
- let allParams = {};
957
-
958
969
  // Existing matches are matches that are already loaded along with
959
970
  // pending matches that are still loading
960
971
 
961
- const matches = matchedRoutes.map(route => {
962
- let parsedParams;
972
+ const parseErrors = matchedRoutes.map(route => {
963
973
  let parsedParamsError;
964
- try {
965
- parsedParams = route.options.parseParams?.(routeParams) ?? routeParams;
966
- // (typeof route.options.parseParams === 'object' &&
967
- // route.options.parseParams.parse
968
- // ? route.options.parseParams.parse(routeParams)
969
- // : (route.options.parseParams as any)?.(routeParams!)) ?? routeParams
970
- } catch (err) {
971
- parsedParamsError = new PathParamError(err.message, {
972
- cause: err
973
- });
974
- if (opts?.throwOnError) {
975
- throw parsedParamsError;
974
+ if (route.options.parseParams) {
975
+ try {
976
+ const parsedParams = route.options.parseParams(routeParams);
977
+ // Add the parsed params to the accumulated params bag
978
+ Object.assign(routeParams, parsedParams);
979
+ } catch (err) {
980
+ parsedParamsError = new PathParamError(err.message, {
981
+ cause: err
982
+ });
983
+ if (opts?.throwOnError) {
984
+ throw parsedParamsError;
985
+ }
986
+ return parsedParamsError;
976
987
  }
977
988
  }
978
-
979
- // Add the parsed params to the accumulated params bag
980
- Object.assign(allParams, parsedParams);
981
- const interpolatedPath = interpolatePath(route.path, allParams);
989
+ return;
990
+ });
991
+ const matches = matchedRoutes.map((route, index) => {
992
+ const interpolatedPath = interpolatePath(route.path, routeParams);
982
993
  const key = route.options.key ? route.options.key({
983
- params: allParams,
994
+ params: routeParams,
984
995
  search: locationSearch
985
996
  }) ?? '' : '';
986
997
  const stringifiedKey = key ? JSON.stringify(key) : '';
987
- const matchId = interpolatePath(route.id, allParams, true) + stringifiedKey;
998
+ const matchId = interpolatePath(route.id, routeParams, true) + stringifiedKey;
988
999
 
989
1000
  // Waste not, want not. If we already have a match for this route,
990
1001
  // reuse it. This is important for layout routes, which might stick
@@ -1002,7 +1013,7 @@ class Router {
1002
1013
  id: matchId,
1003
1014
  key: stringifiedKey,
1004
1015
  routeId: route.id,
1005
- params: allParams,
1016
+ params: routeParams,
1006
1017
  pathname: joinPaths([this.basepath, interpolatedPath]),
1007
1018
  updatedAt: Date.now(),
1008
1019
  invalidAt: Infinity,
@@ -1013,7 +1024,7 @@ class Router {
1013
1024
  isFetching: false,
1014
1025
  invalid: false,
1015
1026
  error: undefined,
1016
- paramsError: parsedParamsError,
1027
+ paramsError: parseErrors[index],
1017
1028
  searchError: undefined,
1018
1029
  loaderData: undefined,
1019
1030
  loadPromise: Promise.resolve(),