@gasket/plugin-nextjs
Version:
Adds Next support to your application
78 lines (77 loc) • 2.4 kB
JavaScript
/// <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;
}