111 lines
5.1 KiB
JavaScript
111 lines
5.1 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const _ctx_1 = require("expo-router/_ctx");
|
|
const routing_1 = require("expo-router/internal/routing");
|
|
const create_expo_pages_1 = require("./create-expo-pages");
|
|
const getRoutesSSR_1 = require("../../getRoutesSSR");
|
|
const loadStaticParamsAsync_1 = require("../../loadStaticParamsAsync");
|
|
const UNIMPLEMENTED_PARAMS = new Proxy({}, {
|
|
// Assert that params is unimplemented when accessed.
|
|
get() {
|
|
throw new Error('generateStaticParams(): params is not implemented yet');
|
|
},
|
|
});
|
|
exports.default = (0, create_expo_pages_1.createExpoPages)(async ({ createPage, createLayout }, { getRouteOptions }) => {
|
|
const routes = (0, getRoutesSSR_1.getRoutes)(_ctx_1.ctx, {
|
|
...getRouteOptions,
|
|
platform: process.env.EXPO_OS,
|
|
skipGenerated: true,
|
|
importMode: 'lazy',
|
|
});
|
|
if (!routes)
|
|
return;
|
|
async function loadAndConvertStaticParamsAsync(route) {
|
|
const loaded = route.loadRoute();
|
|
let staticPaths = undefined;
|
|
if (route.dynamic) {
|
|
const params = await (0, loadStaticParamsAsync_1.evalStaticParamsAsync)(route, { parentParams: UNIMPLEMENTED_PARAMS }, loaded.generateStaticParams);
|
|
// Sort `params` like `[{a: 'x', b: 'y'}, { a: 'z', b: 'w' }]` for a route.dynamic like `[{name: 'a', deep: false}, {name: 'b', deep: false}]` to `[['a', 'y'], ['z', 'w]]`
|
|
staticPaths = params?.map((p) => {
|
|
const grouped = [];
|
|
for (const dynamic of route.dynamic) {
|
|
const defined = p[dynamic.name];
|
|
if (!defined) {
|
|
throw new Error('generateStaticParams is missing param: ' +
|
|
dynamic.name +
|
|
'. In route: ' +
|
|
route.contextKey);
|
|
}
|
|
if (Array.isArray(defined)) {
|
|
if (defined.length > 1) {
|
|
throw new Error('generateStaticParams does not support returning multiple static paths for deep dynamic routes in React Server Components yet. Update route: ' +
|
|
route.contextKey);
|
|
}
|
|
}
|
|
const first = Array.isArray(defined) ? defined[0] : defined;
|
|
grouped.push(first);
|
|
}
|
|
return grouped;
|
|
});
|
|
}
|
|
else if (loaded.generateStaticParams) {
|
|
throw new Error('Cannot use generateStaticParams without a dynamic route: ' + route.contextKey);
|
|
}
|
|
return staticPaths;
|
|
}
|
|
async function addLayout(route) {
|
|
const normal = (0, routing_1.getContextKey)(route.contextKey).replace(/\/index$/, '');
|
|
const loaded = route.loadRoute();
|
|
if (loaded.generateStaticParams) {
|
|
throw new Error('generateStaticParams is not supported in _layout routes with React Server Components enabled yet.');
|
|
}
|
|
createLayout({
|
|
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
component: loaded.default,
|
|
path: normal,
|
|
render: 'static',
|
|
...loaded.unstable_settings,
|
|
});
|
|
await Promise.all(route.children.sort(routing_1.sortRoutes).map(async (child) => {
|
|
if (child.type === 'layout') {
|
|
await addLayout(child);
|
|
}
|
|
else {
|
|
const normal = (0, routing_1.getContextKey)(child.contextKey).replace(/\/index$/, '');
|
|
const loaded = child.loadRoute();
|
|
const settings = loaded.unstable_settings;
|
|
// Support generateStaticParams for dynamic routes by defining the route twice.
|
|
if (loaded.generateStaticParams) {
|
|
createPage({
|
|
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
component: loaded.default,
|
|
path: normal,
|
|
render: 'static',
|
|
...loaded.unstable_settings,
|
|
staticPaths: (await loadAndConvertStaticParamsAsync(child)),
|
|
});
|
|
if (settings?.render !== 'static') {
|
|
createPage({
|
|
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
component: loaded.default,
|
|
path: normal,
|
|
render: 'dynamic',
|
|
...settings,
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
createPage({
|
|
// NOTE(EvanBacon): Support routes with top-level "use client"
|
|
component: loaded.default,
|
|
path: normal,
|
|
render: 'dynamic',
|
|
...settings,
|
|
});
|
|
}
|
|
}
|
|
}));
|
|
}
|
|
await addLayout(routes);
|
|
});
|
|
//# sourceMappingURL=expo-definedRouter.js.map
|