UNPKG

@intlayer/chokidar

Version:

Scans and builds Intlayer declaration files into dictionaries based on Intlayer configuration.

56 lines (54 loc) 3.11 kB
import { parallelize } from "../utils/parallelize.mjs"; import { writeFileIfChanged } from "../writeFileIfChanged.mjs"; import { mkdir } from "node:fs/promises"; import { relative, resolve } from "node:path"; import { colorizePath } from "@intlayer/config/logger"; import { assertPathWithin, normalizePath } from "@intlayer/config/utils"; import { OUTPUT_FORMAT } from "@intlayer/config/defaultValues"; //#region src/buildIntlayerDictionary/writeFetchDictionary.ts const generateDictionaryEntryPoint = (key, locales, relativePrefix, format = "esm") => { const extension = format === "cjs" ? "cjs" : "mjs"; const localeEntries = locales.sort((a, b) => String(a).localeCompare(String(b))).map((locale) => ` '${locale}': async () => {\n try {\n const res = await fetch(\`\${editor.liveSyncURL}/dictionaries/${key}/${locale}\`);\n return await res.json();\n } catch {\n return dynContent['${locale}']();\n }\n }`).join(",\n"); if (format === "esm") return `import { editor } from 'intlayer';\nimport dynContent from '${relativePrefix}/${key}.${extension}';\n\nconst content = {\n${localeEntries}\n};\n\nexport default content;\n`; return `const { editor } = require('intlayer');\nconst dynContent = require('${relativePrefix}/${key}.${extension}');\n\nmodule.exports = {\n${localeEntries}\n};\n`; }; /** * Write the localized dictionaries to the dictionariesDir * @param mergedDictionaries - The merged dictionaries * @param configuration - The configuration * @returns The final dictionaries * * @example * ```ts * const unmergedDictionaries = await writeUnmergedDictionaries(dictionaries); * const finalDictionaries = await writeFinalDictionaries(unmergedDictionaries); * console.log(finalDictionaries); * * // .intlayer/fetch_dictionary/home.mjs * // .intlayer/fetch_dictionary/home.cjs * ``` */ const writeFetchDictionary = async (dynamicDictionaries, configuration, formats = OUTPUT_FORMAT) => { const { fetchDictionariesDir, dynamicDictionariesDir } = configuration.system; const { locales } = configuration.internationalization; let relativePrefix = normalizePath(relative(fetchDictionariesDir, dynamicDictionariesDir)); if (!relativePrefix.startsWith(".")) relativePrefix = `./${relativePrefix}`; await mkdir(resolve(fetchDictionariesDir), { recursive: true }); const resultDictionariesPaths = {}; await parallelize(Object.entries(dynamicDictionaries), async ([key]) => { if (key === "undefined") return; await parallelize(formats, async (format) => { const extension = format === "cjs" ? "cjs" : "mjs"; const content = generateDictionaryEntryPoint(key, locales, relativePrefix, format); const fetchEntryPath = resolve(fetchDictionariesDir, `${key}.${extension}`); assertPathWithin(fetchEntryPath, fetchDictionariesDir); await writeFileIfChanged(fetchEntryPath, content).catch((err) => { console.error(`Error creating fetch ${colorizePath(fetchEntryPath)}:`, err); }); }); }); return resultDictionariesPaths; }; //#endregion export { generateDictionaryEntryPoint, writeFetchDictionary }; //# sourceMappingURL=writeFetchDictionary.mjs.map