52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
import https from 'https';
|
|
import { fileURLToPath } from 'url';
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
const ASSETS = [
|
|
{
|
|
url: 'https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.30.2/cytoscape.min.js',
|
|
output: path.join(__dirname, '../../site/public/js/cytoscape.min.js'),
|
|
},
|
|
{
|
|
url: 'https://unpkg.com/cytoscape-cose-bilkent@1.6.4/cytoscape-cose-bilkent.js',
|
|
output: path.join(__dirname, '../../site/public/js/cytoscape-cose-bilkent.js'),
|
|
},
|
|
];
|
|
|
|
function downloadFile(url, outputPath) {
|
|
return new Promise((resolve, reject) => {
|
|
https.get(url, (res) => {
|
|
if (res.statusCode !== 200) {
|
|
reject(new Error(`HTTP ${res.statusCode}: ${url}`));
|
|
return;
|
|
}
|
|
const chunks = [];
|
|
res.on('data', (c) => chunks.push(c));
|
|
res.on('end', () => {
|
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
fs.writeFileSync(outputPath, Buffer.concat(chunks));
|
|
resolve();
|
|
});
|
|
}).on('error', reject);
|
|
});
|
|
}
|
|
|
|
const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
|
|
for (const { url, output } of ASSETS) {
|
|
if (fs.existsSync(output)) {
|
|
const age = Date.now() - fs.statSync(output).mtime.getTime();
|
|
if (age < MAX_AGE_MS) {
|
|
console.log(`✅ ${path.basename(output)} already present (${fs.statSync(output).size} bytes)`);
|
|
continue;
|
|
}
|
|
}
|
|
process.stdout.write(`📥 ${path.basename(output)}... `);
|
|
await downloadFile(url, output);
|
|
console.log(`${fs.statSync(output).size} bytes`);
|
|
}
|