expo-router 4.0.16 → 4.0.17

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,4 +1,9 @@
1
1
  import type { RouteNode } from './Route';
2
2
  export declare function loadStaticParamsAsync(route: RouteNode): Promise<RouteNode>;
3
+ export declare function evalStaticParamsAsync(route: RouteNode, props: {
4
+ parentParams: any;
5
+ }, generateStaticParams?: (props: {
6
+ params?: Record<string, string | string[]>;
7
+ }) => Record<string, string | string[]>[]): Promise<Record<string, string | string[]>[] | null>;
3
8
  export declare function assertStaticParams(route: Pick<RouteNode, 'contextKey' | 'dynamic'>, params: Record<string, string | string[]>): void;
4
9
  //# sourceMappingURL=loadStaticParamsAsync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadStaticParamsAsync.d.ts","sourceRoot":"","sources":["../src/loadStaticParamsAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAMhF;AAgID,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC,EAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,QA2D1C"}
1
+ {"version":3,"file":"loadStaticParamsAsync.d.ts","sourceRoot":"","sources":["../src/loadStaticParamsAsync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,SAAS,EAAE,MAAM,SAAS,CAAC;AAE5D,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAMhF;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE;IAAE,YAAY,EAAE,GAAG,CAAA;CAAE,EAC5B,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAmBrD;AAuHD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC,EAChD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,QA2D1C"}
@@ -1,26 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertStaticParams = exports.loadStaticParamsAsync = void 0;
3
+ exports.assertStaticParams = exports.evalStaticParamsAsync = exports.loadStaticParamsAsync = void 0;
4
4
  async function loadStaticParamsAsync(route) {
5
5
  const expandedChildren = await Promise.all(route.children.map((route) => loadStaticParamsRecursive(route, { parentParams: {} })));
6
6
  route.children = expandedChildren.flat();
7
7
  return route;
8
8
  }
9
9
  exports.loadStaticParamsAsync = loadStaticParamsAsync;
10
- async function loadStaticParamsRecursive(route, props) {
11
- if (!route?.dynamic && !route?.children?.length) {
12
- return [route];
10
+ async function evalStaticParamsAsync(route, props, generateStaticParams) {
11
+ if (!route.dynamic && generateStaticParams) {
12
+ throw new Error('Cannot use generateStaticParams in a route without dynamic segments: ' + route.contextKey);
13
13
  }
14
- const loaded = await route.loadRoute();
15
- let staticParams = [];
16
- if (loaded.generateStaticParams) {
17
- staticParams = await loaded.generateStaticParams({
14
+ if (generateStaticParams) {
15
+ const staticParams = await generateStaticParams({
18
16
  params: props.parentParams || {},
19
17
  });
20
18
  assertStaticParamsType(staticParams);
21
19
  // Assert that at least one param from each matches the dynamic route.
22
20
  staticParams.forEach((params) => assertStaticParams(route, params));
21
+ return staticParams;
22
+ }
23
+ return null;
24
+ }
25
+ exports.evalStaticParamsAsync = evalStaticParamsAsync;
26
+ async function loadStaticParamsRecursive(route, props) {
27
+ if (!route?.dynamic && !route?.children?.length) {
28
+ return [route];
23
29
  }
30
+ const loaded = await route.loadRoute();
31
+ const staticParams = (await evalStaticParamsAsync(route, props, loaded.generateStaticParams)) ?? [];
24
32
  const traverseForNode = async (nextParams) => {
25
33
  const nextChildren = [];
26
34
  for (const child of route.children) {
@@ -1 +1 @@
1
- {"version":3,"file":"loadStaticParamsAsync.js","sourceRoot":"","sources":["../src/loadStaticParamsAsync.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DynamicConvention, RouteNode } from './Route';\n\nexport async function loadStaticParamsAsync(route: RouteNode): Promise<RouteNode> {\n const expandedChildren = await Promise.all(\n route.children.map((route) => loadStaticParamsRecursive(route, { parentParams: {} }))\n );\n route.children = expandedChildren.flat();\n return route;\n}\n\nasync function loadStaticParamsRecursive(\n route: RouteNode,\n props: { parentParams: any }\n): Promise<RouteNode[]> {\n if (!route?.dynamic && !route?.children?.length) {\n return [route];\n }\n\n const loaded = await route.loadRoute();\n\n let staticParams: Record<string, string | string[]>[] = [];\n\n if (loaded.generateStaticParams) {\n staticParams = await loaded.generateStaticParams({\n params: props.parentParams || {},\n });\n\n assertStaticParamsType(staticParams);\n // Assert that at least one param from each matches the dynamic route.\n staticParams.forEach((params) => assertStaticParams(route, params));\n }\n\n const traverseForNode = async (nextParams: Record<string, string | string[]>) => {\n const nextChildren: RouteNode[] = [];\n for (const child of route.children) {\n const children = await loadStaticParamsRecursive(child, {\n ...props,\n parentParams: nextParams,\n });\n nextChildren.push(...children);\n }\n\n return uniqBy(nextChildren, (i) => i.route);\n };\n\n if (!staticParams.length) {\n const nextParams = {\n ...props.parentParams,\n };\n\n route.children = await traverseForNode(nextParams);\n\n return [route];\n }\n\n const createParsedRouteName = (input: string, params: any) => {\n let parsedRouteName = input;\n route.dynamic?.map((query) => {\n const param = params[query.name];\n const formattedParameter = Array.isArray(param) ? param.join('/') : param;\n if (query.deep) {\n parsedRouteName = parsedRouteName.replace(`[...${query.name}]`, formattedParameter);\n } else {\n parsedRouteName = parsedRouteName.replace(`[${query.name}]`, param);\n }\n });\n\n return parsedRouteName;\n };\n\n const generatedRoutes = await Promise.all(\n staticParams.map(async (params) => {\n const nextParams = {\n ...props.parentParams,\n ...params,\n };\n\n const dynamicChildren = await traverseForNode(nextParams);\n const parsedRoute = createParsedRouteName(route.route, params);\n const generatedContextKey = createParsedRouteName(route.contextKey, params);\n\n return {\n ...route,\n // TODO: Add a new field for this\n contextKey: generatedContextKey,\n // Convert the dynamic route to a static route.\n dynamic: null,\n route: parsedRoute,\n children: dynamicChildren,\n };\n })\n );\n\n return [route, ...generatedRoutes];\n}\n\n/** lodash.uniqBy */\nfunction uniqBy<T>(array: T[], key: (item: T) => string): T[] {\n const seen: Record<string, boolean> = {};\n return array.filter((item) => {\n const k = key(item);\n if (seen[k]) {\n return false;\n }\n seen[k] = true;\n return true;\n });\n}\n\nfunction assertStaticParamsType(params: any): asserts params is Record<string, string | string[]> {\n if (!Array.isArray(params)) {\n throw new Error(`generateStaticParams() must return an array of params, received ${params}`);\n }\n}\n\nfunction formatExpected(expected: string[], received: Record<string, any>): string {\n const total = {\n ...received,\n };\n for (const item of expected) {\n if (total[item] == null) {\n total[item] = String(total[item]);\n } else {\n total[item] = `\"${total[item]}\"`;\n }\n }\n\n return [\n '{',\n Object.entries(total)\n .map(([key, value]) => ` \"${key}\": ${value}`)\n .join(',\\n'),\n '}',\n ].join('\\n');\n}\n\nexport function assertStaticParams(\n route: Pick<RouteNode, 'contextKey' | 'dynamic'>,\n params: Record<string, string | string[]>\n) {\n // Type checking\n if (!route.dynamic) {\n throw new Error('assertStaticParams() must be called on a dynamic route.');\n }\n const matches = route.dynamic.every((dynamic) => {\n const value = params[dynamic.name];\n return value !== undefined && value !== null;\n });\n if (!matches) {\n const plural = route.dynamic.length > 1 ? 's' : '';\n const expected = route.dynamic.map((dynamic) => dynamic.name);\n throw new Error(\n `[${\n route.contextKey\n }]: generateStaticParams() must return an array of params that match the dynamic route${plural}. Expected non-nullish values for key${plural}: ${expected\n .map((v) => `\"${v}\"`)\n .join(', ')}.\\nReceived:\\n${formatExpected(expected, params)}`\n );\n }\n\n const validateSingleParam = (\n dynamic: DynamicConvention,\n value: any,\n allowMultipleSegments?: boolean\n ) => {\n if (typeof value !== 'string') {\n throw new Error(\n `generateStaticParams() for route \"${route.contextKey}\" expected param \"${\n dynamic.name\n }\" to be of type string, instead found \"${typeof value}\" while parsing \"${value}\".`\n );\n }\n const parts = value.split('/').filter(Boolean);\n if (parts.length > 1 && !allowMultipleSegments) {\n throw new Error(\n `generateStaticParams() for route \"${route.contextKey}\" expected param \"${dynamic.name}\" to not contain \"/\" (multiple segments) while parsing \"${value}\".`\n );\n }\n if (parts.length === 0) {\n throw new Error(\n `generateStaticParams() for route \"${route.contextKey}\" expected param \"${dynamic.name}\" not to be empty while parsing \"${value}\".`\n );\n }\n };\n\n // `[shape]/bar/[...colors]` -> `[shape]`, `[...colors]`\n for (const dynamic of route.dynamic) {\n let parameter = params[dynamic.name];\n if (dynamic.deep) {\n if (Array.isArray(parameter)) {\n parameter = parameter.filter(Boolean).join('/');\n }\n validateSingleParam(dynamic, parameter, true);\n } else {\n validateSingleParam(dynamic, parameter);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"loadStaticParamsAsync.js","sourceRoot":"","sources":["../src/loadStaticParamsAsync.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DynamicConvention, RouteNode } from './Route';\n\nexport async function loadStaticParamsAsync(route: RouteNode): Promise<RouteNode> {\n const expandedChildren = await Promise.all(\n route.children.map((route) => loadStaticParamsRecursive(route, { parentParams: {} }))\n );\n route.children = expandedChildren.flat();\n return route;\n}\n\nexport async function evalStaticParamsAsync(\n route: RouteNode,\n props: { parentParams: any },\n generateStaticParams?: (props: {\n params?: Record<string, string | string[]>;\n }) => Record<string, string | string[]>[]\n): Promise<Record<string, string | string[]>[] | null> {\n if (!route.dynamic && generateStaticParams) {\n throw new Error(\n 'Cannot use generateStaticParams in a route without dynamic segments: ' + route.contextKey\n );\n }\n\n if (generateStaticParams) {\n const staticParams = await generateStaticParams({\n params: props.parentParams || {},\n });\n\n assertStaticParamsType(staticParams);\n // Assert that at least one param from each matches the dynamic route.\n staticParams.forEach((params) => assertStaticParams(route, params));\n\n return staticParams;\n }\n return null;\n}\n\nasync function loadStaticParamsRecursive(\n route: RouteNode,\n props: { parentParams: any }\n): Promise<RouteNode[]> {\n if (!route?.dynamic && !route?.children?.length) {\n return [route];\n }\n\n const loaded = await route.loadRoute();\n\n const staticParams =\n (await evalStaticParamsAsync(route, props, loaded.generateStaticParams)) ?? [];\n\n const traverseForNode = async (nextParams: Record<string, string | string[]>) => {\n const nextChildren: RouteNode[] = [];\n for (const child of route.children) {\n const children = await loadStaticParamsRecursive(child, {\n ...props,\n parentParams: nextParams,\n });\n nextChildren.push(...children);\n }\n\n return uniqBy(nextChildren, (i) => i.route);\n };\n\n if (!staticParams.length) {\n const nextParams = {\n ...props.parentParams,\n };\n\n route.children = await traverseForNode(nextParams);\n\n return [route];\n }\n\n const createParsedRouteName = (input: string, params: any) => {\n let parsedRouteName = input;\n route.dynamic?.map((query) => {\n const param = params[query.name];\n const formattedParameter = Array.isArray(param) ? param.join('/') : param;\n if (query.deep) {\n parsedRouteName = parsedRouteName.replace(`[...${query.name}]`, formattedParameter);\n } else {\n parsedRouteName = parsedRouteName.replace(`[${query.name}]`, param);\n }\n });\n\n return parsedRouteName;\n };\n\n const generatedRoutes = await Promise.all(\n staticParams.map(async (params) => {\n const nextParams = {\n ...props.parentParams,\n ...params,\n };\n\n const dynamicChildren = await traverseForNode(nextParams);\n const parsedRoute = createParsedRouteName(route.route, params);\n const generatedContextKey = createParsedRouteName(route.contextKey, params);\n\n return {\n ...route,\n // TODO: Add a new field for this\n contextKey: generatedContextKey,\n // Convert the dynamic route to a static route.\n dynamic: null,\n route: parsedRoute,\n children: dynamicChildren,\n };\n })\n );\n\n return [route, ...generatedRoutes];\n}\n\n/** lodash.uniqBy */\nfunction uniqBy<T>(array: T[], key: (item: T) => string): T[] {\n const seen: Record<string, boolean> = {};\n return array.filter((item) => {\n const k = key(item);\n if (seen[k]) {\n return false;\n }\n seen[k] = true;\n return true;\n });\n}\n\nfunction assertStaticParamsType(params: any): asserts params is Record<string, string | string[]> {\n if (!Array.isArray(params)) {\n throw new Error(`generateStaticParams() must return an array of params, received ${params}`);\n }\n}\n\nfunction formatExpected(expected: string[], received: Record<string, any>): string {\n const total = {\n ...received,\n };\n for (const item of expected) {\n if (total[item] == null) {\n total[item] = String(total[item]);\n } else {\n total[item] = `\"${total[item]}\"`;\n }\n }\n\n return [\n '{',\n Object.entries(total)\n .map(([key, value]) => ` \"${key}\": ${value}`)\n .join(',\\n'),\n '}',\n ].join('\\n');\n}\n\nexport function assertStaticParams(\n route: Pick<RouteNode, 'contextKey' | 'dynamic'>,\n params: Record<string, string | string[]>\n) {\n // Type checking\n if (!route.dynamic) {\n throw new Error('assertStaticParams() must be called on a dynamic route.');\n }\n const matches = route.dynamic.every((dynamic) => {\n const value = params[dynamic.name];\n return value !== undefined && value !== null;\n });\n if (!matches) {\n const plural = route.dynamic.length > 1 ? 's' : '';\n const expected = route.dynamic.map((dynamic) => dynamic.name);\n throw new Error(\n `[${\n route.contextKey\n }]: generateStaticParams() must return an array of params that match the dynamic route${plural}. Expected non-nullish values for key${plural}: ${expected\n .map((v) => `\"${v}\"`)\n .join(', ')}.\\nReceived:\\n${formatExpected(expected, params)}`\n );\n }\n\n const validateSingleParam = (\n dynamic: DynamicConvention,\n value: any,\n allowMultipleSegments?: boolean\n ) => {\n if (typeof value !== 'string') {\n throw new Error(\n `generateStaticParams() for route \"${route.contextKey}\" expected param \"${\n dynamic.name\n }\" to be of type string, instead found \"${typeof value}\" while parsing \"${value}\".`\n );\n }\n const parts = value.split('/').filter(Boolean);\n if (parts.length > 1 && !allowMultipleSegments) {\n throw new Error(\n `generateStaticParams() for route \"${route.contextKey}\" expected param \"${dynamic.name}\" to not contain \"/\" (multiple segments) while parsing \"${value}\".`\n );\n }\n if (parts.length === 0) {\n throw new Error(\n `generateStaticParams() for route \"${route.contextKey}\" expected param \"${dynamic.name}\" not to be empty while parsing \"${value}\".`\n );\n }\n };\n\n // `[shape]/bar/[...colors]` -> `[shape]`, `[...colors]`\n for (const dynamic of route.dynamic) {\n let parameter = params[dynamic.name];\n if (dynamic.deep) {\n if (Array.isArray(parameter)) {\n parameter = parameter.filter(Boolean).join('/');\n }\n validateSingleParam(dynamic, parameter, true);\n } else {\n validateSingleParam(dynamic, parameter);\n }\n }\n}\n"]}
@@ -112,7 +112,7 @@ function createPages(fn) {
112
112
  wildcardPagePathMap.set(page.path, [pathSpec, page.component]);
113
113
  }
114
114
  else {
115
- throw new Error('Invalid page configuration');
115
+ throw new Error('Invalid page configuration: ' + page.path);
116
116
  }
117
117
  };
118
118
  const createLayout = (layout) => {
@@ -1 +1 @@
1
- {"version":3,"file":"create-pages.js","sourceRoot":"","sources":["../../../src/rsc/router/create-pages.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/**\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 *\n * https://github.com/dai-shi/waku/blob/3d1cc7d714b67b142c847e879c30f0724fc457a7/packages/waku/src/router/create-pages.ts#L1\n */\n\nimport { createElement } from 'react';\nimport type { FunctionComponent, ReactNode } from 'react';\n\nimport type { RouteProps } from './common.js';\nimport { unstable_defineRouter } from './defineRouter';\nimport { joinPath, parsePathWithSlug, getPathMapping, path2regexp } from '../path';\nimport type { PathSpec } from '../path';\nimport type { BuildConfig } from '../server.js';\n\nconst hasPathSpecPrefix = (prefix: PathSpec, path: PathSpec) => {\n for (let i = 0; i < prefix.length; i++) {\n if (\n i >= path.length ||\n prefix[i]!.type !== path[i]!.type ||\n prefix[i]!.name !== path[i]!.name\n ) {\n return false;\n }\n }\n return true;\n};\n\nconst sanitizeSlug = (slug: string) => slug.replace(/\\./g, '').replace(/ /g, '-');\n\n// createPages API (a wrapper around unstable_defineRouter)\n\n/**\n * Type version of `String.prototype.split()`. Splits the first string argument by the second string argument\n * @example\n * ```ts\n * // ['a', 'b', 'c']\n * type Case1 = Split<'abc', ''>\n * // ['a', 'b', 'c']\n * type Case2 = Split<'a,b,c', ','>\n * ```\n */\ntype Split<Str extends string, Del extends string | number> = string extends Str\n ? string[]\n : '' extends Str\n ? []\n : Str extends `${infer T}${Del}${infer U}`\n ? [T, ...Split<U, Del>]\n : [Str];\n\n/** Assumes that the path is a part of a slug path. */\ntype IsValidPathItem<T> = T extends `/${infer _}` ? false : T extends '[]' | '' ? false : true;\n/**\n * This is a helper type to check if a path is valid in a slug path.\n */\nexport type IsValidPathInSlugPath<T> = T extends `/${infer L}/${infer R}`\n ? IsValidPathItem<L> extends true\n ? IsValidPathInSlugPath<`/${R}`>\n : false\n : T extends `/${infer U}`\n ? IsValidPathItem<U>\n : false;\n/** Checks if a particular slug name exists in a path. */\nexport type HasSlugInPath<T, K extends string> = T extends `/[${K}]/${infer _}`\n ? true\n : T extends `/${infer _}/${infer U}`\n ? HasSlugInPath<`/${U}`, K>\n : T extends `/[${K}]`\n ? true\n : false;\n\nexport type HasWildcardInPath<T> = T extends `/[...${string}]/${string}`\n ? true\n : T extends `/${infer _}/${infer U}`\n ? HasWildcardInPath<`/${U}`>\n : T extends `/[...${string}]`\n ? true\n : false;\n\nexport type PathWithSlug<T, K extends string> =\n IsValidPathInSlugPath<T> extends true ? (HasSlugInPath<T, K> extends true ? T : never) : never;\n\ntype _GetSlugs<\n Route extends string,\n SplitRoute extends string[] = Split<Route, '/'>,\n Result extends string[] = [],\n> = SplitRoute extends []\n ? Result\n : SplitRoute extends [`${infer MaybeSlug}`, ...infer Rest]\n ? Rest extends string[]\n ? MaybeSlug extends `[${infer Slug}]`\n ? _GetSlugs<Route, Rest, [...Result, Slug]>\n : _GetSlugs<Route, Rest, Result>\n : never\n : Result;\n\nexport type GetSlugs<Route extends string> = _GetSlugs<Route>;\n\nexport type StaticSlugRoutePathsTuple<\n T extends string,\n Slugs extends unknown[] = GetSlugs<T>,\n Result extends string[] = [],\n> = Slugs extends []\n ? Result\n : Slugs extends [infer _, ...infer Rest]\n ? StaticSlugRoutePathsTuple<T, Rest, [...Result, string]>\n : never;\n\ntype StaticSlugRoutePaths<T extends string> =\n HasWildcardInPath<T> extends true\n ? string[] | string[][]\n : StaticSlugRoutePathsTuple<T> extends [string]\n ? string[]\n : StaticSlugRoutePathsTuple<T>[];\n\nexport type PathWithoutSlug<T> = T extends '/'\n ? T\n : IsValidPathInSlugPath<T> extends true\n ? HasSlugInPath<T, string> extends true\n ? never\n : T\n : never;\n\ntype PathWithStaticSlugs<T extends string> = T extends `/`\n ? T\n : IsValidPathInSlugPath<T> extends true\n ? T\n : never;\n\nexport type PathWithWildcard<\n Path,\n SlugKey extends string,\n WildSlugKey extends string,\n> = PathWithSlug<Path, SlugKey | `...${WildSlugKey}`>;\n\nexport type CreatePage = <Path extends string, SlugKey extends string, WildSlugKey extends string>(\n page: (\n | {\n render: 'static';\n path: PathWithoutSlug<Path>;\n component: FunctionComponent<RouteProps>;\n }\n | {\n render: 'static';\n path: PathWithStaticSlugs<Path>;\n staticPaths: StaticSlugRoutePaths<Path>;\n component: FunctionComponent<RouteProps & Record<SlugKey, string>>;\n }\n | {\n render: 'dynamic';\n path: PathWithoutSlug<Path>;\n component: FunctionComponent<RouteProps>;\n }\n | {\n render: 'dynamic';\n path: PathWithWildcard<Path, SlugKey, WildSlugKey>;\n component: FunctionComponent<\n RouteProps & Record<SlugKey, string> & Record<WildSlugKey, string[]>\n >;\n }\n ) & { unstable_disableSSR?: boolean }\n) => void;\n\nexport type CreateLayout = <T extends string>(layout: {\n render: 'static' | 'dynamic';\n path: PathWithoutSlug<T>;\n component: FunctionComponent<Omit<RouteProps, 'searchParams'> & { children: ReactNode }>;\n}) => void;\n\nexport function createPages(\n fn: (\n fns: {\n createPage: CreatePage;\n createLayout: CreateLayout;\n unstable_setBuildData: (path: string, data: unknown) => void;\n },\n opts: {\n unstable_buildConfig: BuildConfig | undefined;\n }\n ) => Promise<void>\n) {\n let configured = false;\n\n // TODO I think there's room for improvement to refactor these structures\n const staticPathSet = new Set<[string, PathSpec]>();\n const dynamicPagePathMap = new Map<string, [PathSpec, FunctionComponent<any>]>();\n const wildcardPagePathMap = new Map<string, [PathSpec, FunctionComponent<any>]>();\n const dynamicLayoutPathMap = new Map<string, [PathSpec, FunctionComponent<any>]>();\n const staticComponentMap = new Map<string, FunctionComponent<any>>();\n const noSsrSet = new WeakSet<PathSpec>();\n const buildDataMap = new Map<string, unknown>();\n\n const registerStaticComponent = (id: string, component: FunctionComponent<any>) => {\n if (staticComponentMap.has(id) && staticComponentMap.get(id) !== component) {\n throw new Error(`Duplicated component for: ${id}`);\n }\n staticComponentMap.set(id, component);\n };\n\n const createPage: CreatePage = (page) => {\n if (configured) {\n throw new Error('no longer available');\n }\n const pathSpec = parsePathWithSlug(page.path);\n if (page.unstable_disableSSR) {\n noSsrSet.add(pathSpec);\n }\n const { numSlugs, numWildcards } = (() => {\n let numSlugs = 0;\n let numWildcards = 0;\n for (const slug of pathSpec) {\n if (slug.type !== 'literal') {\n numSlugs++;\n }\n if (slug.type === 'wildcard') {\n numWildcards++;\n }\n }\n return { numSlugs, numWildcards };\n })();\n if (page.render === 'static' && numSlugs === 0) {\n staticPathSet.add([page.path, pathSpec]);\n const id = joinPath(page.path, 'page').replace(/^\\//, '');\n registerStaticComponent(id, page.component);\n } else if (page.render === 'static' && numSlugs > 0 && 'staticPaths' in page) {\n const staticPaths = page.staticPaths.map((item) =>\n (Array.isArray(item) ? item : [item]).map(sanitizeSlug)\n );\n for (const staticPath of staticPaths) {\n if (staticPath.length !== numSlugs && numWildcards === 0) {\n throw new Error('staticPaths does not match with slug pattern');\n }\n const mapping: Record<string, string | string[]> = {};\n let slugIndex = 0;\n const pathItems: string[] = [];\n pathSpec.forEach(({ type, name }) => {\n switch (type) {\n case 'literal':\n pathItems.push(name!);\n break;\n case 'wildcard':\n mapping[name!] = staticPath.slice(slugIndex);\n staticPath.slice(slugIndex++).forEach((slug) => {\n pathItems.push(slug);\n });\n break;\n case 'group':\n pathItems.push(staticPath[slugIndex++]!);\n mapping[name!] = pathItems[pathItems.length - 1]!;\n break;\n }\n });\n staticPathSet.add([page.path, pathItems.map((name) => ({ type: 'literal', name }))]);\n const id = joinPath(...pathItems, 'page');\n const WrappedComponent = (props: Record<string, unknown>) =>\n createElement(page.component as any, { ...props, ...mapping });\n registerStaticComponent(id, WrappedComponent);\n }\n } else if (page.render === 'dynamic' && numWildcards === 0) {\n if (dynamicPagePathMap.has(page.path)) {\n throw new Error(`Duplicated dynamic path: ${page.path}`);\n }\n dynamicPagePathMap.set(page.path, [pathSpec, page.component]);\n } else if (page.render === 'dynamic' && numWildcards === 1) {\n if (wildcardPagePathMap.has(page.path)) {\n throw new Error(`Duplicated dynamic path: ${page.path}`);\n }\n wildcardPagePathMap.set(page.path, [pathSpec, page.component]);\n } else {\n throw new Error('Invalid page configuration');\n }\n };\n\n const createLayout: CreateLayout = (layout) => {\n if (configured) {\n throw new Error('no longer available');\n }\n if (layout.render === 'static') {\n const id = joinPath(layout.path, 'layout').replace(/^\\//, '');\n registerStaticComponent(id, layout.component);\n } else if (layout.render === 'dynamic') {\n if (dynamicLayoutPathMap.has(layout.path)) {\n throw new Error(`Duplicated dynamic path: ${layout.path}`);\n }\n const pathSpec = parsePathWithSlug(layout.path);\n dynamicLayoutPathMap.set(layout.path, [pathSpec, layout.component]);\n } else {\n throw new Error('Invalid layout configuration');\n }\n };\n\n const unstable_setBuildData = (path: string, data: unknown) => {\n buildDataMap.set(path, data);\n };\n\n let ready: Promise<void> | undefined;\n const configure = async (buildConfig?: BuildConfig) => {\n if (!configured && !ready) {\n ready = fn(\n { createPage, createLayout, unstable_setBuildData },\n { unstable_buildConfig: buildConfig }\n );\n await ready;\n configured = true;\n }\n await ready;\n };\n\n return unstable_defineRouter(\n async () => {\n await configure();\n const paths: {\n pattern: string;\n path: PathSpec;\n isStatic: boolean;\n noSsr: boolean;\n data: unknown;\n }[] = [];\n for (const [path, pathSpec] of staticPathSet) {\n const noSsr = noSsrSet.has(pathSpec);\n const isStatic = (() => {\n for (const [_, [layoutPathSpec]] of dynamicLayoutPathMap) {\n if (hasPathSpecPrefix(layoutPathSpec, pathSpec)) {\n return false;\n }\n }\n return true;\n })();\n\n paths.push({\n pattern: path2regexp(parsePathWithSlug(path)),\n path: pathSpec,\n isStatic,\n noSsr,\n data: buildDataMap.get(path),\n });\n }\n for (const [path, [pathSpec]] of dynamicPagePathMap) {\n const noSsr = noSsrSet.has(pathSpec);\n paths.push({\n pattern: path2regexp(parsePathWithSlug(path)),\n path: pathSpec,\n isStatic: false,\n noSsr,\n data: buildDataMap.get(path),\n });\n }\n for (const [path, [pathSpec]] of wildcardPagePathMap) {\n const noSsr = noSsrSet.has(pathSpec);\n paths.push({\n pattern: path2regexp(parsePathWithSlug(path)),\n path: pathSpec,\n isStatic: false,\n noSsr,\n data: buildDataMap.get(path),\n });\n }\n return paths;\n },\n async (id, { unstable_setShouldSkip, unstable_buildConfig }) => {\n await configure(unstable_buildConfig);\n const staticComponent = staticComponentMap.get(id);\n if (staticComponent) {\n unstable_setShouldSkip([]);\n return staticComponent;\n }\n for (const [_, [pathSpec, Component]] of dynamicPagePathMap) {\n const mapping = getPathMapping([...pathSpec, { type: 'literal', name: 'page' }], id);\n if (mapping) {\n if (Object.keys(mapping).length === 0) {\n unstable_setShouldSkip();\n return Component;\n }\n const WrappedComponent = (props: Record<string, unknown>) =>\n createElement(Component, { ...props, ...mapping });\n unstable_setShouldSkip();\n return WrappedComponent;\n }\n }\n for (const [_, [pathSpec, Component]] of wildcardPagePathMap) {\n const mapping = getPathMapping([...pathSpec, { type: 'literal', name: 'page' }], id);\n if (mapping) {\n const WrappedComponent = (props: Record<string, unknown>) =>\n createElement(Component, { ...props, ...mapping });\n unstable_setShouldSkip();\n return WrappedComponent;\n }\n }\n for (const [_, [pathSpec, Component]] of dynamicLayoutPathMap) {\n const mapping = getPathMapping([...pathSpec, { type: 'literal', name: 'layout' }], id);\n if (mapping) {\n if (Object.keys(mapping).length) {\n throw new Error('[Bug] layout should not have slugs');\n }\n unstable_setShouldSkip();\n return Component;\n }\n }\n unstable_setShouldSkip([]); // negative cache\n return null; // not found\n }\n );\n}\n"]}
1
+ {"version":3,"file":"create-pages.js","sourceRoot":"","sources":["../../../src/rsc/router/create-pages.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/**\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 *\n * https://github.com/dai-shi/waku/blob/3d1cc7d714b67b142c847e879c30f0724fc457a7/packages/waku/src/router/create-pages.ts#L1\n */\n\nimport { createElement } from 'react';\nimport type { FunctionComponent, ReactNode } from 'react';\n\nimport type { RouteProps } from './common.js';\nimport { unstable_defineRouter } from './defineRouter';\nimport { joinPath, parsePathWithSlug, getPathMapping, path2regexp } from '../path';\nimport type { PathSpec } from '../path';\nimport type { BuildConfig } from '../server.js';\n\nconst hasPathSpecPrefix = (prefix: PathSpec, path: PathSpec) => {\n for (let i = 0; i < prefix.length; i++) {\n if (\n i >= path.length ||\n prefix[i]!.type !== path[i]!.type ||\n prefix[i]!.name !== path[i]!.name\n ) {\n return false;\n }\n }\n return true;\n};\n\nconst sanitizeSlug = (slug: string) => slug.replace(/\\./g, '').replace(/ /g, '-');\n\n// createPages API (a wrapper around unstable_defineRouter)\n\n/**\n * Type version of `String.prototype.split()`. Splits the first string argument by the second string argument\n * @example\n * ```ts\n * // ['a', 'b', 'c']\n * type Case1 = Split<'abc', ''>\n * // ['a', 'b', 'c']\n * type Case2 = Split<'a,b,c', ','>\n * ```\n */\ntype Split<Str extends string, Del extends string | number> = string extends Str\n ? string[]\n : '' extends Str\n ? []\n : Str extends `${infer T}${Del}${infer U}`\n ? [T, ...Split<U, Del>]\n : [Str];\n\n/** Assumes that the path is a part of a slug path. */\ntype IsValidPathItem<T> = T extends `/${infer _}` ? false : T extends '[]' | '' ? false : true;\n/**\n * This is a helper type to check if a path is valid in a slug path.\n */\nexport type IsValidPathInSlugPath<T> = T extends `/${infer L}/${infer R}`\n ? IsValidPathItem<L> extends true\n ? IsValidPathInSlugPath<`/${R}`>\n : false\n : T extends `/${infer U}`\n ? IsValidPathItem<U>\n : false;\n/** Checks if a particular slug name exists in a path. */\nexport type HasSlugInPath<T, K extends string> = T extends `/[${K}]/${infer _}`\n ? true\n : T extends `/${infer _}/${infer U}`\n ? HasSlugInPath<`/${U}`, K>\n : T extends `/[${K}]`\n ? true\n : false;\n\nexport type HasWildcardInPath<T> = T extends `/[...${string}]/${string}`\n ? true\n : T extends `/${infer _}/${infer U}`\n ? HasWildcardInPath<`/${U}`>\n : T extends `/[...${string}]`\n ? true\n : false;\n\nexport type PathWithSlug<T, K extends string> =\n IsValidPathInSlugPath<T> extends true ? (HasSlugInPath<T, K> extends true ? T : never) : never;\n\ntype _GetSlugs<\n Route extends string,\n SplitRoute extends string[] = Split<Route, '/'>,\n Result extends string[] = [],\n> = SplitRoute extends []\n ? Result\n : SplitRoute extends [`${infer MaybeSlug}`, ...infer Rest]\n ? Rest extends string[]\n ? MaybeSlug extends `[${infer Slug}]`\n ? _GetSlugs<Route, Rest, [...Result, Slug]>\n : _GetSlugs<Route, Rest, Result>\n : never\n : Result;\n\nexport type GetSlugs<Route extends string> = _GetSlugs<Route>;\n\nexport type StaticSlugRoutePathsTuple<\n T extends string,\n Slugs extends unknown[] = GetSlugs<T>,\n Result extends string[] = [],\n> = Slugs extends []\n ? Result\n : Slugs extends [infer _, ...infer Rest]\n ? StaticSlugRoutePathsTuple<T, Rest, [...Result, string]>\n : never;\n\ntype StaticSlugRoutePaths<T extends string> =\n HasWildcardInPath<T> extends true\n ? string[] | string[][]\n : StaticSlugRoutePathsTuple<T> extends [string]\n ? string[]\n : StaticSlugRoutePathsTuple<T>[];\n\nexport type PathWithoutSlug<T> = T extends '/'\n ? T\n : IsValidPathInSlugPath<T> extends true\n ? HasSlugInPath<T, string> extends true\n ? never\n : T\n : never;\n\ntype PathWithStaticSlugs<T extends string> = T extends `/`\n ? T\n : IsValidPathInSlugPath<T> extends true\n ? T\n : never;\n\nexport type PathWithWildcard<\n Path,\n SlugKey extends string,\n WildSlugKey extends string,\n> = PathWithSlug<Path, SlugKey | `...${WildSlugKey}`>;\n\nexport type CreatePage = <Path extends string, SlugKey extends string, WildSlugKey extends string>(\n page: (\n | {\n render: 'static';\n path: PathWithoutSlug<Path>;\n component: FunctionComponent<RouteProps>;\n }\n | {\n render: 'static';\n path: PathWithStaticSlugs<Path>;\n staticPaths: StaticSlugRoutePaths<Path>;\n component: FunctionComponent<RouteProps & Record<SlugKey, string>>;\n }\n | {\n render: 'dynamic';\n path: PathWithoutSlug<Path>;\n component: FunctionComponent<RouteProps>;\n }\n | {\n render: 'dynamic';\n path: PathWithWildcard<Path, SlugKey, WildSlugKey>;\n component: FunctionComponent<\n RouteProps & Record<SlugKey, string> & Record<WildSlugKey, string[]>\n >;\n }\n ) & { unstable_disableSSR?: boolean }\n) => void;\n\nexport type CreateLayout = <T extends string>(layout: {\n render: 'static' | 'dynamic';\n path: PathWithoutSlug<T>;\n component: FunctionComponent<Omit<RouteProps, 'searchParams'> & { children: ReactNode }>;\n}) => void;\n\nexport function createPages(\n fn: (\n fns: {\n createPage: CreatePage;\n createLayout: CreateLayout;\n unstable_setBuildData: (path: string, data: unknown) => void;\n },\n opts: {\n unstable_buildConfig: BuildConfig | undefined;\n }\n ) => Promise<void>\n) {\n let configured = false;\n\n // TODO I think there's room for improvement to refactor these structures\n const staticPathSet = new Set<[string, PathSpec]>();\n const dynamicPagePathMap = new Map<string, [PathSpec, FunctionComponent<any>]>();\n const wildcardPagePathMap = new Map<string, [PathSpec, FunctionComponent<any>]>();\n const dynamicLayoutPathMap = new Map<string, [PathSpec, FunctionComponent<any>]>();\n const staticComponentMap = new Map<string, FunctionComponent<any>>();\n const noSsrSet = new WeakSet<PathSpec>();\n const buildDataMap = new Map<string, unknown>();\n\n const registerStaticComponent = (id: string, component: FunctionComponent<any>) => {\n if (staticComponentMap.has(id) && staticComponentMap.get(id) !== component) {\n throw new Error(`Duplicated component for: ${id}`);\n }\n staticComponentMap.set(id, component);\n };\n\n const createPage: CreatePage = (page) => {\n if (configured) {\n throw new Error('no longer available');\n }\n const pathSpec = parsePathWithSlug(page.path);\n if (page.unstable_disableSSR) {\n noSsrSet.add(pathSpec);\n }\n const { numSlugs, numWildcards } = (() => {\n let numSlugs = 0;\n let numWildcards = 0;\n for (const slug of pathSpec) {\n if (slug.type !== 'literal') {\n numSlugs++;\n }\n if (slug.type === 'wildcard') {\n numWildcards++;\n }\n }\n return { numSlugs, numWildcards };\n })();\n if (page.render === 'static' && numSlugs === 0) {\n staticPathSet.add([page.path, pathSpec]);\n const id = joinPath(page.path, 'page').replace(/^\\//, '');\n registerStaticComponent(id, page.component);\n } else if (page.render === 'static' && numSlugs > 0 && 'staticPaths' in page) {\n const staticPaths = page.staticPaths.map((item) =>\n (Array.isArray(item) ? item : [item]).map(sanitizeSlug)\n );\n for (const staticPath of staticPaths) {\n if (staticPath.length !== numSlugs && numWildcards === 0) {\n throw new Error('staticPaths does not match with slug pattern');\n }\n const mapping: Record<string, string | string[]> = {};\n let slugIndex = 0;\n const pathItems: string[] = [];\n pathSpec.forEach(({ type, name }) => {\n switch (type) {\n case 'literal':\n pathItems.push(name!);\n break;\n case 'wildcard':\n mapping[name!] = staticPath.slice(slugIndex);\n staticPath.slice(slugIndex++).forEach((slug) => {\n pathItems.push(slug);\n });\n break;\n case 'group':\n pathItems.push(staticPath[slugIndex++]!);\n mapping[name!] = pathItems[pathItems.length - 1]!;\n break;\n }\n });\n staticPathSet.add([page.path, pathItems.map((name) => ({ type: 'literal', name }))]);\n const id = joinPath(...pathItems, 'page');\n const WrappedComponent = (props: Record<string, unknown>) =>\n createElement(page.component as any, { ...props, ...mapping });\n registerStaticComponent(id, WrappedComponent);\n }\n } else if (page.render === 'dynamic' && numWildcards === 0) {\n if (dynamicPagePathMap.has(page.path)) {\n throw new Error(`Duplicated dynamic path: ${page.path}`);\n }\n dynamicPagePathMap.set(page.path, [pathSpec, page.component]);\n } else if (page.render === 'dynamic' && numWildcards === 1) {\n if (wildcardPagePathMap.has(page.path)) {\n throw new Error(`Duplicated dynamic path: ${page.path}`);\n }\n wildcardPagePathMap.set(page.path, [pathSpec, page.component]);\n } else {\n throw new Error('Invalid page configuration: ' + page.path);\n }\n };\n\n const createLayout: CreateLayout = (layout) => {\n if (configured) {\n throw new Error('no longer available');\n }\n if (layout.render === 'static') {\n const id = joinPath(layout.path, 'layout').replace(/^\\//, '');\n registerStaticComponent(id, layout.component);\n } else if (layout.render === 'dynamic') {\n if (dynamicLayoutPathMap.has(layout.path)) {\n throw new Error(`Duplicated dynamic path: ${layout.path}`);\n }\n const pathSpec = parsePathWithSlug(layout.path);\n dynamicLayoutPathMap.set(layout.path, [pathSpec, layout.component]);\n } else {\n throw new Error('Invalid layout configuration');\n }\n };\n\n const unstable_setBuildData = (path: string, data: unknown) => {\n buildDataMap.set(path, data);\n };\n\n let ready: Promise<void> | undefined;\n const configure = async (buildConfig?: BuildConfig) => {\n if (!configured && !ready) {\n ready = fn(\n { createPage, createLayout, unstable_setBuildData },\n { unstable_buildConfig: buildConfig }\n );\n await ready;\n configured = true;\n }\n await ready;\n };\n\n return unstable_defineRouter(\n async () => {\n await configure();\n const paths: {\n pattern: string;\n path: PathSpec;\n isStatic: boolean;\n noSsr: boolean;\n data: unknown;\n }[] = [];\n for (const [path, pathSpec] of staticPathSet) {\n const noSsr = noSsrSet.has(pathSpec);\n const isStatic = (() => {\n for (const [_, [layoutPathSpec]] of dynamicLayoutPathMap) {\n if (hasPathSpecPrefix(layoutPathSpec, pathSpec)) {\n return false;\n }\n }\n return true;\n })();\n\n paths.push({\n pattern: path2regexp(parsePathWithSlug(path)),\n path: pathSpec,\n isStatic,\n noSsr,\n data: buildDataMap.get(path),\n });\n }\n for (const [path, [pathSpec]] of dynamicPagePathMap) {\n const noSsr = noSsrSet.has(pathSpec);\n paths.push({\n pattern: path2regexp(parsePathWithSlug(path)),\n path: pathSpec,\n isStatic: false,\n noSsr,\n data: buildDataMap.get(path),\n });\n }\n for (const [path, [pathSpec]] of wildcardPagePathMap) {\n const noSsr = noSsrSet.has(pathSpec);\n paths.push({\n pattern: path2regexp(parsePathWithSlug(path)),\n path: pathSpec,\n isStatic: false,\n noSsr,\n data: buildDataMap.get(path),\n });\n }\n return paths;\n },\n async (id, { unstable_setShouldSkip, unstable_buildConfig }) => {\n await configure(unstable_buildConfig);\n const staticComponent = staticComponentMap.get(id);\n if (staticComponent) {\n unstable_setShouldSkip([]);\n return staticComponent;\n }\n for (const [_, [pathSpec, Component]] of dynamicPagePathMap) {\n const mapping = getPathMapping([...pathSpec, { type: 'literal', name: 'page' }], id);\n if (mapping) {\n if (Object.keys(mapping).length === 0) {\n unstable_setShouldSkip();\n return Component;\n }\n const WrappedComponent = (props: Record<string, unknown>) =>\n createElement(Component, { ...props, ...mapping });\n unstable_setShouldSkip();\n return WrappedComponent;\n }\n }\n for (const [_, [pathSpec, Component]] of wildcardPagePathMap) {\n const mapping = getPathMapping([...pathSpec, { type: 'literal', name: 'page' }], id);\n if (mapping) {\n const WrappedComponent = (props: Record<string, unknown>) =>\n createElement(Component, { ...props, ...mapping });\n unstable_setShouldSkip();\n return WrappedComponent;\n }\n }\n for (const [_, [pathSpec, Component]] of dynamicLayoutPathMap) {\n const mapping = getPathMapping([...pathSpec, { type: 'literal', name: 'layout' }], id);\n if (mapping) {\n if (Object.keys(mapping).length) {\n throw new Error('[Bug] layout should not have slugs');\n }\n unstable_setShouldSkip();\n return Component;\n }\n }\n unstable_setShouldSkip([]); // negative cache\n return null; // not found\n }\n );\n}\n"]}
@@ -14,8 +14,12 @@ export declare class MetroServerError extends Error {
14
14
  export declare class ReactServerError extends Error {
15
15
  url: string;
16
16
  statusCode: number;
17
+ /** Response headers from the server. */
18
+ headers: Headers;
17
19
  code: string;
18
- constructor(message: string, url: string, statusCode: number);
20
+ constructor(message: string, url: string, statusCode: number,
21
+ /** Response headers from the server. */
22
+ headers: Headers);
19
23
  }
20
24
  export declare class NetworkError extends Error {
21
25
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IAKhC,GAAG,EAAE,MAAM;IAJpB,IAAI,SAAwB;gBAG1B,WAAW,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/C,GAAG,EAAE,MAAM;CASrB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAKhC,GAAG,EAAE,MAAM;IACX,UAAU,EAAE,MAAM;IAL3B,IAAI,SAAwB;gBAG1B,OAAO,EAAE,MAAM,EACR,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM;CAK5B;AAED,qBAAa,YAAa,SAAQ,KAAK;IAK5B,GAAG,EAAE,MAAM;IAJpB,IAAI,SAAmB;gBAGrB,OAAO,EAAE,MAAM,EACR,GAAG,EAAE,MAAM;CAKrB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,gBAAiB,SAAQ,KAAK;IAKhC,GAAG,EAAE,MAAM;IAJpB,IAAI,SAAwB;gBAG1B,WAAW,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/C,GAAG,EAAE,MAAM;CASrB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAKhC,GAAG,EAAE,MAAM;IACX,UAAU,EAAE,MAAM;IACzB,wCAAwC;IACjC,OAAO,EAAE,OAAO;IAPzB,IAAI,SAAwB;gBAG1B,OAAO,EAAE,MAAM,EACR,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM;IACzB,wCAAwC;IACjC,OAAO,EAAE,OAAO;CAK1B;AAED,qBAAa,YAAa,SAAQ,KAAK;IAK5B,GAAG,EAAE,MAAM;IAJpB,IAAI,SAAmB;gBAGrB,OAAO,EAAE,MAAM,EACR,GAAG,EAAE,MAAM;CAKrB"}
@@ -23,11 +23,15 @@ exports.MetroServerError = MetroServerError;
23
23
  class ReactServerError extends Error {
24
24
  url;
25
25
  statusCode;
26
+ headers;
26
27
  code = 'REACT_SERVER_ERROR';
27
- constructor(message, url, statusCode) {
28
+ constructor(message, url, statusCode,
29
+ /** Response headers from the server. */
30
+ headers) {
28
31
  super(message);
29
32
  this.url = url;
30
33
  this.statusCode = statusCode;
34
+ this.headers = headers;
31
35
  this.name = 'ReactServerError';
32
36
  }
33
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/rsc/router/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,MAAa,gBAAiB,SAAQ,KAAK;IAKhC;IAJT,IAAI,GAAG,oBAAoB,CAAC;IAE5B,YACE,WAAsD,EAC/C,GAAW;QAElB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAFpB,QAAG,GAAH,GAAG,CAAQ;QAGlB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;YAC5B,IAAY,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;SACvC;IACH,CAAC;CACF;AAdD,4CAcC;AAED,MAAa,gBAAiB,SAAQ,KAAK;IAKhC;IACA;IALT,IAAI,GAAG,oBAAoB,CAAC;IAE5B,YACE,OAAe,EACR,GAAW,EACX,UAAkB;QAEzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,QAAG,GAAH,GAAG,CAAQ;QACX,eAAU,GAAV,UAAU,CAAQ;QAGzB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAXD,4CAWC;AAED,MAAa,YAAa,SAAQ,KAAK;IAK5B;IAJT,IAAI,GAAG,eAAe,CAAC;IAEvB,YACE,OAAe,EACR,GAAW;QAElB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,QAAG,GAAH,GAAG,CAAQ;QAGlB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAVD,oCAUC","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\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 */\n\nexport class MetroServerError extends Error {\n code = 'METRO_SERVER_ERROR';\n\n constructor(\n errorObject: { message: string } & Record<string, any>,\n public url: string\n ) {\n super(errorObject.message);\n this.name = 'MetroServerError';\n\n for (const key in errorObject) {\n (this as any)[key] = errorObject[key];\n }\n }\n}\n\nexport class ReactServerError extends Error {\n code = 'REACT_SERVER_ERROR';\n\n constructor(\n message: string,\n public url: string,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ReactServerError';\n }\n}\n\nexport class NetworkError extends Error {\n code = 'NETWORK_ERROR';\n\n constructor(\n message: string,\n public url: string\n ) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/rsc/router/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,MAAa,gBAAiB,SAAQ,KAAK;IAKhC;IAJT,IAAI,GAAG,oBAAoB,CAAC;IAE5B,YACE,WAAsD,EAC/C,GAAW;QAElB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAFpB,QAAG,GAAH,GAAG,CAAQ;QAGlB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;YAC5B,IAAY,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;SACvC;IACH,CAAC;CACF;AAdD,4CAcC;AAED,MAAa,gBAAiB,SAAQ,KAAK;IAKhC;IACA;IAEA;IAPT,IAAI,GAAG,oBAAoB,CAAC;IAE5B,YACE,OAAe,EACR,GAAW,EACX,UAAkB;IACzB,wCAAwC;IACjC,OAAgB;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QALR,QAAG,GAAH,GAAG,CAAQ;QACX,eAAU,GAAV,UAAU,CAAQ;QAElB,YAAO,GAAP,OAAO,CAAS;QAGvB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAbD,4CAaC;AAED,MAAa,YAAa,SAAQ,KAAK;IAK5B;IAJT,IAAI,GAAG,eAAe,CAAC;IAEvB,YACE,OAAe,EACR,GAAW;QAElB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,QAAG,GAAH,GAAG,CAAQ;QAGlB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAVD,oCAUC","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\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 */\n\nexport class MetroServerError extends Error {\n code = 'METRO_SERVER_ERROR';\n\n constructor(\n errorObject: { message: string } & Record<string, any>,\n public url: string\n ) {\n super(errorObject.message);\n this.name = 'MetroServerError';\n\n for (const key in errorObject) {\n (this as any)[key] = errorObject[key];\n }\n }\n}\n\nexport class ReactServerError extends Error {\n code = 'REACT_SERVER_ERROR';\n\n constructor(\n message: string,\n public url: string,\n public statusCode: number,\n /** Response headers from the server. */\n public headers: Headers\n ) {\n super(message);\n this.name = 'ReactServerError';\n }\n}\n\nexport class NetworkError extends Error {\n code = 'NETWORK_ERROR';\n\n constructor(\n message: string,\n public url: string\n ) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"expo-definedRouter.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/expo-definedRouter.ts"],"names":[],"mappings":";;;;;AAQA,wBAqCG"}
1
+ {"version":3,"file":"expo-definedRouter.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/expo-definedRouter.ts"],"names":[],"mappings":";;;;;AAmBA,wBAwHG"}
@@ -3,8 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const _ctx_1 = require("expo-router/_ctx");
4
4
  const create_pages_1 = require("./create-pages");
5
5
  const getRoutesSSR_1 = require("../../getRoutesSSR");
6
+ const loadStaticParamsAsync_1 = require("../../loadStaticParamsAsync");
6
7
  const matchers_1 = require("../../matchers");
7
8
  const sortRoutes_1 = require("../../sortRoutes");
9
+ const UNIMPLEMENTED_PARAMS = new Proxy({}, {
10
+ // Assert that params is unimplemented when accessed.
11
+ get() {
12
+ throw new Error('generateStaticParams(): params is not implemented yet');
13
+ },
14
+ });
8
15
  exports.default = (0, create_pages_1.createPages)(async ({ createPage, createLayout, unstable_setBuildData }) => {
9
16
  const routes = (0, getRoutesSSR_1.getRoutes)(_ctx_1.ctx, {
10
17
  platform: process.env.EXPO_OS,
@@ -13,32 +20,92 @@ exports.default = (0, create_pages_1.createPages)(async ({ createPage, createLay
13
20
  });
14
21
  if (!routes)
15
22
  return;
16
- function addLayout(route) {
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
+ grouped.push(first);
47
+ }
48
+ return grouped;
49
+ });
50
+ }
51
+ else if (loaded.generateStaticParams) {
52
+ throw new Error('Cannot use generateStaticParams without a dynamic route: ' + route.contextKey);
53
+ }
54
+ return staticPaths;
55
+ }
56
+ async function addLayout(route) {
17
57
  const normal = (0, matchers_1.getContextKey)(route.contextKey).replace(/\/index$/, '');
58
+ const loaded = route.loadRoute();
59
+ if (loaded.generateStaticParams) {
60
+ throw new Error('generateStaticParams is not supported in _layout routes with React Server Components enabled yet.');
61
+ }
18
62
  createLayout({
19
63
  // NOTE(EvanBacon): Support routes with top-level "use client"
20
- component: route.loadRoute().default,
64
+ component: loaded.default,
21
65
  path: normal,
22
- // staticPaths
23
66
  render: 'static',
24
- ...route.loadRoute().unstable_settings,
67
+ ...loaded.unstable_settings,
25
68
  });
26
- route.children.sort(sortRoutes_1.sortRoutes).forEach((child) => {
69
+ await Promise.all(route.children.sort(sortRoutes_1.sortRoutes).map(async (child) => {
27
70
  if (child.type === 'layout') {
28
- addLayout(child);
71
+ await addLayout(child);
29
72
  }
30
73
  else {
31
74
  const normal = (0, matchers_1.getContextKey)(child.contextKey).replace(/\/index$/, '');
32
- createPage({
33
- // NOTE(EvanBacon): Support routes with top-level "use client"
34
- component: child.loadRoute().default,
35
- path: normal,
36
- render: 'dynamic',
37
- ...child.loadRoute().unstable_settings,
38
- });
75
+ const loaded = child.loadRoute();
76
+ const settings = loaded.unstable_settings;
77
+ // Support generateStaticParams for dynamic routes by defining the route twice.
78
+ if (loaded.generateStaticParams) {
79
+ createPage({
80
+ // NOTE(EvanBacon): Support routes with top-level "use client"
81
+ component: loaded.default,
82
+ path: normal,
83
+ render: 'static',
84
+ ...loaded.unstable_settings,
85
+ staticPaths: (await loadAndConvertStaticParamsAsync(child)),
86
+ });
87
+ if (settings?.render !== 'static') {
88
+ createPage({
89
+ // NOTE(EvanBacon): Support routes with top-level "use client"
90
+ component: loaded.default,
91
+ path: normal,
92
+ render: 'dynamic',
93
+ ...settings,
94
+ });
95
+ }
96
+ }
97
+ else {
98
+ createPage({
99
+ // NOTE(EvanBacon): Support routes with top-level "use client"
100
+ component: loaded.default,
101
+ path: normal,
102
+ render: 'dynamic',
103
+ ...settings,
104
+ });
105
+ }
39
106
  }
40
- });
107
+ }));
41
108
  }
42
- addLayout(routes);
109
+ await addLayout(routes);
43
110
  });
44
111
  //# 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;AAEvC,iDAA6C;AAE7C,qDAA+C;AAC/C,6CAA+C;AAC/C,iDAA8C;AAE9C,kBAAe,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,qBAAqB,EAAE,EAAE,EAAE;IACvF,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC,UAAG,EAAE;QAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QAC7B,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,MAAM;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,SAAS,SAAS,CAAC,KAAgB;QACjC,MAAM,MAAM,GAAG,IAAA,wBAAa,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACvE,YAAY,CAAC;YACX,8DAA8D;YAC9D,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,OAAe;YAC5C,IAAI,EAAE,MAAa;YACnB,cAAc;YACd,MAAM,EAAE,QAAQ;YAChB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB;SACvC,CAAC,CAAC;QAEH,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAU,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC3B,SAAS,CAAC,KAAK,CAAC,CAAC;aAClB;iBAAM;gBACL,MAAM,MAAM,GAAG,IAAA,wBAAa,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACvE,UAAU,CAAC;oBACT,8DAA8D;oBAC9D,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,OAAc;oBAC3C,IAAI,EAAE,MAAa;oBACnB,MAAM,EAAE,SAAS;oBACjB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB;iBACvC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC","sourcesContent":["import { ctx } from 'expo-router/_ctx';\n\nimport { createPages } from './create-pages';\nimport type { RouteNode } from '../../Route';\nimport { getRoutes } from '../../getRoutesSSR';\nimport { getContextKey } from '../../matchers';\nimport { sortRoutes } from '../../sortRoutes';\n\nexport default createPages(async ({ createPage, createLayout, unstable_setBuildData }) => {\n const routes = getRoutes(ctx, {\n platform: process.env.EXPO_OS,\n skipGenerated: true,\n importMode: 'lazy',\n });\n\n if (!routes) return;\n\n function addLayout(route: RouteNode) {\n const normal = getContextKey(route.contextKey).replace(/\\/index$/, '');\n createLayout({\n // NOTE(EvanBacon): Support routes with top-level \"use client\"\n component: route.loadRoute().default! as any,\n path: normal as any,\n // staticPaths\n render: 'static',\n ...route.loadRoute().unstable_settings,\n });\n\n route.children.sort(sortRoutes).forEach((child) => {\n if (child.type === 'layout') {\n addLayout(child);\n } else {\n const normal = getContextKey(child.contextKey).replace(/\\/index$/, '');\n createPage({\n // NOTE(EvanBacon): Support routes with top-level \"use client\"\n component: child.loadRoute().default as any,\n path: normal as any,\n render: 'dynamic',\n ...child.loadRoute().unstable_settings,\n });\n }\n });\n }\n\n addLayout(routes);\n});\n"]}
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';\n\nimport { createPages } from './create-pages';\nimport type { RouteNode } from '../../Route';\nimport { getRoutes } from '../../getRoutesSSR';\nimport { evalStaticParamsAsync } from '../../loadStaticParamsAsync';\nimport { getContextKey } from '../../matchers';\nimport { sortRoutes } from '../../sortRoutes';\n\nconst UNIMPLEMENTED_PARAMS = new Proxy(\n {},\n {\n // Assert that params is unimplemented when accessed.\n get() {\n throw new Error('generateStaticParams(): params is not implemented yet');\n },\n }\n);\n\nexport default createPages(async ({ createPage, createLayout, unstable_setBuildData }) => {\n const routes = getRoutes(ctx, {\n platform: process.env.EXPO_OS,\n skipGenerated: true,\n importMode: 'lazy',\n });\n\n if (!routes) return;\n\n async function loadAndConvertStaticParamsAsync(route: RouteNode) {\n const loaded = route.loadRoute();\n\n let staticPaths: string[][] | undefined = undefined;\n\n if (route.dynamic) {\n const params = await evalStaticParamsAsync(\n route,\n { parentParams: UNIMPLEMENTED_PARAMS },\n loaded.generateStaticParams\n );\n\n // 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]]`\n staticPaths = params?.map((p) => {\n const grouped: string[] = [];\n\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)) {\n if (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 }\n\n const first = Array.isArray(defined) ? defined[0] : defined;\n\n grouped.push(first);\n }\n return grouped;\n });\n } else if (loaded.generateStaticParams) {\n throw new Error(\n 'Cannot use generateStaticParams without a dynamic route: ' + route.contextKey\n );\n }\n return staticPaths;\n }\n async function addLayout(route: RouteNode) {\n const normal = getContextKey(route.contextKey).replace(/\\/index$/, '');\n\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 createLayout({\n // NOTE(EvanBacon): Support routes with top-level \"use client\"\n component: loaded.default! as any,\n path: normal as any,\n render: 'static',\n ...loaded.unstable_settings,\n });\n\n await Promise.all(\n route.children.sort(sortRoutes).map(async (child) => {\n if (child.type === 'layout') {\n await addLayout(child);\n } else {\n const normal = getContextKey(child.contextKey).replace(/\\/index$/, '');\n const loaded = child.loadRoute();\n const settings = loaded.unstable_settings;\n\n // Support generateStaticParams for dynamic routes by defining the route twice.\n if (loaded.generateStaticParams) {\n createPage({\n // NOTE(EvanBacon): Support routes with top-level \"use client\"\n component: loaded.default as any,\n path: normal as any,\n render: 'static',\n ...loaded.unstable_settings,\n staticPaths: (await loadAndConvertStaticParamsAsync(child)) as any,\n });\n\n if (settings?.render !== 'static') {\n createPage({\n // NOTE(EvanBacon): Support routes with top-level \"use client\"\n component: loaded.default as any,\n path: normal as any,\n render: 'dynamic',\n ...settings,\n });\n }\n } else {\n createPage({\n // NOTE(EvanBacon): Support routes with top-level \"use client\"\n component: loaded.default as any,\n path: normal as any,\n render: 'dynamic',\n ...settings,\n });\n }\n }\n })\n );\n }\n\n await addLayout(routes);\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/host.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAgDvC,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAC3C,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC;AAIhF,QAAA,MAAM,KAAK,MAAM,CAAC;AAClB,QAAA,MAAM,YAAY,MAAM,CAAC;AACzB,QAAA,MAAM,aAAa,MAAM,CAAC;AAE1B,KAAK,UAAU,GAAG;IAChB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC;IAC7B,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AAiDF,KAAK,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;CAC9C,CAAC;AAmCF;;;GAGG;AACH,eAAO,MAAM,aAAa,aACd,MAAM,SACT,OAAO,EAAE,gDAmBjB,CAAC;AAyBF,eAAO,MAAM,QAAQ,UACZ,MAAM,WACJ,OAAO,8BAEf,QA0CF,CAAC;AAqBF,eAAO,MAAM,WAAW,UAAW,MAAM,WAAW,OAAO,KAAG,IAQ7D,CAAC;AASF,eAAO,MAAM,IAAI;;oBASC,OAAO;;mCAEO,OAAO,KAAK,IAAI;cACpC,SAAS;qFAnBwB,MAAM,iBAAiB,eAAe,KAAK,IAAI,EA4C3F,CAAC;AAEF,eAAO,MAAM,UAAU,WAA4B,CAAC;AAKpD,eAAO,MAAM,IAAI;QAKX,MAAM;eACC,SAAS;eACT,SAAS;gOAcrB,CAAC;AAEF,eAAO,MAAM,QAAQ,WAA6B,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,UAAU;cAAwC,QAAQ;cAAY,SAAS;8FACpB,CAAC"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/host.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAgDvC,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAC3C,KAAK,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC;AAIhF,QAAA,MAAM,KAAK,MAAM,CAAC;AAClB,QAAA,MAAM,YAAY,MAAM,CAAC;AACzB,QAAA,MAAM,aAAa,MAAM,CAAC;AAE1B,KAAK,UAAU,GAAG;IAChB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC,YAAY,CAAC,CAAC,EAAE,WAAW,CAAC;IAC7B,CAAC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C,CAAC;AA4DF,KAAK,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC;CAC9C,CAAC;AAmCF;;;GAGG;AACH,eAAO,MAAM,aAAa,aACd,MAAM,SACT,OAAO,EAAE,gDAmBjB,CAAC;AAyBF,eAAO,MAAM,QAAQ,UACZ,MAAM,WACJ,OAAO,8BAEf,QA0CF,CAAC;AAqBF,eAAO,MAAM,WAAW,UAAW,MAAM,WAAW,OAAO,KAAG,IAQ7D,CAAC;AASF,eAAO,MAAM,IAAI;;oBASC,OAAO;;mCAEO,OAAO,KAAK,IAAI;cACpC,SAAS;qFAnBwB,MAAM,iBAAiB,eAAe,KAAK,IAAI,EA4C3F,CAAC;AAEF,eAAO,MAAM,UAAU,WAA4B,CAAC;AAKpD,eAAO,MAAM,IAAI;QAKX,MAAM;eACC,SAAS;eACT,SAAS;gOAcrB,CAAC;AAEF,eAAO,MAAM,QAAQ,WAA6B,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,UAAU;cAAwC,QAAQ;cAAY,SAAS;8FACpB,CAAC"}
@@ -70,16 +70,21 @@ const checkStatus = async (responsePromise) => {
70
70
  if (!response.ok) {
71
71
  // NOTE(EvanBacon): Transform the Metro development error into a JS error that can be used by LogBox.
72
72
  // This was tested against using a Class component in a server component.
73
- if (response.status === 500) {
73
+ if (__DEV__ && (response.status === 500 || response.status === 404)) {
74
74
  const errorText = await response.text();
75
75
  let errorJson;
76
76
  try {
77
77
  errorJson = JSON.parse(errorText);
78
78
  }
79
79
  catch {
80
- throw new errors_1.ReactServerError(errorText, response.url, response.status);
80
+ // `Unable to resolve module` error should respond as JSON from the dev server and sent to the master red box, this can get corrupt when it's returned as the formatted string.
81
+ if (errorText.startsWith('Unable to resolve module')) {
82
+ console.error('Unexpected Metro error format from dev server');
83
+ // This is an unexpected state that occurs when the dev server renderer does not throw Metro errors in the expected JSON format.
84
+ throw new Error(errorJson);
85
+ }
86
+ throw new errors_1.ReactServerError(errorText, response.url, response.status, response.headers);
81
87
  }
82
- // TODO: This should be a dev-only error. Add handling for production equivalent.
83
88
  throw new errors_1.MetroServerError(errorJson, response.url);
84
89
  }
85
90
  let responseText;
@@ -87,9 +92,9 @@ const checkStatus = async (responsePromise) => {
87
92
  responseText = await response.text();
88
93
  }
89
94
  catch {
90
- throw new errors_1.ReactServerError(response.statusText, response.url, response.status);
95
+ throw new errors_1.ReactServerError(response.statusText, response.url, response.status, response.headers);
91
96
  }
92
- throw new errors_1.ReactServerError(responseText, response.url, response.status);
97
+ throw new errors_1.ReactServerError(responseText, response.url, response.status, response.headers);
93
98
  }
94
99
  return response;
95
100
  };
@@ -1 +1 @@
1
- {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/rsc/router/host.tsx"],"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 *\n * https://github.com/dai-shi/waku/blob/32d52242c1450b5f5965860e671ff73c42da8bd0/packages/waku/src/client.ts#L1\n */\n\n//// <reference types=\"react/canary\" />\n'use client';\n\nimport {\n createContext,\n createElement,\n memo,\n useCallback,\n useState,\n startTransition,\n // @ts-expect-error\n use,\n useEffect,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport RSDWClient from 'react-server-dom-webpack/client';\n\nimport { MetroServerError, ReactServerError } from './errors';\nimport { fetch } from './fetch';\nimport { encodeInput, encodeActionId } from './utils';\nimport { getDevServer } from '../../getDevServer';\nimport { getOriginFromConstants } from '../../head/url';\n\nconst { createFromFetch, encodeReply } = RSDWClient;\n\n// TODO: Maybe this could be a bundler global instead.\nconst IS_DOM =\n // @ts-expect-error: Added via react-native-webview\n typeof ReactNativeWebView !== 'undefined';\n\n// NOTE: Ensured to start with `/`.\nconst RSC_PATH = '/_flight/' + process.env.EXPO_OS; // process.env.EXPO_RSC_PATH;\n\n// Using base URL for remote hosts isn't currently supported in DOM components as we use it for offline assets.\nconst BASE_URL = IS_DOM ? '' : process.env.EXPO_BASE_URL;\n\nlet BASE_PATH = `${BASE_URL}${RSC_PATH}`;\n\nif (!BASE_PATH.startsWith('/')) {\n BASE_PATH = '/' + BASE_PATH;\n}\n\nif (!BASE_PATH.endsWith('/')) {\n BASE_PATH += '/';\n}\n\nif (BASE_PATH === '/') {\n throw new Error(\n `Invalid React Flight path \"${BASE_PATH}\". The path should not live at the project root, e.g. /_flight/. Dev server URL: ${\n getDevServer().fullBundleUrl\n }`\n );\n}\n\nif (process.env.EXPO_OS !== 'web' && !window.location?.href) {\n // This can happen if the user attempts to use React Server Components without\n // enabling the flags in the app.json. This will set origin to false and prevent the expo/metro-runtime polyfill from running.\n throw new Error(\n 'window.location.href is not defined. This is required for React Server Components to work correctly. Ensure React Server Components is correctly enabled in your project and config.'\n );\n}\n\ntype OnFetchData = (data: unknown) => void;\ntype SetElements = (updater: Elements | ((prev: Elements) => Elements)) => void;\n\nconst RSC_CONTENT_TYPE = 'text/x-component';\n\nconst ENTRY = 'e';\nconst SET_ELEMENTS = 's';\nconst ON_FETCH_DATA = 'o';\n\ntype FetchCache = {\n [ENTRY]?: [input: string, params: unknown, elements: Elements];\n [SET_ELEMENTS]?: SetElements;\n [ON_FETCH_DATA]?: OnFetchData | undefined;\n};\n\nconst defaultFetchCache: FetchCache = {};\n\nconst NO_CACHE_HEADERS: Record<string, string> =\n process.env.EXPO_OS === 'web'\n ? {}\n : // These are needed for iOS + Prod to get updates after the first request.\n {\n 'Cache-Control': 'no-cache',\n Pragma: 'no-cache',\n Expires: '0',\n };\n\nconst ACTION_HEADERS = {\n ...NO_CACHE_HEADERS,\n accept: RSC_CONTENT_TYPE,\n 'expo-platform': process.env.EXPO_OS!,\n};\n\nconst checkStatus = async (responsePromise: Promise<Response>): Promise<Response> => {\n // TODO: Combine with metro async fetch logic.\n const response = await responsePromise;\n if (!response.ok) {\n // NOTE(EvanBacon): Transform the Metro development error into a JS error that can be used by LogBox.\n // This was tested against using a Class component in a server component.\n if (response.status === 500) {\n const errorText = await response.text();\n let errorJson;\n try {\n errorJson = JSON.parse(errorText);\n } catch {\n throw new ReactServerError(errorText, response.url, response.status);\n }\n // TODO: This should be a dev-only error. Add handling for production equivalent.\n throw new MetroServerError(errorJson, response.url);\n }\n\n let responseText;\n try {\n responseText = await response.text();\n } catch {\n throw new ReactServerError(response.statusText, response.url, response.status);\n }\n throw new ReactServerError(responseText, response.url, response.status);\n }\n return response;\n};\n\ntype Elements = Promise<Record<string, ReactNode>> & {\n prev?: Record<string, ReactNode> | undefined;\n};\nfunction getCached<T>(c: () => T, m: WeakMap<object, T>, k: object): T {\n return (m.has(k) ? m : m.set(k, c())).get(k) as T;\n}\n\nconst cache1 = new WeakMap();\nconst mergeElements = (a: Elements, b: Elements): Elements => {\n const getResult = () => {\n const promise: Elements = new Promise((resolve, reject) => {\n Promise.all([a, b])\n .then(([a, b]) => {\n const nextElements = { ...a, ...b };\n delete nextElements._value;\n promise.prev = a;\n resolve(nextElements);\n })\n .catch((e) => {\n a.then(\n (a) => {\n promise.prev = a;\n reject(e);\n },\n () => {\n promise.prev = a.prev;\n reject(e);\n }\n );\n });\n });\n return promise;\n };\n const cache2 = getCached(() => new WeakMap(), cache1, a);\n return getCached(getResult, cache2, b);\n};\n\n/**\n * callServer callback\n * This is not a public API.\n */\nexport const callServerRSC = async (\n actionId: string,\n args?: unknown[],\n fetchCache = defaultFetchCache\n) => {\n const url = getAdjustedRemoteFilePath(BASE_PATH + encodeInput(encodeActionId(actionId)));\n const response =\n args === undefined\n ? fetch(url, { headers: ACTION_HEADERS })\n : encodeReply(args).then((body) =>\n fetch(url, { method: 'POST', body, headers: ACTION_HEADERS })\n );\n const data = createFromFetch<Awaited<Elements>>(checkStatus(response), {\n callServer: (actionId: string, args: unknown[]) => callServerRSC(actionId, args, fetchCache),\n });\n fetchCache[ON_FETCH_DATA]?.(data);\n startTransition(() => {\n // FIXME this causes rerenders even if data is empty\n fetchCache[SET_ELEMENTS]?.((prev) => mergeElements(prev, data));\n });\n return (await data)._value;\n};\n\nconst prefetchedParams = new WeakMap<Promise<unknown>, unknown>();\n\nconst fetchRSCInternal = (url: string, params: unknown) =>\n params === undefined\n ? fetch(url, {\n // Disable caching\n headers: {\n ...NO_CACHE_HEADERS,\n 'expo-platform': process.env.EXPO_OS!,\n },\n })\n : typeof params === 'string'\n ? fetch(url, {\n headers: {\n ...NO_CACHE_HEADERS,\n 'expo-platform': process.env.EXPO_OS!,\n 'X-Expo-Params': params,\n },\n })\n : encodeReply(params).then((body) =>\n fetch(url, { method: 'POST', headers: ACTION_HEADERS, body })\n );\n\nexport const fetchRSC = (\n input: string,\n params?: unknown,\n fetchCache = defaultFetchCache\n): Elements => {\n // TODO: strip when \"is exporting\".\n if (process.env.NODE_ENV === 'development') {\n const refetchRsc = () => {\n delete fetchCache[ENTRY];\n const data = fetchRSC(input, params, fetchCache);\n fetchCache[SET_ELEMENTS]?.(() => data);\n };\n globalThis.__EXPO_RSC_RELOAD_LISTENERS__ ||= [];\n const index = globalThis.__EXPO_RSC_RELOAD_LISTENERS__.indexOf(globalThis.__EXPO_REFETCH_RSC__);\n if (index !== -1) {\n globalThis.__EXPO_RSC_RELOAD_LISTENERS__.splice(index, 1, refetchRsc);\n } else {\n globalThis.__EXPO_RSC_RELOAD_LISTENERS__.push(refetchRsc);\n }\n globalThis.__EXPO_REFETCH_RSC__ = refetchRsc;\n }\n\n const entry = fetchCache[ENTRY];\n if (entry && entry[0] === input && entry[1] === params) {\n return entry[2];\n }\n\n // eslint-disable-next-line no-multi-assign\n const prefetched = ((globalThis as any).__EXPO_PREFETCHED__ ||= {});\n // TODO: Load from on-disk on native when indicated.\n // const reqPath = fetchOptions?.remote ? getAdjustedRemoteFilePath(url) : getAdjustedRemoteFilePath(url);\n const url = getAdjustedRemoteFilePath(BASE_PATH + encodeInput(input));\n const hasValidPrefetchedResponse =\n !!prefetched[url] &&\n // HACK .has() is for the initial hydration\n // It's limited and may result in a wrong result. FIXME\n (!prefetchedParams.has(prefetched[url]) || prefetchedParams.get(prefetched[url]) === params);\n const response = hasValidPrefetchedResponse ? prefetched[url] : fetchRSCInternal(url, params);\n delete prefetched[url];\n const data = createFromFetch<Awaited<Elements>>(checkStatus(response), {\n callServer: (actionId: string, args: unknown[]) => callServerRSC(actionId, args, fetchCache),\n });\n fetchCache[ON_FETCH_DATA]?.(data);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n fetchCache[ENTRY] = [input, params, data];\n return data;\n};\n\nfunction getAdjustedRemoteFilePath(path: string): string {\n if (IS_DOM && process.env.NODE_ENV === 'production') {\n const origin = getOriginFromConstants();\n if (!origin) {\n throw new Error(\n 'Expo RSC: Origin not found in Constants. This is required for production DOM components using server actions.'\n );\n }\n // DOM components in production need to use the same origin logic as native.\n return new URL(path, origin).toString();\n }\n\n if (!IS_DOM && process.env.EXPO_OS === 'web') {\n return path;\n }\n\n return new URL(path, window.location.href).toString();\n}\n\nexport const prefetchRSC = (input: string, params?: unknown): void => {\n // eslint-disable-next-line no-multi-assign\n const prefetched = ((globalThis as any).__EXPO_PREFETCHED__ ||= {});\n const url = getAdjustedRemoteFilePath(BASE_PATH + encodeInput(input));\n if (!(url in prefetched)) {\n prefetched[url] = fetchRSCInternal(url, params);\n prefetchedParams.set(prefetched[url], params);\n }\n};\n\nconst RefetchContext = createContext<(input: string, searchParams?: URLSearchParams) => void>(\n () => {\n throw new Error('Missing Root component');\n }\n);\nconst ElementsContext = createContext<Elements | null>(null);\n\nexport const Root = ({\n initialInput,\n initialParams,\n fetchCache = defaultFetchCache,\n\n unstable_onFetchData,\n children,\n}: {\n initialInput?: string;\n initialParams?: unknown;\n fetchCache?: FetchCache;\n unstable_onFetchData?: (data: unknown) => void;\n children: ReactNode;\n}) => {\n fetchCache[ON_FETCH_DATA] = unstable_onFetchData;\n const [elements, setElements] = useState(() =>\n fetchRSC(initialInput || '', initialParams, fetchCache)\n );\n useEffect(() => {\n fetchCache[SET_ELEMENTS] = setElements;\n }, [fetchCache, setElements]);\n const refetch = useCallback(\n (input: string, params?: unknown) => {\n // clear cache entry before fetching\n delete fetchCache[ENTRY];\n const data = fetchRSC(input, params, fetchCache);\n startTransition(() => {\n setElements((prev) => mergeElements(prev, data));\n });\n },\n [fetchCache]\n );\n return createElement(\n RefetchContext.Provider,\n { value: refetch },\n createElement(ElementsContext.Provider, { value: elements }, children)\n );\n};\n\nexport const useRefetch = () => use(RefetchContext);\n\nconst ChildrenContext = createContext<ReactNode>(undefined);\nconst ChildrenContextProvider = memo(ChildrenContext.Provider);\n\nexport const Slot = ({\n id,\n children,\n fallback,\n}: {\n id: string;\n children?: ReactNode;\n fallback?: ReactNode;\n}) => {\n const elementsPromise = use(ElementsContext);\n if (!elementsPromise) {\n throw new Error('Missing Root component');\n }\n const elements = use(elementsPromise);\n if (!(id in elements)) {\n if (fallback) {\n return fallback;\n }\n throw new Error('Not found: ' + id + '. Expected: ' + Object.keys(elements).join(', '));\n }\n return createElement(ChildrenContextProvider, { value: children }, elements[id]);\n};\n\nexport const Children = () => use(ChildrenContext);\n\n/**\n * ServerRoot for SSR\n * This is not a public API.\n */\nexport const ServerRoot = ({ elements, children }: { elements: Elements; children: ReactNode }) =>\n createElement(ElementsContext.Provider, { value: elements }, children);\n"]}
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/rsc/router/host.tsx"],"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 *\n * https://github.com/dai-shi/waku/blob/32d52242c1450b5f5965860e671ff73c42da8bd0/packages/waku/src/client.ts#L1\n */\n\n//// <reference types=\"react/canary\" />\n'use client';\n\nimport {\n createContext,\n createElement,\n memo,\n useCallback,\n useState,\n startTransition,\n // @ts-expect-error\n use,\n useEffect,\n} from 'react';\nimport type { ReactNode } from 'react';\nimport RSDWClient from 'react-server-dom-webpack/client';\n\nimport { MetroServerError, ReactServerError } from './errors';\nimport { fetch } from './fetch';\nimport { encodeInput, encodeActionId } from './utils';\nimport { getDevServer } from '../../getDevServer';\nimport { getOriginFromConstants } from '../../head/url';\n\nconst { createFromFetch, encodeReply } = RSDWClient;\n\n// TODO: Maybe this could be a bundler global instead.\nconst IS_DOM =\n // @ts-expect-error: Added via react-native-webview\n typeof ReactNativeWebView !== 'undefined';\n\n// NOTE: Ensured to start with `/`.\nconst RSC_PATH = '/_flight/' + process.env.EXPO_OS; // process.env.EXPO_RSC_PATH;\n\n// Using base URL for remote hosts isn't currently supported in DOM components as we use it for offline assets.\nconst BASE_URL = IS_DOM ? '' : process.env.EXPO_BASE_URL;\n\nlet BASE_PATH = `${BASE_URL}${RSC_PATH}`;\n\nif (!BASE_PATH.startsWith('/')) {\n BASE_PATH = '/' + BASE_PATH;\n}\n\nif (!BASE_PATH.endsWith('/')) {\n BASE_PATH += '/';\n}\n\nif (BASE_PATH === '/') {\n throw new Error(\n `Invalid React Flight path \"${BASE_PATH}\". The path should not live at the project root, e.g. /_flight/. Dev server URL: ${\n getDevServer().fullBundleUrl\n }`\n );\n}\n\nif (process.env.EXPO_OS !== 'web' && !window.location?.href) {\n // This can happen if the user attempts to use React Server Components without\n // enabling the flags in the app.json. This will set origin to false and prevent the expo/metro-runtime polyfill from running.\n throw new Error(\n 'window.location.href is not defined. This is required for React Server Components to work correctly. Ensure React Server Components is correctly enabled in your project and config.'\n );\n}\n\ntype OnFetchData = (data: unknown) => void;\ntype SetElements = (updater: Elements | ((prev: Elements) => Elements)) => void;\n\nconst RSC_CONTENT_TYPE = 'text/x-component';\n\nconst ENTRY = 'e';\nconst SET_ELEMENTS = 's';\nconst ON_FETCH_DATA = 'o';\n\ntype FetchCache = {\n [ENTRY]?: [input: string, params: unknown, elements: Elements];\n [SET_ELEMENTS]?: SetElements;\n [ON_FETCH_DATA]?: OnFetchData | undefined;\n};\n\nconst defaultFetchCache: FetchCache = {};\n\nconst NO_CACHE_HEADERS: Record<string, string> =\n process.env.EXPO_OS === 'web'\n ? {}\n : // These are needed for iOS + Prod to get updates after the first request.\n {\n 'Cache-Control': 'no-cache',\n Pragma: 'no-cache',\n Expires: '0',\n };\n\nconst ACTION_HEADERS = {\n ...NO_CACHE_HEADERS,\n accept: RSC_CONTENT_TYPE,\n 'expo-platform': process.env.EXPO_OS!,\n};\n\nconst checkStatus = async (responsePromise: Promise<Response>): Promise<Response> => {\n // TODO: Combine with metro async fetch logic.\n const response = await responsePromise;\n if (!response.ok) {\n // NOTE(EvanBacon): Transform the Metro development error into a JS error that can be used by LogBox.\n // This was tested against using a Class component in a server component.\n if (__DEV__ && (response.status === 500 || response.status === 404)) {\n const errorText = await response.text();\n let errorJson;\n try {\n errorJson = JSON.parse(errorText);\n } catch {\n // `Unable to resolve module` error should respond as JSON from the dev server and sent to the master red box, this can get corrupt when it's returned as the formatted string.\n if (errorText.startsWith('Unable to resolve module')) {\n console.error('Unexpected Metro error format from dev server');\n // This is an unexpected state that occurs when the dev server renderer does not throw Metro errors in the expected JSON format.\n throw new Error(errorJson);\n }\n throw new ReactServerError(errorText, response.url, response.status, response.headers);\n }\n\n throw new MetroServerError(errorJson, response.url);\n }\n\n let responseText;\n try {\n responseText = await response.text();\n } catch {\n throw new ReactServerError(\n response.statusText,\n response.url,\n response.status,\n response.headers\n );\n }\n throw new ReactServerError(responseText, response.url, response.status, response.headers);\n }\n return response;\n};\n\ntype Elements = Promise<Record<string, ReactNode>> & {\n prev?: Record<string, ReactNode> | undefined;\n};\nfunction getCached<T>(c: () => T, m: WeakMap<object, T>, k: object): T {\n return (m.has(k) ? m : m.set(k, c())).get(k) as T;\n}\n\nconst cache1 = new WeakMap();\nconst mergeElements = (a: Elements, b: Elements): Elements => {\n const getResult = () => {\n const promise: Elements = new Promise((resolve, reject) => {\n Promise.all([a, b])\n .then(([a, b]) => {\n const nextElements = { ...a, ...b };\n delete nextElements._value;\n promise.prev = a;\n resolve(nextElements);\n })\n .catch((e) => {\n a.then(\n (a) => {\n promise.prev = a;\n reject(e);\n },\n () => {\n promise.prev = a.prev;\n reject(e);\n }\n );\n });\n });\n return promise;\n };\n const cache2 = getCached(() => new WeakMap(), cache1, a);\n return getCached(getResult, cache2, b);\n};\n\n/**\n * callServer callback\n * This is not a public API.\n */\nexport const callServerRSC = async (\n actionId: string,\n args?: unknown[],\n fetchCache = defaultFetchCache\n) => {\n const url = getAdjustedRemoteFilePath(BASE_PATH + encodeInput(encodeActionId(actionId)));\n const response =\n args === undefined\n ? fetch(url, { headers: ACTION_HEADERS })\n : encodeReply(args).then((body) =>\n fetch(url, { method: 'POST', body, headers: ACTION_HEADERS })\n );\n const data = createFromFetch<Awaited<Elements>>(checkStatus(response), {\n callServer: (actionId: string, args: unknown[]) => callServerRSC(actionId, args, fetchCache),\n });\n fetchCache[ON_FETCH_DATA]?.(data);\n startTransition(() => {\n // FIXME this causes rerenders even if data is empty\n fetchCache[SET_ELEMENTS]?.((prev) => mergeElements(prev, data));\n });\n return (await data)._value;\n};\n\nconst prefetchedParams = new WeakMap<Promise<unknown>, unknown>();\n\nconst fetchRSCInternal = (url: string, params: unknown) =>\n params === undefined\n ? fetch(url, {\n // Disable caching\n headers: {\n ...NO_CACHE_HEADERS,\n 'expo-platform': process.env.EXPO_OS!,\n },\n })\n : typeof params === 'string'\n ? fetch(url, {\n headers: {\n ...NO_CACHE_HEADERS,\n 'expo-platform': process.env.EXPO_OS!,\n 'X-Expo-Params': params,\n },\n })\n : encodeReply(params).then((body) =>\n fetch(url, { method: 'POST', headers: ACTION_HEADERS, body })\n );\n\nexport const fetchRSC = (\n input: string,\n params?: unknown,\n fetchCache = defaultFetchCache\n): Elements => {\n // TODO: strip when \"is exporting\".\n if (process.env.NODE_ENV === 'development') {\n const refetchRsc = () => {\n delete fetchCache[ENTRY];\n const data = fetchRSC(input, params, fetchCache);\n fetchCache[SET_ELEMENTS]?.(() => data);\n };\n globalThis.__EXPO_RSC_RELOAD_LISTENERS__ ||= [];\n const index = globalThis.__EXPO_RSC_RELOAD_LISTENERS__.indexOf(globalThis.__EXPO_REFETCH_RSC__);\n if (index !== -1) {\n globalThis.__EXPO_RSC_RELOAD_LISTENERS__.splice(index, 1, refetchRsc);\n } else {\n globalThis.__EXPO_RSC_RELOAD_LISTENERS__.push(refetchRsc);\n }\n globalThis.__EXPO_REFETCH_RSC__ = refetchRsc;\n }\n\n const entry = fetchCache[ENTRY];\n if (entry && entry[0] === input && entry[1] === params) {\n return entry[2];\n }\n\n // eslint-disable-next-line no-multi-assign\n const prefetched = ((globalThis as any).__EXPO_PREFETCHED__ ||= {});\n // TODO: Load from on-disk on native when indicated.\n // const reqPath = fetchOptions?.remote ? getAdjustedRemoteFilePath(url) : getAdjustedRemoteFilePath(url);\n const url = getAdjustedRemoteFilePath(BASE_PATH + encodeInput(input));\n const hasValidPrefetchedResponse =\n !!prefetched[url] &&\n // HACK .has() is for the initial hydration\n // It's limited and may result in a wrong result. FIXME\n (!prefetchedParams.has(prefetched[url]) || prefetchedParams.get(prefetched[url]) === params);\n const response = hasValidPrefetchedResponse ? prefetched[url] : fetchRSCInternal(url, params);\n delete prefetched[url];\n const data = createFromFetch<Awaited<Elements>>(checkStatus(response), {\n callServer: (actionId: string, args: unknown[]) => callServerRSC(actionId, args, fetchCache),\n });\n fetchCache[ON_FETCH_DATA]?.(data);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n fetchCache[ENTRY] = [input, params, data];\n return data;\n};\n\nfunction getAdjustedRemoteFilePath(path: string): string {\n if (IS_DOM && process.env.NODE_ENV === 'production') {\n const origin = getOriginFromConstants();\n if (!origin) {\n throw new Error(\n 'Expo RSC: Origin not found in Constants. This is required for production DOM components using server actions.'\n );\n }\n // DOM components in production need to use the same origin logic as native.\n return new URL(path, origin).toString();\n }\n\n if (!IS_DOM && process.env.EXPO_OS === 'web') {\n return path;\n }\n\n return new URL(path, window.location.href).toString();\n}\n\nexport const prefetchRSC = (input: string, params?: unknown): void => {\n // eslint-disable-next-line no-multi-assign\n const prefetched = ((globalThis as any).__EXPO_PREFETCHED__ ||= {});\n const url = getAdjustedRemoteFilePath(BASE_PATH + encodeInput(input));\n if (!(url in prefetched)) {\n prefetched[url] = fetchRSCInternal(url, params);\n prefetchedParams.set(prefetched[url], params);\n }\n};\n\nconst RefetchContext = createContext<(input: string, searchParams?: URLSearchParams) => void>(\n () => {\n throw new Error('Missing Root component');\n }\n);\nconst ElementsContext = createContext<Elements | null>(null);\n\nexport const Root = ({\n initialInput,\n initialParams,\n fetchCache = defaultFetchCache,\n\n unstable_onFetchData,\n children,\n}: {\n initialInput?: string;\n initialParams?: unknown;\n fetchCache?: FetchCache;\n unstable_onFetchData?: (data: unknown) => void;\n children: ReactNode;\n}) => {\n fetchCache[ON_FETCH_DATA] = unstable_onFetchData;\n const [elements, setElements] = useState(() =>\n fetchRSC(initialInput || '', initialParams, fetchCache)\n );\n useEffect(() => {\n fetchCache[SET_ELEMENTS] = setElements;\n }, [fetchCache, setElements]);\n const refetch = useCallback(\n (input: string, params?: unknown) => {\n // clear cache entry before fetching\n delete fetchCache[ENTRY];\n const data = fetchRSC(input, params, fetchCache);\n startTransition(() => {\n setElements((prev) => mergeElements(prev, data));\n });\n },\n [fetchCache]\n );\n return createElement(\n RefetchContext.Provider,\n { value: refetch },\n createElement(ElementsContext.Provider, { value: elements }, children)\n );\n};\n\nexport const useRefetch = () => use(RefetchContext);\n\nconst ChildrenContext = createContext<ReactNode>(undefined);\nconst ChildrenContextProvider = memo(ChildrenContext.Provider);\n\nexport const Slot = ({\n id,\n children,\n fallback,\n}: {\n id: string;\n children?: ReactNode;\n fallback?: ReactNode;\n}) => {\n const elementsPromise = use(ElementsContext);\n if (!elementsPromise) {\n throw new Error('Missing Root component');\n }\n const elements = use(elementsPromise);\n if (!(id in elements)) {\n if (fallback) {\n return fallback;\n }\n throw new Error('Not found: ' + id + '. Expected: ' + Object.keys(elements).join(', '));\n }\n return createElement(ChildrenContextProvider, { value: children }, elements[id]);\n};\n\nexport const Children = () => use(ChildrenContext);\n\n/**\n * ServerRoot for SSR\n * This is not a public API.\n */\nexport const ServerRoot = ({ elements, children }: { elements: Elements; children: ReactNode }) =>\n createElement(ElementsContext.Provider, { value: elements }, children);\n"]}
@@ -14,4 +14,9 @@ import { ExpoRouterServerManifestV1 } from '../getServerManifest';
14
14
  * This is used for the production manifest where we pre-render certain pages and should no longer treat them as dynamic.
15
15
  */
16
16
  export declare function getBuildTimeServerManifestAsync(options?: Options): Promise<ExpoRouterServerManifestV1>;
17
+ /** Get the linking manifest from a Node.js process. */
18
+ export declare function getManifest(options?: Options): Promise<{
19
+ initialRouteName: undefined;
20
+ screens: Record<string, import("../getReactNavigationConfig").Screen>;
21
+ }>;
17
22
  //# sourceMappingURL=getServerManifest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getServerManifest.d.ts","sourceRoot":"","sources":["../../src/static/getServerManifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAqB,MAAM,sBAAsB,CAAC;AAGrF;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,GAAE,OAAY,GACpB,OAAO,CAAC,0BAA0B,CAAC,CAcrC"}
1
+ {"version":3,"file":"getServerManifest.d.ts","sourceRoot":"","sources":["../../src/static/getServerManifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAqB,MAAM,sBAAsB,CAAC;AAGrF;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,GAAE,OAAY,GACpB,OAAO,CAAC,0BAA0B,CAAC,CAcrC;AAED,uDAAuD;AACvD,wBAAsB,WAAW,CAAC,OAAO,GAAE,OAAY;;;GAetD"}
@@ -6,8 +6,9 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.getBuildTimeServerManifestAsync = void 0;
9
+ exports.getManifest = exports.getBuildTimeServerManifestAsync = void 0;
10
10
  const _ctx_1 = require("../../_ctx");
11
+ const getReactNavigationConfig_1 = require("../getReactNavigationConfig");
11
12
  const getRoutes_1 = require("../getRoutes");
12
13
  const getServerManifest_1 = require("../getServerManifest");
13
14
  const loadStaticParamsAsync_1 = require("../loadStaticParamsAsync");
@@ -31,4 +32,19 @@ async function getBuildTimeServerManifestAsync(options = {}) {
31
32
  return (0, getServerManifest_1.getServerManifest)(routeTree);
32
33
  }
33
34
  exports.getBuildTimeServerManifestAsync = getBuildTimeServerManifestAsync;
35
+ /** Get the linking manifest from a Node.js process. */
36
+ async function getManifest(options = {}) {
37
+ const routeTree = (0, getRoutes_1.getRoutes)(_ctx_1.ctx, {
38
+ preserveApiRoutes: true,
39
+ platform: 'web',
40
+ ...options,
41
+ });
42
+ if (!routeTree) {
43
+ throw new Error('No routes found');
44
+ }
45
+ // Evaluate all static params
46
+ await (0, loadStaticParamsAsync_1.loadStaticParamsAsync)(routeTree);
47
+ return (0, getReactNavigationConfig_1.getReactNavigationConfig)(routeTree, false);
48
+ }
49
+ exports.getManifest = getManifest;
34
50
  //# sourceMappingURL=getServerManifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getServerManifest.js","sourceRoot":"","sources":["../../src/static/getServerManifest.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,qCAAiC;AACjC,4CAAkD;AAClD,4DAAqF;AACrF,oEAAiE;AAEjE;;;;;;GAMG;AACI,KAAK,UAAU,+BAA+B,CACnD,UAAmB,EAAE;IAErB,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,UAAG,EAAE;QAC/B,QAAQ,EAAE,KAAK;QACf,GAAG,OAAO;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;KACpC;IAED,6BAA6B;IAC7B,MAAM,IAAA,6CAAqB,EAAC,SAAS,CAAC,CAAC;IAEvC,OAAO,IAAA,qCAAiB,EAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAhBD,0EAgBC","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\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 */\n\nimport { ctx } from '../../_ctx';\nimport { getRoutes, Options } from '../getRoutes';\nimport { ExpoRouterServerManifestV1, getServerManifest } from '../getServerManifest';\nimport { loadStaticParamsAsync } from '../loadStaticParamsAsync';\n\n/**\n * Get the server manifest with all dynamic routes loaded with `generateStaticParams`.\n * Unlike the `expo-router/src/routes-manifest.ts` method, this requires loading the entire app in-memory, which\n * takes substantially longer and requires Metro bundling.\n *\n * This is used for the production manifest where we pre-render certain pages and should no longer treat them as dynamic.\n */\nexport async function getBuildTimeServerManifestAsync(\n options: Options = {}\n): Promise<ExpoRouterServerManifestV1> {\n const routeTree = getRoutes(ctx, {\n platform: 'web',\n ...options,\n });\n\n if (!routeTree) {\n throw new Error('No routes found');\n }\n\n // Evaluate all static params\n await loadStaticParamsAsync(routeTree);\n\n return getServerManifest(routeTree);\n}\n"]}
1
+ {"version":3,"file":"getServerManifest.js","sourceRoot":"","sources":["../../src/static/getServerManifest.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,qCAAiC;AACjC,0EAAuE;AACvE,4CAAkD;AAClD,4DAAqF;AACrF,oEAAiE;AAEjE;;;;;;GAMG;AACI,KAAK,UAAU,+BAA+B,CACnD,UAAmB,EAAE;IAErB,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,UAAG,EAAE;QAC/B,QAAQ,EAAE,KAAK;QACf,GAAG,OAAO;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;KACpC;IAED,6BAA6B;IAC7B,MAAM,IAAA,6CAAqB,EAAC,SAAS,CAAC,CAAC;IAEvC,OAAO,IAAA,qCAAiB,EAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAhBD,0EAgBC;AAED,uDAAuD;AAChD,KAAK,UAAU,WAAW,CAAC,UAAmB,EAAE;IACrD,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,UAAG,EAAE;QAC/B,iBAAiB,EAAE,IAAI;QACvB,QAAQ,EAAE,KAAK;QACf,GAAG,OAAO;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;KACpC;IAED,6BAA6B;IAC7B,MAAM,IAAA,6CAAqB,EAAC,SAAS,CAAC,CAAC;IAEvC,OAAO,IAAA,mDAAwB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACpD,CAAC;AAfD,kCAeC","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\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 */\n\nimport { ctx } from '../../_ctx';\nimport { getReactNavigationConfig } from '../getReactNavigationConfig';\nimport { getRoutes, Options } from '../getRoutes';\nimport { ExpoRouterServerManifestV1, getServerManifest } from '../getServerManifest';\nimport { loadStaticParamsAsync } from '../loadStaticParamsAsync';\n\n/**\n * Get the server manifest with all dynamic routes loaded with `generateStaticParams`.\n * Unlike the `expo-router/src/routes-manifest.ts` method, this requires loading the entire app in-memory, which\n * takes substantially longer and requires Metro bundling.\n *\n * This is used for the production manifest where we pre-render certain pages and should no longer treat them as dynamic.\n */\nexport async function getBuildTimeServerManifestAsync(\n options: Options = {}\n): Promise<ExpoRouterServerManifestV1> {\n const routeTree = getRoutes(ctx, {\n platform: 'web',\n ...options,\n });\n\n if (!routeTree) {\n throw new Error('No routes found');\n }\n\n // Evaluate all static params\n await loadStaticParamsAsync(routeTree);\n\n return getServerManifest(routeTree);\n}\n\n/** Get the linking manifest from a Node.js process. */\nexport async function getManifest(options: Options = {}) {\n const routeTree = getRoutes(ctx, {\n preserveApiRoutes: true,\n platform: 'web',\n ...options,\n });\n\n if (!routeTree) {\n throw new Error('No routes found');\n }\n\n // Evaluate all static params\n await loadStaticParamsAsync(routeTree);\n\n return getReactNavigationConfig(routeTree, false);\n}\n"]}
@@ -5,13 +5,6 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import '@expo/metro-runtime';
8
- import { Options } from '../getRoutes';
9
- /** Get the linking manifest from a Node.js process. */
10
- declare function getManifest(options?: Options): Promise<{
11
- initialRouteName: undefined;
12
- screens: Record<string, import("../getReactNavigationConfig").Screen>;
13
- }>;
14
8
  export declare function getStaticContent(location: URL): Promise<string>;
15
- export { getManifest };
16
- export { getBuildTimeServerManifestAsync } from './getServerManifest';
9
+ export { getBuildTimeServerManifestAsync, getManifest } from './getServerManifest';
17
10
  //# sourceMappingURL=renderStaticContent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderStaticContent.d.ts","sourceRoot":"","sources":["../../src/static/renderStaticContent.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,qBAAqB,CAAC;AAY7B,OAAO,EAAa,OAAO,EAAE,MAAM,cAAc,CAAC;AAQlD,uDAAuD;AACvD,iBAAe,WAAW,CAAC,OAAO,GAAE,OAAY;;;GAe/C;AAYD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDrE;AAmBD,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,OAAO,EAAE,+BAA+B,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"renderStaticContent.d.ts","sourceRoot":"","sources":["../../src/static/renderStaticContent.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,qBAAqB,CAAC;AA2B7B,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDrE;AAmBD,OAAO,EAAE,+BAA+B,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.getBuildTimeServerManifestAsync = exports.getManifest = exports.getStaticContent = void 0;
29
+ exports.getManifest = exports.getBuildTimeServerManifestAsync = exports.getStaticContent = void 0;
30
30
  /**
31
31
  * Copyright © 2023 650 Industries.
32
32
  *
@@ -42,27 +42,9 @@ const react_native_web_1 = require("react-native-web");
42
42
  const getRootComponent_1 = require("./getRootComponent");
43
43
  const _ctx_1 = require("../../_ctx");
44
44
  const ExpoRoot_1 = require("../ExpoRoot");
45
- const getReactNavigationConfig_1 = require("../getReactNavigationConfig");
46
- const getRoutes_1 = require("../getRoutes");
47
45
  const head_1 = require("../head");
48
- const loadStaticParamsAsync_1 = require("../loadStaticParamsAsync");
49
46
  const debug = require('debug')('expo:router:renderStaticContent');
50
47
  react_native_web_1.AppRegistry.registerComponent('App', () => ExpoRoot_1.ExpoRoot);
51
- /** Get the linking manifest from a Node.js process. */
52
- async function getManifest(options = {}) {
53
- const routeTree = (0, getRoutes_1.getRoutes)(_ctx_1.ctx, {
54
- preserveApiRoutes: true,
55
- platform: 'web',
56
- ...options,
57
- });
58
- if (!routeTree) {
59
- throw new Error('No routes found');
60
- }
61
- // Evaluate all static params
62
- await (0, loadStaticParamsAsync_1.loadStaticParamsAsync)(routeTree);
63
- return (0, getReactNavigationConfig_1.getReactNavigationConfig)(routeTree, false);
64
- }
65
- exports.getManifest = getManifest;
66
48
  function resetReactNavigationContexts() {
67
49
  // https://github.com/expo/router/discussions/588
68
50
  // https://github.com/react-navigation/react-navigation/blob/9fe34b445fcb86e5666f61e144007d7540f014fa/packages/elements/src/getNamedContext.tsx#LL3C1-L4C1
@@ -121,6 +103,8 @@ function mixHeadComponentsWithStaticResults(helmet, html) {
121
103
  html = html.replace('<body ', `<body ${helmet?.bodyAttributes.toString()} `);
122
104
  return html;
123
105
  }
106
+ // Re-export for use in server
124
107
  var getServerManifest_1 = require("./getServerManifest");
125
108
  Object.defineProperty(exports, "getBuildTimeServerManifestAsync", { enumerable: true, get: function () { return getServerManifest_1.getBuildTimeServerManifestAsync; } });
109
+ Object.defineProperty(exports, "getManifest", { enumerable: true, get: function () { return getServerManifest_1.getManifest; } });
126
110
  //# sourceMappingURL=renderStaticContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderStaticContent.js","sourceRoot":"","sources":["../../src/static/renderStaticContent.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright © 2023 650 Industries.\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 '@expo/metro-runtime';\n\nimport { ServerContainer, ServerContainerRef } from '@react-navigation/native';\nimport * as Font from 'expo-font/build/server';\nimport React from 'react';\nimport ReactDOMServer from 'react-dom/server.node';\nimport { AppRegistry } from 'react-native-web';\n\nimport { getRootComponent } from './getRootComponent';\nimport { ctx } from '../../_ctx';\nimport { ExpoRoot } from '../ExpoRoot';\nimport { getReactNavigationConfig } from '../getReactNavigationConfig';\nimport { getRoutes, Options } from '../getRoutes';\nimport { Head } from '../head';\nimport { loadStaticParamsAsync } from '../loadStaticParamsAsync';\n\nconst debug = require('debug')('expo:router:renderStaticContent');\n\nAppRegistry.registerComponent('App', () => ExpoRoot);\n\n/** Get the linking manifest from a Node.js process. */\nasync function getManifest(options: Options = {}) {\n const routeTree = getRoutes(ctx, {\n preserveApiRoutes: true,\n platform: 'web',\n ...options,\n });\n\n if (!routeTree) {\n throw new Error('No routes found');\n }\n\n // Evaluate all static params\n await loadStaticParamsAsync(routeTree);\n\n return getReactNavigationConfig(routeTree, false);\n}\n\nfunction resetReactNavigationContexts() {\n // https://github.com/expo/router/discussions/588\n // https://github.com/react-navigation/react-navigation/blob/9fe34b445fcb86e5666f61e144007d7540f014fa/packages/elements/src/getNamedContext.tsx#LL3C1-L4C1\n\n // React Navigation is storing providers in a global, this is fine for the first static render\n // but subsequent static renders of Stack or Tabs will cause React to throw a warning. To prevent this warning, we'll reset the globals before rendering.\n const contexts = '__react_navigation__elements_contexts';\n global[contexts] = new Map<string, React.Context<any>>();\n}\n\nexport async function getStaticContent(location: URL): Promise<string> {\n const headContext: { helmet?: any } = {};\n\n const ref = React.createRef<ServerContainerRef>();\n\n const {\n // NOTE: The `element` that's returned adds two extra Views and\n // the seemingly unused `RootTagContext.Provider`.\n element,\n getStyleElement,\n } = AppRegistry.getApplication('App', {\n initialProps: {\n location,\n context: ctx,\n wrapper: ({ children }) => (\n <Root>\n <div id=\"root\">{children}</div>\n </Root>\n ),\n },\n });\n\n const Root = getRootComponent();\n\n // Clear any existing static resources from the global scope to attempt to prevent leaking between pages.\n // This could break if pages are rendered in parallel or if fonts are loaded outside of the React tree\n Font.resetServerContext();\n\n // This MUST be run before `ReactDOMServer.renderToString` to prevent\n // \"Warning: Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported.\"\n resetReactNavigationContexts();\n\n const html = await ReactDOMServer.renderToString(\n <Head.Provider context={headContext}>\n <ServerContainer ref={ref}>{element}</ServerContainer>\n </Head.Provider>\n );\n\n // Eval the CSS after the HTML is rendered so that the CSS is in the same order\n const css = ReactDOMServer.renderToStaticMarkup(getStyleElement());\n\n let output = mixHeadComponentsWithStaticResults(headContext.helmet, html);\n\n output = output.replace('</head>', `${css}</head>`);\n\n const fonts = Font.getServerResources();\n debug(`Pushing static fonts: (count: ${fonts.length})`, fonts);\n // debug('Push static fonts:', fonts)\n // Inject static fonts loaded with expo-font\n output = output.replace('</head>', `${fonts.join('')}</head>`);\n\n return '<!DOCTYPE html>' + output;\n}\n\nfunction mixHeadComponentsWithStaticResults(helmet: any, html: string) {\n // Head components\n for (const key of ['title', 'priority', 'meta', 'link', 'script', 'style'].reverse()) {\n const result = helmet?.[key]?.toString();\n if (result) {\n html = html.replace('<head>', `<head>${result}`);\n }\n }\n\n // attributes\n html = html.replace('<html ', `<html ${helmet?.htmlAttributes.toString()} `);\n html = html.replace('<body ', `<body ${helmet?.bodyAttributes.toString()} `);\n\n return html;\n}\n\n// Re-export for use in server\nexport { getManifest };\nexport { getBuildTimeServerManifestAsync } from './getServerManifest';\n"]}
1
+ {"version":3,"file":"renderStaticContent.js","sourceRoot":"","sources":["../../src/static/renderStaticContent.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright © 2023 650 Industries.\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 '@expo/metro-runtime';\n\nimport { ServerContainer, ServerContainerRef } from '@react-navigation/native';\nimport * as Font from 'expo-font/build/server';\nimport React from 'react';\nimport ReactDOMServer from 'react-dom/server.node';\nimport { AppRegistry } from 'react-native-web';\n\nimport { getRootComponent } from './getRootComponent';\nimport { ctx } from '../../_ctx';\nimport { ExpoRoot } from '../ExpoRoot';\nimport { Head } from '../head';\n\nconst debug = require('debug')('expo:router:renderStaticContent');\n\nAppRegistry.registerComponent('App', () => ExpoRoot);\n\nfunction resetReactNavigationContexts() {\n // https://github.com/expo/router/discussions/588\n // https://github.com/react-navigation/react-navigation/blob/9fe34b445fcb86e5666f61e144007d7540f014fa/packages/elements/src/getNamedContext.tsx#LL3C1-L4C1\n\n // React Navigation is storing providers in a global, this is fine for the first static render\n // but subsequent static renders of Stack or Tabs will cause React to throw a warning. To prevent this warning, we'll reset the globals before rendering.\n const contexts = '__react_navigation__elements_contexts';\n global[contexts] = new Map<string, React.Context<any>>();\n}\n\nexport async function getStaticContent(location: URL): Promise<string> {\n const headContext: { helmet?: any } = {};\n\n const ref = React.createRef<ServerContainerRef>();\n\n const {\n // NOTE: The `element` that's returned adds two extra Views and\n // the seemingly unused `RootTagContext.Provider`.\n element,\n getStyleElement,\n } = AppRegistry.getApplication('App', {\n initialProps: {\n location,\n context: ctx,\n wrapper: ({ children }) => (\n <Root>\n <div id=\"root\">{children}</div>\n </Root>\n ),\n },\n });\n\n const Root = getRootComponent();\n\n // Clear any existing static resources from the global scope to attempt to prevent leaking between pages.\n // This could break if pages are rendered in parallel or if fonts are loaded outside of the React tree\n Font.resetServerContext();\n\n // This MUST be run before `ReactDOMServer.renderToString` to prevent\n // \"Warning: Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported.\"\n resetReactNavigationContexts();\n\n const html = await ReactDOMServer.renderToString(\n <Head.Provider context={headContext}>\n <ServerContainer ref={ref}>{element}</ServerContainer>\n </Head.Provider>\n );\n\n // Eval the CSS after the HTML is rendered so that the CSS is in the same order\n const css = ReactDOMServer.renderToStaticMarkup(getStyleElement());\n\n let output = mixHeadComponentsWithStaticResults(headContext.helmet, html);\n\n output = output.replace('</head>', `${css}</head>`);\n\n const fonts = Font.getServerResources();\n debug(`Pushing static fonts: (count: ${fonts.length})`, fonts);\n // debug('Push static fonts:', fonts)\n // Inject static fonts loaded with expo-font\n output = output.replace('</head>', `${fonts.join('')}</head>`);\n\n return '<!DOCTYPE html>' + output;\n}\n\nfunction mixHeadComponentsWithStaticResults(helmet: any, html: string) {\n // Head components\n for (const key of ['title', 'priority', 'meta', 'link', 'script', 'style'].reverse()) {\n const result = helmet?.[key]?.toString();\n if (result) {\n html = html.replace('<head>', `<head>${result}`);\n }\n }\n\n // attributes\n html = html.replace('<html ', `<html ${helmet?.htmlAttributes.toString()} `);\n html = html.replace('<body ', `<body ${helmet?.bodyAttributes.toString()} `);\n\n return html;\n}\n\n// Re-export for use in server\nexport { getBuildTimeServerManifestAsync, getManifest } from './getServerManifest';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/views/ErrorBoundary.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AA6E3C,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,+BA+CjE"}
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/views/ErrorBoundary.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAgG3C,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,+BA6CjE"}
@@ -8,6 +8,7 @@ const react_native_1 = require("react-native");
8
8
  const react_native_safe_area_context_1 = require("react-native-safe-area-context");
9
9
  const Pressable_1 = require("./Pressable");
10
10
  const Link_1 = require("../link/Link");
11
+ const errors_1 = require("../rsc/router/errors");
11
12
  let useMetroSymbolication;
12
13
  if (process.env.NODE_ENV === 'development') {
13
14
  const { LogBoxLog, parseErrorStack } = require('@expo/metro-runtime/symbolicate');
@@ -68,30 +69,39 @@ else {
68
69
  return <react_native_1.View style={{ flex: 1 }}/>;
69
70
  };
70
71
  }
72
+ function StandardErrorView({ error }) {
73
+ return (<react_native_1.View style={{
74
+ marginBottom: 12,
75
+ gap: 4,
76
+ flexWrap: process.env.EXPO_OS === 'web' ? 'wrap' : 'nowrap',
77
+ }}>
78
+ <react_native_1.Text role="heading" aria-level={1} style={styles.title}>
79
+ Something went wrong
80
+ </react_native_1.Text>
81
+ <react_native_1.Text testID="router_error_message" role="heading" aria-level={2} style={styles.errorMessage}>
82
+ Error: {error.message}
83
+ </react_native_1.Text>
84
+ </react_native_1.View>);
85
+ }
71
86
  function ErrorBoundary({ error, retry }) {
72
87
  const logBoxLog = useMetroSymbolication(error);
73
88
  const inTabBar = (0, react_1.useContext)(bottom_tabs_1.BottomTabBarHeightContext);
74
89
  const Wrapper = inTabBar ? react_native_1.View : react_native_safe_area_context_1.SafeAreaView;
90
+ const isServerError = error instanceof errors_1.ReactServerError;
75
91
  return (<react_native_1.View style={styles.container}>
76
92
  <Wrapper style={{ flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' }}>
77
- <react_native_1.View style={{
78
- marginBottom: 12,
79
- gap: 4,
80
- flexWrap: process.env.EXPO_OS === 'web' ? 'wrap' : 'nowrap',
81
- }}>
82
- <react_native_1.Text role="heading" aria-level={1} style={styles.title}>
83
- Something went wrong
84
- </react_native_1.Text>
85
- <react_native_1.Text role="heading" aria-level={2} style={styles.errorMessage}>
86
- Error: {error.message}
87
- </react_native_1.Text>
88
- </react_native_1.View>
93
+ {isServerError ? (<>
94
+ <ReactServerErrorView error={error}/>
95
+ <react_native_1.View style={{ flex: 1 }}/>
96
+ </>) : (<>
97
+ <StandardErrorView error={error}/>
98
+ <StackTrace logData={logBoxLog}/>
99
+ </>)}
89
100
 
90
- <StackTrace logData={logBoxLog}/>
91
- {process.env.NODE_ENV === 'development' && (<Link_1.Link href="/_sitemap" style={styles.link}>
101
+ {process.env.NODE_ENV === 'development' && (<Link_1.Link testID="router_error_sitemap" href="/_sitemap" style={styles.link}>
92
102
  Sitemap
93
103
  </Link_1.Link>)}
94
- <Pressable_1.Pressable onPress={retry}>
104
+ <Pressable_1.Pressable testID="router_error_retry" onPress={retry}>
95
105
  {({ hovered, pressed }) => (<react_native_1.View style={[styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }]}>
96
106
  <react_native_1.Text style={[
97
107
  styles.buttonText,
@@ -107,6 +117,74 @@ function ErrorBoundary({ error, retry }) {
107
117
  </react_native_1.View>);
108
118
  }
109
119
  exports.ErrorBoundary = ErrorBoundary;
120
+ const COMMON_ERROR_STATUS = {
121
+ 404: 'NOT_FOUND',
122
+ 500: 'INTERNAL_SERVER_ERROR',
123
+ 503: 'SERVICE_UNAVAILABLE',
124
+ 504: 'GATEWAY_TIMEOUT',
125
+ };
126
+ // TODO: This should probably be replaced by a DOM component that loads server errors in the future.
127
+ function ReactServerErrorView({ error }) {
128
+ let title = String(error.statusCode);
129
+ title += ': ' + (COMMON_ERROR_STATUS[error.statusCode] ?? 'Server Error');
130
+ const errorId = error.headers.get('cf-ray');
131
+ const date = error.headers.get('Date');
132
+ return (<react_native_1.View style={{
133
+ padding: 12,
134
+ gap: 8,
135
+ }}>
136
+ <react_native_1.Text selectable allowFontScaling style={{
137
+ fontSize: react_native_1.Platform.select({ web: 24, default: 16 }),
138
+ fontWeight: 'bold',
139
+ marginBottom: 4,
140
+ color: 'white',
141
+ }}>
142
+ {title}
143
+ </react_native_1.Text>
144
+
145
+ {process.env.EXPO_OS === 'web' ? (<react_native_1.ScrollView style={{
146
+ borderColor: 'rgba(255,255,255,0.5)',
147
+ borderTopWidth: react_native_1.StyleSheet.hairlineWidth,
148
+ borderBottomWidth: react_native_1.StyleSheet.hairlineWidth,
149
+ maxHeight: 150,
150
+ }} contentContainerStyle={{ paddingVertical: 4 }}>
151
+ <react_native_1.Text testID="router_error_message" selectable allowFontScaling style={{
152
+ color: 'white',
153
+ }}>
154
+ {error.message}
155
+ </react_native_1.Text>
156
+ </react_native_1.ScrollView>) : (<react_native_1.TextInput testID="router_error_message" scrollEnabled multiline editable={false} allowFontScaling value={error.message} style={{
157
+ borderColor: 'rgba(255,255,255,0.5)',
158
+ borderTopWidth: react_native_1.StyleSheet.hairlineWidth,
159
+ borderBottomWidth: react_native_1.StyleSheet.hairlineWidth,
160
+ paddingVertical: 4,
161
+ maxHeight: 150,
162
+ color: 'white',
163
+ }}/>)}
164
+
165
+ <InfoRow title="Code" right={error.statusCode}/>
166
+ {errorId && <InfoRow title="ID" right={errorId}/>}
167
+ {date && <InfoRow title="Date" right={date}/>}
168
+
169
+ {error.url && (<react_native_1.Text selectable allowFontScaling style={{ fontSize: 14, opacity: 0.5, color: 'white' }}>
170
+ {error.url}
171
+ </react_native_1.Text>)}
172
+ </react_native_1.View>);
173
+ }
174
+ function InfoRow({ title, right }) {
175
+ const style = {
176
+ fontSize: 16,
177
+ color: 'white',
178
+ };
179
+ return (<react_native_1.View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
180
+ <react_native_1.Text selectable allowFontScaling style={style}>
181
+ {title}
182
+ </react_native_1.Text>
183
+ {right && (<react_native_1.Text selectable allowFontScaling style={[style, styles.code]}>
184
+ {right}
185
+ </react_native_1.Text>)}
186
+ </react_native_1.View>);
187
+ }
110
188
  const styles = react_native_1.StyleSheet.create({
111
189
  container: {
112
190
  flex: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/views/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\nimport type { LogBoxLog } from '@expo/metro-runtime/symbolicate';\nimport { BottomTabBarHeightContext } from '@react-navigation/bottom-tabs';\nimport { ComponentType, useContext, useEffect, useState } from 'react';\nimport { StyleSheet, Text, View, Platform, ScrollView } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Pressable } from './Pressable';\nimport { ErrorBoundaryProps } from './Try';\nimport { Link } from '../link/Link';\n\nlet useMetroSymbolication: (error: Error) => LogBoxLog | null;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogBoxLog, parseErrorStack } =\n require('@expo/metro-runtime/symbolicate') as typeof import('@expo/metro-runtime/symbolicate');\n useMetroSymbolication = function (error: Error) {\n const [logBoxLog, setLogBoxLog] = useState<LogBoxLog | null>(null);\n\n useEffect(() => {\n let isMounted = true;\n const stack = parseErrorStack(error.stack);\n\n const log = new LogBoxLog({\n level: 'error',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: error.message,\n componentStack: [],\n });\n\n log.symbolicate('stack', () => {\n if (isMounted) {\n setLogBoxLog(log);\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [error]);\n\n return logBoxLog;\n };\n} else {\n useMetroSymbolication = function () {\n return null;\n };\n}\n\nlet StackTrace: ComponentType<{ logData: LogBoxLog | null }>;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogContext } = require('@expo/metro-runtime/src/error-overlay/Data/LogContext');\n const {\n LogBoxInspectorStackFrames,\n } = require('@expo/metro-runtime/src/error-overlay/overlay/LogBoxInspectorStackFrames');\n\n StackTrace = function ({ logData }: { logData: LogBoxLog | null }) {\n if (!logData?.symbolicated?.stack?.stack) {\n return null;\n }\n return (\n <ScrollView style={{ flex: 1 }}>\n <LogContext.Provider\n value={{\n isDisabled: false,\n logs: [logData],\n selectedLogIndex: 0,\n }}>\n <LogBoxInspectorStackFrames onRetry={function () {}} type=\"stack\" />\n </LogContext.Provider>\n </ScrollView>\n );\n };\n} else {\n StackTrace = function () {\n return <View style={{ flex: 1 }} />;\n };\n}\n\nexport function ErrorBoundary({ error, retry }: ErrorBoundaryProps) {\n const logBoxLog = useMetroSymbolication(error);\n const inTabBar = useContext(BottomTabBarHeightContext);\n const Wrapper = inTabBar ? View : SafeAreaView;\n\n return (\n <View style={styles.container}>\n <Wrapper style={{ flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' }}>\n <View\n style={{\n marginBottom: 12,\n gap: 4,\n flexWrap: process.env.EXPO_OS === 'web' ? 'wrap' : 'nowrap',\n }}>\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Something went wrong\n </Text>\n <Text role=\"heading\" aria-level={2} style={styles.errorMessage}>\n Error: {error.message}\n </Text>\n </View>\n\n <StackTrace logData={logBoxLog} />\n {process.env.NODE_ENV === 'development' && (\n <Link href=\"/_sitemap\" style={styles.link}>\n Sitemap\n </Link>\n )}\n <Pressable onPress={retry}>\n {({ hovered, pressed }) => (\n <View\n style={[styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }]}>\n <Text\n style={[\n styles.buttonText,\n {\n color: hovered || pressed ? 'black' : 'white',\n },\n ]}>\n Retry\n </Text>\n </View>\n )}\n </Pressable>\n </Wrapper>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n alignItems: 'stretch',\n justifyContent: 'center',\n },\n title: {\n color: 'white',\n fontSize: Platform.select({ web: 32, default: 24 }),\n fontWeight: 'bold',\n },\n buttonText: {\n fontSize: 18,\n fontWeight: 'bold',\n color: 'black',\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n },\n buttonInner: {\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n paddingVertical: 12,\n paddingHorizontal: 24,\n borderColor: 'white',\n borderWidth: 2,\n marginLeft: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n code: {\n fontFamily: Platform.select({\n default: 'Courier',\n ios: 'Courier New',\n android: 'monospace',\n }),\n fontWeight: '500',\n },\n errorMessage: {\n color: 'white',\n fontSize: 16,\n },\n subtitle: {\n color: 'white',\n fontSize: 14,\n marginBottom: 12,\n },\n link: {\n color: 'rgba(255,255,255,0.4)',\n textDecorationStyle: 'solid',\n textDecorationLine: 'underline',\n fontSize: 14,\n textAlign: 'center',\n },\n});\n"]}
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/views/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\nimport type { LogBoxLog } from '@expo/metro-runtime/symbolicate';\nimport { BottomTabBarHeightContext } from '@react-navigation/bottom-tabs';\nimport { ComponentType, useContext, useEffect, useState } from 'react';\nimport { StyleSheet, Text, View, Platform, ScrollView, TextInput } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Pressable } from './Pressable';\nimport { ErrorBoundaryProps } from './Try';\nimport { Link } from '../link/Link';\nimport { ReactServerError } from '../rsc/router/errors';\n\nlet useMetroSymbolication: (error: Error) => LogBoxLog | null;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogBoxLog, parseErrorStack } =\n require('@expo/metro-runtime/symbolicate') as typeof import('@expo/metro-runtime/symbolicate');\n useMetroSymbolication = function (error: Error) {\n const [logBoxLog, setLogBoxLog] = useState<LogBoxLog | null>(null);\n\n useEffect(() => {\n let isMounted = true;\n const stack = parseErrorStack(error.stack);\n\n const log = new LogBoxLog({\n level: 'error',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: error.message,\n componentStack: [],\n });\n\n log.symbolicate('stack', () => {\n if (isMounted) {\n setLogBoxLog(log);\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [error]);\n\n return logBoxLog;\n };\n} else {\n useMetroSymbolication = function () {\n return null;\n };\n}\n\nlet StackTrace: ComponentType<{ logData: LogBoxLog | null }>;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogContext } = require('@expo/metro-runtime/src/error-overlay/Data/LogContext');\n const {\n LogBoxInspectorStackFrames,\n } = require('@expo/metro-runtime/src/error-overlay/overlay/LogBoxInspectorStackFrames');\n\n StackTrace = function ({ logData }: { logData: LogBoxLog | null }) {\n if (!logData?.symbolicated?.stack?.stack) {\n return null;\n }\n return (\n <ScrollView style={{ flex: 1 }}>\n <LogContext.Provider\n value={{\n isDisabled: false,\n logs: [logData],\n selectedLogIndex: 0,\n }}>\n <LogBoxInspectorStackFrames onRetry={function () {}} type=\"stack\" />\n </LogContext.Provider>\n </ScrollView>\n );\n };\n} else {\n StackTrace = function () {\n return <View style={{ flex: 1 }} />;\n };\n}\n\nfunction StandardErrorView({ error }: { error: Error }) {\n return (\n <View\n style={{\n marginBottom: 12,\n gap: 4,\n flexWrap: process.env.EXPO_OS === 'web' ? 'wrap' : 'nowrap',\n }}>\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Something went wrong\n </Text>\n <Text testID=\"router_error_message\" role=\"heading\" aria-level={2} style={styles.errorMessage}>\n Error: {error.message}\n </Text>\n </View>\n );\n}\n\nexport function ErrorBoundary({ error, retry }: ErrorBoundaryProps) {\n const logBoxLog = useMetroSymbolication(error);\n const inTabBar = useContext(BottomTabBarHeightContext);\n const Wrapper = inTabBar ? View : SafeAreaView;\n\n const isServerError = error instanceof ReactServerError;\n return (\n <View style={styles.container}>\n <Wrapper style={{ flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' }}>\n {isServerError ? (\n <>\n <ReactServerErrorView error={error} />\n <View style={{ flex: 1 }} />\n </>\n ) : (\n <>\n <StandardErrorView error={error} />\n <StackTrace logData={logBoxLog} />\n </>\n )}\n\n {process.env.NODE_ENV === 'development' && (\n <Link testID=\"router_error_sitemap\" href=\"/_sitemap\" style={styles.link}>\n Sitemap\n </Link>\n )}\n <Pressable testID=\"router_error_retry\" onPress={retry}>\n {({ hovered, pressed }) => (\n <View\n style={[styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }]}>\n <Text\n style={[\n styles.buttonText,\n {\n color: hovered || pressed ? 'black' : 'white',\n },\n ]}>\n Retry\n </Text>\n </View>\n )}\n </Pressable>\n </Wrapper>\n </View>\n );\n}\n\nconst COMMON_ERROR_STATUS = {\n 404: 'NOT_FOUND',\n 500: 'INTERNAL_SERVER_ERROR',\n 503: 'SERVICE_UNAVAILABLE',\n 504: 'GATEWAY_TIMEOUT',\n};\n\n// TODO: This should probably be replaced by a DOM component that loads server errors in the future.\nfunction ReactServerErrorView({ error }: { error: ReactServerError }) {\n let title = String(error.statusCode);\n title += ': ' + (COMMON_ERROR_STATUS[error.statusCode] ?? 'Server Error');\n\n const errorId = error.headers.get('cf-ray');\n\n const date = error.headers.get('Date');\n\n return (\n <View\n style={{\n padding: 12,\n gap: 8,\n }}>\n <Text\n selectable\n allowFontScaling\n style={{\n fontSize: Platform.select({ web: 24, default: 16 }),\n fontWeight: 'bold',\n marginBottom: 4,\n color: 'white',\n }}>\n {title}\n </Text>\n\n {process.env.EXPO_OS === 'web' ? (\n <ScrollView\n style={{\n borderColor: 'rgba(255,255,255,0.5)',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderBottomWidth: StyleSheet.hairlineWidth,\n maxHeight: 150,\n }}\n contentContainerStyle={{ paddingVertical: 4 }}>\n <Text\n testID=\"router_error_message\"\n selectable\n allowFontScaling\n style={{\n color: 'white',\n }}>\n {error.message}\n </Text>\n </ScrollView>\n ) : (\n <TextInput\n testID=\"router_error_message\"\n scrollEnabled\n multiline\n editable={false}\n allowFontScaling\n value={error.message}\n style={{\n borderColor: 'rgba(255,255,255,0.5)',\n borderTopWidth: StyleSheet.hairlineWidth,\n borderBottomWidth: StyleSheet.hairlineWidth,\n paddingVertical: 4,\n maxHeight: 150,\n color: 'white',\n }}\n />\n )}\n\n <InfoRow title=\"Code\" right={error.statusCode} />\n {errorId && <InfoRow title=\"ID\" right={errorId} />}\n {date && <InfoRow title=\"Date\" right={date} />}\n\n {error.url && (\n <Text selectable allowFontScaling style={{ fontSize: 14, opacity: 0.5, color: 'white' }}>\n {error.url}\n </Text>\n )}\n </View>\n );\n}\n\nfunction InfoRow({ title, right }: { title: string; right?: any }) {\n const style = {\n fontSize: 16,\n color: 'white',\n };\n\n return (\n <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>\n <Text selectable allowFontScaling style={style}>\n {title}\n </Text>\n {right && (\n <Text selectable allowFontScaling style={[style, styles.code]}>\n {right}\n </Text>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n alignItems: 'stretch',\n justifyContent: 'center',\n },\n title: {\n color: 'white',\n fontSize: Platform.select({ web: 32, default: 24 }),\n fontWeight: 'bold',\n },\n buttonText: {\n fontSize: 18,\n fontWeight: 'bold',\n color: 'black',\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n },\n buttonInner: {\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n paddingVertical: 12,\n paddingHorizontal: 24,\n borderColor: 'white',\n borderWidth: 2,\n marginLeft: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n code: {\n fontFamily: Platform.select({\n default: 'Courier',\n ios: 'Courier New',\n android: 'monospace',\n }),\n fontWeight: '500',\n },\n errorMessage: {\n color: 'white',\n fontSize: 16,\n },\n subtitle: {\n color: 'white',\n fontSize: 14,\n marginBottom: 12,\n },\n link: {\n color: 'rgba(255,255,255,0.4)',\n textDecorationStyle: 'solid',\n textDecorationLine: 'underline',\n fontSize: 14,\n textAlign: 'center',\n },\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-router",
3
- "version": "4.0.16",
3
+ "version": "4.0.17",
4
4
  "description": "Expo Router is a file-based router for React Native and web applications.",
5
5
  "author": "650 Industries, Inc.",
6
6
  "license": "MIT",
@@ -103,8 +103,8 @@
103
103
  "tsd": "^0.28.1"
104
104
  },
105
105
  "dependencies": {
106
- "@expo/metro-runtime": "4.0.0",
107
- "@expo/server": "^0.5.0",
106
+ "@expo/metro-runtime": "4.0.1",
107
+ "@expo/server": "^0.5.1",
108
108
  "@radix-ui/react-slot": "1.0.1",
109
109
  "@react-navigation/bottom-tabs": "^7.2.0",
110
110
  "@react-navigation/native": "^7.0.14",
@@ -117,5 +117,5 @@
117
117
  "semver": "~7.6.3",
118
118
  "server-only": "^0.0.1"
119
119
  },
120
- "gitHead": "1955c7d38e69c0eb62df89d516a392ea64db6405"
120
+ "gitHead": "0a0c6d35a691fc59c0d94675d159ac9e3dfd6f26"
121
121
  }