vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
229 lines (228 loc) • 10.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.manifestTempFile = void 0;
exports.pluginBuildConfig = pluginBuildConfig;
exports.assertRollupInput = assertRollupInput;
exports.analyzeClientEntries = analyzeClientEntries;
const utils_js_1 = require("../../utils.js");
const resolveVikeConfigInternal_js_1 = require("../../shared/resolveVikeConfigInternal.js");
const findPageFiles_js_1 = require("../../shared/findPageFiles.js");
const virtualFilePageConfigLazy_js_1 = require("../../../shared/virtualFiles/virtualFilePageConfigLazy.js");
const extractAssetsQuery_js_1 = require("../../../shared/extractAssetsQuery.js");
const prependEntriesDir_js_1 = require("../../../shared/prependEntriesDir.js");
const getFilePath_js_1 = require("../../shared/getFilePath.js");
const getConfigValueBuildTime_js_1 = require("../../../../shared/page-configs/getConfigValueBuildTime.js");
const isViteServerBuild_js_1 = require("../../shared/isViteServerBuild.js");
const getOutDirs_js_1 = require("../../shared/getOutDirs.js");
const handleAssetsManifest_js_1 = require("./handleAssetsManifest.js");
const getPageAssets_js_1 = require("../../../runtime/renderPage/getPageAssets.js");
const manifestTempFile = '_temp_manifest.json';
exports.manifestTempFile = manifestTempFile;
function pluginBuildConfig() {
let config;
return [
{
name: 'vike:build:pluginBuildConfig',
apply: 'build',
enforce: 'post',
configResolved: {
order: 'post',
async handler(config_) {
(0, utils_js_1.onSetupBuild)();
config = config_;
assertRollupInput(config);
const entries = await getEntries(config);
(0, utils_js_1.assert)(Object.keys(entries).length > 0);
config.build.rollupOptions.input = (0, utils_js_1.injectRollupInputs)(entries, config);
addLogHook();
(0, handleAssetsManifest_js_1.handleAssetsManifest_assertUsageCssCodeSplit)(config);
},
},
config: {
order: 'post',
async handler(config) {
(0, utils_js_1.onSetupBuild)();
return {
build: {
outDir: (0, getOutDirs_js_1.resolveOutDir)(config),
...(await (0, handleAssetsManifest_js_1.handleAssetsManifest_getBuildConfig)(config)),
},
};
},
},
buildStart() {
(0, utils_js_1.onSetupBuild)();
},
},
];
}
async function getEntries(config) {
const vikeConfig = await (0, resolveVikeConfigInternal_js_1.getVikeConfigInternal)();
const { _pageConfigs: pageConfigs } = vikeConfig;
// TODO/v1-release: remove
const pageFileEntries = await getPageFileEntries(config, (0, getPageAssets_js_1.resolveIncludeAssetsImportedByServer)(vikeConfig.config));
(0, utils_js_1.assertUsage)(Object.keys(pageFileEntries).length !== 0 || pageConfigs.length !== 0, 'At least one page should be defined, see https://vike.dev/add');
if ((0, isViteServerBuild_js_1.isViteServerBuild)(config)) {
const pageEntries = getPageEntries(pageConfigs);
const entries = {
...pageFileEntries,
// Ensure Rollup generates a bundle per page: https://github.com/vikejs/vike/issues/349#issuecomment-1166247275
...pageEntries,
};
return entries;
}
else {
let { hasClientRouting, hasServerRouting, clientEntries } = analyzeClientEntries(pageConfigs, config);
if (Object.entries(pageFileEntries).length > 0) {
hasClientRouting = true;
hasServerRouting = true;
}
const entries = {
...clientEntries,
...pageFileEntries,
};
const clientRoutingEntry = (0, utils_js_1.requireResolveVikeDistFile)('dist/esm/client/runtime-client-routing/entry.js');
const serverRoutingEntry = (0, utils_js_1.requireResolveVikeDistFile)('dist/esm/client/runtime-server-routing/entry.js');
if (hasClientRouting) {
entries['entries/entry-client-routing'] = clientRoutingEntry;
}
if (hasServerRouting) {
entries['entries/entry-server-routing'] = serverRoutingEntry;
}
return entries;
}
}
function getPageEntries(pageConfigs) {
const pageEntries = {};
pageConfigs.forEach((pageConfig) => {
const { entryName, entryTarget } = getEntryFromPageConfig(pageConfig, false);
pageEntries[entryName] = entryTarget;
});
return pageEntries;
}
function analyzeClientEntries(pageConfigs, config) {
let hasClientRouting = false;
let hasServerRouting = false;
let clientEntries = {};
let clientEntryList = [];
pageConfigs.forEach((pageConfig) => {
const configValue = (0, getConfigValueBuildTime_js_1.getConfigValueBuildTime)(pageConfig, 'clientRouting', 'boolean');
if (configValue?.value) {
hasClientRouting = true;
}
else {
hasServerRouting = true;
}
{
// Ensure Rollup generates a bundle per page: https://github.com/vikejs/vike/issues/349#issuecomment-1166247275
const { entryName, entryTarget } = getEntryFromPageConfig(pageConfig, true);
clientEntries[entryName] = entryTarget;
}
{
const clientEntry = (0, getConfigValueBuildTime_js_1.getConfigValueBuildTime)(pageConfig, 'client', 'string')?.value ?? null;
if (clientEntry) {
clientEntryList.push(clientEntry);
}
}
});
clientEntryList = (0, utils_js_1.unique)(clientEntryList);
clientEntryList.forEach((clientEntry) => {
const { entryName, entryTarget } = getEntryFromClientEntry(clientEntry, config);
clientEntries[entryName] = entryTarget;
});
return { hasClientRouting, hasServerRouting, clientEntries };
}
// Ensure Rollup creates entries for each page file, see https://github.com/vikejs/vike/issues/350
// (Otherwise the page files may be missing in the client manifest.json)
async function getPageFileEntries(config, includeAssetsImportedByServer) {
const isForClientSide = !(0, isViteServerBuild_js_1.isViteServerBuild)(config);
const fileTypes = isForClientSide ? ['.page', '.page.client'] : ['.page', '.page.server'];
if (isForClientSide && includeAssetsImportedByServer) {
fileTypes.push('.page.server');
}
let pageFiles = await (0, findPageFiles_js_1.findPageFiles)(config, fileTypes, false);
const pageFileEntries = {};
pageFiles = (0, utils_js_1.unique)(pageFiles);
pageFiles.forEach((pageFile) => {
let addExtractAssetsQuery = false;
if (isForClientSide && pageFile.includes('.page.server.')) {
(0, utils_js_1.assert)(includeAssetsImportedByServer);
addExtractAssetsQuery = true;
}
const { entryName, entryTarget } = getEntryFromClientEntry(pageFile, config, addExtractAssetsQuery);
pageFileEntries[entryName] = entryTarget;
});
return pageFileEntries;
}
function getEntryFromClientEntry(clientEntry, config, addExtractAssetsQuery) {
if (!clientEntry.startsWith('/')) {
(0, utils_js_1.assertIsImportPathNpmPackage)(clientEntry);
const entryTarget = clientEntry;
const entryName = (0, prependEntriesDir_js_1.prependEntriesDir)(clientEntry);
return { entryName, entryTarget };
}
const filePathAbsoluteUserRootDir = clientEntry;
(0, utils_js_1.assert)(filePathAbsoluteUserRootDir.startsWith('/'));
const filePath = (0, getFilePath_js_1.getFilePathResolved)({
filePathAbsoluteUserRootDir,
userRootDir: config.root,
});
let entryTarget = filePath.filePathAbsoluteFilesystem;
if (addExtractAssetsQuery)
entryTarget = (0, extractAssetsQuery_js_1.extractAssetsAddQuery)(entryTarget);
let entryName = filePathAbsoluteUserRootDir;
if (addExtractAssetsQuery)
entryName = (0, extractAssetsQuery_js_1.extractAssetsAddQuery)(entryName);
entryName = (0, utils_js_1.removeFileExtension)(entryName);
entryName = (0, prependEntriesDir_js_1.prependEntriesDir)(entryName);
return { entryName, entryTarget };
}
function getEntryFromPageConfig(pageConfig, isForClientSide) {
let { pageId } = pageConfig;
const entryTarget = (0, virtualFilePageConfigLazy_js_1.getVirtualFileIdPageConfigLazy)(pageId, isForClientSide);
let entryName = pageId;
// Avoid:
// ```
// dist/client/assets/entries/.Dp9wM6PK.js
// dist/server/entries/.mjs
// ```
if (entryName === '/')
entryName = 'root';
entryName = (0, prependEntriesDir_js_1.prependEntriesDir)(entryName);
(0, utils_js_1.assert)(!entryName.endsWith('/'));
return { entryName, entryTarget };
}
function addLogHook() {
const tty = process.stdout.isTTY && !process.env.CI; // Equals https://github.com/vitejs/vite/blob/193d55c7b9cbfec5b79ebfca276d4a721e7de14d/packages/vite/src/node/plugins/reporter.ts#L27
if (!tty)
return;
let lastLog = null;
['stdout', 'stderr'].forEach((stdName) => {
var methodOriginal = process[stdName].write;
process[stdName].write = function (...args) {
lastLog = String(args[0]);
return methodOriginal.apply(process[stdName], args);
};
});
// Exhaustive list extracted from writeLine() calls at https://github.com/vitejs/vite/blob/193d55c7b9cbfec5b79ebfca276d4a721e7de14d/packages/vite/src/node/plugins/reporter.ts
// prettier-ignore
// biome-ignore format:
const viteTransientLogs = [
'transforming (',
'rendering chunks (',
'computing gzip size ('
];
(0, utils_js_1.addOnBeforeLogHook)(() => {
// Using viteTransientLogs is very conservative as clearing the current line is low risk. (We can assume that important messages, such as errors, include a trailing new line. Usually, only transient messages have no trailing new lines.)
if (viteTransientLogs.some((s) => lastLog?.startsWith(s))) {
process.stdout.clearLine(0);
process.stdout.cursorTo(0);
}
});
}
function assertRollupInput(config) {
const userInputs = (0, utils_js_1.normalizeRollupInput)(config.build.rollupOptions.input);
const htmlInputs = Object.values(userInputs).filter((entry) => entry.endsWith('.html') || entry.endsWith('.htm'));
const htmlInput = htmlInputs[0];
(0, utils_js_1.assertUsage)(htmlInput === undefined, `The entry ${htmlInput} of config build.rollupOptions.input is an HTML entry which is forbidden when using Vike, instead follow https://vike.dev/add`);
}