@expo/router-server 56.0.7 → 56.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/getNamedParametrizedRoute.d.ts +12 -0
- package/build/getNamedParametrizedRoute.d.ts.map +1 -0
- package/build/getNamedParametrizedRoute.js +127 -0
- package/build/getNamedParametrizedRoute.js.map +1 -0
- package/build/getServerManifest.d.ts +0 -14
- package/build/getServerManifest.d.ts.map +1 -1
- package/build/getServerManifest.js +2 -131
- package/build/getServerManifest.js.map +1 -1
- package/build/rsc/middleware.d.ts +1 -1
- package/build/rsc/middleware.d.ts.map +1 -1
- package/build/rsc/middleware.js +4 -14
- package/build/rsc/middleware.js.map +1 -1
- package/build/rsc/path.d.ts +0 -17
- package/build/rsc/path.d.ts.map +1 -1
- package/build/rsc/path.js +1 -91
- package/build/rsc/path.js.map +1 -1
- package/build/rsc/router/createPages.d.ts +35 -0
- package/build/rsc/router/createPages.d.ts.map +1 -0
- package/build/rsc/router/createPages.js +258 -0
- package/build/rsc/router/createPages.js.map +1 -0
- package/build/rsc/router/defineRouter.d.ts +10 -6
- package/build/rsc/router/defineRouter.d.ts.map +1 -1
- package/build/rsc/router/defineRouter.js +38 -29
- package/build/rsc/router/defineRouter.js.map +1 -1
- package/build/rsc/router/expo-definedRouter.d.ts +3 -1
- package/build/rsc/router/expo-definedRouter.d.ts.map +1 -1
- package/build/rsc/router/expo-definedRouter.js +90 -94
- package/build/rsc/router/expo-definedRouter.js.map +1 -1
- package/build/rsc/router/index.d.ts +13 -0
- package/build/rsc/router/index.d.ts.map +1 -0
- package/build/rsc/router/index.js +13 -0
- package/build/rsc/router/index.js.map +1 -0
- package/build/rsc/router/noopRouter.d.ts +2 -1
- package/build/rsc/router/noopRouter.d.ts.map +1 -1
- package/build/rsc/router/noopRouter.js +4 -3
- package/build/rsc/router/noopRouter.js.map +1 -1
- package/build/rsc/rsc-renderer.d.ts +2 -0
- package/build/rsc/rsc-renderer.d.ts.map +1 -1
- package/build/rsc/rsc-renderer.js +34 -7
- package/build/rsc/rsc-renderer.js.map +1 -1
- package/build/rsc/server.d.ts +2 -3
- package/build/rsc/server.d.ts.map +1 -1
- package/build/rsc/server.js +7 -34
- package/build/rsc/server.js.map +1 -1
- package/package.json +8 -8
- package/build/rsc/router/create-expo-pages.d.ts +0 -20
- package/build/rsc/router/create-expo-pages.d.ts.map +0 -1
- package/build/rsc/router/create-expo-pages.js +0 -21
- package/build/rsc/router/create-expo-pages.js.map +0 -1
- package/build/rsc/router/create-pages.d.ts +0 -80
- package/build/rsc/router/create-pages.d.ts.map +0 -1
- package/build/rsc/router/create-pages.js +0 -232
- package/build/rsc/router/create-pages.js.map +0 -1
|
@@ -127,13 +127,26 @@ async function renderRsc(args, opts) {
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
const actionId = (0, rsc_1.decodeActionId)(input);
|
|
130
|
-
|
|
130
|
+
// CSRF preflight checks
|
|
131
|
+
// - Enforces Sec-Fetch-Site isn't "cross-site"
|
|
132
|
+
// - Otherwise, we enforce expo-platform to enforce preflight
|
|
133
|
+
const fetchSite = args.headers?.['sec-fetch-site'];
|
|
134
|
+
if (actionId && args.method !== 'POST') {
|
|
135
|
+
throw new Error(`Server action "${actionId}" rejected: Invalid method`);
|
|
136
|
+
}
|
|
137
|
+
else if (actionId && fetchSite === 'cross-site') {
|
|
138
|
+
throw new Error(`Server action "${actionId}" rejected: Cross-site request`);
|
|
139
|
+
}
|
|
140
|
+
else if (actionId && !fetchSite && !args.headers?.['expo-platform']) {
|
|
141
|
+
throw new Error(`Server action "${actionId}" rejected: Missing required header`);
|
|
142
|
+
}
|
|
143
|
+
else if (actionId) {
|
|
131
144
|
if (!opts.isExporting &&
|
|
132
145
|
// @ts-ignore
|
|
133
146
|
!process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS) {
|
|
134
147
|
throw new Error('Experimental support for React Server Functions is not enabled');
|
|
135
148
|
}
|
|
136
|
-
const
|
|
149
|
+
const actionArgs = Array.isArray(decodedBody) ? decodedBody : [];
|
|
137
150
|
const chunkInfo = serverConfig[actionId];
|
|
138
151
|
if (!chunkInfo) {
|
|
139
152
|
throw new Error(`Could not find server action "${actionId}" in the server config.`);
|
|
@@ -142,14 +155,28 @@ async function renderRsc(args, opts) {
|
|
|
142
155
|
await Promise.all(chunkInfo.chunks.map((chunk) => globalThis.__webpack_chunk_load__(chunk)));
|
|
143
156
|
// Import module.
|
|
144
157
|
const mod = globalThis.__webpack_require__(chunkInfo.id);
|
|
145
|
-
|
|
146
|
-
if (
|
|
158
|
+
let fn;
|
|
159
|
+
if (mod == null || (typeof mod !== 'object' && typeof mod !== 'function')) {
|
|
160
|
+
fn = undefined;
|
|
161
|
+
}
|
|
162
|
+
else if (chunkInfo.name === '*' || chunkInfo.name === '') {
|
|
163
|
+
fn = mod.__esModule === true && Object.hasOwn(mod, 'default') ? mod.default : mod;
|
|
164
|
+
}
|
|
165
|
+
else if (Object.hasOwn(mod, chunkInfo.name)) {
|
|
166
|
+
fn = mod[chunkInfo.name];
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
fn = undefined;
|
|
170
|
+
}
|
|
171
|
+
if (typeof fn !== 'function') {
|
|
147
172
|
throw new Error(`Could not find server action: ${actionId}. Module: ${JSON.stringify(chunkInfo, null, 2)}`);
|
|
148
173
|
}
|
|
149
|
-
return renderWithContextWithAction(context, fn,
|
|
174
|
+
return renderWithContextWithAction(context, fn, actionArgs);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// method === 'GET'
|
|
178
|
+
return renderWithContext(context, input, decodedBody);
|
|
150
179
|
}
|
|
151
|
-
// method === 'GET'
|
|
152
|
-
return renderWithContext(context, input, decodedBody);
|
|
153
180
|
}
|
|
154
181
|
// TODO is this correct? better to use a library?
|
|
155
182
|
const parseFormData = (body, contentType) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsc-renderer.js","sourceRoot":"","sources":["../../src/rsc/rsc-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\n * Copyright © 2024 dai-shi.\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 * From waku https://github.com/dai-shi/waku/blob/32d52242c1450b5f5965860e671ff73c42da8bd0/packages/waku/src/lib/renderers/rsc-renderer.ts\n */\n\n// This file must remain platform agnostic for production exports.\n\n// Import the runtime to support polyfills for webpack to load modules in the server using Metro.\nimport '@expo/metro-runtime/rsc/runtime';\n\nimport { decodeActionId } from 'expo-router/internal/rsc';\nimport type { ReactNode } from 'react';\nimport { renderToReadableStream, decodeReply } from 'react-server-dom-webpack/server';\n\nimport { fileURLToFilePath } from './path';\nimport { runWithRenderStore, type EntriesDev, type EntriesPrd } from './server';\n\ndeclare namespace globalThis {\n function __webpack_chunk_load__(id: string): Promise<unknown>;\n function __webpack_require__(id: string): any;\n}\n\nexport interface RenderContext<T = unknown> {\n rerender: (input: string, searchParams?: URLSearchParams) => void;\n context: T;\n}\n\ntype ResolvedConfig = any;\n\nexport type RenderRscArgs = {\n // TODO:\n config: ResolvedConfig;\n\n // Done\n input: string;\n context: Record<string, unknown> | undefined;\n body?: ReadableStream | undefined;\n contentType?: string | undefined;\n decodedBody?: unknown;\n moduleIdCallback?: (module: {\n id: string;\n chunks: string[];\n name: string;\n async: boolean;\n }) => void;\n onError?: (err: unknown) => void;\n};\n\ntype ResolveClientEntry = (id: string, server: boolean) => { id: string; chunks: string[] };\n\ntype RenderRscOpts = {\n isExporting: boolean;\n entries: EntriesDev;\n resolveClientEntry: ResolveClientEntry;\n loadServerModuleRsc: (url: string) => Promise<any>;\n};\n\nexport async function renderRsc(args: RenderRscArgs, opts: RenderRscOpts): Promise<ReadableStream> {\n const { input, body, contentType, context, onError } = args;\n const { resolveClientEntry, entries } = opts;\n\n const {\n default: { renderEntries },\n // @ts-expect-error\n buildConfig,\n } = entries as (EntriesDev & { loadModule: never; buildConfig: never }) | EntriesPrd;\n\n function resolveRequest(isServer: boolean, encodedId: string) {\n const [\n // File is the on-disk location of the module, this is injected during the \"use client\" transformation (babel).\n file,\n // The name of the import (e.g. \"default\" or \"\")\n // This will be empty when using `module.exports = ` and `require('...')`.\n name = '',\n ] = encodedId.split('#') as [string, string];\n\n const filePath = file.startsWith('file://') ? fileURLToFilePath(file) : file;\n\n args.moduleIdCallback?.({\n id: filePath,\n chunks: [\n // TODO: Add a lookup later which reads from the SSR manifest to get the correct chunk.\n // NOTE(EvanBacon): This is a placeholder since we need to render RSC to get the client boundaries, which we then inject later.\n 'chunk:' + filePath,\n ],\n name,\n async: true,\n });\n // We'll augment the file path with the incoming RSC request which will forward the metro props required to make a cache hit, e.g. platform=web&...\n // This is similar to how we handle lazy bundling.\n const resolved = resolveClientEntry(filePath, isServer);\n return { id: resolved.id, chunks: resolved.chunks, name, async: true };\n }\n\n const bundlerConfig: Record<string, ReturnType<typeof resolveRequest>> = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n return resolveRequest(false, encodedId);\n },\n }\n );\n\n const serverConfig: Record<string, ReturnType<typeof resolveRequest>> = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n return resolveRequest(true, encodedId);\n },\n }\n );\n\n // @ts-ignore: Not part of global types. This is added to support server actions loading more actions.\n global[`${__METRO_GLOBAL_PREFIX__}__loadBundleAsync`] = opts.loadServerModuleRsc;\n\n const renderWithContext = async (\n context: Record<string, unknown> | undefined,\n input: string,\n params: unknown\n ) => {\n const renderStore = {\n context: context || {},\n rerender: () => {\n throw new Error('Cannot rerender');\n },\n };\n return runWithRenderStore(renderStore, async () => {\n const elements = await renderEntries(input, {\n params,\n buildConfig,\n });\n if (elements === null) {\n const err = new Error('No function component found at: ' + input);\n (err as any).statusCode = 404;\n throw err;\n }\n if (Object.keys(elements).some((key) => key.startsWith('_'))) {\n throw new Error('\"_\" prefix is reserved');\n }\n return renderToReadableStream(elements, bundlerConfig, {\n onError,\n });\n });\n };\n\n const renderWithContextWithAction = async (\n context: Record<string, unknown> | undefined,\n actionFn: (...args: unknown[]) => unknown,\n actionArgs: unknown[]\n ) => {\n let elementsPromise: Promise<Record<string, ReactNode>> = Promise.resolve({});\n let rendered = false;\n const renderStore = {\n context: context || {},\n rerender: async (input: string, params?: unknown) => {\n if (rendered) {\n throw new Error('already rendered');\n }\n elementsPromise = Promise.all([\n elementsPromise,\n renderEntries(input, { params, buildConfig }),\n ]).then(([oldElements, newElements]) => ({\n ...oldElements,\n // FIXME we should actually check if newElements is null and send an error\n ...newElements,\n }));\n },\n };\n return runWithRenderStore(renderStore, async () => {\n const actionValue = await actionFn(...actionArgs);\n const elements = await elementsPromise;\n rendered = true;\n if (Object.keys(elements).some((key) => key.startsWith('_'))) {\n throw new Error('\"_\" prefix is reserved');\n }\n return renderToReadableStream({ ...elements, _value: actionValue }, bundlerConfig, {\n onError,\n });\n });\n };\n\n let decodedBody: unknown | undefined = args.decodedBody;\n if (body) {\n const bodyStr = await streamToString(body);\n if (typeof contentType === 'string' && contentType.startsWith('multipart/form-data')) {\n // XXX This doesn't support streaming unlike busboy\n const formData = parseFormData(bodyStr, contentType);\n decodedBody = await decodeReply(formData, serverConfig);\n } else if (bodyStr) {\n decodedBody = await decodeReply(bodyStr, serverConfig);\n }\n }\n\n const actionId = decodeActionId(input);\n if (actionId) {\n if (\n !opts.isExporting &&\n // @ts-ignore\n !process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS\n ) {\n throw new Error('Experimental support for React Server Functions is not enabled');\n }\n\n const args = Array.isArray(decodedBody) ? decodedBody : [];\n\n const chunkInfo = serverConfig[actionId];\n\n if (!chunkInfo) {\n throw new Error(`Could not find server action \"${actionId}\" in the server config.`);\n }\n\n // Load module into memory.\n await Promise.all(chunkInfo.chunks.map((chunk) => globalThis.__webpack_chunk_load__(chunk)));\n\n // Import module.\n const mod: any = globalThis.__webpack_require__(chunkInfo.id);\n const fn = chunkInfo.name === '*' ? chunkInfo.name : mod[chunkInfo.name] || mod;\n\n if (!fn) {\n throw new Error(\n `Could not find server action: ${actionId}. Module: ${JSON.stringify(chunkInfo, null, 2)}`\n );\n }\n\n return renderWithContextWithAction(context, fn, args);\n }\n\n // method === 'GET'\n return renderWithContext(context, input, decodedBody);\n}\n\n// TODO is this correct? better to use a library?\nconst parseFormData = (body: string, contentType: string) => {\n const boundary = contentType.split('boundary=')[1];\n const parts = body.split(`--${boundary}`);\n const formData = new FormData();\n for (const part of parts) {\n if (part.trim() === '' || part === '--') continue;\n const [rawHeaders, content] = part.split('\\r\\n\\r\\n', 2);\n const headers = rawHeaders!.split('\\r\\n').reduce(\n (acc, currentHeader) => {\n const [key, value] = currentHeader.split(': ');\n acc[key!.toLowerCase()] = value!;\n return acc;\n },\n {} as Record<string, string>\n );\n const contentDisposition = headers['content-disposition'];\n const nameMatch = /name=\"([^\"]+)\"/.exec(contentDisposition!);\n const filenameMatch = /filename=\"([^\"]+)\"/.exec(contentDisposition!);\n if (nameMatch) {\n const name = nameMatch[1];\n if (filenameMatch) {\n const filename = filenameMatch[1];\n const type = headers['content-type'] || 'application/octet-stream';\n const blob = new Blob([content!], { type });\n formData.append(name!, blob, filename);\n } else {\n formData.append(name!, content!.trim());\n }\n }\n }\n return formData;\n};\n\nconst streamToString = async (stream: ReadableStream): Promise<string> => {\n const decoder = new TextDecoder();\n const reader = stream.getReader();\n const outs: string[] = [];\n let result: ReadableStreamReadResult<unknown>;\n do {\n result = await reader.read();\n if (result.value) {\n if (!(result.value instanceof Uint8Array)) {\n throw new Error('Unexepected buffer type');\n }\n outs.push(decoder.decode(result.value, { stream: true }));\n }\n } while (!result.done);\n outs.push(decoder.decode());\n return outs.join('');\n};\n"]}
|
|
1
|
+
{"version":3,"file":"rsc-renderer.js","sourceRoot":"","sources":["../../src/rsc/rsc-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\n * Copyright © 2024 dai-shi.\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 * From waku https://github.com/dai-shi/waku/blob/32d52242c1450b5f5965860e671ff73c42da8bd0/packages/waku/src/lib/renderers/rsc-renderer.ts\n */\n\n// This file must remain platform agnostic for production exports.\n\n// Import the runtime to support polyfills for webpack to load modules in the server using Metro.\nimport '@expo/metro-runtime/rsc/runtime';\n\nimport { decodeActionId } from 'expo-router/internal/rsc';\nimport type { ReactNode } from 'react';\nimport { renderToReadableStream, decodeReply } from 'react-server-dom-webpack/server';\n\nimport { fileURLToFilePath } from './path';\nimport { runWithRenderStore, type EntriesDev, type EntriesPrd } from './server';\n\ndeclare namespace globalThis {\n function __webpack_chunk_load__(id: string): Promise<unknown>;\n function __webpack_require__(id: string): any;\n}\n\nexport interface RenderContext<T = unknown> {\n rerender: (input: string, searchParams?: URLSearchParams) => void;\n context: T;\n}\n\ntype ResolvedConfig = any;\n\nexport type RenderRscArgs = {\n // TODO:\n config: ResolvedConfig;\n\n // Done\n input: string;\n context: Record<string, unknown> | undefined;\n body?: ReadableStream | undefined;\n method?: 'GET' | 'POST';\n headers?: Record<string, string>;\n contentType?: string | undefined;\n decodedBody?: unknown;\n moduleIdCallback?: (module: {\n id: string;\n chunks: string[];\n name: string;\n async: boolean;\n }) => void;\n onError?: (err: unknown) => void;\n};\n\ntype ResolveClientEntry = (id: string, server: boolean) => { id: string; chunks: string[] };\n\ntype RenderRscOpts = {\n isExporting: boolean;\n entries: EntriesDev;\n resolveClientEntry: ResolveClientEntry;\n loadServerModuleRsc: (url: string) => Promise<any>;\n};\n\nexport async function renderRsc(args: RenderRscArgs, opts: RenderRscOpts): Promise<ReadableStream> {\n const { input, body, contentType, context, onError } = args;\n const { resolveClientEntry, entries } = opts;\n\n const {\n default: { renderEntries },\n // @ts-expect-error\n buildConfig,\n } = entries as (EntriesDev & { loadModule: never; buildConfig: never }) | EntriesPrd;\n\n function resolveRequest(isServer: boolean, encodedId: string) {\n const [\n // File is the on-disk location of the module, this is injected during the \"use client\" transformation (babel).\n file,\n // The name of the import (e.g. \"default\" or \"\")\n // This will be empty when using `module.exports = ` and `require('...')`.\n name = '',\n ] = encodedId.split('#') as [string, string];\n\n const filePath = file.startsWith('file://') ? fileURLToFilePath(file) : file;\n\n args.moduleIdCallback?.({\n id: filePath,\n chunks: [\n // TODO: Add a lookup later which reads from the SSR manifest to get the correct chunk.\n // NOTE(EvanBacon): This is a placeholder since we need to render RSC to get the client boundaries, which we then inject later.\n 'chunk:' + filePath,\n ],\n name,\n async: true,\n });\n // We'll augment the file path with the incoming RSC request which will forward the metro props required to make a cache hit, e.g. platform=web&...\n // This is similar to how we handle lazy bundling.\n const resolved = resolveClientEntry(filePath, isServer);\n return { id: resolved.id, chunks: resolved.chunks, name, async: true };\n }\n\n const bundlerConfig: Record<string, ReturnType<typeof resolveRequest>> = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n return resolveRequest(false, encodedId);\n },\n }\n );\n\n const serverConfig: Record<string, ReturnType<typeof resolveRequest>> = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n return resolveRequest(true, encodedId);\n },\n }\n );\n\n // @ts-ignore: Not part of global types. This is added to support server actions loading more actions.\n global[`${__METRO_GLOBAL_PREFIX__}__loadBundleAsync`] = opts.loadServerModuleRsc;\n\n const renderWithContext = async (\n context: Record<string, unknown> | undefined,\n input: string,\n params: unknown\n ) => {\n const renderStore = {\n context: context || {},\n rerender: () => {\n throw new Error('Cannot rerender');\n },\n };\n return runWithRenderStore(renderStore, async () => {\n const elements = await renderEntries(input, {\n params,\n buildConfig,\n });\n if (elements === null) {\n const err = new Error('No function component found at: ' + input);\n (err as any).statusCode = 404;\n throw err;\n }\n if (Object.keys(elements).some((key) => key.startsWith('_'))) {\n throw new Error('\"_\" prefix is reserved');\n }\n return renderToReadableStream(elements, bundlerConfig, {\n onError,\n });\n });\n };\n\n const renderWithContextWithAction = async (\n context: Record<string, unknown> | undefined,\n actionFn: (...args: unknown[]) => unknown,\n actionArgs: unknown[]\n ) => {\n let elementsPromise: Promise<Record<string, ReactNode>> = Promise.resolve({});\n let rendered = false;\n const renderStore = {\n context: context || {},\n rerender: async (input: string, params?: unknown) => {\n if (rendered) {\n throw new Error('already rendered');\n }\n elementsPromise = Promise.all([\n elementsPromise,\n renderEntries(input, { params, buildConfig }),\n ]).then(([oldElements, newElements]) => ({\n ...oldElements,\n // FIXME we should actually check if newElements is null and send an error\n ...newElements,\n }));\n },\n };\n return runWithRenderStore(renderStore, async () => {\n const actionValue = await actionFn(...actionArgs);\n const elements = await elementsPromise;\n rendered = true;\n if (Object.keys(elements).some((key) => key.startsWith('_'))) {\n throw new Error('\"_\" prefix is reserved');\n }\n return renderToReadableStream({ ...elements, _value: actionValue }, bundlerConfig, {\n onError,\n });\n });\n };\n\n let decodedBody: unknown | undefined = args.decodedBody;\n if (body) {\n const bodyStr = await streamToString(body);\n if (typeof contentType === 'string' && contentType.startsWith('multipart/form-data')) {\n // XXX This doesn't support streaming unlike busboy\n const formData = parseFormData(bodyStr, contentType);\n decodedBody = await decodeReply(formData, serverConfig);\n } else if (bodyStr) {\n decodedBody = await decodeReply(bodyStr, serverConfig);\n }\n }\n\n const actionId = decodeActionId(input);\n // CSRF preflight checks\n // - Enforces Sec-Fetch-Site isn't \"cross-site\"\n // - Otherwise, we enforce expo-platform to enforce preflight\n const fetchSite = args.headers?.['sec-fetch-site'];\n if (actionId && args.method !== 'POST') {\n throw new Error(`Server action \"${actionId}\" rejected: Invalid method`);\n } else if (actionId && fetchSite === 'cross-site') {\n throw new Error(`Server action \"${actionId}\" rejected: Cross-site request`);\n } else if (actionId && !fetchSite && !args.headers?.['expo-platform']) {\n throw new Error(`Server action \"${actionId}\" rejected: Missing required header`);\n } else if (actionId) {\n if (\n !opts.isExporting &&\n // @ts-ignore\n !process.env.EXPO_UNSTABLE_SERVER_FUNCTIONS\n ) {\n throw new Error('Experimental support for React Server Functions is not enabled');\n }\n\n const actionArgs = Array.isArray(decodedBody) ? decodedBody : [];\n const chunkInfo = serverConfig[actionId];\n if (!chunkInfo) {\n throw new Error(`Could not find server action \"${actionId}\" in the server config.`);\n }\n\n // Load module into memory.\n await Promise.all(chunkInfo.chunks.map((chunk) => globalThis.__webpack_chunk_load__(chunk)));\n\n // Import module.\n const mod: any = globalThis.__webpack_require__(chunkInfo.id);\n\n let fn: ((...args: unknown[]) => unknown) | undefined;\n if (mod == null || (typeof mod !== 'object' && typeof mod !== 'function')) {\n fn = undefined;\n } else if (chunkInfo.name === '*' || chunkInfo.name === '') {\n fn = mod.__esModule === true && Object.hasOwn(mod, 'default') ? mod.default : mod;\n } else if (Object.hasOwn(mod, chunkInfo.name)) {\n fn = mod[chunkInfo.name];\n } else {\n fn = undefined;\n }\n\n if (typeof fn !== 'function') {\n throw new Error(\n `Could not find server action: ${actionId}. Module: ${JSON.stringify(chunkInfo, null, 2)}`\n );\n }\n\n return renderWithContextWithAction(context, fn, actionArgs);\n } else {\n // method === 'GET'\n return renderWithContext(context, input, decodedBody);\n }\n}\n\n// TODO is this correct? better to use a library?\nconst parseFormData = (body: string, contentType: string) => {\n const boundary = contentType.split('boundary=')[1];\n const parts = body.split(`--${boundary}`);\n const formData = new FormData();\n for (const part of parts) {\n if (part.trim() === '' || part === '--') continue;\n const [rawHeaders, content] = part.split('\\r\\n\\r\\n', 2);\n const headers = rawHeaders!.split('\\r\\n').reduce(\n (acc, currentHeader) => {\n const [key, value] = currentHeader.split(': ');\n acc[key!.toLowerCase()] = value!;\n return acc;\n },\n {} as Record<string, string>\n );\n const contentDisposition = headers['content-disposition'];\n const nameMatch = /name=\"([^\"]+)\"/.exec(contentDisposition!);\n const filenameMatch = /filename=\"([^\"]+)\"/.exec(contentDisposition!);\n if (nameMatch) {\n const name = nameMatch[1];\n if (filenameMatch) {\n const filename = filenameMatch[1];\n const type = headers['content-type'] || 'application/octet-stream';\n const blob = new Blob([content!], { type });\n formData.append(name!, blob, filename);\n } else {\n formData.append(name!, content!.trim());\n }\n }\n }\n return formData;\n};\n\nconst streamToString = async (stream: ReadableStream): Promise<string> => {\n const decoder = new TextDecoder();\n const reader = stream.getReader();\n const outs: string[] = [];\n let result: ReadableStreamReadResult<unknown>;\n do {\n result = await reader.read();\n if (result.value) {\n if (!(result.value instanceof Uint8Array)) {\n throw new Error('Unexepected buffer type');\n }\n outs.push(decoder.decode(result.value, { stream: true }));\n }\n } while (!result.done);\n outs.push(decoder.decode());\n return outs.join('');\n};\n"]}
|
package/build/rsc/server.d.ts
CHANGED
|
@@ -6,12 +6,11 @@
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/
|
|
8
8
|
import type { ReactNode } from 'react';
|
|
9
|
-
import type { PathSpec } from './path';
|
|
10
9
|
export declare const REQUEST_HEADERS = "__expo_requestHeaders";
|
|
11
10
|
type Config = any;
|
|
12
11
|
type Elements = Record<string, ReactNode>;
|
|
13
12
|
export type BuildConfig = {
|
|
14
|
-
pathname: string
|
|
13
|
+
pathname: string;
|
|
15
14
|
isStatic?: boolean | undefined;
|
|
16
15
|
entries?: {
|
|
17
16
|
input: string;
|
|
@@ -46,7 +45,7 @@ export type EntriesDev = {
|
|
|
46
45
|
export type EntriesPrd = EntriesDev & {
|
|
47
46
|
loadConfig: () => Promise<Config>;
|
|
48
47
|
loadModule: (id: string) => Promise<unknown>;
|
|
49
|
-
dynamicHtmlPaths: [
|
|
48
|
+
dynamicHtmlPaths: [pathname: string, htmlHead: string][];
|
|
50
49
|
publicIndexHtml: string;
|
|
51
50
|
};
|
|
52
51
|
type RenderStore = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rsc/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rsc/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAQvD,KAAK,MAAM,GAAG,GAAG,CAAC;AAElB,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE1C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACnC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KAChC,EAAE,CAAC;IACJ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EAAE,CAAC;AAEJ,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;CACtC,KACE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9B,MAAM,MAAM,cAAc,GAAG,CAC3B,6BAA6B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,KAChE,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B,MAAM,MAAM,YAAY,GAAG,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACvC,KACE,OAAO,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,IAAI,EAAE,SAAS,CAAC;CACjB,GAAG,IAAI,CAAC,CAAC;AAEV,wBAAgB,aAAa,CAC3B,aAAa,EAAE,aAAa,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,YAAY,CAAC,EAAE,YAAY;;;;EAG5B;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IACpC,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IACzD,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAQF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,aAAa,WAAW,EAAE,IAAI,MAAM,CAAC,KAAG,CAE7E,CAAC;AAEF,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,iBAM7D;AAED,wBAAgB,UAAU,CACxB,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACjE,UAAU,CAMd"}
|
package/build/rsc/server.js
CHANGED
|
@@ -16,54 +16,27 @@ exports.REQUEST_HEADERS = '__expo_requestHeaders';
|
|
|
16
16
|
function defineEntries(renderEntries, getBuildConfig, getSsrConfig) {
|
|
17
17
|
return { renderEntries, getBuildConfig, getSsrConfig };
|
|
18
18
|
}
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
// In production the shared middleware is web-only and that causes the first version of this module
|
|
24
|
-
// to be bound to web.
|
|
25
|
-
const platform = globalThis.__expo_platform_header ?? process.env.EXPO_OS;
|
|
26
|
-
if (!globalThis.__EXPO_RSC_CACHE__) {
|
|
27
|
-
globalThis.__EXPO_RSC_CACHE__ = new Map();
|
|
28
|
-
}
|
|
29
|
-
if (globalThis.__EXPO_RSC_CACHE__.has(platform)) {
|
|
30
|
-
return globalThis.__EXPO_RSC_CACHE__.get(platform);
|
|
31
|
-
}
|
|
32
|
-
const serverCache = new node_async_hooks_1.AsyncLocalStorage();
|
|
33
|
-
globalThis.__EXPO_RSC_CACHE__.set(platform, serverCache);
|
|
34
|
-
return serverCache;
|
|
19
|
+
// Stashed on globalThis so separately-loaded copies of this module (e.g. the renderer and a
|
|
20
|
+
// server-action module loaded via Metro's ssrLoadModule) share one storage instance.
|
|
21
|
+
function getRenderStorage() {
|
|
22
|
+
return (globalThis.__EXPO_RSC_STORE__ ??= new node_async_hooks_1.AsyncLocalStorage());
|
|
35
23
|
}
|
|
36
|
-
let previousRenderStore;
|
|
37
|
-
let currentRenderStore;
|
|
38
24
|
/**
|
|
39
25
|
* This is an internal function and not for public use.
|
|
40
26
|
*/
|
|
41
27
|
const runWithRenderStore = (renderStore, fn) => {
|
|
42
|
-
|
|
43
|
-
if (renderStorage) {
|
|
44
|
-
return renderStorage.run(renderStore, fn);
|
|
45
|
-
}
|
|
46
|
-
previousRenderStore = currentRenderStore;
|
|
47
|
-
currentRenderStore = renderStore;
|
|
48
|
-
try {
|
|
49
|
-
return fn();
|
|
50
|
-
}
|
|
51
|
-
finally {
|
|
52
|
-
currentRenderStore = previousRenderStore;
|
|
53
|
-
}
|
|
28
|
+
return getRenderStorage().run(renderStore, fn);
|
|
54
29
|
};
|
|
55
30
|
exports.runWithRenderStore = runWithRenderStore;
|
|
56
31
|
async function rerender(input, params) {
|
|
57
|
-
const
|
|
58
|
-
const renderStore = renderStorage.getStore() ?? currentRenderStore;
|
|
32
|
+
const renderStore = getRenderStorage().getStore();
|
|
59
33
|
if (!renderStore) {
|
|
60
34
|
throw new Error('Render store is not available for rerender');
|
|
61
35
|
}
|
|
62
36
|
renderStore.rerender(input, params);
|
|
63
37
|
}
|
|
64
38
|
function getContext() {
|
|
65
|
-
const
|
|
66
|
-
const renderStore = renderStorage.getStore() ?? currentRenderStore;
|
|
39
|
+
const renderStore = getRenderStorage().getStore();
|
|
67
40
|
if (!renderStore) {
|
|
68
41
|
throw new Error('Render store is not available for accessing context');
|
|
69
42
|
}
|
package/build/rsc/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/rsc/server.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/rsc/server.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAsDH,sCAMC;AA+BD,4BAMC;AAED,gCAQC;AAzGD,uDAAqD;AAGxC,QAAA,eAAe,GAAG,uBAAuB,CAAC;AAiDvD,SAAgB,aAAa,CAC3B,aAA4B,EAC5B,cAA+B,EAC/B,YAA2B;IAE3B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC;AAkBD,4FAA4F;AAC5F,qFAAqF;AACrF,SAAS,gBAAgB;IACvB,OAAO,CAAC,UAAU,CAAC,kBAAkB,KAAK,IAAI,oCAAiB,EAAe,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACI,MAAM,kBAAkB,GAAG,CAAI,WAAwB,EAAE,EAAW,EAAK,EAAE;IAChF,OAAO,gBAAgB,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC;AAFW,QAAA,kBAAkB,sBAE7B;AAEK,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAgB;IAC5D,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,UAAU;IAGxB,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,WAAW,CAAC,OAAqB,CAAC;AAC3C,CAAC","sourcesContent":["/**\n * Copyright © 2024 650 Industries.\n * Copyright © 2024 2023 Daishi Kato\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { ReactNode } from 'react';\n\nexport const REQUEST_HEADERS = '__expo_requestHeaders';\n\ndeclare let globalThis: {\n __EXPO_RSC_STORE__?: AsyncLocalStorage<RenderStore>;\n __webpack_chunk_load__: (id: string) => Promise<any>;\n __webpack_require__: (id: string) => any;\n};\n\ntype Config = any;\n\ntype Elements = Record<string, ReactNode>;\n\nexport type BuildConfig = {\n pathname: string;\n isStatic?: boolean | undefined;\n entries?: {\n input: string;\n skipPrefetch?: boolean | undefined;\n isStatic?: boolean | undefined;\n }[];\n context?: Record<string, unknown>;\n customCode?: string; // optional code to inject TODO hope to remove this\n customData?: unknown; // should be serializable with JSON.stringify\n}[];\n\nexport type RenderEntries = (\n input: string,\n options: {\n params: unknown | undefined;\n buildConfig: BuildConfig | undefined;\n }\n) => Promise<Elements | null>;\n\nexport type GetBuildConfig = (\n unstable_collectClientModules: (input: string) => Promise<string[]>\n) => Promise<BuildConfig>;\n\nexport type GetSsrConfig = (\n pathname: string,\n options: {\n searchParams: URLSearchParams;\n buildConfig?: BuildConfig | undefined;\n }\n) => Promise<{\n input: string;\n searchParams?: URLSearchParams;\n html: ReactNode;\n} | null>;\n\nexport function defineEntries(\n renderEntries: RenderEntries,\n getBuildConfig?: GetBuildConfig,\n getSsrConfig?: GetSsrConfig\n) {\n return { renderEntries, getBuildConfig, getSsrConfig };\n}\n\nexport type EntriesDev = {\n default: ReturnType<typeof defineEntries>;\n};\n\nexport type EntriesPrd = EntriesDev & {\n loadConfig: () => Promise<Config>;\n loadModule: (id: string) => Promise<unknown>;\n dynamicHtmlPaths: [pathname: string, htmlHead: string][];\n publicIndexHtml: string;\n};\n\ntype RenderStore = {\n rerender: (input: string, params?: unknown) => void;\n context: Record<string, unknown>;\n};\n\n// Stashed on globalThis so separately-loaded copies of this module (e.g. the renderer and a\n// server-action module loaded via Metro's ssrLoadModule) share one storage instance.\nfunction getRenderStorage(): AsyncLocalStorage<RenderStore> {\n return (globalThis.__EXPO_RSC_STORE__ ??= new AsyncLocalStorage<RenderStore>());\n}\n\n/**\n * This is an internal function and not for public use.\n */\nexport const runWithRenderStore = <T>(renderStore: RenderStore, fn: () => T): T => {\n return getRenderStorage().run(renderStore, fn);\n};\n\nexport async function rerender(input: string, params?: unknown) {\n const renderStore = getRenderStorage().getStore();\n if (!renderStore) {\n throw new Error('Render store is not available for rerender');\n }\n renderStore.rerender(input, params);\n}\n\nexport function getContext<\n RscContext extends Record<string, unknown> = Record<string, unknown>,\n>(): RscContext {\n const renderStore = getRenderStorage().getStore();\n if (!renderStore) {\n throw new Error('Render store is not available for accessing context');\n }\n return renderStore.context as RscContext;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/router-server",
|
|
3
|
-
"version": "56.0.
|
|
3
|
+
"version": "56.0.9",
|
|
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",
|
|
@@ -24,12 +24,12 @@
|
|
|
24
24
|
"expo"
|
|
25
25
|
],
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@expo/metro-runtime": "^56.0.
|
|
27
|
+
"@expo/metro-runtime": "^56.0.9",
|
|
28
28
|
"expo": "*",
|
|
29
|
-
"expo-constants": "^56.0.
|
|
30
|
-
"expo-font": "^56.0.
|
|
29
|
+
"expo-constants": "^56.0.12",
|
|
30
|
+
"expo-font": "^56.0.5",
|
|
31
31
|
"expo-router": "*",
|
|
32
|
-
"expo-server": "^56.0.
|
|
32
|
+
"expo-server": "^56.0.3",
|
|
33
33
|
"react": "*",
|
|
34
34
|
"react-dom": "*",
|
|
35
35
|
"react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
"react-server-dom-webpack": "~19.0.6",
|
|
60
60
|
"tsd": "^0.33.0",
|
|
61
61
|
"tsd-lite": "^0.9.0",
|
|
62
|
-
"expo
|
|
63
|
-
"expo": "56.
|
|
62
|
+
"expo": "56.0.0-preview.13",
|
|
63
|
+
"expo-router": "56.2.2"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"debug": "^4.3.4"
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"publishConfig": {
|
|
69
69
|
"access": "public"
|
|
70
70
|
},
|
|
71
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "290368bc41026449a05a4ebf991b85c3a2fb0e3a",
|
|
72
72
|
"scripts": {
|
|
73
73
|
"build": "expo-module build",
|
|
74
74
|
"clean": "expo-module clean",
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { GetRoutesOptions } from 'expo-router/internal/routing';
|
|
2
|
-
import { createPages } from './create-pages';
|
|
3
|
-
import type { EntriesDev } from '../server';
|
|
4
|
-
type CreatePagesFn = Parameters<typeof createPages>[0];
|
|
5
|
-
type CreatePagesFns = Parameters<CreatePagesFn>[0];
|
|
6
|
-
type CreatePagesOptions = Parameters<CreatePagesFn>[1] & {
|
|
7
|
-
getRouteOptions?: GetRoutesOptions;
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Wrapper around `createPages` to pass data from the server to the fn
|
|
11
|
-
*
|
|
12
|
-
* This is separated from the `createPages` function allowing us to keep the createPages
|
|
13
|
-
* in sync with the original Waku implementation.
|
|
14
|
-
*
|
|
15
|
-
* @param fn
|
|
16
|
-
* @returns
|
|
17
|
-
*/
|
|
18
|
-
export declare function createExpoPages(fn: (fn: CreatePagesFns, options: CreatePagesOptions) => ReturnType<CreatePagesFn>): (getRouteOptions?: GetRoutesOptions) => EntriesDev;
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=create-expo-pages.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-expo-pages.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/create-expo-pages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,KAAK,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,KAAK,kBAAkB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG;IACvD,eAAe,CAAC,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,KAAK,UAAU,CAAC,aAAa,CAAC,IAE1E,kBAAkB,gBAAgB,KAAG,UAAU,CAKxD"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createExpoPages = createExpoPages;
|
|
4
|
-
const create_pages_1 = require("./create-pages");
|
|
5
|
-
/**
|
|
6
|
-
* Wrapper around `createPages` to pass data from the server to the fn
|
|
7
|
-
*
|
|
8
|
-
* This is separated from the `createPages` function allowing us to keep the createPages
|
|
9
|
-
* in sync with the original Waku implementation.
|
|
10
|
-
*
|
|
11
|
-
* @param fn
|
|
12
|
-
* @returns
|
|
13
|
-
*/
|
|
14
|
-
function createExpoPages(fn) {
|
|
15
|
-
return (getRouteOptions) => {
|
|
16
|
-
return {
|
|
17
|
-
default: (0, create_pages_1.createPages)((a, b) => fn(a, { ...b, getRouteOptions })),
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=create-expo-pages.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-expo-pages.js","sourceRoot":"","sources":["../../../src/rsc/router/create-expo-pages.ts"],"names":[],"mappings":";;AAoBA,0CAQC;AA1BD,iDAA6C;AAS7C;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAC7B,EAAkF;IAElF,OAAO,CAAC,eAAkC,EAAc,EAAE;QACxD,OAAO;YACL,OAAO,EAAE,IAAA,0BAAW,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;SACjE,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { GetRoutesOptions } from 'expo-router/internal/routing';\n\nimport { createPages } from './create-pages';\nimport type { EntriesDev } from '../server';\n\ntype CreatePagesFn = Parameters<typeof createPages>[0];\ntype CreatePagesFns = Parameters<CreatePagesFn>[0];\ntype CreatePagesOptions = Parameters<CreatePagesFn>[1] & {\n getRouteOptions?: GetRoutesOptions;\n};\n\n/**\n * Wrapper around `createPages` to pass data from the server to the fn\n *\n * This is separated from the `createPages` function allowing us to keep the createPages\n * in sync with the original Waku implementation.\n *\n * @param fn\n * @returns\n */\nexport function createExpoPages(\n fn: (fn: CreatePagesFns, options: CreatePagesOptions) => ReturnType<CreatePagesFn>\n) {\n return (getRouteOptions?: GetRoutesOptions): EntriesDev => {\n return {\n default: createPages((a, b) => fn(a, { ...b, getRouteOptions })),\n };\n };\n}\n"]}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright © 2024 650 Industries.
|
|
3
|
-
* Copyright © 2024 2023 Daishi Kato
|
|
4
|
-
*
|
|
5
|
-
* This source code is licensed under the MIT license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*
|
|
8
|
-
* https://github.com/dai-shi/waku/blob/3d1cc7d714b67b142c847e879c30f0724fc457a7/packages/waku/src/router/create-pages.ts#L1
|
|
9
|
-
*/
|
|
10
|
-
import type { RouteProps } from 'expo-router/internal/rsc';
|
|
11
|
-
import type { FunctionComponent, ReactNode } from 'react';
|
|
12
|
-
import type { BuildConfig } from '../server';
|
|
13
|
-
/**
|
|
14
|
-
* Type version of `String.prototype.split()`. Splits the first string argument by the second string argument
|
|
15
|
-
* @example
|
|
16
|
-
* ```ts
|
|
17
|
-
* // ['a', 'b', 'c']
|
|
18
|
-
* type Case1 = Split<'abc', ''>
|
|
19
|
-
* // ['a', 'b', 'c']
|
|
20
|
-
* type Case2 = Split<'a,b,c', ','>
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
type Split<Str extends string, Del extends string | number> = string extends Str ? string[] : '' extends Str ? [] : Str extends `${infer T}${Del}${infer U}` ? [T, ...Split<U, Del>] : [Str];
|
|
24
|
-
/** Assumes that the path is a part of a slug path. */
|
|
25
|
-
type IsValidPathItem<T> = T extends `/${infer _}` ? false : T extends '[]' | '' ? false : true;
|
|
26
|
-
/**
|
|
27
|
-
* This is a helper type to check if a path is valid in a slug path.
|
|
28
|
-
*/
|
|
29
|
-
export type IsValidPathInSlugPath<T> = T extends `/${infer L}/${infer R}` ? IsValidPathItem<L> extends true ? IsValidPathInSlugPath<`/${R}`> : false : T extends `/${infer U}` ? IsValidPathItem<U> : false;
|
|
30
|
-
/** Checks if a particular slug name exists in a path. */
|
|
31
|
-
export type HasSlugInPath<T, K extends string> = T extends `/[${K}]/${infer _}` ? true : T extends `/${infer _}/${infer U}` ? HasSlugInPath<`/${U}`, K> : T extends `/[${K}]` ? true : false;
|
|
32
|
-
export type HasWildcardInPath<T> = T extends `/[...${string}]/${string}` ? true : T extends `/${infer _}/${infer U}` ? HasWildcardInPath<`/${U}`> : T extends `/[...${string}]` ? true : false;
|
|
33
|
-
export type PathWithSlug<T, K extends string> = IsValidPathInSlugPath<T> extends true ? (HasSlugInPath<T, K> extends true ? T : never) : never;
|
|
34
|
-
type _GetSlugs<Route extends string, SplitRoute extends string[] = Split<Route, '/'>, Result extends string[] = []> = SplitRoute extends [] ? Result : SplitRoute extends [`${infer MaybeSlug}`, ...infer Rest] ? Rest extends string[] ? MaybeSlug extends `[${infer Slug}]` ? _GetSlugs<Route, Rest, [...Result, Slug]> : _GetSlugs<Route, Rest, Result> : never : Result;
|
|
35
|
-
export type GetSlugs<Route extends string> = _GetSlugs<Route>;
|
|
36
|
-
export type StaticSlugRoutePathsTuple<T extends string, Slugs extends unknown[] = GetSlugs<T>, Result extends string[] = []> = Slugs extends [] ? Result : Slugs extends [infer _, ...infer Rest] ? StaticSlugRoutePathsTuple<T, Rest, [...Result, string]> : never;
|
|
37
|
-
type StaticSlugRoutePaths<T extends string> = HasWildcardInPath<T> extends true ? string[] | string[][] : StaticSlugRoutePathsTuple<T> extends [string] ? string[] : StaticSlugRoutePathsTuple<T>[];
|
|
38
|
-
export type PathWithoutSlug<T> = T extends '/' ? T : IsValidPathInSlugPath<T> extends true ? HasSlugInPath<T, string> extends true ? never : T : never;
|
|
39
|
-
type PathWithStaticSlugs<T extends string> = T extends `/` ? T : IsValidPathInSlugPath<T> extends true ? T : never;
|
|
40
|
-
export type PathWithWildcard<Path, SlugKey extends string, WildSlugKey extends string> = PathWithSlug<Path, SlugKey | `...${WildSlugKey}`>;
|
|
41
|
-
export type CreatePage = <Path extends string, SlugKey extends string, WildSlugKey extends string>(page: ({
|
|
42
|
-
render: 'static';
|
|
43
|
-
path: PathWithoutSlug<Path>;
|
|
44
|
-
component: FunctionComponent<RouteProps>;
|
|
45
|
-
} | {
|
|
46
|
-
render: 'static';
|
|
47
|
-
path: PathWithStaticSlugs<Path>;
|
|
48
|
-
staticPaths: StaticSlugRoutePaths<Path>;
|
|
49
|
-
component: FunctionComponent<RouteProps & Record<SlugKey, string>>;
|
|
50
|
-
} | {
|
|
51
|
-
render: 'dynamic';
|
|
52
|
-
path: PathWithoutSlug<Path>;
|
|
53
|
-
component: FunctionComponent<RouteProps>;
|
|
54
|
-
} | {
|
|
55
|
-
render: 'dynamic';
|
|
56
|
-
path: PathWithWildcard<Path, SlugKey, WildSlugKey>;
|
|
57
|
-
component: FunctionComponent<RouteProps & Record<SlugKey, string> & Record<WildSlugKey, string[]>>;
|
|
58
|
-
}) & {
|
|
59
|
-
unstable_disableSSR?: boolean;
|
|
60
|
-
}) => void;
|
|
61
|
-
export type CreateLayout = <T extends string>(layout: {
|
|
62
|
-
render: 'static' | 'dynamic';
|
|
63
|
-
path: PathWithoutSlug<T>;
|
|
64
|
-
component: FunctionComponent<Omit<RouteProps, 'searchParams'> & {
|
|
65
|
-
children: ReactNode;
|
|
66
|
-
}>;
|
|
67
|
-
}) => void;
|
|
68
|
-
export declare function createPages(fn: (fns: {
|
|
69
|
-
createPage: CreatePage;
|
|
70
|
-
createLayout: CreateLayout;
|
|
71
|
-
unstable_setBuildData: (path: string, data: unknown) => void;
|
|
72
|
-
}, opts: {
|
|
73
|
-
unstable_buildConfig: BuildConfig | undefined;
|
|
74
|
-
}) => Promise<void>): {
|
|
75
|
-
renderEntries: import("../server").RenderEntries;
|
|
76
|
-
getBuildConfig: import("../server").GetBuildConfig | undefined;
|
|
77
|
-
getSsrConfig: import("../server").GetSsrConfig | undefined;
|
|
78
|
-
};
|
|
79
|
-
export {};
|
|
80
|
-
//# sourceMappingURL=create-pages.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-pages.d.ts","sourceRoot":"","sources":["../../../src/rsc/router/create-pages.ts"],"names":[],"mappings":"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"}
|