Files
haptika/mobile/scripts/download-assets.cjs
2026-09-08 09:07:27 +02:00

16 lines
2.1 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const {execFile} = require('child_process');
const root = path.resolve(__dirname, '..');
const manifest = JSON.parse(fs.readFileSync(root + '/design/asset-manifest.json'));
const extraPath = root + '/design/screenshot-manifest.json';
if (fs.existsSync(extraPath)) Object.assign(manifest, JSON.parse(fs.readFileSync(extraPath)));
const dir = root + '/assets/figma';
fs.mkdirSync(dir, {recursive: true});
const assets = Object.entries(manifest); let cursor = 0;
const registry = fs.existsSync(root + "/design/asset-files.json") ? JSON.parse(fs.readFileSync(root + "/design/asset-files.json")) : {}; const failures = [];
function download(url, file) {return new Promise((resolve, reject) => execFile('/usr/bin/curl', ['--fail', '--location', '--retry', '3', '--silent', '--show-error', '--output', file, url], {maxBuffer: 1024 * 1024}, error => error ? reject(error) : resolve()));}
async function worker() {while (cursor < assets.length) {const [id, asset] = assets[cursor++]; if (registry[id] && fs.existsSync(dir + '/' + registry[id])) continue; const tmp = dir + '/' + id.replace(':', '-') + '.tmp';try {await download(asset.url, tmp); const bytes = fs.readFileSync(tmp); if (!bytes.length) throw Error('Empty asset'); const filename = crypto.createHash('sha256').update(bytes).digest('hex').slice(0, 20) + '.' + asset.format; fs.renameSync(tmp, dir + '/' + filename); registry[id] = filename;}catch (error) {failures.push({id, error: String(error)});}}}
Promise.all(Array.from({length: 4}, worker)).then(() => {fs.mkdirSync(root + '/src/design', {recursive: true});fs.writeFileSync(root + '/src/design/assets.ts', '// Exact Figma exports, bundled for offline use.\nexport const assets: Record<string, number> = {\n' + Object.entries(registry).map(([id, file]) => JSON.stringify(id) + ': require("../../assets/figma/' + file + '"),').join('\n') + '\n};\n');fs.writeFileSync(root + '/design/asset-files.json', JSON.stringify(registry, null, 2));console.log({downloaded: Object.keys(registry).length, unique: new Set(Object.values(registry)).size, failures});if (failures.length) process.exitCode = 1;});