feat: add watch scripts
parent
f54d36f4b2
commit
7da64127ba
@ -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();
|
Loading…
Reference in New Issue