54 lines
2.2 KiB
JavaScript
54 lines
2.2 KiB
JavaScript
|
|
// Build-time character generator.
|
||
|
|
//
|
||
|
|
// DiceBear's `open-peeps` style IS Pablo Stanley's Open Peeps artwork (CC0-1.0).
|
||
|
|
// We generate deterministic per-seed SVGs OFFLINE (no runtime CDN / HTTP call) and
|
||
|
|
// vendor them into public/illustrations/dicebear/, then write a license-ledger row
|
||
|
|
// per file into public/illustrations/assets.json. Run: npm run gen:dicebear
|
||
|
|
import { createAvatar } from "@dicebear/core";
|
||
|
|
import { openPeeps } from "@dicebear/collection";
|
||
|
|
import { writeFileSync, readFileSync, mkdirSync } from "node:fs";
|
||
|
|
import { dirname, join } from "node:path";
|
||
|
|
import { fileURLToPath } from "node:url";
|
||
|
|
|
||
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||
|
|
const ILLUS = join(__dirname, "..", "public", "illustrations");
|
||
|
|
const OUT = join(ILLUS, "dicebear");
|
||
|
|
mkdirSync(OUT, { recursive: true });
|
||
|
|
|
||
|
|
const COUNT = 30;
|
||
|
|
const VENDORED = "2026-06-22";
|
||
|
|
const ledger = {};
|
||
|
|
|
||
|
|
for (let i = 1; i <= COUNT; i++) {
|
||
|
|
const seed = `flatrender-peep-${i}`;
|
||
|
|
// idRandomizer keeps SVG <defs> ids unique so multiple avatars can be inlined
|
||
|
|
// in one document without clashing (Remotion composites many in one frame).
|
||
|
|
const svg = createAvatar(openPeeps, { seed, size: 400, randomizeIds: true }).toString();
|
||
|
|
const file = `openpeeps-${String(i).padStart(2, "0")}.svg`;
|
||
|
|
writeFileSync(join(OUT, file), svg, "utf8");
|
||
|
|
ledger[`dicebear/${file}`] = {
|
||
|
|
source: "DiceBear open-peeps (Pablo Stanley Open Peeps)",
|
||
|
|
license: "CC0-1.0",
|
||
|
|
license_class: "CC0",
|
||
|
|
commercial_ok: true,
|
||
|
|
attribution_required: false,
|
||
|
|
ai_training_allowed: true,
|
||
|
|
animation_fit: "swap-transform (bust/half-body micro-rig)",
|
||
|
|
generator: `createAvatar(openPeeps,{seed:'${seed}'})`,
|
||
|
|
url: "https://www.dicebear.com/styles/open-peeps/",
|
||
|
|
vendored: VENDORED,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
// Merge into the assets.json license ledger (preserve any existing rows).
|
||
|
|
const ledgerPath = join(ILLUS, "assets.json");
|
||
|
|
let existing = {};
|
||
|
|
try {
|
||
|
|
existing = JSON.parse(readFileSync(ledgerPath, "utf8"));
|
||
|
|
} catch {
|
||
|
|
existing = {};
|
||
|
|
}
|
||
|
|
writeFileSync(ledgerPath, JSON.stringify({ ...existing, ...ledger }, null, 2) + "\n", "utf8");
|
||
|
|
console.log(`generated ${COUNT} open-peeps SVGs in ${OUT}`);
|
||
|
|
console.log(`ledger now has ${Object.keys({ ...existing, ...ledger }).length} rows`);
|