vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
109 lines (108 loc) • 5.21 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.route = route;
// Ensure we don't bloat runtime of Server Routing
const assertRoutingType_js_1 = require("../../utils/assertRoutingType.js");
const isBrowser_js_1 = require("../../utils/isBrowser.js");
if ((0, isBrowser_js_1.isBrowser)()) {
(0, assertRoutingType_js_1.assertClientRouting)();
}
const utils_js_1 = require("./utils.js");
const resolvePrecedence_js_1 = require("./resolvePrecedence.js");
const resolveRouteString_js_1 = require("./resolveRouteString.js");
const resolveRouteFunction_js_1 = require("./resolveRouteFunction.js");
const execHookOnBeforeRoute_js_1 = require("./execHookOnBeforeRoute.js");
const debug_js_1 = require("./debug.js");
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
// TODO/next-major-release: make it sync
async function route(pageContext, skipOnBeforeRouteHook) {
(0, debug_js_1.debug)('Pages routes:', pageContext._globalContext._pageRoutes);
const pageContextFromRoute = {};
// onBeforeRoute()
if (!skipOnBeforeRouteHook) {
const pageContextFromOnBeforeRouteHook = await (0, execHookOnBeforeRoute_js_1.execHookOnBeforeRoute)(pageContext);
if (pageContextFromOnBeforeRouteHook) {
if (pageContextFromOnBeforeRouteHook._routingProvidedByOnBeforeRouteHook) {
(0, utils_js_1.assert)(pageContextFromOnBeforeRouteHook.pageId);
return pageContextFromOnBeforeRouteHook;
}
else {
(0, utils_js_1.objectAssign)(pageContextFromRoute, pageContextFromOnBeforeRouteHook);
}
}
// We take into account pageContext.urlLogical set by onBeforeRoute()
(0, utils_js_1.objectAssign)(pageContext, pageContextFromOnBeforeRouteHook);
}
// Vike's routing
const allPageIds = pageContext._globalContext._allPageIds;
(0, utils_js_1.assertUsage)(allPageIds.length > 0, 'No page found. You must create at least one page.');
(0, utils_js_1.assert)(pageContext._globalContext._pageFilesAll.length > 0 || pageContext._globalContext._pageConfigs.length > 0);
const { urlPathname } = pageContext;
(0, utils_js_1.assert)(urlPathname.startsWith('/'));
const routeMatches = [];
await Promise.all(pageContext._globalContext._pageRoutes.map(async (pageRoute) => {
const { pageId, routeType } = pageRoute;
// Filesystem Routing
if (pageRoute.routeType === 'FILESYSTEM') {
const { routeString } = pageRoute;
const match = (0, resolveRouteString_js_1.resolveRouteString)(routeString, urlPathname);
if (match) {
const { routeParams } = match;
routeMatches.push({ pageId, routeParams, routeString, routeType });
}
return;
}
// Route String defined in `.page.route.js`
if (pageRoute.routeType === 'STRING') {
const { routeString } = pageRoute;
const match = (0, resolveRouteString_js_1.resolveRouteString)(routeString, urlPathname);
if (match) {
const { routeParams } = match;
(0, utils_js_1.assert)(routeType === 'STRING');
routeMatches.push({
pageId,
routeString,
routeParams,
routeType,
});
}
return;
}
// Route Function defined in `.page.route.js`
if (pageRoute.routeType === 'FUNCTION') {
const { routeFunction, routeFunctionFilePath } = pageRoute;
const match = await (0, resolveRouteFunction_js_1.resolveRouteFunction)(routeFunction, pageContext, routeFunctionFilePath);
if (match) {
const { routeParams, precedence } = match;
routeMatches.push({ pageId, precedence, routeParams, routeType });
}
return;
}
(0, utils_js_1.assert)(false);
}));
(0, resolvePrecedence_js_1.resolvePrecedence)(routeMatches);
const winner = routeMatches[0] ?? null;
(0, debug_js_1.debug)(`Route matches for URL ${picocolors_1.default.cyan(urlPathname)} (in precedence order):`, routeMatches);
(0, utils_js_1.objectAssign)(pageContextFromRoute, { _debugRouteMatches: routeMatches });
// For vite-plugin-vercel https://github.com/magne4000/vite-plugin-vercel/blob/main/packages/vike-integration/vike.ts#L173
(0, utils_js_1.objectAssign)(pageContextFromRoute, { _routeMatch: winner });
if (!winner) {
(0, utils_js_1.objectAssign)(pageContextFromRoute, {
pageId: null,
routeParams: {},
});
return pageContextFromRoute;
}
{
const { routeParams } = winner;
(0, utils_js_1.assert)((0, utils_js_1.isPlainObject)(routeParams));
(0, utils_js_1.objectAssign)(pageContextFromRoute, {
pageId: winner.pageId,
routeParams: winner.routeParams,
});
}
return pageContextFromRoute;
}