@greenwood/cli
Version:
93 lines (80 loc) • 2.94 kB
JavaScript
import { bundleCompilation } from "../lifecycles/bundle.js";
import { checkResourceExists } from "../lib/resource-utils.js";
import { copyAssets } from "../lifecycles/copy.js";
import { getDevServer } from "../lifecycles/serve.js";
import fs from "fs/promises";
import {
preRenderCompilationWorker,
preRenderCompilationCustom,
staticRenderCompilation,
} from "../lifecycles/prerender.js";
const runProductionBuild = async (compilation) => {
// eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => {
try {
const { prerender, activeContent, plugins } = compilation.config;
const outputDir = compilation.context.outputDir;
const prerenderPlugin = compilation.config.plugins.find(
(plugin) => plugin.type === "renderer",
)
? compilation.config.plugins
.find((plugin) => plugin.type === "renderer")
.provider(compilation)
: {};
const adapterPlugin = compilation.config.plugins.find((plugin) => plugin.type === "adapter")
? compilation.config.plugins
.find((plugin) => plugin.type === "adapter")
.provider(compilation)
: null;
if (!(await checkResourceExists(outputDir))) {
await fs.mkdir(outputDir, {
recursive: true,
});
}
if (prerender) {
// start any of the user's server plugins if needed
const servers = [
...compilation.config.plugins
.filter((plugin) => {
return plugin.type === "server" && !plugin.isGreenwoodDefaultPlugin;
})
.map((plugin) => plugin.provider(compilation)),
];
if (activeContent) {
(
await getDevServer({
...compilation,
// prune for the content as data plugin and start the dev server with only that plugin enabled
plugins: [plugins.find((plugin) => plugin.name === "plugin-active-content")],
})
).listen(compilation.config.devServer.port, () => {
console.info("Initializing active content...");
});
}
await Promise.all(
servers.map(async (server) => {
await server.start();
return Promise.resolve(server);
}),
);
if (prerenderPlugin.executeModuleUrl) {
await preRenderCompilationWorker(compilation, prerenderPlugin);
} else {
await preRenderCompilationCustom(compilation, prerenderPlugin);
}
} else {
await staticRenderCompilation(compilation);
}
console.info("success, done generating all pages!");
await bundleCompilation(compilation);
await copyAssets(compilation);
if (adapterPlugin) {
await adapterPlugin();
}
resolve();
} catch (err) {
reject(err);
}
});
};
export { runProductionBuild };