ops(sched-pipelines): локальный стенд sched + ym/ozon воркеры + browser/ntfy/alert-bridge; ТЗ разосланы
This commit is contained in:
43
host-stacks/local/sched-pipelines/render-tasks.cjs
Normal file
43
host-stacks/local/sched-pipelines/render-tasks.cjs
Normal file
@@ -0,0 +1,43 @@
|
||||
'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,
|
||||
};
|
||||
|
||||
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})`);
|
||||
Reference in New Issue
Block a user