Files
wedding/tools/copy.js

68 lines
1.9 KiB
JavaScript

import path from 'path';
import chokidar from 'chokidar';
import { exec } from 'child_process';
import { writeFile, copyFile, makeDir, copyDir, cleanDir } from './lib/fs';
import pkg from '../package.json';
import { format } from './run';
/**
* Copies static files such as robots.txt, favicon.ico to the
* output (build) folder.
*/
async function copy() {
await makeDir('build');
await Promise.all([
writeFile('build/package.json', JSON.stringify({
private: true,
engines: pkg.engines,
dependencies: pkg.dependencies,
scripts: {
start: 'node server.js',
},
}, null, 2)),
copyFile('LICENSE.txt', 'build/LICENSE.txt'),
copyDir('src/content', 'build/content'),
copyDir('public', 'build/public'),
]);
await exec('git log -n 1 --pretty=format:"%H"', (err, stdout) => {
if (stdout) {
writeFile('build/public/config.json', JSON.stringify({
build: {
hash: stdout,
time: new Date(),
},
}, null, 2));
}
});
if (process.argv.includes('--watch')) {
const watcher = chokidar.watch([
'src/content/**/*',
'public/**/*',
], { ignoreInitial: true });
watcher.on('all', async (event, filePath) => {
const start = new Date();
const src = path.relative('./', filePath);
const dist = path.join('build/', src.startsWith('src') ? path.relative('src', src) : src);
switch (event) {
case 'add':
case 'change':
await makeDir(path.dirname(dist));
await copyFile(filePath, dist);
break;
case 'unlink':
case 'unlinkDir':
cleanDir(dist, { nosort: true, dot: true });
break;
default:
return;
}
const end = new Date();
const time = end.getTime() - start.getTime();
console.log(`[${format(end)}] ${event} '${dist}' after ${time} ms`);
});
}
}
export default copy;