feat: add watch scripts

main
Tanimodori 2 years ago
parent f54d36f4b2
commit 7da64127ba
No known key found for this signature in database
GPG Key ID: 27779538B4410104

@ -0,0 +1,10 @@
const fileSyncJson = require('../filesync.json');
const dist = fileSyncJson['scriptsFolder'];
const src = 'src';
const allowedFiletypes = fileSyncJson['allowedFiletypes'];
module.exports = {
dist,
src,
allowedFiletypes,
};

@ -0,0 +1,7 @@
const fs = require('node:fs');
const { dist } = require('./config');
// ensure dist exist
if (!fs.existsSync(dist)) {
fs.mkdirSync(dist);
}

@ -0,0 +1,90 @@
const fs = require('node:fs');
const path = require('node:path');
const syncDirectory = require('sync-directory');
const fg = require('fast-glob');
const chokidar = require('chokidar');
const { src, dist, allowedFiletypes } = require('./config');
/** Format dist path for printing */
function normalize(p) {
return p.replace(/\\/g, '/');
}
/**
* Sync static files.
* Include init and watch phase.
*/
async function syncStatic() {
return syncDirectory.async(path.resolve(src), path.resolve(dist), {
exclude: (file) => {
const { ext } = path.parse(file);
return ext && !allowedFiletypes.includes(ext);
},
async afterEachSync(event) {
// log file action
let eventType;
if (event.eventType === 'add' || event.eventType === 'init:copy') {
eventType = 'changed';
} else if (event.eventType === 'unlink') {
eventType = 'deleted';
}
if (eventType) {
let relative = event.relativePath;
if (relative[0] === '\\') {
relative = relative.substring(1);
}
console.log(`${normalize(relative)} ${eventType}`);
}
},
watch: true,
deleteOrphaned: true,
});
}
/**
* Sync ts script files.
* Init phase only.
*/
async function initTypeScript() {
const distFiles = await fg(`${dist}/**/*.js`);
for (const distFile of distFiles) {
// search existing *.js file in dist
const relative = path.relative(dist, distFile);
const srcFile = path.resolve(src, relative).replace(/\.js$/, '.ts');
// if srcFile does not exist, delete distFile
if (!fs.existsSync(srcFile)) {
await fs.promises.unlink(distFile);
console.log(`${normalize(relative)} deleted`);
}
}
}
/**
* Sync ts script files.
* Watch phase only.
*/
async function watchTypeScript() {
chokidar.watch(`${src}/**/*.ts`).on('unlink', async (p) => {
// called on *.ts file get deleted
const relative = path.relative(src, p).replace(/\.ts$/, '.js');
const distFile = path.resolve(dist, relative);
// if distFile exists, delete it
if (fs.existsSync(distFile)) {
await fs.promises.unlink(distFile);
console.log(`${normalize(relative)} deleted`);
}
});
}
/**
* Sync ts script files.
* Include init and watch phase.
*/
async function syncTypeScript() {
await initTypeScript();
return watchTypeScript();
}
console.log('INIT watching static and ts files...');
syncStatic();
syncTypeScript();

@ -2,8 +2,12 @@
"name": "bitburner-typescript-template",
"version": "1.0.0",
"scripts": {
"transpile": "npx tsc -w",
"watch": "npx bitburner-filesync@latest"
"watch:transpile": "tsc -w --preserveWatchOutput",
"watch:local": "node build/watch.js",
"watch:remote": "bitburner-filesync",
"watch:init": "node build/init.js",
"watch:all": "concurrently npm:watch:transpile npm:watch:local npm:watch:remote",
"watch": "npm run watch:init && npm run watch:all"
},
"author": "hydroflame, Hoekstraa, based on work by SlyCedix",
"devDependencies": {

Loading…
Cancel
Save