76 lines
2.2 KiB
JavaScript
76 lines
2.2 KiB
JavaScript
import { build as esbuild } from "esbuild";
|
|
import path from "node:path";
|
|
import { stripNodePrefixPlugin } from "./plugins/stripNodePrefixPlugin.mjs";
|
|
import { ignoreModulesPlugin } from "./plugins/ignoreModulesPlugin.mjs";
|
|
import { postBuildPlugin } from "./plugins/postBuildPlugin.mjs";
|
|
import { externalNodeBuiltinsPlugin } from "./plugins/externalNodeBuiltinsPlugin.mjs";
|
|
import { OUT_DIR, ROOT_DIR, getEsbuildProdConfig } from "./constants.mjs";
|
|
import { reportSize } from "../../../../scripts/reportSize.mjs";
|
|
import { colors } from "../../../../scripts/logger.mjs";
|
|
import { BUILD_TARGETS } from "./targets.mjs";
|
|
|
|
/**
|
|
* Helper function to create build configurations.
|
|
*/
|
|
async function buildTarget(
|
|
{
|
|
name = "",
|
|
suffix = ".js",
|
|
format = "esm", // 'esm' | 'cjs'
|
|
ignoreModules = [],
|
|
externalModules = [],
|
|
usePostBuild = false,
|
|
},
|
|
log,
|
|
) {
|
|
const platform = format === "cjs" ? "node" : "neutral";
|
|
|
|
const regularFile = `transformers${name}${suffix}`;
|
|
const minFile = `transformers${name}.min${suffix}`;
|
|
|
|
const plugins = [];
|
|
// Add ignoreModulesPlugin FIRST so it can catch modules before stripNodePrefixPlugin marks them as external
|
|
if (ignoreModules.length > 0) {
|
|
plugins.push(ignoreModulesPlugin(ignoreModules));
|
|
}
|
|
plugins.push(stripNodePrefixPlugin());
|
|
plugins.push(externalNodeBuiltinsPlugin());
|
|
if (usePostBuild) {
|
|
plugins.push(postBuildPlugin(OUT_DIR, ROOT_DIR));
|
|
}
|
|
|
|
log.build(`Building ${colors.bright}${regularFile}${colors.reset}...`);
|
|
await esbuild({
|
|
...getEsbuildProdConfig(ROOT_DIR),
|
|
platform,
|
|
format,
|
|
outfile: path.join(OUT_DIR, regularFile),
|
|
external: externalModules,
|
|
plugins,
|
|
});
|
|
reportSize(path.join(OUT_DIR, regularFile), log);
|
|
|
|
log.build(`Building ${colors.bright}${minFile}${colors.reset}...`);
|
|
await esbuild({
|
|
...getEsbuildProdConfig(ROOT_DIR),
|
|
platform,
|
|
format,
|
|
outfile: path.join(OUT_DIR, minFile),
|
|
minify: true,
|
|
external: externalModules,
|
|
plugins,
|
|
legalComments: "none",
|
|
});
|
|
reportSize(path.join(OUT_DIR, minFile), log);
|
|
}
|
|
|
|
/**
|
|
* Build all targets for production
|
|
*/
|
|
export async function buildAll(log) {
|
|
for (const target of BUILD_TARGETS) {
|
|
log.section(target.name);
|
|
await buildTarget(target.config, log);
|
|
}
|
|
}
|