expo-router 4.0.0-preview.11 → 4.0.0-preview.12
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/fast-refresh.d.ts.map +1 -1
- package/build/fast-refresh.js.map +1 -1
- package/build/getRoutesCore.d.ts +1 -0
- package/build/getRoutesCore.d.ts.map +1 -1
- package/build/getRoutesCore.js +3 -1
- package/build/getRoutesCore.js.map +1 -1
- package/build/head/url.d.ts +1 -0
- package/build/head/url.d.ts.map +1 -1
- package/build/head/url.js +21 -4
- package/build/head/url.js.map +1 -1
- package/build/hooks.d.ts +90 -38
- package/build/hooks.d.ts.map +1 -1
- package/build/hooks.js +46 -39
- package/build/hooks.js.map +1 -1
- package/build/imperative-api.d.ts +58 -15
- package/build/imperative-api.d.ts.map +1 -1
- package/build/imperative-api.js.map +1 -1
- package/build/layouts/withLayoutContext.d.ts +4 -1
- package/build/layouts/withLayoutContext.d.ts.map +1 -1
- package/build/layouts/withLayoutContext.js +4 -1
- package/build/layouts/withLayoutContext.js.map +1 -1
- package/build/link/Link.d.ts +48 -4
- package/build/link/Link.d.ts.map +1 -1
- package/build/link/Link.js +47 -3
- package/build/link/Link.js.map +1 -1
- package/build/link/href.d.ts +1 -1
- package/build/link/href.d.ts.map +1 -1
- package/build/link/href.js.map +1 -1
- package/build/link/useLinkHooks.d.ts +122 -29
- package/build/link/useLinkHooks.d.ts.map +1 -1
- package/build/link/useLinkHooks.js.map +1 -1
- package/build/rsc/exports.d.ts +3 -1
- package/build/rsc/exports.d.ts.map +1 -1
- package/build/rsc/exports.js +3 -1
- package/build/rsc/exports.js.map +1 -1
- package/build/rsc/router/client.d.ts +2 -2
- package/build/rsc/router/client.d.ts.map +1 -1
- package/build/rsc/router/client.js.map +1 -1
- package/build/rsc/router/host.d.ts.map +1 -1
- package/build/rsc/router/host.js +20 -15
- package/build/rsc/router/host.js.map +1 -1
- package/build/rsc/rsc-renderer.d.ts +1 -1
- package/build/rsc/rsc-renderer.d.ts.map +1 -1
- package/build/rsc/rsc-renderer.js +1 -1
- package/build/rsc/rsc-renderer.js.map +1 -1
- package/build/testing-library/context-stubs.d.ts.map +1 -1
- package/build/testing-library/context-stubs.js +3 -1
- package/build/testing-library/context-stubs.js.map +1 -1
- package/build/testing-library/mocks.js +14 -13
- package/build/testing-library/mocks.js.map +1 -1
- package/build/typed-routes/generate.d.ts +5 -1
- package/build/typed-routes/generate.d.ts.map +1 -1
- package/build/typed-routes/generate.js +129 -64
- package/build/typed-routes/generate.js.map +1 -1
- package/build/typed-routes/index.d.ts +5 -0
- package/build/typed-routes/index.d.ts.map +1 -1
- package/build/typed-routes/index.js +8 -3
- package/build/typed-routes/index.js.map +1 -1
- package/build/typed-routes/testSetup.d.ts +1 -1
- package/build/typed-routes/testSetup.d.ts.map +1 -1
- package/build/typed-routes/testSetup.js +29 -17
- package/build/typed-routes/testSetup.js.map +1 -1
- package/build/typed-routes/types.d.ts +43 -145
- package/build/typed-routes/types.d.ts.map +1 -1
- package/build/typed-routes/types.js.map +1 -1
- package/build/types.d.ts +33 -0
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/build/ui/TabContext.d.ts +157 -1
- package/build/ui/TabContext.d.ts.map +1 -1
- package/build/ui/TabContext.js +25 -1
- package/build/ui/TabContext.js.map +1 -1
- package/build/ui/TabList.d.ts +16 -0
- package/build/ui/TabList.d.ts.map +1 -1
- package/build/ui/TabList.js +16 -0
- package/build/ui/TabList.js.map +1 -1
- package/build/ui/TabSlot.d.ts +41 -5
- package/build/ui/TabSlot.d.ts.map +1 -1
- package/build/ui/TabSlot.js +36 -14
- package/build/ui/TabSlot.js.map +1 -1
- package/build/ui/TabTrigger.d.ts +50 -68
- package/build/ui/TabTrigger.d.ts.map +1 -1
- package/build/ui/TabTrigger.js +23 -1
- package/build/ui/TabTrigger.js.map +1 -1
- package/build/ui/Tabs.d.ts +96 -132
- package/build/ui/Tabs.d.ts.map +1 -1
- package/build/ui/Tabs.js +48 -8
- package/build/ui/Tabs.js.map +1 -1
- package/build/ui/common.d.ts +3 -3
- package/build/ui/common.d.ts.map +1 -1
- package/build/ui/common.js.map +1 -1
- package/build/useFocusEffect.d.ts +15 -6
- package/build/useFocusEffect.d.ts.map +1 -1
- package/build/useFocusEffect.js +15 -6
- package/build/useFocusEffect.js.map +1 -1
- package/build/useNavigation.d.ts +11 -5
- package/build/useNavigation.d.ts.map +1 -1
- package/build/useNavigation.js +11 -5
- package/build/useNavigation.js.map +1 -1
- package/build/views/Navigator.d.ts +6 -5
- package/build/views/Navigator.d.ts.map +1 -1
- package/build/views/Navigator.js +6 -5
- package/build/views/Navigator.js.map +1 -1
- package/build/views/Try.d.ts +1 -1
- package/build/views/Try.d.ts.map +1 -1
- package/build/views/Try.js.map +1 -1
- package/entry-classic.js +0 -6
- package/package.json +3 -4
- package/plugin/build/index.d.ts +2 -0
- package/plugin/options.json +74 -73
- package/rsc/entry.js +0 -6
- package/build/rsc/runtime.d.ts +0 -9
- package/build/rsc/runtime.d.ts.map +0 -1
- package/build/rsc/runtime.js +0 -36
- package/build/rsc/runtime.js.map +0 -1
- package/virtual-client-boundaries.js +0 -1
|
@@ -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';\n\nconst { createFromFetch, encodeReply } = RSDWClient;\n\n// NOTE: Ensured to start with `/`.\nconst RSC_PATH = '/_flight/' + process.env.EXPO_OS; // process.env.EXPO_RSC_PATH;\n\nlet BASE_PATH = `${process.env.EXPO_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\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) : getAdjustedFilePath(url);\n const url = getAdjustedFilePath(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 (process.env.EXPO_OS === 'web') {\n return path;\n }\n\n return new URL(path, window.location.href).toString();\n}\n\nfunction getAdjustedFilePath(path: string): string {\n if (process.env.EXPO_OS === 'web') {\n return path;\n }\n\n // Server actions should be fetched from the server every time.\n if (path.match(/[0-9a-z]{40}#/i)) {\n return getAdjustedRemoteFilePath(path);\n }\n\n return getAdjustedRemoteFilePath(path);\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 = getAdjustedFilePath(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\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"]}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* From waku https://github.com/dai-shi/waku/blob/32d52242c1450b5f5965860e671ff73c42da8bd0/packages/waku/src/lib/renderers/rsc-renderer.ts
|
|
9
9
|
*/
|
|
10
|
-
import '
|
|
10
|
+
import '@expo/metro-runtime/rsc/runtime';
|
|
11
11
|
import { type EntriesDev } from './server';
|
|
12
12
|
export interface RenderContext<T = unknown> {
|
|
13
13
|
rerender: (input: string, searchParams?: URLSearchParams) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsc-renderer.d.ts","sourceRoot":"","sources":["../../src/rsc/rsc-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,
|
|
1
|
+
{"version":3,"file":"rsc-renderer.d.ts","sourceRoot":"","sources":["../../src/rsc/rsc-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,iCAAiC,CAAC;AAOzC,OAAO,EAAsB,KAAK,UAAU,EAAmB,MAAM,UAAU,CAAC;AAEhF,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,KAAK,cAAc,GAAG,GAAG,CAAC;AAE1B,MAAM,MAAM,aAAa,GAAG;IAE1B,MAAM,EAAE,cAAc,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,IAAI,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE;QAC1B,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KAChB,KAAK,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,kBAAkB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE5F,KAAK,aAAa,GAAG;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACpD,CAAC;AAEF,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAwKjG"}
|
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.renderRsc = void 0;
|
|
13
13
|
// This file must remain platform agnostic for production exports.
|
|
14
14
|
// Import the runtime to support polyfills for webpack to load modules in the server using Metro.
|
|
15
|
-
require("
|
|
15
|
+
require("@expo/metro-runtime/rsc/runtime");
|
|
16
16
|
const server_1 = require("react-server-dom-webpack/server");
|
|
17
17
|
const path_1 = require("./path");
|
|
18
18
|
const utils_1 = require("./router/utils");
|
|
@@ -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 './runtime';\n\nimport type { ReactNode } from 'react';\nimport { renderToReadableStream, decodeReply } from 'react-server-dom-webpack/server';\n\nimport { fileURLToFilePath } from './path';\nimport { decodeActionId } from './router/utils';\nimport { runWithRenderStore, type EntriesDev, type EntriesPrd } from './server';\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 = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n return resolveRequest(false, encodedId);\n },\n }\n );\n\n const serverConfig = 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_ACTIONS\n ) {\n throw new Error('Experimental support for React Server Actions is not enabled');\n }\n\n const args = Array.isArray(decodedBody) ? decodedBody : [];\n\n const chunkInfo = serverConfig[actionId];\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 type { ReactNode } from 'react';\nimport { renderToReadableStream, decodeReply } from 'react-server-dom-webpack/server';\n\nimport { fileURLToFilePath } from './path';\nimport { decodeActionId } from './router/utils';\nimport { runWithRenderStore, type EntriesDev, type EntriesPrd } from './server';\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 = new Proxy(\n {},\n {\n get(_target, encodedId: string) {\n return resolveRequest(false, encodedId);\n },\n }\n );\n\n const serverConfig = 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_ACTIONS\n ) {\n throw new Error('Experimental support for React Server Actions is not enabled');\n }\n\n const args = Array.isArray(decodedBody) ? decodedBody : [];\n\n const chunkInfo = serverConfig[actionId];\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-stubs.d.ts","sourceRoot":"","sources":["../../src/testing-library/context-stubs.ts"],"names":[],"mappings":";AAEA,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AACvE,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAC5C,MAAM,MAAM,QAAQ,GAChB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACzC,CAAC,GACF,cAAc,CAAC;AAEnB,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,gBAAgB,CAAC,GAAG;IACxE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,SAEpC,MAAM;;;;;;mBAKH,MAAM;;;
|
|
1
|
+
{"version":3,"file":"context-stubs.d.ts","sourceRoot":"","sources":["../../src/testing-library/context-stubs.ts"],"names":[],"mappings":";AAEA,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;AACvE,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAC5C,MAAM,MAAM,QAAQ,GAChB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACzC,CAAC,GACF,cAAc,CAAC;AAEnB,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,gBAAgB,CAAC,GAAG;IACxE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC;AAI1B,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,SAEpC,MAAM;;;;;;mBAKH,MAAM;;;EAa1B;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,SAI/D,MAAM;;mBAUH,MAAM;;EAI1B"}
|
|
@@ -18,7 +18,9 @@ function inMemoryContext(context) {
|
|
|
18
18
|
keys: () => Object.keys(context).map((key) => {
|
|
19
19
|
const ext = path_1.default.extname(key);
|
|
20
20
|
key = key.replace(/^\.\//, '');
|
|
21
|
-
|
|
21
|
+
key = key.startsWith('/') ? key : `./${key}`;
|
|
22
|
+
key = validExtensions.includes(ext) ? key : `${key}.js`;
|
|
23
|
+
return key;
|
|
22
24
|
}),
|
|
23
25
|
});
|
|
24
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-stubs.js","sourceRoot":"","sources":["../../src/testing-library/context-stubs.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,0FAAwD;AAgB/C,yBAhBF,kCAAc,CAgBE;AAEvB,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvD,SAAgB,eAAe,CAAC,OAAsB;IACpD,OAAO,MAAM,CAAC,MAAM,CAClB,UAAU,EAAU;QAClB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,OAAO,OAAO,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC,EACD;QACE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC7B,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,GAAG,EAAE,CACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/B,
|
|
1
|
+
{"version":3,"file":"context-stubs.js","sourceRoot":"","sources":["../../src/testing-library/context-stubs.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,0FAAwD;AAgB/C,yBAhBF,kCAAc,CAgBE;AAEvB,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAEvD,SAAgB,eAAe,CAAC,OAAsB;IACpD,OAAO,MAAM,CAAC,MAAM,CAClB,UAAU,EAAU;QAClB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,OAAO,OAAO,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC,EACD;QACE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC7B,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,GAAG,EAAE,CACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/B,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7C,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;YAExD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;KACL,CACF,CAAC;AACJ,CAAC;AApBD,0CAoBC;AAED,SAAgB,2BAA2B,CAAC,GAAW,EAAE,SAAwB;IAC/E,MAAM,eAAe,GAAG,IAAA,kCAAc,EAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzE,OAAO,MAAM,CAAC,MAAM,CAClB,UAAU,EAAU;QAClB,IAAI,EAAE,IAAI,SAAS,EAAE;YACnB,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;SACjE;aAAM;YACL,OAAO,eAAe,CAAC,EAAE,CAAC,CAAC;SAC5B;IACH,CAAC,EACD;QACE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;QAClE,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC7B,EAAE,EAAE,GAAG;KACR,CACF,CAAC;AACJ,CAAC;AAlBD,kEAkBC","sourcesContent":["import path from 'path';\n\nimport requireContext from './require-context-ponyfill';\nimport { NativeIntent } from '../types';\n\nexport type ReactComponent = () => React.ReactElement<any, any> | null;\nexport type NativeIntentStub = NativeIntent;\nexport type FileStub =\n | (Record<string, unknown> & {\n default: ReactComponent;\n unstable_settings?: Record<string, any>;\n })\n | ReactComponent;\n\nexport type MemoryContext = Record<string, FileStub | NativeIntentStub> & {\n '+native-intent'?: NativeIntentStub;\n};\n\nexport { requireContext };\n\nconst validExtensions = ['.js', '.jsx', '.ts', '.tsx'];\n\nexport function inMemoryContext(context: MemoryContext) {\n return Object.assign(\n function (id: string) {\n id = id.replace(/^\\.\\//, '').replace(/\\.\\w*$/, '');\n return typeof context[id] === 'function' ? { default: context[id] } : context[id];\n },\n {\n resolve: (key: string) => key,\n id: '0',\n keys: () =>\n Object.keys(context).map((key) => {\n const ext = path.extname(key);\n key = key.replace(/^\\.\\//, '');\n key = key.startsWith('/') ? key : `./${key}`;\n key = validExtensions.includes(ext) ? key : `${key}.js`;\n\n return key;\n }),\n }\n );\n}\n\nexport function requireContextWithOverrides(dir: string, overrides: MemoryContext) {\n const existingContext = requireContext(path.resolve(process.cwd(), dir));\n\n return Object.assign(\n function (id: string) {\n if (id in overrides) {\n const route = overrides[id];\n return typeof route === 'function' ? { default: route } : route;\n } else {\n return existingContext(id);\n }\n },\n {\n keys: () => [...Object.keys(overrides), ...existingContext.keys()],\n resolve: (key: string) => key,\n id: '0',\n }\n );\n}\n"]}
|
|
@@ -9,19 +9,20 @@ try {
|
|
|
9
9
|
require('react-native-gesture-handler/jestSetup');
|
|
10
10
|
}
|
|
11
11
|
catch { }
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
}
|
|
12
|
+
try {
|
|
13
|
+
require('react-native-reanimated');
|
|
14
|
+
jest.mock('react-native-reanimated', () => {
|
|
15
|
+
try {
|
|
16
|
+
const Reanimated = require('react-native-reanimated/mock');
|
|
17
|
+
Reanimated.default.call = () => { }; // Override `call` with a no-op if needed
|
|
18
|
+
return Reanimated;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch { }
|
|
25
26
|
jest.mock('expo-linking', () => {
|
|
26
27
|
const module = {
|
|
27
28
|
...jest.requireActual('expo-linking'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/testing-library/mocks.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,IAAI;IACF,OAAO,CAAC,4CAA4C,CAAC,CAAC;CACvD;AAAC,MAAM,GAAE;AAEV,IAAI;IACF,OAAO,CAAC,wCAAwC,CAAC,CAAC;CACnD;AAAC,MAAM,GAAE;AAEV,
|
|
1
|
+
{"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/testing-library/mocks.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,IAAI;IACF,OAAO,CAAC,4CAA4C,CAAC,CAAC;CACvD;AAAC,MAAM,GAAE;AAEV,IAAI;IACF,OAAO,CAAC,wCAAwC,CAAC,CAAC;CACnD;AAAC,MAAM,GAAE;AAEV,IAAI;IACF,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACxC,IAAI;YACF,MAAM,UAAU,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAC3D,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,yCAAyC;YAC7E,OAAO,UAAU,CAAC;SACnB;QAAC,MAAM;YACN,OAAO,EAAE,CAAC;SACX;IACH,CAAC,CAAC,CAAC;CACJ;AAAC,MAAM,GAAE;AAEV,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,MAAM,MAAM,GAAkC;QAC5C,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;QACrC,SAAS,CAAC,IAAY;YACpB,OAAO,eAAe,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,aAAa;YACX,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,gBAAgB;YACd,OAAO,EAAE,MAAM,KAAI,CAAC,EAAS,CAAC;QAChC,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC","sourcesContent":["/*\n * Optionally enable @testing-library/jest-native/extend-expect. We use this internally for the `toBeOnTheScreen` matcher()\n */\ntry {\n require('@testing-library/jest-native/extend-expect');\n} catch {}\n\ntry {\n require('react-native-gesture-handler/jestSetup');\n} catch {}\n\ntry {\n require('react-native-reanimated');\n jest.mock('react-native-reanimated', () => {\n try {\n const Reanimated = require('react-native-reanimated/mock');\n Reanimated.default.call = () => {}; // Override `call` with a no-op if needed\n return Reanimated;\n } catch {\n return {};\n }\n });\n} catch {}\n\njest.mock('expo-linking', () => {\n const module: typeof import('expo-linking') = {\n ...jest.requireActual('expo-linking'),\n createURL(path: string) {\n return 'yourscheme://' + path;\n },\n resolveScheme() {\n return 'yourscheme';\n },\n addEventListener() {\n return { remove() {} } as any;\n },\n };\n\n return module;\n});\n"]}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { RequireContext } from '../types';
|
|
2
|
-
export
|
|
2
|
+
export type GetTypedRoutesDeclarationFileOptions = {
|
|
3
|
+
partialTypedGroups?: boolean;
|
|
4
|
+
testIgnoreComments?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function getTypedRoutesDeclarationFile(ctx: RequireContext, { partialTypedGroups, testIgnoreComments, }?: GetTypedRoutesDeclarationFileOptions): string;
|
|
3
7
|
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/typed-routes/generate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/typed-routes/generate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C,MAAM,MAAM,oCAAoC,GAAG;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,cAAc,EACnB,EACE,kBAA0B,EAC1B,kBAA0B,GAC3B,GAAE,oCAAyC,UA4G7C"}
|
|
@@ -7,24 +7,74 @@ const matchers_1 = require("../matchers");
|
|
|
7
7
|
const CATCH_ALL = /\[\.\.\..+?\]/g;
|
|
8
8
|
// /[param1] - Match [param1]
|
|
9
9
|
const SLUG = /\[.+?\]/g;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const dynamicRouteContextKeys = new Set();
|
|
10
|
+
// /(group)/path/(group2)/route - Match [(group), (group2)]
|
|
11
|
+
const GROUP = /(?:^|\/)\(.*?\)/g;
|
|
12
|
+
function getTypedRoutesDeclarationFile(ctx, { partialTypedGroups = false, testIgnoreComments = false, } = {}) {
|
|
14
13
|
let routeNode = null;
|
|
15
14
|
try {
|
|
16
15
|
routeNode = (0, getRoutes_1.getRoutes)(ctx, {
|
|
16
|
+
ignore: [/_layout\.[tj]sx?$/],
|
|
17
17
|
platformRoutes: false,
|
|
18
|
+
notFound: false,
|
|
18
19
|
ignoreEntryPoints: true,
|
|
19
20
|
ignoreRequireErrors: true,
|
|
20
|
-
importMode: 'async',
|
|
21
|
+
importMode: 'async', // Don't load the file
|
|
21
22
|
});
|
|
22
23
|
}
|
|
23
24
|
catch {
|
|
24
25
|
// Ignore errors from `getRoutes`. This is also called inside the app, which has
|
|
25
26
|
// a nicer UX for showing error messages
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
+
const groupedNodes = groupRouteNodes(routeNode);
|
|
29
|
+
const staticRoutesStrings = ['Router.RelativePathString', 'Router.ExternalPathString'];
|
|
30
|
+
const staticRouteInputObjects = [
|
|
31
|
+
'{ pathname: Router.RelativePathString, params?: Router.UnknownInputParams }',
|
|
32
|
+
'{ pathname: Router.ExternalPathString, params?: Router.UnknownInputParams }',
|
|
33
|
+
];
|
|
34
|
+
const staticRouteOutputObjects = [
|
|
35
|
+
'{ pathname: Router.RelativePathString, params?: Router.UnknownOutputParams }',
|
|
36
|
+
'{ pathname: Router.ExternalPathString, params?: Router.UnknownOutputParams }',
|
|
37
|
+
];
|
|
38
|
+
for (const type of groupedNodes.static) {
|
|
39
|
+
staticRoutesStrings.push(contextKeyToType(type + "${`?${string}` | `#${string}` | ''}", partialTypedGroups));
|
|
40
|
+
staticRouteInputObjects.push(`{ pathname: ${contextKeyToType(type, partialTypedGroups)}; params?: Router.UnknownInputParams; }`);
|
|
41
|
+
staticRouteOutputObjects.push(`{ pathname: ${contextKeyToType(type, partialTypedGroups)}; params?: Router.UnknownOutputParams; }`);
|
|
42
|
+
}
|
|
43
|
+
const dynamicRouteStrings = [];
|
|
44
|
+
const dynamicRouteInputObjects = [];
|
|
45
|
+
const dynamicRouteOutputObjects = [];
|
|
46
|
+
for (const [dynamicRouteTemplate, paramsNames] of groupedNodes.dynamic) {
|
|
47
|
+
const inputParams = paramsNames
|
|
48
|
+
.map((param) => {
|
|
49
|
+
const key = param.startsWith('...') ? param.slice(3) : param;
|
|
50
|
+
const value = param.startsWith('...') ? '(string | number)[]' : 'string | number';
|
|
51
|
+
return `${key}: ${value};`;
|
|
52
|
+
})
|
|
53
|
+
.join('');
|
|
54
|
+
const outputParams = paramsNames
|
|
55
|
+
.map((param) => {
|
|
56
|
+
const key = param.startsWith('...') ? param.slice(3) : param;
|
|
57
|
+
const value = param.startsWith('...') ? 'string[]' : 'string';
|
|
58
|
+
return `${key}: ${value};`;
|
|
59
|
+
})
|
|
60
|
+
.join('');
|
|
61
|
+
dynamicRouteStrings.push(contextKeyToType(dynamicRouteTemplate
|
|
62
|
+
.replaceAll(CATCH_ALL, '${string}')
|
|
63
|
+
.replaceAll(SLUG, '${Router.SingleRoutePart<T>}'), partialTypedGroups));
|
|
64
|
+
dynamicRouteInputObjects.push(`{ pathname: ${contextKeyToType(dynamicRouteTemplate, partialTypedGroups)}, params: Router.UnknownInputParams & { ${inputParams} } }`);
|
|
65
|
+
dynamicRouteOutputObjects.push(`{ pathname: ${contextKeyToType(dynamicRouteTemplate, partialTypedGroups)}, params: Router.UnknownOutputParams & { ${outputParams} } }`);
|
|
66
|
+
}
|
|
67
|
+
const href = [
|
|
68
|
+
...staticRoutesStrings,
|
|
69
|
+
...staticRouteInputObjects,
|
|
70
|
+
...dynamicRouteStrings,
|
|
71
|
+
...dynamicRouteInputObjects,
|
|
72
|
+
].join(' | ');
|
|
73
|
+
const hrefInputParams = [...staticRouteInputObjects, ...dynamicRouteInputObjects].join(' | ');
|
|
74
|
+
const hrefOutputParams = [...staticRouteOutputObjects, ...dynamicRouteOutputObjects].join(' | ');
|
|
75
|
+
const tsExpectError = testIgnoreComments
|
|
76
|
+
? '// @ts-ignore-error -- During tests we need to ignore the "duplicate" declaration error, as multiple fixture declare types \n '
|
|
77
|
+
: '';
|
|
28
78
|
return `/* eslint-disable */
|
|
29
79
|
import * as Router from 'expo-router';
|
|
30
80
|
|
|
@@ -32,78 +82,93 @@ export * from 'expo-router';
|
|
|
32
82
|
|
|
33
83
|
declare module 'expo-router' {
|
|
34
84
|
export namespace ExpoRouter {
|
|
35
|
-
export interface __routes<T extends string
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
85
|
+
export interface __routes<T extends string | object = string> {
|
|
86
|
+
${tsExpectError}hrefInputParams: ${hrefInputParams};
|
|
87
|
+
${tsExpectError}hrefOutputParams: ${hrefOutputParams};
|
|
88
|
+
${tsExpectError}href: ${href};
|
|
39
89
|
}
|
|
40
90
|
}
|
|
41
91
|
}
|
|
42
92
|
`;
|
|
43
93
|
}
|
|
44
94
|
exports.getTypedRoutesDeclarationFile = getTypedRoutesDeclarationFile;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (!routeNode)
|
|
50
|
-
return;
|
|
51
|
-
addRouteNode(routeNode, parentRoutePath, staticRoutes, dynamicRoutes, dynamicRouteContextKeys);
|
|
52
|
-
parentRoutePath = `${(0, matchers_1.removeSupportedExtensions)(`${parentRoutePath}/${routeNode.route}`).replace(/\/?index$/, '')}`; // replace /index with /
|
|
53
|
-
for (const child of routeNode.children) {
|
|
54
|
-
walkRouteNode(child, parentRoutePath, staticRoutes, dynamicRoutes, dynamicRouteContextKeys);
|
|
95
|
+
function groupRouteNodes(routeNode, groupedContextKeys = {
|
|
96
|
+
static: new Set(),
|
|
97
|
+
dynamic: new Map(),
|
|
98
|
+
}) {
|
|
99
|
+
if (!routeNode) {
|
|
100
|
+
return groupedContextKeys;
|
|
55
101
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
102
|
+
// Skip non-route files
|
|
103
|
+
if (routeNode.type !== 'route') {
|
|
104
|
+
// Except the root layout
|
|
105
|
+
if (routeNode.route === '') {
|
|
106
|
+
for (const child of routeNode.children) {
|
|
107
|
+
groupRouteNodes(child, groupedContextKeys);
|
|
108
|
+
}
|
|
109
|
+
return groupedContextKeys;
|
|
110
|
+
}
|
|
111
|
+
return groupedContextKeys;
|
|
112
|
+
}
|
|
113
|
+
let routeKey;
|
|
114
|
+
if (routeNode.generated) {
|
|
115
|
+
// Some routes like the root _layout, _sitemap, +not-found are generated.
|
|
116
|
+
// We cannot use the contextKey, as their context key does not specify a route
|
|
117
|
+
routeKey = routeNode.route;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
routeKey = (0, matchers_1.removeSupportedExtensions)(routeNode.contextKey)
|
|
121
|
+
.replace(/\/index$/, '') // Remove any trailing /index
|
|
122
|
+
.replace(/^\./, ''); // Remove any leading .
|
|
123
|
+
}
|
|
124
|
+
routeKey ||= '/'; // A routeKey may be empty for contextKey '' or './index.js'
|
|
125
|
+
if (!routeKey.startsWith('/')) {
|
|
126
|
+
// Not all generated files will have the `/` prefix
|
|
127
|
+
routeKey = `/${routeKey}`;
|
|
69
128
|
}
|
|
70
129
|
if (routeNode.dynamic) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
130
|
+
groupedContextKeys.dynamic.set(routeKey, routeKey
|
|
131
|
+
.split('/')
|
|
132
|
+
.filter((segment) => {
|
|
133
|
+
return segment.startsWith('[') && segment.endsWith(']');
|
|
134
|
+
})
|
|
135
|
+
.map((segment) => {
|
|
136
|
+
return segment.slice(1, -1);
|
|
137
|
+
}));
|
|
75
138
|
}
|
|
76
139
|
else {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
140
|
+
groupedContextKeys.static.add(routeKey);
|
|
141
|
+
}
|
|
142
|
+
for (const child of routeNode.children) {
|
|
143
|
+
groupRouteNodes(child, groupedContextKeys);
|
|
80
144
|
}
|
|
145
|
+
return groupedContextKeys;
|
|
81
146
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
.map((
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return;
|
|
147
|
+
function contextKeyToType(contextKey, partialTypedGroups) {
|
|
148
|
+
// If the route has groups, turn them into template strings
|
|
149
|
+
const typeWithGroups = contextKey.replaceAll(GROUP, (match) => {
|
|
150
|
+
const groups = match.slice(2, -1); // Remove the leading ( and the trailing )
|
|
151
|
+
// When `partialRoutes` is enabled, we always change a group to a template
|
|
152
|
+
if (groups.length > 1 || partialTypedGroups) {
|
|
153
|
+
// Ensure each group has the trailing slash
|
|
154
|
+
const groupsAsType = groups.split(',').map((group) => `'/(${group})'`);
|
|
155
|
+
// `partialRoutes` allow you to skip a group
|
|
156
|
+
if (partialTypedGroups) {
|
|
157
|
+
groupsAsType.push("''");
|
|
158
|
+
}
|
|
159
|
+
// Combine together into a union
|
|
160
|
+
return `\${${groupsAsType.join(' | ')}}`;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
return match;
|
|
100
164
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
165
|
+
});
|
|
166
|
+
const typeWithoutGroups = contextKey.replaceAll(GROUP, '');
|
|
167
|
+
if (typeWithGroups === typeWithoutGroups) {
|
|
168
|
+
return `\`${typeWithGroups}\``;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return `\`${typeWithGroups}\` | \`${typeWithoutGroups}\``;
|
|
105
172
|
}
|
|
106
|
-
generate(0, pathname);
|
|
107
|
-
return combinations;
|
|
108
173
|
}
|
|
109
174
|
//# sourceMappingURL=generate.js.map
|