wuchale
Version:
Protobuf-like i18n from plain code
44 lines (43 loc) • 1.65 kB
JavaScript
import { AdapterHandler } from "../handler.js";
import { color, Logger } from "../log.js";
import { readFile } from "node:fs/promises";
import { watch as watchFS } from 'chokidar';
function extractor(handler) {
const adapterName = color.magenta(handler.key);
return async (filename) => {
console.info(`${adapterName}: Extract from ${color.cyan(filename)}`);
const contents = await readFile(filename);
await handler.transform(contents.toString(), filename);
};
}
export async function extract(config, clean, watch, sync) {
!watch && console.info('Extracting...');
const handlers = [];
const sharedState = {};
for (const [key, adapter] of Object.entries(config.adapters)) {
const handler = new AdapterHandler(adapter, key, config, 'cli', process.cwd(), new Logger(config.logLevel));
await handler.init(sharedState);
handlers.push(handler);
}
// other loop to make sure that all otherFileMatchers are collected
for (const handler of handlers) {
await handler.directScanFS(clean, sync);
}
if (!watch) {
console.info('Extraction finished.');
return;
}
// watch
console.info('Watching for changes');
const handlersWithExtr = handlers.map(h => [h.fileMatches, extractor(h)]);
watchFS('.', { ignoreInitial: true }).on('all', async (event, filename) => {
if (!['add', 'change'].includes(event)) {
return;
}
for (const [fileMatches, extract] of handlersWithExtr) {
if (fileMatches(filename)) {
await extract(filename);
}
}
});
}