92 lines
3.1 KiB
JavaScript
92 lines
3.1 KiB
JavaScript
const { build } = require("esbuild");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const buildOptions = parseBuildOptions(process.argv.slice(2));
|
|
|
|
function loadEnvFile(filePath) {
|
|
if (!fs.existsSync(filePath)) return {};
|
|
return fs.readFileSync(filePath, "utf8").split(/\r?\n/).reduce((acc, line) => {
|
|
const trimmed = line.trim();
|
|
if (!trimmed || trimmed.startsWith("#")) return acc;
|
|
const index = trimmed.indexOf("=");
|
|
if (index <= 0) return acc;
|
|
const key = trimmed.slice(0, index).trim();
|
|
const value = trimmed.slice(index + 1).trim();
|
|
if (key) acc[key] = value;
|
|
return acc;
|
|
}, {});
|
|
}
|
|
|
|
function buildEmbeddedEnvBanner(envFilePath) {
|
|
const env = loadEnvFile(envFilePath);
|
|
const lines = Object.entries(env).map(([key, value]) => `process.env[${JSON.stringify(key)}]=${JSON.stringify(value)};`);
|
|
if (!lines.length) return "";
|
|
return `/* embedded ${path.basename(envFilePath)} */\n${lines.join("\n")}`;
|
|
}
|
|
|
|
function parseBuildOptions(args) {
|
|
const raw = {};
|
|
for (let i = 0; i < args.length; i += 1) {
|
|
const arg = args[i];
|
|
if (arg === "--env" || arg === "--env-file" || arg === "--out" || arg === "--outfile") {
|
|
raw[arg.slice(2)] = args[i + 1];
|
|
i += 1;
|
|
continue;
|
|
}
|
|
if (arg.startsWith("--env=")) raw.env = arg.slice("--env=".length);
|
|
if (arg.startsWith("--env-file=")) raw["env-file"] = arg.slice("--env-file=".length);
|
|
if (arg.startsWith("--out=")) raw.out = arg.slice("--out=".length);
|
|
if (arg.startsWith("--outfile=")) raw.outfile = arg.slice("--outfile=".length);
|
|
}
|
|
|
|
const envName = normalizeName(raw.env || process.env.CONFIG_BUILD_ENV || "");
|
|
const envFileInput = raw["env-file"] || process.env.CONFIG_BUILD_ENV_FILE || (envName ? `.env.${envName}` : ".env.production");
|
|
const envFilePath = path.resolve(__dirname, envFileInput);
|
|
const outfile = raw.outfile || raw.out || process.env.CONFIG_BUILD_OUTFILE || path.resolve(__dirname, "dist", envName ? `bundle.${envName}.js` : "bundle.js");
|
|
|
|
if ((raw.env || raw["env-file"] || process.env.CONFIG_BUILD_ENV || process.env.CONFIG_BUILD_ENV_FILE) && !fs.existsSync(envFilePath)) {
|
|
console.error(`[build] env file not found: ${envFilePath}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
return {
|
|
envName,
|
|
envFilePath,
|
|
outfile: path.resolve(__dirname, outfile),
|
|
};
|
|
}
|
|
|
|
function normalizeName(input) {
|
|
const text = String(input || "").trim();
|
|
if (!text) return "";
|
|
return text.replace(/^\.env\./, "").replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
}
|
|
|
|
console.log(`[build] env: ${buildOptions.envFilePath}`);
|
|
console.log(`[build] outfile: ${buildOptions.outfile}`);
|
|
|
|
build({
|
|
entryPoints: ["./index.js"],
|
|
outfile: buildOptions.outfile,
|
|
platform: "node",
|
|
bundle: true,
|
|
minify: true,
|
|
sourcemap: false,
|
|
target: ["node16", "node18", "node20"],
|
|
banner: {
|
|
js: buildEmbeddedEnvBanner(buildOptions.envFilePath),
|
|
},
|
|
external: ["mysql2", "pg"],
|
|
plugins: [
|
|
{
|
|
name: "bundle-oracledb-js",
|
|
setup(build) {
|
|
build.onResolve({ filter: /^oracledb$/ }, () => ({
|
|
path: path.resolve(__dirname, "node_modules", "oracledb", "index.js"),
|
|
}));
|
|
},
|
|
},
|
|
],
|
|
}).catch(() => process.exit(1));
|