UNPKG

vite-intlayer

Version:

A Vite plugin for seamless internationalization (i18n), providing locale detection, redirection, and environment-based configuration

99 lines (97 loc) 3.58 kB
import { intlayerVueAsyncPlugin } from "./intlayerVueAsyncPlugin.mjs"; import { createRequire } from "node:module"; import { join } from "node:path"; import { intlayerOptimizeBabelPlugin } from "@intlayer/babel"; import { getComponentTransformPattern, runOnce } from "@intlayer/chokidar"; import { getAppLogger } from "@intlayer/config"; import { getDictionaries } from "@intlayer/dictionaries-entry"; //#region src/intlayerPrunePlugin.ts const INTLAYER_USAGE_REGEX = /\b(use|get)Intlayer\b/; const intlayerPrune = async (intlayerConfig) => { try { const babel = createRequire(import.meta.url)("@babel/core"); const logger = getAppLogger(intlayerConfig); const { importMode, optimize } = intlayerConfig.build; const { dictionariesDir, dynamicDictionariesDir, unmergedDictionariesDir, fetchDictionariesDir, mainDir, baseDir } = intlayerConfig.content; const filesListPattern = await getComponentTransformPattern(intlayerConfig); const dictionariesEntryPath = join(mainDir, "dictionaries.mjs"); const unmergedDictionariesEntryPath = join(mainDir, "unmerged_dictionaries.mjs"); const dynamicDictionariesEntryPath = join(mainDir, "dynamic_dictionaries.mjs"); const filesList = [ ...filesListPattern, dictionariesEntryPath, unmergedDictionariesEntryPath ]; const dictionaries = getDictionaries(intlayerConfig); const liveSyncKeys = Object.values(dictionaries).filter((dictionary) => dictionary.live).map((dictionary) => dictionary.key); return [intlayerVueAsyncPlugin(intlayerConfig, filesList), { name: "vite-intlayer-babel-transform", enforce: "post", apply: (_config, env) => { const isBuild = env.command === "build"; const isEnabled = optimize === void 0 && isBuild || optimize === true; if (isEnabled) runOnce(join(baseDir, ".intlayer", "cache", "intlayer-prune-plugin-enabled.lock"), () => logger("Build optimization enabled"), { cacheTimeoutMs: 1e3 * 10 }); return isEnabled; }, transform(code, id) { /** * Transform file as * .../HelloWorld.vue?vue&type=script&setup=true&lang.ts * Into * .../HelloWorld.vue * * Prevention for virtual file */ const filename = id.split("?", 1)[0]; if (!filesList.includes(filename)) return null; const isDictionaryEntry = [dictionariesEntryPath, unmergedDictionariesEntryPath].includes(filename); if (!(INTLAYER_USAGE_REGEX.test(code) || isDictionaryEntry)) return null; const result = babel.transformSync(code, { filename, plugins: [[intlayerOptimizeBabelPlugin, { optimize, dictionariesDir, dictionariesEntryPath, unmergedDictionariesEntryPath, unmergedDictionariesDir, dynamicDictionariesDir, dynamicDictionariesEntryPath, fetchDictionariesDir, importMode, filesList, replaceDictionaryEntry: true, liveSyncKeys }]], parserOpts: { sourceType: "module", allowImportExportEverywhere: true, plugins: [ "typescript", "jsx", "decorators-legacy", "classProperties", "objectRestSpread", "asyncGenerators", "functionBind", "exportDefaultFrom", "exportNamespaceFrom", "dynamicImport", "nullishCoalescingOperator", "optionalChaining" ] } }); if (result?.code) return { code: result.code, map: result.map }; } }]; } catch (error) { console.warn("Failed to transform with Babel plugin:", error); return []; } }; //#endregion export { intlayerPrune }; //# sourceMappingURL=intlayerPrunePlugin.mjs.map