UNPKG

@gasket/plugin-nextjs

Version:
78 lines (77 loc) 2.4 kB
/// <reference types="@gasket/plugin-logger" /> Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, /** * Gets the NextJS route matching the request * @type {import('@gasket/plugin-nextjs').getNextRoute} */ "default", { enumerable: true, get: function() { return getNextRoute; } }); const _path = /*#__PURE__*/ _interop_require_default(require("path")); const _fs = require("fs"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Because getNextRoute may be called multiple times during a request, cache const nextRouteForRequest = new WeakMap(); let routesPromise; let routesLoadError; let cachedRoutes; /** * Loads the NextJS routes manifest * @param {import('@gasket/core').Gasket} gasket - Gasket API * @returns {Promise<*>} routes */ async function loadRoutes(gasket) { if (routesLoadError) { return null; } if (cachedRoutes) { return cachedRoutes; } if (!routesPromise) { routesPromise = _fs.promises.readFile(_path.default.join(gasket.config.root, '.next', 'routes-manifest.json')).then((content)=>{ const routes = JSON.parse(content.toString()); for (const route of iterateRoutes(routes)){ route.regex = new RegExp(route.regex); route.namedRegex = new RegExp(route.namedRegex); } cachedRoutes = routes; return routes; }).catch((err)=>{ gasket.logger.warn('Failed to parse next.js routes', err); routesLoadError = err; }); } return routesPromise; } /** * Iterates over the static and dynamic routes * @param {any} routes - NextJS routes * @yields {*} Route objects from the NextJS routes manifest */ function* iterateRoutes(routes) { yield* routes.staticRoutes; yield* routes.dynamicRoutes; } async function getNextRoute(gasket, req) { if (nextRouteForRequest.has(req)) { return nextRouteForRequest.get(req); } let result = null; const routes = await loadRoutes(gasket); if (routes) { for (const route of iterateRoutes(routes)){ if (route.regex.test(req.path)) { result = route; break; } } } nextRouteForRequest.set(req, result); return result; }