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
JavaScript
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