UNPKG

wuchale

Version:

Protobuf-like i18n from normal code

62 lines 2.37 kB
import { glob } from "tinyglobby"; 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, logger) { const adapterName = color.magenta(handler.key); return async (filename) => { logger.log(`${adapterName}: Extract from ${color.cyan(filename)}`); const contents = await readFile(filename); await handler.transform(contents.toString(), filename); }; } export async function extractAdap(handler, files, locales, clean, logger) { await handler.init(); if (clean) { for (const loc of locales) { for (const item of Object.values(handler.catalogs[loc])) { item.references = []; } } } await Promise.all((await glob(...handler.globConfToArgs(files))).map(extractor(handler, logger))); if (clean) { logger.log('Cleaning...'); for (const loc of locales) { for (const [key, item] of Object.entries(handler.catalogs[loc])) { if (item.references.length === 0) { delete handler.catalogs[loc][key]; } } await handler.savePoAndCompile(loc); } } } export async function extract(config, locales, logger, clean, watch) { !watch && logger.info('Extracting...'); const handlers = []; for (const [key, adapter] of Object.entries(config.adapters)) { const handler = new AdapterHandler(adapter, key, config, 'extract', 'extract', process.cwd(), new Logger(config.messages)); await extractAdap(handler, adapter.files, locales, clean, logger); handlers.push(handler); } if (!watch) { logger.info('Extraction finished.'); return; } // watch logger.info('Watching for changes'); const handlersWithExtr = handlers.map(h => [h.fileMatches, extractor(h, logger)]); 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); } } }); } //# sourceMappingURL=extract.js.map