@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.
- package/build/cjs/router.js +22 -28
- package/build/cjs/router.js.map +1 -1
- package/build/cjs/searchParams.js +25 -8
- package/build/cjs/searchParams.js.map +1 -1
- package/build/esm/index.js +47 -36
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +118 -118
- package/build/types/index.d.ts +2 -2
- package/build/umd/index.development.js +47 -36
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +2 -2
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/router.ts +25 -30
- package/src/searchParams.ts +32 -8
|
@@ -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
|
|
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;;;;;;;"}
|
package/build/esm/index.js
CHANGED
|
@@ -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
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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
|
|
962
|
-
let parsedParams;
|
|
972
|
+
const parseErrors = matchedRoutes.map(route => {
|
|
963
973
|
let parsedParamsError;
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
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
|
-
|
|
980
|
-
|
|
981
|
-
const interpolatedPath = interpolatePath(route.path,
|
|
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:
|
|
994
|
+
params: routeParams,
|
|
984
995
|
search: locationSearch
|
|
985
996
|
}) ?? '' : '';
|
|
986
997
|
const stringifiedKey = key ? JSON.stringify(key) : '';
|
|
987
|
-
const matchId = interpolatePath(route.id,
|
|
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:
|
|
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:
|
|
1027
|
+
paramsError: parseErrors[index],
|
|
1017
1028
|
searchError: undefined,
|
|
1018
1029
|
loaderData: undefined,
|
|
1019
1030
|
loadPromise: Promise.resolve(),
|