'use strict'; /** * Рендер tasks.generated.json из tasks.json (шаблон) + .env. * Подставляет __SCHED_API_KEY__ / __WEBHOOK_SECRET__; после рендера валидирует * «ни одного плейсхолдера не осталось». * * Запуск: node render-tasks.mjs (в этой папке; .env рядом) */ const fs = require('node:fs'); const path = require('node:path'); const envPath = path.join(__dirname, '.env'); const tplPath = path.join(__dirname, 'tasks.json'); const outPath = path.join(__dirname, 'tasks.generated.json'); function loadEnv(file) { const out = {}; for (const line of fs.readFileSync(file, 'utf8').split(/\r?\n/)) { const m = /^\s*([A-Z0-9_]+)\s*=\s*(.*)\s*$/.exec(line); if (m && !line.trim().startsWith('#')) out[m[1]] = m[2].replace(/^["']|["']$/g, ''); } return out; } const env = loadEnv(envPath); const tpl = fs.readFileSync(tplPath, 'utf8'); const subs = { __SCHED_API_KEY__: env.SCHED_API_KEY, __WEBHOOK_SECRET__: env.WEBHOOK_SECRET, __PUBLISH_REGISTRY__: env.PUBLISH_REGISTRY || 'null', __PUBLISH_REMOTE_BASE__: env.PUBLISH_REMOTE_BASE || 'null', __PUBLISH_GH_API_BASE__: env.PUBLISH_GH_API_BASE || 'null', }; let out = tpl; for (const [k, v] of Object.entries(subs)) { if (!v) throw new Error(`.env не содержит ${k.slice(2, -2)} — рендер невозможен`); out = out.split(k).join(v); } const leftovers = [...out.matchAll(/__[A-Z_]+__/g)].map((m) => m[0]); if (leftovers.length) throw new Error(`незаменённые плейсхолдеры: ${[...new Set(leftovers)].join(', ')}`); fs.writeFileSync(outPath, out); console.log(`tasks.generated.json записан (${outPath})`);