Files
NianAIGC/scripts/ensure-deploy-env.mjs
2026-06-01 13:40:17 +08:00

45 lines
1.7 KiB
JavaScript

#!/usr/bin/env node
import { randomBytes } from "node:crypto";
import { copyFileSync, existsSync, readFileSync, writeFileSync } from "node:fs";
import { join, resolve } from "node:path";
const rootDir = resolve(process.argv[2] || process.cwd());
const envPath = join(rootDir, ".env.local");
const examplePath = join(rootDir, ".env.example");
if (!existsSync(envPath)) {
if (!existsSync(examplePath)) {
console.error("[deploy] .env.local was not found and .env.example is missing.");
process.exit(1);
}
copyFileSync(examplePath, envPath);
console.log("[deploy] Created .env.local from .env.example");
console.log("[deploy] Real generation requires API keys in .env.local. Empty keys keep mock/local flows available.");
}
let envText = readFileSync(envPath, "utf8");
const token = readEnvValue(envText, "ZHINIAN_INTERNAL_WORKER_TOKEN");
if (!token || token === "change-me-worker-token") {
envText = setEnvValue(envText, "ZHINIAN_INTERNAL_WORKER_TOKEN", randomBytes(32).toString("hex"));
writeFileSync(envPath, envText);
console.log("[deploy] Added ZHINIAN_INTERNAL_WORKER_TOKEN to .env.local");
}
function readEnvValue(text, name) {
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const match = text.match(new RegExp(`^${escaped}=(.*)$`, "m"));
return match?.[1]?.trim().replace(/^['"]|['"]$/g, "") || "";
}
function setEnvValue(text, name, value) {
const line = `${name}=${value}`;
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
if (new RegExp(`^${escaped}=`, "m").test(text)) {
return text.replace(new RegExp(`^${escaped}=.*$`, "m"), line);
}
const suffix = text.endsWith("\n") ? "" : "\n";
return `${text}${suffix}${line}\n`;
}