UNPKG

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