next-intlayer
Version:
Simplify internationalization i18n in Next.js with context providers, hooks, locale detection, and multilingual content integration.
206 lines (204 loc) • 8.72 kB
JavaScript
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
let node_path = require("node:path");
let __intlayer_chokidar = require("@intlayer/chokidar");
let __intlayer_config = require("@intlayer/config");
let __intlayer_dictionaries_entry = require("@intlayer/dictionaries-entry");
let __intlayer_webpack = require("@intlayer/webpack");
let defu = require("defu");
let fast_glob = require("fast-glob");
fast_glob = require_rolldown_runtime.__toESM(fast_glob);
let next_package_json = require("next/package.json");
next_package_json = require_rolldown_runtime.__toESM(next_package_json);
//#region src/server/withIntlayer.ts
const isGteNext13 = (0, __intlayer_config.compareVersions)(next_package_json.default.version, "≥", "13.0.0");
const isGteNext15 = (0, __intlayer_config.compareVersions)(next_package_json.default.version, "≥", "15.0.0");
const isGteNext16 = (0, __intlayer_config.compareVersions)(next_package_json.default.version, "≥", "16.0.0");
const isTurbopackStable = (0, __intlayer_config.compareVersions)(next_package_json.default.version, "≥", "15.3.0");
const isTurbopackEnabledFromCommand = isGteNext16 ? !process.env.npm_lifecycle_script?.includes("--webpack") : process.env.npm_lifecycle_script?.includes("--turbo");
const getIsSwcPluginAvailable = (intlayerConfig) => {
try {
(intlayerConfig.build?.require ?? (0, __intlayer_config.getProjectRequire)()).resolve("@intlayer/swc");
return true;
} catch (_e) {
return false;
}
};
const resolvePluginPath = (pluginPath, intlayerConfig, isTurbopackEnabled) => {
const pluginPathResolved = (intlayerConfig.build?.require ?? (0, __intlayer_config.getProjectRequire)())?.resolve(pluginPath);
if (isTurbopackEnabled) return (0, __intlayer_config.normalizePath)(`./${(0, node_path.relative)(process.cwd(), pluginPathResolved)}`);
return pluginPathResolved;
};
const getPruneConfig = (intlayerConfig, isBuildCommand, isTurbopackEnabled) => {
const { optimize, traversePattern, importMode } = intlayerConfig.build;
const { dictionariesDir, unmergedDictionariesDir, dynamicDictionariesDir, fetchDictionariesDir, mainDir, baseDir } = intlayerConfig.content;
const logger = (0, __intlayer_config.getAppLogger)(intlayerConfig);
if (optimize === false) return {};
if (optimize === void 0 && !isBuildCommand) return {};
if (!isGteNext13) return {};
if (!getIsSwcPluginAvailable(intlayerConfig)) {
logger([
(0, __intlayer_config.colorize)("Recommended: Install", __intlayer_config.ANSIColors.GREY),
(0, __intlayer_config.colorize)("@intlayer/swc", __intlayer_config.ANSIColors.GREY_LIGHT),
(0, __intlayer_config.colorize)("package to enable build optimization. See documentation: ", __intlayer_config.ANSIColors.GREY),
(0, __intlayer_config.colorize)("https://intlayer.org/docs/en/bundle_optimization", __intlayer_config.ANSIColors.GREY_LIGHT)
]);
return {};
}
(0, __intlayer_chokidar.runOnce)((0, node_path.join)(baseDir, ".intlayer", "cache", "intlayer-prune-plugin-enabled.lock"), () => logger("Build optimization enabled"), { cacheTimeoutMs: 1e3 * 10 });
const dictionariesEntryPath = (0, node_path.join)(mainDir, "dictionaries.mjs");
const dynamicDictionariesEntryPath = (0, node_path.join)(mainDir, "dynamic_dictionaries.mjs");
const unmergedDictionariesEntryPath = (0, node_path.join)(mainDir, "unmerged_dictionaries.mjs");
const fetchDictionariesEntryPath = (0, node_path.join)(mainDir, "fetch_dictionaries.mjs");
const filesList = [
...fast_glob.default.sync(traversePattern, { cwd: baseDir }).map((file) => {
if ((0, node_path.isAbsolute)(file)) return file;
return (0, node_path.join)(baseDir, file);
}),
dictionariesEntryPath,
unmergedDictionariesEntryPath
];
const dictionaries = (0, __intlayer_dictionaries_entry.getDictionaries)(intlayerConfig);
const liveSyncKeys = Object.values(dictionaries).filter((dictionary) => dictionary.live).map((dictionary) => dictionary.key);
return { experimental: { swcPlugins: [[resolvePluginPath("@intlayer/swc", intlayerConfig, isTurbopackEnabled), {
dictionariesDir,
dictionariesEntryPath,
unmergedDictionariesEntryPath,
unmergedDictionariesDir,
dynamicDictionariesDir,
dynamicDictionariesEntryPath,
fetchDictionariesDir,
fetchDictionariesEntryPath,
importMode,
filesList,
replaceDictionaryEntry: true,
liveSyncKeys
}]] } };
};
const getCommandsEvent = () => {
const lifecycleEvent = process.env.npm_lifecycle_event;
const lifecycleScript = process.env.npm_lifecycle_script ?? "";
return {
isDevCommand: lifecycleEvent === "dev" || process.argv.some((arg) => arg === "dev") || /(^|\s)(next\s+)?dev(\s|$)/.test(lifecycleScript),
isBuildCommand: lifecycleEvent === "build" || process.argv.some((arg) => arg === "build") || /(^|\s)(next\s+)?build(\s|$)/.test(lifecycleScript),
isStartCommand: lifecycleEvent === "start" || process.argv.some((arg) => arg === "start") || /(^|\s)(next\s+)?start(\s|$)/.test(lifecycleScript)
};
};
/**
* A Next.js plugin that adds the intlayer configuration to the webpack configuration
* and sets the environment variables
*
* Usage:
*
* ```ts
* // next.config.js
* export default withIntlayerSync(nextConfig)
* ```
*/
const withIntlayerSync = (nextConfig = {}, configOptions) => {
if (typeof nextConfig !== "object") nextConfig = {};
const intlayerConfig = (0, __intlayer_config.getConfiguration)(configOptions);
const logger = (0, __intlayer_config.getAppLogger)(intlayerConfig);
const isTurbopackEnabled = configOptions?.enableTurbopack ?? isTurbopackEnabledFromCommand;
if (isTurbopackEnabled && typeof nextConfig.webpack !== "undefined") logger("Turbopack is enabled but a custom webpack config is present. It will be ignored.");
const { isBuildCommand, isDevCommand } = getCommandsEvent();
const turboConfig = {
resolveAlias: (0, __intlayer_config.getAlias)({
configuration: intlayerConfig,
formatter: (value) => `./${value}`
}),
rules: { "*.node": {
as: "*.node",
loaders: ["node-loader"]
} }
};
const serverExternalPackages = [
"esbuild",
"module",
"fs",
"chokidar",
"fsevents"
];
const getNewConfig = () => {
let config = {};
if (isGteNext15) config = {
...config,
serverExternalPackages
};
if (isGteNext13 && !isGteNext15) config = {
...config,
experimental: {
...config?.experimental ?? {},
serverComponentsExternalPackages: serverExternalPackages
}
};
if (isTurbopackEnabled) if (isGteNext15 && isTurbopackStable) config = {
...config,
turbopack: turboConfig
};
else config = {
...config,
experimental: {
...config?.experimental ?? {},
turbo: turboConfig
}
};
else config = {
...config,
webpack: (config$1, options) => {
const { isServer, nextRuntime } = options;
if (typeof nextConfig.webpack === "function") config$1 = nextConfig.webpack(config$1, options);
if (config$1.externals === false) config$1.externals = [];
config$1.externals.push({
esbuild: "esbuild",
module: "module",
fs: "fs",
chokidar: "chokidar",
fsevents: "fsevents"
});
config$1.module.rules.push({
test: /\.node$/,
loader: "node-loader"
});
config$1.resolve.alias = {
...config$1.resolve.alias,
...(0, __intlayer_config.getAlias)({
configuration: intlayerConfig,
formatter: (value) => (0, node_path.resolve)(value)
})
};
if (isDevCommand && isServer && nextRuntime === "nodejs") config$1.plugins.push(new __intlayer_webpack.IntlayerPlugin(intlayerConfig));
return config$1;
}
};
return config;
};
const pruneConfig = getPruneConfig(intlayerConfig, isBuildCommand, isTurbopackEnabled ?? false);
return (0, defu.defu)((0, defu.defu)(getNewConfig(), pruneConfig), nextConfig);
};
/**
* A Next.js plugin that adds the intlayer configuration to the webpack configuration
* and sets the environment variables
*
* Usage:
*
* ```ts
* // next.config.js
* export default withIntlayer(nextConfig)
* ```
*
* > Node withIntlayer is a promise function. Use withIntlayerSync instead if you want to use it synchronously.
* > Using the promise allows to prepare the intlayer dictionaries before the build starts.
*
*/
const withIntlayer = async (nextConfig = {}, configOptions) => {
const { isBuildCommand, isDevCommand } = getCommandsEvent();
if (isDevCommand || isBuildCommand) await (0, __intlayer_chokidar.prepareIntlayer)((0, __intlayer_config.getConfiguration)(configOptions), {
clean: isBuildCommand,
cacheTimeoutMs: isBuildCommand ? 1e3 * 30 : 1e3 * 60 * 60
});
return withIntlayerSync(nextConfig, configOptions);
};
//#endregion
exports.withIntlayer = withIntlayer;
exports.withIntlayerSync = withIntlayerSync;
//# sourceMappingURL=withIntlayer.cjs.map