93 lines
2.7 KiB
JavaScript
93 lines
2.7 KiB
JavaScript
#!/usr/bin/env node
|
|
"use strict";
|
|
|
|
// Generate UUIDs and write them to server/src/config/uuids.json.
|
|
// Usage:
|
|
// node scripts/generate-uuids.js --count 210 [--force|--append]
|
|
// Defaults: count=210, no overwrite if file has entries.
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const crypto = require("crypto");
|
|
|
|
function parseArgs(argv) {
|
|
const args = { count: 210, force: false, append: false };
|
|
for (let i = 2; i < argv.length; i++) {
|
|
const a = argv[i];
|
|
if (a === "--force") args.force = true;
|
|
else if (a === "--append") args.append = true;
|
|
else if (a === "--count") {
|
|
const n = Number(argv[++i]);
|
|
if (!Number.isFinite(n) || n <= 0) throw new Error("--count must be a positive number");
|
|
args.count = Math.floor(n);
|
|
} else if (/^--count=/.test(a)) {
|
|
const n = Number(a.split("=")[1]);
|
|
if (!Number.isFinite(n) || n <= 0) throw new Error("--count must be a positive number");
|
|
args.count = Math.floor(n);
|
|
} else {
|
|
throw new Error(`Unknown argument: ${a}`);
|
|
}
|
|
}
|
|
return args;
|
|
}
|
|
|
|
function genUuid() {
|
|
if (typeof crypto.randomUUID === "function") return crypto.randomUUID();
|
|
// Fallback: RFC4122 v4-ish
|
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
|
|
const r = (crypto.randomBytes(1)[0] % 16) | 0;
|
|
const v = c === "x" ? r : (r & 0x3) | 0x8;
|
|
return v.toString(16);
|
|
});
|
|
}
|
|
|
|
function uniqueUuids(n, existing = new Set()) {
|
|
const set = new Set(existing);
|
|
while (set.size < n) set.add(genUuid());
|
|
return Array.from(set);
|
|
}
|
|
|
|
function main() {
|
|
const { count, force, append } = parseArgs(process.argv);
|
|
const target = path.resolve(__dirname, "../server/src/config/uuids.json");
|
|
|
|
let current = [];
|
|
if (fs.existsSync(target)) {
|
|
try {
|
|
const raw = fs.readFileSync(target, "utf8");
|
|
const arr = JSON.parse(raw);
|
|
if (Array.isArray(arr)) current = arr.filter(x => typeof x === "string");
|
|
} catch {}
|
|
}
|
|
|
|
if (!force && !append && current.length > 0) {
|
|
console.log(`uuids.json already has ${current.length} entries. Use --force to overwrite or --append to add.`);
|
|
process.exit(0);
|
|
}
|
|
|
|
let out = [];
|
|
if (force) {
|
|
out = uniqueUuids(count);
|
|
} else if (append) {
|
|
const needed = Math.max(count, current.length + count);
|
|
const set = new Set(current);
|
|
out = uniqueUuids(needed, set);
|
|
} else {
|
|
// initial write when empty
|
|
out = uniqueUuids(count);
|
|
}
|
|
|
|
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
fs.writeFileSync(target, JSON.stringify(out, null, 2) + "\n", "utf8");
|
|
|
|
console.log(`Wrote ${out.length} UUIDs to ${path.relative(process.cwd(), target)}`);
|
|
}
|
|
|
|
try {
|
|
main();
|
|
} catch (err) {
|
|
console.error(err.message || err);
|
|
process.exit(1);
|
|
}
|
|
|