vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
110 lines (109 loc) • 5.19 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.pluginBuildEntry = pluginBuildEntry;
exports.set_macro_ASSETS_MANIFEST = set_macro_ASSETS_MANIFEST;
const plugin_1 = require("@brillout/vite-plugin-server-entry/plugin");
const virtualFileEntry_js_1 = require("../../../shared/virtualFiles/virtualFileEntry.js");
const utils_js_1 = require("../../utils.js");
const promises_1 = __importDefault(require("node:fs/promises"));
const node_path_1 = __importDefault(require("node:path"));
const pluginExtractExportNames_js_1 = require("../pluginExtractExportNames.js");
const globalContext_js_1 = require("../../../runtime/globalContext.js");
const getOutDirs_js_1 = require("../../shared/getOutDirs.js");
const getViteConfigRuntime_js_1 = require("../../shared/getViteConfigRuntime.js");
const ASSETS_MANIFEST = '__VITE_ASSETS_MANIFEST__';
function pluginBuildEntry() {
let config;
return [
{
name: 'vike:build:pluginBuildEntry',
apply: 'build',
enforce: 'post',
async configResolved(config_) {
config = config_;
},
},
...(0, plugin_1.serverProductionEntryPlugin)({
getServerProductionEntry: () => {
return getServerProductionEntryCode(config);
},
libraryName: 'Vike',
}),
];
}
function getServerProductionEntryCode(config) {
const importPath = getImportPath(config);
const buildInfo = {
versionAtBuildTime: utils_js_1.PROJECT_VERSION,
usesClientRouter: (0, pluginExtractExportNames_js_1.isUsingClientRouter)(), // TODO/v1-release: remove
viteConfigRuntime: (0, getViteConfigRuntime_js_1.getViteConfigRuntime)(config),
};
(0, globalContext_js_1.assertBuildInfo)(buildInfo);
// After the old design is removed, let's maybe simplify and move everything into a single virtual module
const importerCode = [
` import { setGlobalContext_buildEntry } from '${importPath}';`,
` import * as virtualFileExports from '${virtualFileEntry_js_1.virtualFileIdEntryServer}';`,
` {`,
// Because of a Rollup bug, we have to assign ASSETS_MANIFEST to a variable before passing it to setGlobalContext_buildEntry()
// - This workaround doesn't work: https://github.com/vikejs/vike/commit/d5f3a4f7aae5a8bc44192e6cbb2bcb9007be188d
` const assetsManifest = ${ASSETS_MANIFEST};`,
` const buildInfo = ${JSON.stringify(buildInfo, null, 2)};`,
' setGlobalContext_buildEntry({',
` virtualFileExports,`,
` assetsManifest,`,
` buildInfo,`,
' });',
` }`,
'',
].join('\n');
return importerCode;
}
// Set the value of the ASSETS_MANIFEST constant inside dist/server/entry.js (or dist/server/index.js)
async function set_macro_ASSETS_MANIFEST(assetsJsonFilePath, bundle, outDir) {
(0, utils_js_1.assert)(outDir);
const chunkPath = find_ASSETS_MANIFEST(bundle);
// Some server builds don't contain __VITE_ASSETS_MANIFEST__ such as dist/rsc/ from vike-react-rsc
if (!chunkPath) {
const noop = true; // no operation
return noop;
}
(0, utils_js_1.assert)(assetsJsonFilePath);
const chunkFilePath = node_path_1.default.join(outDir, chunkPath);
const [assetsJsonString, chunkFileContent] = await Promise.all([
await promises_1.default.readFile(assetsJsonFilePath, 'utf8'),
await promises_1.default.readFile(chunkFilePath, 'utf8'),
]);
const serverEntryFileContentPatched = chunkFileContent.replace(ASSETS_MANIFEST, assetsJsonString);
(0, utils_js_1.assert)(serverEntryFileContentPatched !== chunkFileContent);
await promises_1.default.writeFile(chunkFilePath, serverEntryFileContentPatched);
const noop = false;
return noop;
}
function find_ASSETS_MANIFEST(bundle) {
let chunkPath;
for (const filePath in bundle) {
const chunk = bundle[filePath];
if ('code' in chunk && chunk.code.includes(ASSETS_MANIFEST)) {
(0, utils_js_1.assert)(!chunkPath);
chunkPath = filePath;
}
}
return chunkPath;
}
function getImportPath(config) {
// We resolve filePathAbsolute even if we don't use it: we use require.resolve() as an assertion that the relative path is correct
const filePathAbsolute = (0, utils_js_1.requireResolveVikeDistFile)('dist/esm/__internal/index.js');
if (
// Let's implement a new config if a user needs the import to be a relative path instead of 'vike/__internal' (AFAIK a relative path is needed only if a framework has npm package 'vike' as direct dependency instead of a peer dependency and if the user of that framework uses pnpm)
true) {
return 'vike/__internal';
}
else {
const { outDirServer } = (0, getOutDirs_js_1.getOutDirs)(config);
const filePathRelative = node_path_1.default.posix.relative(outDirServer, filePathAbsolute);
return filePathRelative;
}
}