59 lines
1.4 KiB
JavaScript

import { chokidar, lodash, winPath } from '@fesjs/utils';
import { getAppPath } from './getAppEntryPath';
export default async ({ api, watch }) => {
const { paths } = api;
async function generate() {
api.logger.debug('generate files');
await api.applyPlugins({
key: 'onGenerateFiles',
type: api.ApplyPluginsType.event
});
}
let watchers = [];
await generate();
function unwatch() {
watchers.forEach((watcher) => {
watcher.close();
});
watchers = [];
}
function createWatcher(path) {
const watcher = chokidar.watch(path, {
// ignore .dotfiles and _mock.js
ignored: /(^|[/\\])(_mock.js$|\..)/,
ignoreInitial: true
});
watcher.on(
'all',
lodash.throttle(async () => {
await generate();
}, 100)
);
watchers.push(watcher);
}
if (watch) {
const watcherPaths = await api.applyPlugins({
key: 'addTmpGenerateWatcherPaths',
type: api.ApplyPluginsType.add,
initialValue: [
paths.absPagesPath,
getAppPath(paths.absSrcPath)
]
});
lodash
.uniq(watcherPaths.map(p => winPath(p)))
.forEach((p) => {
createWatcher(p);
});
}
return unwatch;
};