sprites/tools/deploy.js
Christopher Monsanto 4f4b19a4b6 Add deploy utility
2020-04-29 07:43:08 -04:00

52 lines
1.6 KiB
JavaScript

const fs = require('fs');
const pathlib = require('path');
const srcDir = process.argv[2];
const dstDir = process.argv[3];
if (srcDir === undefined || dstDir === undefined) {
throw new Error("Pass in directory to search for deploy scripts & directory to deploy to.");
}
process.chdir(srcDir);
const stack = ["."];
const deployMap = new Map;
let dir;
while (dir = stack.pop()) {
for (const name of fs.readdirSync(dir)) {
const path = pathlib.join(dir, name);
if (fs.statSync(path).isDirectory()) {
stack.push(path);
} else if (name === 'deploy.json' || name.endsWith('.deploy.json')) {
console.log(`Found ${path}`);
const pairs = JSON.parse(fs.readFileSync(path, 'utf8'));
for (let [src, dst] of pairs) {
src = pathlib.normalize(src);
dst = pathlib.normalize(dst);
if (pathlib.isAbsolute(src)) {
throw new Error('Deploy files are always relative to deploy json');
}
src = pathlib.join(dir, src);
if (pathlib.isAbsolute(dst)) {
throw new Error('Deploy files are always relative to destination directory');
}
dst = pathlib.join(dstDir, dst);
if (deployMap.has(dst)) {
throw new Error(`Duplicate deploy for ${dst}`);
}
deployMap.set(dst, src);
}
}
}
}
for (const [dst, src] of deployMap) {
fs.mkdirSync(pathlib.dirname(dst), {recursive: true});
fs.linkSync(src, dst);
}