327 lines
17 KiB
JavaScript
327 lines
17 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
Object.defineProperty(exports, "TurbopackManifestLoader", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return TurbopackManifestLoader;
|
|
}
|
|
});
|
|
const _pathtoregexp = require("next/dist/compiled/path-to-regexp");
|
|
const _constants = require("../../../shared/lib/constants");
|
|
const _path = require("path");
|
|
const _promises = require("fs/promises");
|
|
const _nextjsrequirecachehotreloader = require("../../../build/webpack/plugins/nextjs-require-cache-hot-reloader");
|
|
const _writeatomic = require("../../../lib/fs/write-atomic");
|
|
const _generateinterceptionroutesrewrites = require("../../../lib/generate-interception-routes-rewrites");
|
|
const _buildmanifestplugin = require("../../../build/webpack/plugins/build-manifest-plugin");
|
|
const _getassetpathfromroute = /*#__PURE__*/ _interop_require_default(require("../../../shared/lib/router/utils/get-asset-path-from-route"));
|
|
const _entrykey = require("./entry-key");
|
|
function _interop_require_default(obj) {
|
|
return obj && obj.__esModule ? obj : {
|
|
default: obj
|
|
};
|
|
}
|
|
async function readPartialManifest(distDir, name, pageName, type = "pages") {
|
|
const manifestPath = _path.posix.join(distDir, `server`, type, type === "middleware" || type === "instrumentation" ? "" : type === "app" ? pageName : (0, _getassetpathfromroute.default)(pageName), name);
|
|
return JSON.parse(await (0, _promises.readFile)(_path.posix.join(manifestPath), "utf-8"));
|
|
}
|
|
class TurbopackManifestLoader {
|
|
constructor({ distDir, buildId, encryptionKey }){
|
|
this.actionManifests = new Map();
|
|
this.appBuildManifests = new Map();
|
|
this.appPathsManifests = new Map();
|
|
this.buildManifests = new Map();
|
|
this.fontManifests = new Map();
|
|
this.loadableManifests = new Map();
|
|
this.middlewareManifests = new Map();
|
|
this.pagesManifests = new Map();
|
|
this.distDir = distDir;
|
|
this.buildId = buildId;
|
|
this.encryptionKey = encryptionKey;
|
|
}
|
|
delete(key) {
|
|
this.actionManifests.delete(key);
|
|
this.appBuildManifests.delete(key);
|
|
this.appPathsManifests.delete(key);
|
|
this.buildManifests.delete(key);
|
|
this.fontManifests.delete(key);
|
|
this.loadableManifests.delete(key);
|
|
this.middlewareManifests.delete(key);
|
|
this.pagesManifests.delete(key);
|
|
}
|
|
async loadActionManifest(pageName) {
|
|
this.actionManifests.set((0, _entrykey.getEntryKey)("app", "server", pageName), await readPartialManifest(this.distDir, `${_constants.SERVER_REFERENCE_MANIFEST}.json`, pageName, "app"));
|
|
}
|
|
async mergeActionManifests(manifests) {
|
|
const manifest = {
|
|
node: {},
|
|
edge: {},
|
|
encryptionKey: this.encryptionKey
|
|
};
|
|
function mergeActionIds(actionEntries, other) {
|
|
for(const key in other){
|
|
const action = actionEntries[key] ??= {
|
|
workers: {},
|
|
layer: {}
|
|
};
|
|
Object.assign(action.workers, other[key].workers);
|
|
Object.assign(action.layer, other[key].layer);
|
|
}
|
|
}
|
|
for (const m of manifests){
|
|
mergeActionIds(manifest.node, m.node);
|
|
mergeActionIds(manifest.edge, m.edge);
|
|
}
|
|
return manifest;
|
|
}
|
|
async writeActionManifest() {
|
|
const actionManifest = await this.mergeActionManifests(this.actionManifests.values());
|
|
const actionManifestJsonPath = (0, _path.join)(this.distDir, "server", `${_constants.SERVER_REFERENCE_MANIFEST}.json`);
|
|
const actionManifestJsPath = (0, _path.join)(this.distDir, "server", `${_constants.SERVER_REFERENCE_MANIFEST}.js`);
|
|
const json = JSON.stringify(actionManifest, null, 2);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(actionManifestJsonPath);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(actionManifestJsPath);
|
|
await (0, _promises.writeFile)(actionManifestJsonPath, json, "utf-8");
|
|
await (0, _promises.writeFile)(actionManifestJsPath, `self.__RSC_SERVER_MANIFEST=${JSON.stringify(json)}`, "utf-8");
|
|
}
|
|
async loadAppBuildManifest(pageName) {
|
|
this.appBuildManifests.set((0, _entrykey.getEntryKey)("app", "server", pageName), await readPartialManifest(this.distDir, _constants.APP_BUILD_MANIFEST, pageName, "app"));
|
|
}
|
|
mergeAppBuildManifests(manifests) {
|
|
const manifest = {
|
|
pages: {}
|
|
};
|
|
for (const m of manifests){
|
|
Object.assign(manifest.pages, m.pages);
|
|
}
|
|
return manifest;
|
|
}
|
|
async writeAppBuildManifest() {
|
|
const appBuildManifest = this.mergeAppBuildManifests(this.appBuildManifests.values());
|
|
const appBuildManifestPath = (0, _path.join)(this.distDir, _constants.APP_BUILD_MANIFEST);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(appBuildManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(appBuildManifestPath, JSON.stringify(appBuildManifest, null, 2));
|
|
}
|
|
async loadAppPathsManifest(pageName) {
|
|
this.appPathsManifests.set((0, _entrykey.getEntryKey)("app", "server", pageName), await readPartialManifest(this.distDir, _constants.APP_PATHS_MANIFEST, pageName, "app"));
|
|
}
|
|
async writeAppPathsManifest() {
|
|
const appPathsManifest = this.mergePagesManifests(this.appPathsManifests.values());
|
|
const appPathsManifestPath = (0, _path.join)(this.distDir, "server", _constants.APP_PATHS_MANIFEST);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(appPathsManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(appPathsManifestPath, JSON.stringify(appPathsManifest, null, 2));
|
|
}
|
|
/**
|
|
* Turbopack doesn't support this functionality, so it writes an empty manifest.
|
|
*/ async writeAutomaticFontOptimizationManifest() {
|
|
const manifestPath = (0, _path.join)(this.distDir, "server", _constants.AUTOMATIC_FONT_OPTIMIZATION_MANIFEST);
|
|
await (0, _writeatomic.writeFileAtomic)(manifestPath, JSON.stringify([]));
|
|
}
|
|
async loadBuildManifest(pageName, type = "pages") {
|
|
this.buildManifests.set((0, _entrykey.getEntryKey)(type, "server", pageName), await readPartialManifest(this.distDir, _constants.BUILD_MANIFEST, pageName, type));
|
|
}
|
|
mergeBuildManifests(manifests) {
|
|
const manifest = {
|
|
pages: {
|
|
"/_app": []
|
|
},
|
|
// Something in next.js depends on these to exist even for app dir rendering
|
|
devFiles: [],
|
|
ampDevFiles: [],
|
|
polyfillFiles: [],
|
|
lowPriorityFiles: [
|
|
"static/development/_ssgManifest.js",
|
|
"static/development/_buildManifest.js"
|
|
],
|
|
rootMainFiles: [],
|
|
ampFirstPages: []
|
|
};
|
|
for (const m of manifests){
|
|
Object.assign(manifest.pages, m.pages);
|
|
if (m.rootMainFiles.length) manifest.rootMainFiles = m.rootMainFiles;
|
|
}
|
|
return manifest;
|
|
}
|
|
async writeBuildManifest(pageEntrypoints, rewrites) {
|
|
const buildManifest = this.mergeBuildManifests(this.buildManifests.values());
|
|
const buildManifestPath = (0, _path.join)(this.distDir, _constants.BUILD_MANIFEST);
|
|
const middlewareBuildManifestPath = (0, _path.join)(this.distDir, "server", `${_constants.MIDDLEWARE_BUILD_MANIFEST}.js`);
|
|
const interceptionRewriteManifestPath = (0, _path.join)(this.distDir, "server", `${_constants.INTERCEPTION_ROUTE_REWRITE_MANIFEST}.js`);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(buildManifestPath);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(middlewareBuildManifestPath);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(interceptionRewriteManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(buildManifestPath, JSON.stringify(buildManifest, null, 2));
|
|
await (0, _writeatomic.writeFileAtomic)(middlewareBuildManifestPath, `self.__BUILD_MANIFEST=${JSON.stringify(buildManifest)};`);
|
|
const interceptionRewrites = JSON.stringify(rewrites.beforeFiles.filter(_generateinterceptionroutesrewrites.isInterceptionRouteRewrite));
|
|
await (0, _writeatomic.writeFileAtomic)(interceptionRewriteManifestPath, `self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST=${JSON.stringify(interceptionRewrites)};`);
|
|
const content = {
|
|
__rewrites: rewrites ? (0, _buildmanifestplugin.normalizeRewritesForBuildManifest)(rewrites) : {
|
|
afterFiles: [],
|
|
beforeFiles: [],
|
|
fallback: []
|
|
},
|
|
...Object.fromEntries([
|
|
...pageEntrypoints.keys()
|
|
].map((pathname)=>[
|
|
pathname,
|
|
`static/chunks/pages${pathname === "/" ? "/index" : pathname}.js`
|
|
])),
|
|
sortedPages: [
|
|
...pageEntrypoints.keys()
|
|
]
|
|
};
|
|
const buildManifestJs = `self.__BUILD_MANIFEST = ${JSON.stringify(content)};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()`;
|
|
await (0, _writeatomic.writeFileAtomic)((0, _path.join)(this.distDir, "static", this.buildId, "_buildManifest.js"), buildManifestJs);
|
|
await (0, _writeatomic.writeFileAtomic)((0, _path.join)(this.distDir, "static", this.buildId, "_ssgManifest.js"), _buildmanifestplugin.srcEmptySsgManifest);
|
|
}
|
|
async writeFallbackBuildManifest() {
|
|
const fallbackBuildManifest = this.mergeBuildManifests([
|
|
this.buildManifests.get((0, _entrykey.getEntryKey)("pages", "server", "_app")),
|
|
this.buildManifests.get((0, _entrykey.getEntryKey)("pages", "server", "_error"))
|
|
].filter(Boolean));
|
|
const fallbackBuildManifestPath = (0, _path.join)(this.distDir, `fallback-${_constants.BUILD_MANIFEST}`);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(fallbackBuildManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(fallbackBuildManifestPath, JSON.stringify(fallbackBuildManifest, null, 2));
|
|
}
|
|
async loadFontManifest(pageName, type = "pages") {
|
|
this.fontManifests.set((0, _entrykey.getEntryKey)(type, "server", pageName), await readPartialManifest(this.distDir, `${_constants.NEXT_FONT_MANIFEST}.json`, pageName, type));
|
|
}
|
|
mergeFontManifests(manifests) {
|
|
const manifest = {
|
|
app: {},
|
|
appUsingSizeAdjust: false,
|
|
pages: {},
|
|
pagesUsingSizeAdjust: false
|
|
};
|
|
for (const m of manifests){
|
|
Object.assign(manifest.app, m.app);
|
|
Object.assign(manifest.pages, m.pages);
|
|
manifest.appUsingSizeAdjust = manifest.appUsingSizeAdjust || m.appUsingSizeAdjust;
|
|
manifest.pagesUsingSizeAdjust = manifest.pagesUsingSizeAdjust || m.pagesUsingSizeAdjust;
|
|
}
|
|
return manifest;
|
|
}
|
|
async writeNextFontManifest() {
|
|
const fontManifest = this.mergeFontManifests(this.fontManifests.values());
|
|
const json = JSON.stringify(fontManifest, null, 2);
|
|
const fontManifestJsonPath = (0, _path.join)(this.distDir, "server", `${_constants.NEXT_FONT_MANIFEST}.json`);
|
|
const fontManifestJsPath = (0, _path.join)(this.distDir, "server", `${_constants.NEXT_FONT_MANIFEST}.js`);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(fontManifestJsonPath);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(fontManifestJsPath);
|
|
await (0, _writeatomic.writeFileAtomic)(fontManifestJsonPath, json);
|
|
await (0, _writeatomic.writeFileAtomic)(fontManifestJsPath, `self.__NEXT_FONT_MANIFEST=${JSON.stringify(json)}`);
|
|
}
|
|
async loadLoadableManifest(pageName, type = "pages") {
|
|
this.loadableManifests.set((0, _entrykey.getEntryKey)(type, "server", pageName), await readPartialManifest(this.distDir, _constants.REACT_LOADABLE_MANIFEST, pageName, type));
|
|
}
|
|
mergeLoadableManifests(manifests) {
|
|
const manifest = {};
|
|
for (const m of manifests){
|
|
Object.assign(manifest, m);
|
|
}
|
|
return manifest;
|
|
}
|
|
async writeLoadableManifest() {
|
|
const loadableManifest = this.mergeLoadableManifests(this.loadableManifests.values());
|
|
const loadableManifestPath = (0, _path.join)(this.distDir, _constants.REACT_LOADABLE_MANIFEST);
|
|
const middlewareloadableManifestPath = (0, _path.join)(this.distDir, "server", `${_constants.MIDDLEWARE_REACT_LOADABLE_MANIFEST}.js`);
|
|
const json = JSON.stringify(loadableManifest, null, 2);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(loadableManifestPath);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(middlewareloadableManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(loadableManifestPath, json);
|
|
await (0, _writeatomic.writeFileAtomic)(middlewareloadableManifestPath, `self.__REACT_LOADABLE_MANIFEST=${JSON.stringify(json)}`);
|
|
}
|
|
async loadMiddlewareManifest(pageName, type) {
|
|
this.middlewareManifests.set((0, _entrykey.getEntryKey)(type === "middleware" || type === "instrumentation" ? "root" : type, "server", pageName), await readPartialManifest(this.distDir, _constants.MIDDLEWARE_MANIFEST, pageName, type));
|
|
}
|
|
getMiddlewareManifest(key) {
|
|
return this.middlewareManifests.get(key);
|
|
}
|
|
deleteMiddlewareManifest(key) {
|
|
return this.middlewareManifests.delete(key);
|
|
}
|
|
mergeMiddlewareManifests(manifests) {
|
|
const manifest = {
|
|
version: 3,
|
|
middleware: {},
|
|
sortedMiddleware: [],
|
|
functions: {}
|
|
};
|
|
let instrumentation = undefined;
|
|
for (const m of manifests){
|
|
Object.assign(manifest.functions, m.functions);
|
|
Object.assign(manifest.middleware, m.middleware);
|
|
if (m.instrumentation) {
|
|
instrumentation = m.instrumentation;
|
|
}
|
|
}
|
|
const updateFunctionDefinition = (fun)=>{
|
|
return {
|
|
...fun,
|
|
files: [
|
|
...(instrumentation == null ? void 0 : instrumentation.files) ?? [],
|
|
...fun.files
|
|
]
|
|
};
|
|
};
|
|
for (const key of Object.keys(manifest.middleware)){
|
|
const value = manifest.middleware[key];
|
|
manifest.middleware[key] = updateFunctionDefinition(value);
|
|
}
|
|
for (const key of Object.keys(manifest.functions)){
|
|
const value = manifest.functions[key];
|
|
manifest.functions[key] = updateFunctionDefinition(value);
|
|
}
|
|
for (const fun of Object.values(manifest.functions).concat(Object.values(manifest.middleware))){
|
|
for (const matcher of fun.matchers){
|
|
if (!matcher.regexp) {
|
|
matcher.regexp = (0, _pathtoregexp.pathToRegexp)(matcher.originalSource, [], {
|
|
delimiter: "/",
|
|
sensitive: false,
|
|
strict: true
|
|
}).source.replaceAll("\\/", "/");
|
|
}
|
|
}
|
|
}
|
|
manifest.sortedMiddleware = Object.keys(manifest.middleware);
|
|
return manifest;
|
|
}
|
|
async writeMiddlewareManifest() {
|
|
const middlewareManifest = this.mergeMiddlewareManifests(this.middlewareManifests.values());
|
|
const middlewareManifestPath = (0, _path.join)(this.distDir, "server", _constants.MIDDLEWARE_MANIFEST);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(middlewareManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(middlewareManifestPath, JSON.stringify(middlewareManifest, null, 2));
|
|
}
|
|
async loadPagesManifest(pageName) {
|
|
this.pagesManifests.set((0, _entrykey.getEntryKey)("pages", "server", pageName), await readPartialManifest(this.distDir, _constants.PAGES_MANIFEST, pageName));
|
|
}
|
|
mergePagesManifests(manifests) {
|
|
const manifest = {};
|
|
for (const m of manifests){
|
|
Object.assign(manifest, m);
|
|
}
|
|
return manifest;
|
|
}
|
|
async writePagesManifest() {
|
|
const pagesManifest = this.mergePagesManifests(this.pagesManifests.values());
|
|
const pagesManifestPath = (0, _path.join)(this.distDir, "server", _constants.PAGES_MANIFEST);
|
|
(0, _nextjsrequirecachehotreloader.deleteCache)(pagesManifestPath);
|
|
await (0, _writeatomic.writeFileAtomic)(pagesManifestPath, JSON.stringify(pagesManifest, null, 2));
|
|
}
|
|
async writeManifests({ rewrites, pageEntrypoints }) {
|
|
await this.writeActionManifest();
|
|
await this.writeAppBuildManifest();
|
|
await this.writeAppPathsManifest();
|
|
await this.writeAutomaticFontOptimizationManifest();
|
|
await this.writeBuildManifest(pageEntrypoints, rewrites);
|
|
await this.writeFallbackBuildManifest();
|
|
await this.writeLoadableManifest();
|
|
await this.writeMiddlewareManifest();
|
|
await this.writeNextFontManifest();
|
|
await this.writePagesManifest();
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=manifest-loader.js.map
|