@expo/router-server 56.0.8 → 56.0.9
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/getNamedParametrizedRoute.d.ts +12 -0
- package/build/getNamedParametrizedRoute.d.ts.map +1 -0
- package/build/getNamedParametrizedRoute.js +127 -0
- package/build/getNamedParametrizedRoute.js.map +1 -0
- package/build/getServerManifest.d.ts +0 -14
- package/build/getServerManifest.d.ts.map +1 -1
- package/build/getServerManifest.js +2 -131
- package/build/getServerManifest.js.map +1 -1
- package/build/rsc/middleware.d.ts +1 -1
- package/build/rsc/middleware.d.ts.map +1 -1
- package/build/rsc/middleware.js +4 -14
- package/build/rsc/middleware.js.map +1 -1
- package/build/rsc/path.d.ts +0 -17
- package/build/rsc/path.d.ts.map +1 -1
- package/build/rsc/path.js +1 -91
- package/build/rsc/path.js.map +1 -1
- package/build/rsc/router/createPages.d.ts +35 -0
- package/build/rsc/router/createPages.d.ts.map +1 -0
- package/build/rsc/router/createPages.js +258 -0
- package/build/rsc/router/createPages.js.map +1 -0
- package/build/rsc/router/defineRouter.d.ts +10 -6
- package/build/rsc/router/defineRouter.d.ts.map +1 -1
- package/build/rsc/router/defineRouter.js +38 -29
- package/build/rsc/router/defineRouter.js.map +1 -1
- package/build/rsc/router/expo-definedRouter.d.ts +3 -1
- package/build/rsc/router/expo-definedRouter.d.ts.map +1 -1
- package/build/rsc/router/expo-definedRouter.js +90 -94
- package/build/rsc/router/expo-definedRouter.js.map +1 -1
- package/build/rsc/router/index.d.ts +13 -0
- package/build/rsc/router/index.d.ts.map +1 -0
- package/build/rsc/router/index.js +13 -0
- package/build/rsc/router/index.js.map +1 -0
- package/build/rsc/router/noopRouter.d.ts +2 -1
- package/build/rsc/router/noopRouter.d.ts.map +1 -1
- package/build/rsc/router/noopRouter.js +4 -3
- package/build/rsc/router/noopRouter.js.map +1 -1
- package/build/rsc/rsc-renderer.d.ts +2 -0
- package/build/rsc/rsc-renderer.d.ts.map +1 -1
- package/build/rsc/rsc-renderer.js +34 -7
- package/build/rsc/rsc-renderer.js.map +1 -1
- package/build/rsc/server.d.ts +2 -3
- package/build/rsc/server.d.ts.map +1 -1
- package/build/rsc/server.js +7 -34
- package/build/rsc/server.js.map +1 -1
- package/package.json +8 -8
- package/build/rsc/router/create-expo-pages.d.ts +0 -20
- package/build/rsc/router/create-expo-pages.d.ts.map +0 -1
- package/build/rsc/router/create-expo-pages.js +0 -21
- package/build/rsc/router/create-expo-pages.js.map +0 -1
- package/build/rsc/router/create-pages.d.ts +0 -80
- package/build/rsc/router/create-pages.d.ts.map +0 -1
- package/build/rsc/router/create-pages.js +0 -232
- package/build/rsc/router/create-pages.js.map +0 -1
|
@@ -11,7 +11,6 @@ exports.unstable_redirect = unstable_redirect;
|
|
|
11
11
|
*/
|
|
12
12
|
const rsc_1 = require("expo-router/internal/rsc");
|
|
13
13
|
const react_1 = require("react");
|
|
14
|
-
const path_1 = require("../path");
|
|
15
14
|
const server_1 = require("../server");
|
|
16
15
|
const safeJsonParse = (str) => {
|
|
17
16
|
if (typeof str === 'string') {
|
|
@@ -27,6 +26,11 @@ const safeJsonParse = (str) => {
|
|
|
27
26
|
}
|
|
28
27
|
return undefined;
|
|
29
28
|
};
|
|
29
|
+
const parseSkipList = (value) => {
|
|
30
|
+
if (!Array.isArray(value))
|
|
31
|
+
return new Set();
|
|
32
|
+
return new Set(value.filter((v) => typeof v === 'string'));
|
|
33
|
+
};
|
|
30
34
|
function unstable_defineRouter(getPathConfig, getComponent) {
|
|
31
35
|
let cachedPathConfig;
|
|
32
36
|
const getMyPathConfig = async (buildConfig) => {
|
|
@@ -34,23 +38,22 @@ function unstable_defineRouter(getPathConfig, getComponent) {
|
|
|
34
38
|
return buildConfig;
|
|
35
39
|
}
|
|
36
40
|
if (!cachedPathConfig) {
|
|
37
|
-
cachedPathConfig = Array.from(await getPathConfig()).map((item) => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
});
|
|
41
|
+
cachedPathConfig = Array.from(await getPathConfig()).map((item) => ({
|
|
42
|
+
pathname: item.path,
|
|
43
|
+
matchesPathname: item.matchesPathname,
|
|
44
|
+
isStatic: item.isStatic,
|
|
45
|
+
customData: {
|
|
46
|
+
is404: item.path === '/404',
|
|
47
|
+
noSsr: !!item.noSsr,
|
|
48
|
+
data: item.data,
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
48
51
|
}
|
|
49
52
|
return cachedPathConfig;
|
|
50
53
|
};
|
|
51
54
|
const existsPath = async (pathname, buildConfig) => {
|
|
52
55
|
const pathConfig = await getMyPathConfig(buildConfig);
|
|
53
|
-
const found = pathConfig.find(({
|
|
56
|
+
const found = pathConfig.find(({ matchesPathname }) => matchesPathname(pathname));
|
|
54
57
|
return found
|
|
55
58
|
? found.customData.noSsr
|
|
56
59
|
? ['FOUND', 'NO_SSR']
|
|
@@ -67,10 +70,14 @@ function unstable_defineRouter(getPathConfig, getComponent) {
|
|
|
67
70
|
const shouldSkipObj = {};
|
|
68
71
|
const parsedParams = safeJsonParse(params);
|
|
69
72
|
const query = typeof parsedParams?.query === 'string' ? parsedParams.query : '';
|
|
70
|
-
const skip =
|
|
71
|
-
const
|
|
72
|
-
const entries = (await Promise.all(
|
|
73
|
-
|
|
73
|
+
const skip = parseSkipList(parsedParams?.skip);
|
|
74
|
+
const { layouts, page } = (0, rsc_1.getComponentIds)(pathname);
|
|
75
|
+
const entries = (await Promise.all([...layouts, page].map(async (id) => {
|
|
76
|
+
// `getComponentIds` separates the terminal page from layouts. Use that
|
|
77
|
+
// structural distinction as a fast-path skip (kind isn't known until we
|
|
78
|
+
// resolve); the kind-based check after resolve is the authoritative defense.
|
|
79
|
+
const isPage = id === page;
|
|
80
|
+
if (isPage && skip.has(id)) {
|
|
74
81
|
return [];
|
|
75
82
|
}
|
|
76
83
|
const setShouldSkip = (val) => {
|
|
@@ -81,14 +88,18 @@ function unstable_defineRouter(getPathConfig, getComponent) {
|
|
|
81
88
|
delete shouldSkipObj[id];
|
|
82
89
|
}
|
|
83
90
|
};
|
|
84
|
-
const
|
|
91
|
+
const resolved = await getComponent(id, {
|
|
85
92
|
unstable_setShouldSkip: setShouldSkip,
|
|
86
93
|
unstable_buildConfig: buildConfig,
|
|
87
94
|
});
|
|
88
|
-
if (!
|
|
95
|
+
if (!resolved) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
// Honor skip only for entries the resolver opted into shouldSkipObj; layouts are never skippable.
|
|
99
|
+
if (skip.has(id) && resolved.kind !== 'layout' && shouldSkipObj[id] != null) {
|
|
89
100
|
return [];
|
|
90
101
|
}
|
|
91
|
-
const element = (0, react_1.createElement)(component,
|
|
102
|
+
const element = (0, react_1.createElement)(resolved.component, isPage ? { path: pathname, query } : { path: pathname }, (0, react_1.createElement)(rsc_1.Children));
|
|
92
103
|
return [[id, element]];
|
|
93
104
|
}))).flat();
|
|
94
105
|
entries.push([rsc_1.SHOULD_SKIP_ID, Object.entries(shouldSkipObj)]);
|
|
@@ -98,11 +109,10 @@ function unstable_defineRouter(getPathConfig, getComponent) {
|
|
|
98
109
|
const getBuildConfig = async (unstable_collectClientModules) => {
|
|
99
110
|
const pathConfig = await getMyPathConfig();
|
|
100
111
|
const path2moduleIds = {};
|
|
101
|
-
for (const { pathname
|
|
102
|
-
if (
|
|
112
|
+
for (const { pathname } of pathConfig) {
|
|
113
|
+
if (pathname.includes('[')) {
|
|
103
114
|
continue;
|
|
104
115
|
}
|
|
105
|
-
const pathname = '/' + pathSpec.map(({ name }) => name).join('/');
|
|
106
116
|
const input = (0, rsc_1.getInputString)(pathname);
|
|
107
117
|
const moduleIds = await unstable_collectClientModules(input);
|
|
108
118
|
path2moduleIds[pathname] = moduleIds;
|
|
@@ -115,15 +125,14 @@ globalThis.__EXPO_ROUTER_PREFETCH__ = (path) => {
|
|
|
115
125
|
}
|
|
116
126
|
};`;
|
|
117
127
|
const buildConfig = [];
|
|
118
|
-
for (const { pathname
|
|
128
|
+
for (const { pathname, isStatic, customData } of pathConfig) {
|
|
119
129
|
const entries = [];
|
|
120
|
-
if (
|
|
121
|
-
const pathname = '/' + pathSpec.map(({ name }) => name).join('/');
|
|
130
|
+
if (!pathname.includes('[')) {
|
|
122
131
|
const input = (0, rsc_1.getInputString)(pathname);
|
|
123
132
|
entries.push({ input, isStatic });
|
|
124
133
|
}
|
|
125
134
|
buildConfig.push({
|
|
126
|
-
pathname
|
|
135
|
+
pathname,
|
|
127
136
|
isStatic,
|
|
128
137
|
entries,
|
|
129
138
|
customCode,
|
|
@@ -145,9 +154,9 @@ globalThis.__EXPO_ROUTER_PREFETCH__ = (path) => {
|
|
|
145
154
|
return null;
|
|
146
155
|
}
|
|
147
156
|
}
|
|
148
|
-
const
|
|
157
|
+
const { layouts, page } = (0, rsc_1.getComponentIds)(pathname);
|
|
149
158
|
const input = (0, rsc_1.getInputString)(pathname);
|
|
150
|
-
const html = (0, react_1.createElement)(rsc_1.ServerRouter, { route: { path: pathname, query: searchParams.toString(), hash: '' } },
|
|
159
|
+
const html = (0, react_1.createElement)(rsc_1.ServerRouter, { route: { path: pathname, query: searchParams.toString(), hash: '' } }, [...layouts, page].reduceRight((acc, id) => (0, react_1.createElement)(rsc_1.Slot, { id, fallback: acc }, acc), null));
|
|
151
160
|
return {
|
|
152
161
|
input,
|
|
153
162
|
params: JSON.stringify({ query: searchParams.toString() }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineRouter.js","sourceRoot":"","sources":["../../../src/rsc/router/defineRouter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\n * Copyright © 2024 2023 Daishi Kato\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {\n getComponentIds,\n getInputString,\n parseInputString,\n PARAM_KEY_SKIP,\n SHOULD_SKIP_ID,\n LOCATION_ID,\n Children,\n ServerRouter,\n Slot,\n type RouteProps,\n type ShouldSkip,\n} from 'expo-router/internal/rsc';\nimport type { ComponentProps, FunctionComponent, ReactNode } from 'react';\nimport { createElement } from 'react';\n\nimport { getPathMapping } from '../path';\nimport type { PathSpec } from '../path';\nimport { rerender } from '../server';\nimport type {\n BuildConfig,\n RenderEntries,\n GetBuildConfig,\n GetSsrConfig,\n defineEntries,\n} from '../server';\n\ntype RoutePropsForLayout = Omit<RouteProps, 'searchParams'> & {\n children: ReactNode;\n};\n\ntype ShouldSkipValue = ShouldSkip[number][1];\n\nconst safeJsonParse = (str: unknown) => {\n if (typeof str === 'string') {\n try {\n const obj = JSON.parse(str);\n if (typeof obj === 'object') {\n return obj as Record<string, unknown>;\n }\n } catch {\n // ignore\n }\n }\n return undefined;\n};\n\nexport function unstable_defineRouter(\n getPathConfig: () => Promise<\n Iterable<{\n pattern: string;\n path: PathSpec;\n isStatic?: boolean;\n noSsr?: boolean;\n data?: unknown; // For build: put in customData\n }>\n >,\n getComponent: (\n componentId: string, // \"**/layout\" or \"**/page\"\n options: {\n // TODO setShouldSkip API is too hard to understand\n unstable_setShouldSkip: (val?: ShouldSkipValue) => void;\n unstable_buildConfig: BuildConfig | undefined;\n }\n ) => Promise<FunctionComponent<RouteProps> | FunctionComponent<RoutePropsForLayout> | null>\n): ReturnType<typeof defineEntries> {\n type MyPathConfig = {\n pattern: string;\n pathname: PathSpec;\n isStatic?: boolean | undefined;\n customData: { noSsr?: boolean; is404: boolean; data: unknown };\n }[];\n let cachedPathConfig: MyPathConfig | undefined;\n const getMyPathConfig = async (buildConfig?: BuildConfig): Promise<MyPathConfig> => {\n if (buildConfig) {\n return buildConfig as MyPathConfig;\n }\n if (!cachedPathConfig) {\n cachedPathConfig = Array.from(await getPathConfig()).map((item) => {\n const is404 =\n item.path.length === 1 &&\n item.path[0]!.type === 'literal' &&\n item.path[0]!.name === '404';\n return {\n pattern: item.pattern,\n pathname: item.path,\n isStatic: item.isStatic,\n customData: { is404, noSsr: !!item.noSsr, data: item.data },\n };\n });\n }\n return cachedPathConfig;\n };\n const existsPath = async (\n pathname: string,\n buildConfig: BuildConfig | undefined\n ): Promise<['FOUND', 'NO_SSR'?] | ['NOT_FOUND', 'HAS_404'?]> => {\n const pathConfig = await getMyPathConfig(buildConfig);\n const found = pathConfig.find(({ pathname: pathSpec }) => getPathMapping(pathSpec, pathname));\n return found\n ? found.customData.noSsr\n ? ['FOUND', 'NO_SSR']\n : ['FOUND']\n : pathConfig.some(({ customData: { is404 } }) => is404) // FIXMEs should avoid re-computation\n ? ['NOT_FOUND', 'HAS_404']\n : ['NOT_FOUND'];\n };\n const renderEntries: RenderEntries = async (input, { params, buildConfig }) => {\n const pathname = parseInputString(input);\n if ((await existsPath(pathname, buildConfig))[0] === 'NOT_FOUND') {\n return null;\n }\n const shouldSkipObj: {\n [componentId: ShouldSkip[number][0]]: ShouldSkip[number][1];\n } = {};\n\n const parsedParams = safeJsonParse(params);\n\n const query = typeof parsedParams?.query === 'string' ? parsedParams.query : '';\n const skip = Array.isArray(parsedParams?.skip) ? (parsedParams?.skip as unknown[]) : [];\n const componentIds = getComponentIds(pathname);\n const entries: (readonly [string, ReactNode])[] = (\n await Promise.all(\n componentIds.map(async (id) => {\n if (skip?.includes(id)) {\n return [];\n }\n const setShouldSkip = (val?: ShouldSkipValue) => {\n if (val) {\n shouldSkipObj[id] = val;\n } else {\n delete shouldSkipObj[id];\n }\n };\n const component = await getComponent(id, {\n unstable_setShouldSkip: setShouldSkip,\n unstable_buildConfig: buildConfig,\n });\n if (!component) {\n return [];\n }\n const element = createElement(\n component as FunctionComponent<{\n path: string;\n query?: string;\n }>,\n id.endsWith('/layout') ? { path: pathname } : { path: pathname, query },\n createElement(Children)\n );\n return [[id, element]] as const;\n })\n )\n ).flat();\n entries.push([SHOULD_SKIP_ID, Object.entries(shouldSkipObj)]);\n entries.push([LOCATION_ID, [pathname, query]]);\n return Object.fromEntries(entries);\n };\n\n const getBuildConfig: GetBuildConfig = async (unstable_collectClientModules) => {\n const pathConfig = await getMyPathConfig();\n const path2moduleIds: Record<string, string[]> = {};\n\n for (const { pathname: pathSpec } of pathConfig) {\n if (pathSpec.some(({ type }) => type !== 'literal')) {\n continue;\n }\n\n const pathname = '/' + pathSpec.map(({ name }) => name).join('/');\n const input = getInputString(pathname);\n const moduleIds = await unstable_collectClientModules(input);\n path2moduleIds[pathname] = moduleIds;\n }\n const customCode = `\nglobalThis.__EXPO_ROUTER_PREFETCH__ = (path) => {\n const path2ids = ${JSON.stringify(path2moduleIds)};\n for (const id of path2ids[path] || []) {\n import(id);\n }\n};`;\n const buildConfig: BuildConfig = [];\n for (const { pathname: pathSpec, isStatic, customData } of pathConfig) {\n const entries: BuildConfig[number]['entries'] = [];\n if (pathSpec.every(({ type }) => type === 'literal')) {\n const pathname = '/' + pathSpec.map(({ name }) => name).join('/');\n const input = getInputString(pathname);\n entries.push({ input, isStatic });\n }\n buildConfig.push({\n pathname: pathSpec,\n isStatic,\n entries,\n customCode,\n customData,\n });\n }\n return buildConfig;\n };\n\n const getSsrConfig: GetSsrConfig = async (pathname, { searchParams, buildConfig }) => {\n const pathStatus = await existsPath(pathname, buildConfig);\n if (pathStatus[1] === 'NO_SSR') {\n return null;\n }\n if (pathStatus[0] === 'NOT_FOUND') {\n if (pathStatus[1] === 'HAS_404') {\n pathname = '/404';\n } else {\n return null;\n }\n }\n const componentIds = getComponentIds(pathname);\n const input = getInputString(pathname);\n const html = createElement(\n ServerRouter as FunctionComponent<Omit<ComponentProps<typeof ServerRouter>, 'children'>>,\n { route: { path: pathname, query: searchParams.toString(), hash: '' } },\n componentIds.reduceRight(\n (acc: ReactNode, id) => createElement(Slot, { id, fallback: acc }, acc),\n null\n )\n );\n return {\n input,\n params: JSON.stringify({ query: searchParams.toString() }),\n html,\n };\n };\n\n return { renderEntries, getBuildConfig, getSsrConfig };\n}\n\nexport function unstable_redirect(\n pathname: string,\n searchParams?: URLSearchParams,\n skip?: string[]\n) {\n if (skip) {\n searchParams = new URLSearchParams(searchParams);\n for (const id of skip) {\n searchParams.append(PARAM_KEY_SKIP, id);\n }\n }\n const input = getInputString(pathname);\n rerender(input, searchParams);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"defineRouter.js","sourceRoot":"","sources":["../../../src/rsc/router/defineRouter.ts"],"names":[],"mappings":";;AAyDA,sDA4LC;AAED,8CAaC;AApQD;;;;;;GAMG;AACH,kDAYkC;AAElC,iCAAsC;AAEtC,sCAAqC;AAerC,MAAM,aAAa,GAAG,CAAC,GAAY,EAAE,EAAE;IACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,GAA8B,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAe,EAAE;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC5C,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,SAAgB,qBAAqB,CACnC,aAQC,EACD,YAWC;IAQD,IAAI,gBAA0C,CAAC;IAC/C,MAAM,eAAe,GAAG,KAAK,EAAE,WAAyB,EAAyB,EAAE;QACjF,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAA2B,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClE,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;oBAC3B,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB;aACF,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,EACtB,QAAgB,EAChB,WAAoC,EACuB,EAAE;QAC7D,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,OAAO,KAAK;YACV,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK;gBACtB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;gBACrB,CAAC,CAAC,CAAC,OAAO,CAAC;YACb,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,qCAAqC;gBAC3F,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC;gBAC1B,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,aAAa,GAAkB,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5E,MAAM,QAAQ,GAAG,IAAA,sBAAgB,EAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,aAAa,GAEf,EAAE,CAAC;QAEP,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,KAAK,GAAG,OAAO,YAAY,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,GAAG,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAe,EAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,OAAO,GAAqC,CAChD,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAClC,uEAAuE;YACvE,wEAAwE;YACxE,6EAA6E;YAC7E,MAAM,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;YAC3B,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,aAAa,GAAG,CAAC,GAAqB,EAAE,EAAE;gBAC9C,IAAI,GAAG,EAAE,CAAC;oBACR,aAAa,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,OAAO,aAAa,CAAC,EAAE,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE;gBACtC,sBAAsB,EAAE,aAAa;gBACrC,oBAAoB,EAAE,WAAW;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,kGAAkG;YAClG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC5E,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,OAAO,GAAG,IAAA,qBAAa,EAC3B,QAAQ,CAAC,SAGP,EACF,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EACvD,IAAA,qBAAa,EAAC,cAAQ,CAAC,CACxB,CAAC;YACF,OAAO,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAU,CAAC;QAClC,CAAC,CAAC,CACH,CACF,CAAC,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CAAC,CAAC,oBAAc,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAW,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAmB,KAAK,EAAE,6BAA6B,EAAE,EAAE;QAC7E,MAAM,UAAU,GAAG,MAAM,eAAe,EAAE,CAAC;QAC3C,MAAM,cAAc,GAA6B,EAAE,CAAC;QAEpD,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,IAAA,oBAAc,EAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,6BAA6B,CAAC,KAAK,CAAC,CAAC;YAC7D,cAAc,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QACvC,CAAC;QACD,MAAM,UAAU,GAAG;;qBAEF,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;;;;GAIhD,CAAC;QACA,MAAM,WAAW,GAAgB,EAAE,CAAC;QACpC,KAAK,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAmC,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAA,oBAAc,EAAC,QAAQ,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,WAAW,CAAC,IAAI,CAAC;gBACf,QAAQ;gBACR,QAAQ;gBACR,OAAO;gBACP,UAAU;gBACV,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAiB,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;QACnF,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChC,QAAQ,GAAG,MAAM,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAe,EAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAA,oBAAc,EAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAA,qBAAa,EACxB,kBAAwF,EACxF,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EACvE,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,WAAW,CAC5B,CAAC,GAAc,EAAE,EAAE,EAAE,EAAE,CAAC,IAAA,qBAAa,EAAC,UAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,EACvE,IAAI,CACL,CACF,CAAC;QACF,OAAO;YACL,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC1D,IAAI;SACL,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC;AAED,SAAgB,iBAAiB,CAC/B,QAAgB,EAChB,YAA8B,EAC9B,IAAe;IAEf,IAAI,IAAI,EAAE,CAAC;QACT,YAAY,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;QACjD,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACtB,YAAY,CAAC,MAAM,CAAC,oBAAc,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,oBAAc,EAAC,QAAQ,CAAC,CAAC;IACvC,IAAA,iBAAQ,EAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAChC,CAAC","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\n * Copyright © 2024 2023 Daishi Kato\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport {\n getComponentIds,\n getInputString,\n parseInputString,\n PARAM_KEY_SKIP,\n SHOULD_SKIP_ID,\n LOCATION_ID,\n Children,\n ServerRouter,\n Slot,\n type RouteProps,\n type ShouldSkip,\n} from 'expo-router/internal/rsc';\nimport type { ComponentProps, FunctionComponent, ReactNode } from 'react';\nimport { createElement } from 'react';\n\nimport { rerender } from '../server';\nimport type {\n BuildConfig,\n RenderEntries,\n GetBuildConfig,\n GetSsrConfig,\n defineEntries,\n} from '../server';\n\ntype RoutePropsForLayout = Omit<RouteProps, 'searchParams'> & {\n children: ReactNode;\n};\n\ntype ShouldSkipValue = ShouldSkip[number][1];\n\nconst safeJsonParse = (str: unknown) => {\n if (typeof str === 'string') {\n try {\n const obj = JSON.parse(str);\n if (typeof obj === 'object') {\n return obj as Record<string, unknown>;\n }\n } catch {\n // ignore\n }\n }\n return undefined;\n};\n\nconst parseSkipList = (value: unknown): Set<string> => {\n if (!Array.isArray(value)) return new Set();\n return new Set(value.filter((v): v is string => typeof v === 'string'));\n};\n\nexport function unstable_defineRouter(\n getPathConfig: () => Promise<\n Iterable<{\n path: string;\n matchesPathname: (pathname: string) => boolean;\n isStatic?: boolean;\n noSsr?: boolean;\n data?: unknown; // For build: put in customData\n }>\n >,\n getComponent: (\n componentId: string,\n options: {\n // TODO setShouldSkip API is too hard to understand\n unstable_setShouldSkip: (val?: ShouldSkipValue) => void;\n unstable_buildConfig: BuildConfig | undefined;\n }\n ) => Promise<\n | { component: FunctionComponent<RouteProps>; kind: 'page' }\n | { component: FunctionComponent<RoutePropsForLayout>; kind: 'layout' }\n | null\n >\n): ReturnType<typeof defineEntries> {\n type MyPathConfig = {\n pathname: string;\n matchesPathname: (pathname: string) => boolean;\n isStatic?: boolean | undefined;\n customData: { noSsr?: boolean; is404: boolean; data: unknown };\n }[];\n let cachedPathConfig: MyPathConfig | undefined;\n const getMyPathConfig = async (buildConfig?: BuildConfig): Promise<MyPathConfig> => {\n if (buildConfig) {\n return buildConfig as MyPathConfig;\n }\n if (!cachedPathConfig) {\n cachedPathConfig = Array.from(await getPathConfig()).map((item) => ({\n pathname: item.path,\n matchesPathname: item.matchesPathname,\n isStatic: item.isStatic,\n customData: {\n is404: item.path === '/404',\n noSsr: !!item.noSsr,\n data: item.data,\n },\n }));\n }\n return cachedPathConfig;\n };\n const existsPath = async (\n pathname: string,\n buildConfig: BuildConfig | undefined\n ): Promise<['FOUND', 'NO_SSR'?] | ['NOT_FOUND', 'HAS_404'?]> => {\n const pathConfig = await getMyPathConfig(buildConfig);\n const found = pathConfig.find(({ matchesPathname }) => matchesPathname(pathname));\n return found\n ? found.customData.noSsr\n ? ['FOUND', 'NO_SSR']\n : ['FOUND']\n : pathConfig.some(({ customData: { is404 } }) => is404) // FIXMEs should avoid re-computation\n ? ['NOT_FOUND', 'HAS_404']\n : ['NOT_FOUND'];\n };\n const renderEntries: RenderEntries = async (input, { params, buildConfig }) => {\n const pathname = parseInputString(input);\n if ((await existsPath(pathname, buildConfig))[0] === 'NOT_FOUND') {\n return null;\n }\n const shouldSkipObj: {\n [componentId: ShouldSkip[number][0]]: ShouldSkip[number][1];\n } = {};\n\n const parsedParams = safeJsonParse(params);\n\n const query = typeof parsedParams?.query === 'string' ? parsedParams.query : '';\n const skip = parseSkipList(parsedParams?.skip);\n const { layouts, page } = getComponentIds(pathname);\n const entries: (readonly [string, ReactNode])[] = (\n await Promise.all(\n [...layouts, page].map(async (id) => {\n // `getComponentIds` separates the terminal page from layouts. Use that\n // structural distinction as a fast-path skip (kind isn't known until we\n // resolve); the kind-based check after resolve is the authoritative defense.\n const isPage = id === page;\n if (isPage && skip.has(id)) {\n return [];\n }\n const setShouldSkip = (val?: ShouldSkipValue) => {\n if (val) {\n shouldSkipObj[id] = val;\n } else {\n delete shouldSkipObj[id];\n }\n };\n const resolved = await getComponent(id, {\n unstable_setShouldSkip: setShouldSkip,\n unstable_buildConfig: buildConfig,\n });\n if (!resolved) {\n return [];\n }\n // Honor skip only for entries the resolver opted into shouldSkipObj; layouts are never skippable.\n if (skip.has(id) && resolved.kind !== 'layout' && shouldSkipObj[id] != null) {\n return [];\n }\n const element = createElement(\n resolved.component as FunctionComponent<{\n path: string;\n query?: string;\n }>,\n isPage ? { path: pathname, query } : { path: pathname },\n createElement(Children)\n );\n return [[id, element]] as const;\n })\n )\n ).flat();\n entries.push([SHOULD_SKIP_ID, Object.entries(shouldSkipObj)]);\n entries.push([LOCATION_ID, [pathname, query]]);\n return Object.fromEntries(entries);\n };\n\n const getBuildConfig: GetBuildConfig = async (unstable_collectClientModules) => {\n const pathConfig = await getMyPathConfig();\n const path2moduleIds: Record<string, string[]> = {};\n\n for (const { pathname } of pathConfig) {\n if (pathname.includes('[')) {\n continue;\n }\n const input = getInputString(pathname);\n const moduleIds = await unstable_collectClientModules(input);\n path2moduleIds[pathname] = moduleIds;\n }\n const customCode = `\nglobalThis.__EXPO_ROUTER_PREFETCH__ = (path) => {\n const path2ids = ${JSON.stringify(path2moduleIds)};\n for (const id of path2ids[path] || []) {\n import(id);\n }\n};`;\n const buildConfig: BuildConfig = [];\n for (const { pathname, isStatic, customData } of pathConfig) {\n const entries: BuildConfig[number]['entries'] = [];\n if (!pathname.includes('[')) {\n const input = getInputString(pathname);\n entries.push({ input, isStatic });\n }\n buildConfig.push({\n pathname,\n isStatic,\n entries,\n customCode,\n customData,\n });\n }\n return buildConfig;\n };\n\n const getSsrConfig: GetSsrConfig = async (pathname, { searchParams, buildConfig }) => {\n const pathStatus = await existsPath(pathname, buildConfig);\n if (pathStatus[1] === 'NO_SSR') {\n return null;\n }\n if (pathStatus[0] === 'NOT_FOUND') {\n if (pathStatus[1] === 'HAS_404') {\n pathname = '/404';\n } else {\n return null;\n }\n }\n const { layouts, page } = getComponentIds(pathname);\n const input = getInputString(pathname);\n const html = createElement(\n ServerRouter as FunctionComponent<Omit<ComponentProps<typeof ServerRouter>, 'children'>>,\n { route: { path: pathname, query: searchParams.toString(), hash: '' } },\n [...layouts, page].reduceRight(\n (acc: ReactNode, id) => createElement(Slot, { id, fallback: acc }, acc),\n null\n )\n );\n return {\n input,\n params: JSON.stringify({ query: searchParams.toString() }),\n html,\n };\n };\n\n return { renderEntries, getBuildConfig, getSsrConfig };\n}\n\nexport function unstable_redirect(\n pathname: string,\n searchParams?: URLSearchParams,\n skip?: string[]\n) {\n if (skip) {\n searchParams = new URLSearchParams(searchParams);\n for (const id of skip) {\n searchParams.append(PARAM_KEY_SKIP, id);\n }\n }\n const input = getInputString(pathname);\n rerender(input, searchParams);\n}\n"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { getRoutes } from '../../getRoutesSSR';
|
|
2
|
+
import type { EntriesDev } from '../server';
|
|
3
|
+
declare const _default: (getRouteOptions?: Parameters<typeof getRoutes>[1]) => EntriesDev;
|
|
2
4
|
export default _default;
|
|
3
5
|
//# sourceMappingURL=expo-definedRouter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo-definedRouter.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/expo-definedRouter.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"expo-definedRouter.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/expo-definedRouter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;yBA6H5B,kBAAkB,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,KAAG,UAAU;AAA9E,wBAWG"}
|
|
@@ -2,112 +2,108 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const _ctx_1 = require("expo-router/_ctx");
|
|
4
4
|
const routing_1 = require("expo-router/internal/routing");
|
|
5
|
-
const
|
|
5
|
+
const createPages_1 = require("./createPages");
|
|
6
6
|
const getRoutesSSR_1 = require("../../getRoutesSSR");
|
|
7
7
|
const loadStaticParamsAsync_1 = require("../../loadStaticParamsAsync");
|
|
8
|
+
function readSettings(loaded) {
|
|
9
|
+
const raw = (loaded.unstable_settings ?? {});
|
|
10
|
+
const render = raw.render === 'static' || raw.render === 'dynamic' ? raw.render : undefined;
|
|
11
|
+
const unstable_disableSSR = typeof raw.unstable_disableSSR === 'boolean' ? raw.unstable_disableSSR : undefined;
|
|
12
|
+
return { render, unstable_disableSSR };
|
|
13
|
+
}
|
|
8
14
|
const UNIMPLEMENTED_PARAMS = new Proxy({}, {
|
|
9
|
-
// Assert that params is unimplemented when accessed.
|
|
10
15
|
get() {
|
|
11
16
|
throw new Error('generateStaticParams(): params is not implemented yet');
|
|
12
17
|
},
|
|
13
18
|
});
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
skipGenerated: true,
|
|
19
|
-
importMode: 'lazy',
|
|
20
|
-
});
|
|
21
|
-
if (!routes)
|
|
22
|
-
return;
|
|
23
|
-
async function loadAndConvertStaticParamsAsync(route) {
|
|
24
|
-
const loaded = route.loadRoute();
|
|
25
|
-
let staticPaths = undefined;
|
|
26
|
-
if (route.dynamic) {
|
|
27
|
-
const params = await (0, loadStaticParamsAsync_1.evalStaticParamsAsync)(route, { parentParams: UNIMPLEMENTED_PARAMS }, loaded.generateStaticParams);
|
|
28
|
-
// Sort `params` like `[{a: 'x', b: 'y'}, { a: 'z', b: 'w' }]` for a route.dynamic like `[{name: 'a', deep: false}, {name: 'b', deep: false}]` to `[['a', 'y'], ['z', 'w]]`
|
|
29
|
-
staticPaths = params?.map((p) => {
|
|
30
|
-
const grouped = [];
|
|
31
|
-
for (const dynamic of route.dynamic) {
|
|
32
|
-
const defined = p[dynamic.name];
|
|
33
|
-
if (!defined) {
|
|
34
|
-
throw new Error('generateStaticParams is missing param: ' +
|
|
35
|
-
dynamic.name +
|
|
36
|
-
'. In route: ' +
|
|
37
|
-
route.contextKey);
|
|
38
|
-
}
|
|
39
|
-
if (Array.isArray(defined)) {
|
|
40
|
-
if (defined.length > 1) {
|
|
41
|
-
throw new Error('generateStaticParams does not support returning multiple static paths for deep dynamic routes in React Server Components yet. Update route: ' +
|
|
42
|
-
route.contextKey);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
const first = Array.isArray(defined) ? defined[0] : defined;
|
|
46
|
-
if (first != null) {
|
|
47
|
-
grouped.push(first);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return grouped;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
else if (loaded.generateStaticParams) {
|
|
19
|
+
async function loadStaticParamsForRoute(route) {
|
|
20
|
+
const loaded = route.loadRoute();
|
|
21
|
+
if (!route.dynamic) {
|
|
22
|
+
if (loaded.generateStaticParams) {
|
|
54
23
|
throw new Error('Cannot use generateStaticParams without a dynamic route: ' + route.contextKey);
|
|
55
24
|
}
|
|
56
|
-
return
|
|
25
|
+
return undefined;
|
|
57
26
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
render: 'static',
|
|
69
|
-
...loaded.unstable_settings,
|
|
70
|
-
});
|
|
71
|
-
await Promise.all(route.children.sort(routing_1.sortRoutes).map(async (child) => {
|
|
72
|
-
if (child.type === 'layout') {
|
|
73
|
-
await addLayout(child);
|
|
27
|
+
const params = await (0, loadStaticParamsAsync_1.evalStaticParamsAsync)(route, { parentParams: UNIMPLEMENTED_PARAMS }, loaded.generateStaticParams);
|
|
28
|
+
return params?.map((p) => {
|
|
29
|
+
const grouped = [];
|
|
30
|
+
for (const dynamic of route.dynamic) {
|
|
31
|
+
const defined = p[dynamic.name];
|
|
32
|
+
if (!defined) {
|
|
33
|
+
throw new Error('generateStaticParams is missing param: ' +
|
|
34
|
+
dynamic.name +
|
|
35
|
+
'. In route: ' +
|
|
36
|
+
route.contextKey);
|
|
74
37
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const settings = loaded.unstable_settings;
|
|
79
|
-
// Support generateStaticParams for dynamic routes by defining the route twice.
|
|
80
|
-
if (loaded.generateStaticParams) {
|
|
81
|
-
createPage({
|
|
82
|
-
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
83
|
-
component: loaded.default,
|
|
84
|
-
path: normal,
|
|
85
|
-
render: 'static',
|
|
86
|
-
...loaded.unstable_settings,
|
|
87
|
-
staticPaths: (await loadAndConvertStaticParamsAsync(child)),
|
|
88
|
-
});
|
|
89
|
-
if (settings?.render !== 'static') {
|
|
90
|
-
createPage({
|
|
91
|
-
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
92
|
-
component: loaded.default,
|
|
93
|
-
path: normal,
|
|
94
|
-
render: 'dynamic',
|
|
95
|
-
...settings,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
createPage({
|
|
101
|
-
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
102
|
-
component: loaded.default,
|
|
103
|
-
path: normal,
|
|
104
|
-
render: 'dynamic',
|
|
105
|
-
...settings,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
38
|
+
if (Array.isArray(defined) && defined.length > 1) {
|
|
39
|
+
throw new Error('generateStaticParams does not support returning multiple static paths for deep dynamic routes in React Server Components yet. Update route: ' +
|
|
40
|
+
route.contextKey);
|
|
108
41
|
}
|
|
109
|
-
|
|
42
|
+
const first = Array.isArray(defined) ? defined[0] : defined;
|
|
43
|
+
if (first != null) {
|
|
44
|
+
grouped.push(first);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return grouped;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async function registerRouteTree(api, route) {
|
|
51
|
+
const layoutPath = (0, routing_1.getContextKey)(route.contextKey).replace(/\/index$/, '');
|
|
52
|
+
const loaded = route.loadRoute();
|
|
53
|
+
if (loaded.generateStaticParams) {
|
|
54
|
+
throw new Error('generateStaticParams is not supported in _layout routes with React Server Components enabled yet.');
|
|
110
55
|
}
|
|
111
|
-
|
|
56
|
+
const layoutSettings = readSettings(loaded);
|
|
57
|
+
api.createLayout({
|
|
58
|
+
component: loaded.default,
|
|
59
|
+
path: layoutPath,
|
|
60
|
+
render: layoutSettings.render ?? 'static',
|
|
61
|
+
});
|
|
62
|
+
await Promise.all(route.children.sort(routing_1.sortRoutes).map(async (child) => {
|
|
63
|
+
if (child.type === 'layout') {
|
|
64
|
+
await registerRouteTree(api, child);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const childPath = (0, routing_1.getContextKey)(child.contextKey).replace(/\/index$/, '');
|
|
68
|
+
const childLoaded = child.loadRoute();
|
|
69
|
+
const settings = readSettings(childLoaded);
|
|
70
|
+
if (childLoaded.generateStaticParams) {
|
|
71
|
+
api.createPage({
|
|
72
|
+
component: childLoaded.default,
|
|
73
|
+
path: childPath,
|
|
74
|
+
render: 'static',
|
|
75
|
+
staticPaths: (await loadStaticParamsForRoute(child)),
|
|
76
|
+
unstable_disableSSR: settings.unstable_disableSSR,
|
|
77
|
+
});
|
|
78
|
+
if (settings.render !== 'static') {
|
|
79
|
+
api.createPage({
|
|
80
|
+
component: childLoaded.default,
|
|
81
|
+
path: childPath,
|
|
82
|
+
render: 'dynamic',
|
|
83
|
+
unstable_disableSSR: settings.unstable_disableSSR,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
api.createPage({
|
|
89
|
+
component: childLoaded.default,
|
|
90
|
+
path: childPath,
|
|
91
|
+
render: settings.render ?? 'dynamic',
|
|
92
|
+
unstable_disableSSR: settings.unstable_disableSSR,
|
|
93
|
+
});
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
exports.default = (getRouteOptions) => ({
|
|
97
|
+
default: (0, createPages_1.createPages)(async ({ createPage, createLayout, unstable_setBuildData }) => {
|
|
98
|
+
const routes = (0, getRoutesSSR_1.getRoutes)(_ctx_1.ctx, {
|
|
99
|
+
...getRouteOptions,
|
|
100
|
+
platform: process.env.EXPO_OS,
|
|
101
|
+
skipGenerated: true,
|
|
102
|
+
importMode: 'lazy',
|
|
103
|
+
});
|
|
104
|
+
if (!routes)
|
|
105
|
+
return;
|
|
106
|
+
await registerRouteTree({ createPage, createLayout, unstable_setBuildData }, routes);
|
|
107
|
+
}),
|
|
112
108
|
});
|
|
113
109
|
//# sourceMappingURL=expo-definedRouter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo-definedRouter.js","sourceRoot":"","sources":["../../../src/rsc/router/expo-definedRouter.ts"],"names":[],"mappings":";;AAAA,2CAAuC;AACvC,0DAAyF;AAEzF
|
|
1
|
+
{"version":3,"file":"expo-definedRouter.js","sourceRoot":"","sources":["../../../src/rsc/router/expo-definedRouter.ts"],"names":[],"mappings":"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","sourcesContent":["import { ctx } from 'expo-router/_ctx';\nimport { getContextKey, sortRoutes, type RouteNode } from 'expo-router/internal/routing';\n\nimport { createPages, type CreatePagesApi } from './createPages';\nimport { getRoutes } from '../../getRoutesSSR';\nimport { evalStaticParamsAsync } from '../../loadStaticParamsAsync';\nimport type { EntriesDev } from '../server';\n\ntype RouteSettings = {\n render?: 'static' | 'dynamic';\n unstable_disableSSR?: boolean;\n};\n\nfunction readSettings(loaded: { unstable_settings?: unknown }): RouteSettings {\n const raw = (loaded.unstable_settings ?? {}) as Record<string, unknown>;\n const render = raw.render === 'static' || raw.render === 'dynamic' ? raw.render : undefined;\n const unstable_disableSSR =\n typeof raw.unstable_disableSSR === 'boolean' ? raw.unstable_disableSSR : undefined;\n return { render, unstable_disableSSR };\n}\n\nconst UNIMPLEMENTED_PARAMS = new Proxy(\n {},\n {\n get() {\n throw new Error('generateStaticParams(): params is not implemented yet');\n },\n }\n);\n\nasync function loadStaticParamsForRoute(route: RouteNode): Promise<string[][] | undefined> {\n const loaded = route.loadRoute();\n\n if (!route.dynamic) {\n if (loaded.generateStaticParams) {\n throw new Error(\n 'Cannot use generateStaticParams without a dynamic route: ' + route.contextKey\n );\n }\n return undefined;\n }\n\n const params = await evalStaticParamsAsync(\n route,\n { parentParams: UNIMPLEMENTED_PARAMS },\n loaded.generateStaticParams\n );\n\n return params?.map((p) => {\n const grouped: string[] = [];\n for (const dynamic of route.dynamic!) {\n const defined = p[dynamic.name];\n if (!defined) {\n throw new Error(\n 'generateStaticParams is missing param: ' +\n dynamic.name +\n '. In route: ' +\n route.contextKey\n );\n }\n if (Array.isArray(defined) && defined.length > 1) {\n throw new Error(\n 'generateStaticParams does not support returning multiple static paths for deep dynamic routes in React Server Components yet. Update route: ' +\n route.contextKey\n );\n }\n const first = Array.isArray(defined) ? defined[0] : defined;\n if (first != null) {\n grouped.push(first);\n }\n }\n return grouped;\n });\n}\n\nasync function registerRouteTree(api: CreatePagesApi, route: RouteNode): Promise<void> {\n const layoutPath = getContextKey(route.contextKey).replace(/\\/index$/, '');\n const loaded = route.loadRoute();\n\n if (loaded.generateStaticParams) {\n throw new Error(\n 'generateStaticParams is not supported in _layout routes with React Server Components enabled yet.'\n );\n }\n\n const layoutSettings = readSettings(loaded);\n api.createLayout({\n component: loaded.default! as any,\n path: layoutPath,\n render: layoutSettings.render ?? 'static',\n });\n\n await Promise.all(\n route.children.sort(sortRoutes).map(async (child) => {\n if (child.type === 'layout') {\n await registerRouteTree(api, child);\n return;\n }\n const childPath = getContextKey(child.contextKey).replace(/\\/index$/, '');\n const childLoaded = child.loadRoute();\n const settings = readSettings(childLoaded);\n\n if (childLoaded.generateStaticParams) {\n api.createPage({\n component: childLoaded.default as any,\n path: childPath,\n render: 'static',\n staticPaths: (await loadStaticParamsForRoute(child)) as any,\n unstable_disableSSR: settings.unstable_disableSSR,\n });\n if (settings.render !== 'static') {\n api.createPage({\n component: childLoaded.default as any,\n path: childPath,\n render: 'dynamic',\n unstable_disableSSR: settings.unstable_disableSSR,\n });\n }\n return;\n }\n\n api.createPage({\n component: childLoaded.default as any,\n path: childPath,\n render: settings.render ?? 'dynamic',\n unstable_disableSSR: settings.unstable_disableSSR,\n });\n })\n );\n}\n\nexport default (getRouteOptions?: Parameters<typeof getRoutes>[1]): EntriesDev => ({\n default: createPages(async ({ createPage, createLayout, unstable_setBuildData }) => {\n const routes = getRoutes(ctx, {\n ...getRouteOptions,\n platform: process.env.EXPO_OS,\n skipGenerated: true,\n importMode: 'lazy',\n });\n if (!routes) return;\n await registerRouteTree({ createPage, createLayout, unstable_setBuildData }, routes);\n }),\n});\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EntriesDev } from '../server';
|
|
2
|
+
/** Shape of a router module loaded via Metro SSR (full or client-only). */
|
|
3
|
+
export type RouterModule = {
|
|
4
|
+
default: (getRouteOptions?: any) => EntriesDev;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the absolute file path of the router module to load. Two modes:
|
|
8
|
+
* full (Expo Router file tree walker) or client-only (no-op).
|
|
9
|
+
*
|
|
10
|
+
* The cli passes the returned path to Metro's SSR loader.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveRouterModule(clientOnly: boolean): string;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,KAAK,UAAU,CAAC;CAChD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAE/D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveRouterModule = resolveRouterModule;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the absolute file path of the router module to load. Two modes:
|
|
6
|
+
* full (Expo Router file tree walker) or client-only (no-op).
|
|
7
|
+
*
|
|
8
|
+
* The cli passes the returned path to Metro's SSR loader.
|
|
9
|
+
*/
|
|
10
|
+
function resolveRouterModule(clientOnly) {
|
|
11
|
+
return clientOnly ? require.resolve('./noopRouter') : require.resolve('./expo-definedRouter');
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rsc/router/index.ts"],"names":[],"mappings":";;AAaA,kDAEC;AARD;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,UAAmB;IACrD,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAChG,CAAC","sourcesContent":["import type { EntriesDev } from '../server';\n\n/** Shape of a router module loaded via Metro SSR (full or client-only). */\nexport type RouterModule = {\n default: (getRouteOptions?: any) => EntriesDev;\n};\n\n/**\n * Resolve the absolute file path of the router module to load. Two modes:\n * full (Expo Router file tree walker) or client-only (no-op).\n *\n * The cli passes the returned path to Metro's SSR loader.\n */\nexport function resolveRouterModule(clientOnly: boolean): string {\n return clientOnly ? require.resolve('./noopRouter') : require.resolve('./expo-definedRouter');\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import type { EntriesDev } from '../server';
|
|
2
|
+
declare const _default: (_getRouteOptions?: unknown) => EntriesDev;
|
|
2
3
|
export default _default;
|
|
3
4
|
//# sourceMappingURL=noopRouter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noopRouter.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/noopRouter.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"noopRouter.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/noopRouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;yBAI5B,mBAAmB,OAAO,KAAG,UAAU;AAAvD,wBAEG"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const createPages_1 = require("./createPages");
|
|
4
|
+
// Used in client-only mode to skip route loading in react-server bundles.
|
|
5
|
+
exports.default = (_getRouteOptions) => ({
|
|
6
|
+
default: (0, createPages_1.createPages)(async () => { }),
|
|
6
7
|
});
|
|
7
8
|
//# sourceMappingURL=noopRouter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noopRouter.js","sourceRoot":"","sources":["../../../src/rsc/router/noopRouter.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"noopRouter.js","sourceRoot":"","sources":["../../../src/rsc/router/noopRouter.ts"],"names":[],"mappings":";;AACA,+CAA4C;AAE5C,0EAA0E;AAC1E,kBAAe,CAAC,gBAA0B,EAAc,EAAE,CAAC,CAAC;IAC1D,OAAO,EAAE,IAAA,yBAAW,EAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;CACrC,CAAC,CAAC","sourcesContent":["import type { EntriesDev } from '../server';\nimport { createPages } from './createPages';\n\n// Used in client-only mode to skip route loading in react-server bundles.\nexport default (_getRouteOptions?: unknown): EntriesDev => ({\n default: createPages(async () => {}),\n});\n"]}
|
|
@@ -19,6 +19,8 @@ export type RenderRscArgs = {
|
|
|
19
19
|
input: string;
|
|
20
20
|
context: Record<string, unknown> | undefined;
|
|
21
21
|
body?: ReadableStream | undefined;
|
|
22
|
+
method?: 'GET' | 'POST';
|
|
23
|
+
headers?: Record<string, string>;
|
|
22
24
|
contentType?: string | undefined;
|
|
23
25
|
decodedBody?: unknown;
|
|
24
26
|
moduleIdCallback?: (module: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsc-renderer.d.ts","sourceRoot":"","sources":["../../src/rsc/rsc-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,iCAAiC,CAAC;AAOzC,OAAO,EAAsB,KAAK,UAAU,EAAmB,MAAM,UAAU,CAAC;AAOhF,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,KAAK,cAAc,GAAG,GAAG,CAAC;AAE1B,MAAM,MAAM,aAAa,GAAG;IAE1B,MAAM,EAAE,cAAc,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,IAAI,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,KAAK,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,kBAAkB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE5F,KAAK,aAAa,GAAG;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACpD,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"rsc-renderer.d.ts","sourceRoot":"","sources":["../../src/rsc/rsc-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,iCAAiC,CAAC;AAOzC,OAAO,EAAsB,KAAK,UAAU,EAAmB,MAAM,UAAU,CAAC;AAOhF,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,KAAK,cAAc,GAAG,GAAG,CAAC;AAE1B,MAAM,MAAM,aAAa,GAAG;IAE1B,MAAM,EAAE,cAAc,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,IAAI,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,KAAK,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,kBAAkB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE5F,KAAK,aAAa,GAAG;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACpD,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CA8LjG"}
|