// .gitea/scripts/replaceTokens.js // Skanuje: // - artifacts/frontend/**/*.js // - artifacts/webapi/appsettings.json (jeśli jest) // - artifacts/webapi/client_secrets.json (jeśli jest) // Tokeny: #{NAME}# -> wartość z VARIABLES/SECRETS (NAME: uppercased, '-'->'_') // Dodatkowo: #{BUILDID}# -> RUN_ID (z ENV) const fs = require('fs'); const path = require('path'); function walk(dir, predicate) { const out = []; if (!fs.existsSync(dir)) return out; for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { const full = path.join(dir, entry.name); if (entry.isDirectory()) out.push(...walk(full, predicate)); else if (predicate(full)) out.push(full); } return out; } function replaceInFile(file, mapToken) { let data = fs.readFileSync(file, 'utf8'); const re = /#\{(.*?)\}#/g; let changed = false; data = data.replace(re, (_, raw) => { const token = (raw || '').replace(/-/g, '_').toUpperCase(); const val = mapToken(token); if (val == null || val === '') return `#{${raw}}#`; // zostaw bez zmian, podbijemy błąd później changed = true; return String(val); }); fs.writeFileSync(file, data, 'utf8'); return changed; } (async () => { const secrets = JSON.parse(process.env.SECRETS || '{}'); const variables = JSON.parse(process.env.VARIABLES || '{}'); const RUN_ID = process.env.RUN_ID || process.env.GITHUB_RUN_ID || ''; const mapToken = (token) => { if (token === 'BUILDID') return RUN_ID; return (variables[token] != null ? variables[token] : secrets[token]); }; // 1) Frontend: wszystkie .js const feRoot = path.resolve('artifacts/frontend'); const feFiles = walk(feRoot, (f) => f.endsWith('.js')); // 2) Backend: wybrane pliki jeśli istnieją const beRoot = path.resolve('artifacts/webapi'); const beFiles = [] ;['appsettings.json', 'client_secrets.json'].forEach((name) => { const p = path.join(beRoot, name); if (fs.existsSync(p)) beFiles.push(p); }); const files = [...feFiles, ...beFiles]; if (files.length === 0) { console.error('❌ No candidate files found to tokenize (frontend .js / backend json).'); process.exit(1); } console.log(`🔎 Tokenizing ${files.length} file(s)`); const missing = new Set(); // drugi przebieg: wypisz brakujące tokeny, jeśli jakieś zostały w plikach for (const file of files) { // pierwsze podejście: podstaw wartości replaceInFile(file, mapToken); } for (const file of files) { const content = fs.readFileSync(file, 'utf8'); const reLeft = /#\{(.*?)\}#/g; let m; while ((m = reLeft.exec(content))) { const token = (m[1] || '').replace(/-/g, '_').toUpperCase(); missing.add(token); } } if (missing.size > 0) { console.error(`❌ Missing values for tokens: ${Array.from(missing).join(', ')}`); process.exit(1); } console.log('✅ Tokenization complete.'); })();