next-intlayer 5.8.1 → 6.0.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -33,6 +33,7 @@ __export(withIntlayer_exports, {
|
|
|
33
33
|
module.exports = __toCommonJS(withIntlayer_exports);
|
|
34
34
|
var import_chokidar = require("@intlayer/chokidar");
|
|
35
35
|
var import_config = require("@intlayer/config");
|
|
36
|
+
var import_dictionaries_entry = __toESM(require("@intlayer/dictionaries-entry"));
|
|
36
37
|
var import_webpack = require("@intlayer/webpack");
|
|
37
38
|
var import_deepmerge = __toESM(require("deepmerge"));
|
|
38
39
|
var import_fast_glob = __toESM(require("fast-glob"));
|
|
@@ -52,9 +53,21 @@ const getIsSwcPluginAvailable = () => {
|
|
|
52
53
|
return false;
|
|
53
54
|
}
|
|
54
55
|
};
|
|
56
|
+
const resolvePluginPath = (pluginPath) => {
|
|
57
|
+
const pluginPathResolved = import_config.ESMxCJSRequire.resolve(pluginPath);
|
|
58
|
+
if (isTurbopackEnabled)
|
|
59
|
+
return (0, import_config.normalizePath)(`./${(0, import_path.relative)(process.cwd(), pluginPathResolved)}`);
|
|
60
|
+
return pluginPathResolved;
|
|
61
|
+
};
|
|
55
62
|
const getPruneConfig = (intlayerConfig) => {
|
|
56
63
|
const { optimize, traversePattern, importMode } = intlayerConfig.build;
|
|
57
|
-
const {
|
|
64
|
+
const {
|
|
65
|
+
dictionariesDir,
|
|
66
|
+
dynamicDictionariesDir,
|
|
67
|
+
fetchDictionariesDir,
|
|
68
|
+
mainDir,
|
|
69
|
+
baseDir
|
|
70
|
+
} = intlayerConfig.content;
|
|
58
71
|
if (!optimize) return {};
|
|
59
72
|
if (!isGteNext13) return {};
|
|
60
73
|
const isSwcPluginAvailable = getIsSwcPluginAvailable();
|
|
@@ -63,6 +76,7 @@ const getPruneConfig = (intlayerConfig) => {
|
|
|
63
76
|
(0, import_chokidar.runOnce)(
|
|
64
77
|
(0, import_path.join)(baseDir, ".next", "cache", "intlayer-prune-plugin-enabled.lock"),
|
|
65
78
|
() => logger("Intlayer prune plugin is enabled"),
|
|
79
|
+
void 0,
|
|
66
80
|
1e3 * 10
|
|
67
81
|
// 10 seconds
|
|
68
82
|
);
|
|
@@ -71,6 +85,7 @@ const getPruneConfig = (intlayerConfig) => {
|
|
|
71
85
|
mainDir,
|
|
72
86
|
"dynamic_dictionaries.mjs"
|
|
73
87
|
);
|
|
88
|
+
const fetchDictionariesEntryPath = (0, import_path.join)(mainDir, "fetch_dictionaries.mjs");
|
|
74
89
|
const filesListPattern = import_fast_glob.default.sync(traversePattern, {
|
|
75
90
|
cwd: baseDir
|
|
76
91
|
}).map((file) => (0, import_path.join)(baseDir, file));
|
|
@@ -79,62 +94,67 @@ const getPruneConfig = (intlayerConfig) => {
|
|
|
79
94
|
dictionariesEntryPath
|
|
80
95
|
// should add dictionariesEntryPath to replace it by a empty object if import made dynamic
|
|
81
96
|
];
|
|
97
|
+
const liveSyncKeys = Object.values(import_dictionaries_entry.default).filter((dictionary) => dictionary.live).map((dictionary) => dictionary.key);
|
|
82
98
|
return {
|
|
83
99
|
experimental: {
|
|
84
100
|
swcPlugins: [
|
|
85
101
|
[
|
|
86
|
-
|
|
102
|
+
resolvePluginPath("@intlayer/swc"),
|
|
87
103
|
{
|
|
88
104
|
dictionariesDir,
|
|
89
105
|
dictionariesEntryPath,
|
|
90
106
|
dynamicDictionariesDir,
|
|
91
107
|
dynamicDictionariesEntryPath,
|
|
108
|
+
fetchDictionariesDir,
|
|
109
|
+
fetchDictionariesEntryPath,
|
|
92
110
|
importMode,
|
|
93
111
|
filesList,
|
|
94
|
-
replaceDictionaryEntry: false
|
|
112
|
+
replaceDictionaryEntry: false,
|
|
113
|
+
liveSyncKeys
|
|
95
114
|
}
|
|
96
115
|
]
|
|
97
116
|
]
|
|
98
117
|
}
|
|
99
118
|
};
|
|
100
119
|
};
|
|
120
|
+
const getCommandsEvent = () => {
|
|
121
|
+
const lifecycleEvent = process.env.npm_lifecycle_event;
|
|
122
|
+
const lifecycleScript = process.env.npm_lifecycle_script ?? "";
|
|
123
|
+
const isDevCommand = lifecycleEvent === "dev" || process.argv.some((arg) => arg === "dev") || /(^|\s)(next\s+)?dev(\s|$)/.test(lifecycleScript);
|
|
124
|
+
const isBuildCommand = lifecycleEvent === "build" || process.argv.some((arg) => arg === "build") || /(^|\s)(next\s+)?build(\s|$)/.test(lifecycleScript);
|
|
125
|
+
const isStartCommand = lifecycleEvent === "start" || process.argv.some((arg) => arg === "start") || /(^|\s)(next\s+)?start(\s|$)/.test(lifecycleScript);
|
|
126
|
+
return {
|
|
127
|
+
isDevCommand,
|
|
128
|
+
isBuildCommand,
|
|
129
|
+
isStartCommand
|
|
130
|
+
};
|
|
131
|
+
};
|
|
101
132
|
const withIntlayer = async (nextConfig = {}) => {
|
|
102
133
|
if (typeof nextConfig !== "object") {
|
|
103
134
|
nextConfig = {};
|
|
104
135
|
}
|
|
105
136
|
const intlayerConfig = (0, import_config.getConfiguration)();
|
|
137
|
+
const { isDevCommand, isBuildCommand } = getCommandsEvent();
|
|
138
|
+
const appLogger = (0, import_config.getAppLogger)(intlayerConfig);
|
|
106
139
|
const sentinelPath = (0, import_path.join)(
|
|
107
140
|
intlayerConfig.content.baseDir,
|
|
108
141
|
".next",
|
|
109
142
|
"cache",
|
|
110
143
|
"intlayer-prepared.lock"
|
|
111
144
|
);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const unmergedDictionariesPath = (0, import_path.join)(mainDir, "unmerged_dictionaries.mjs");
|
|
120
|
-
const relativeUnmergedDictionariesPath = (0, import_path.relative)(
|
|
121
|
-
baseDir,
|
|
122
|
-
unmergedDictionariesPath
|
|
123
|
-
);
|
|
124
|
-
const configurationPath = (0, import_path.join)(configDir, "configuration.json");
|
|
125
|
-
const relativeConfigurationPath = (0, import_path.relative)(baseDir, configurationPath);
|
|
145
|
+
if (isBuildCommand || isDevCommand) {
|
|
146
|
+
await (0, import_chokidar.runOnce)(
|
|
147
|
+
sentinelPath,
|
|
148
|
+
async () => await (0, import_chokidar.prepareIntlayer)(intlayerConfig),
|
|
149
|
+
() => appLogger("Intlayer prepared")
|
|
150
|
+
);
|
|
151
|
+
}
|
|
126
152
|
const turboConfig = {
|
|
127
|
-
resolveAlias: {
|
|
153
|
+
resolveAlias: (0, import_config.getAlias)({
|
|
154
|
+
configuration: intlayerConfig,
|
|
155
|
+
formatter: (value) => `./${value}`
|
|
128
156
|
// prefix by './' to consider the path as relative to the project root. This is necessary for turbopack to work correctly.
|
|
129
|
-
|
|
130
|
-
"@intlayer/dictionaries-entry": (0, import_config.normalizePath)(
|
|
131
|
-
`./${relativeDictionariesPath}`
|
|
132
|
-
),
|
|
133
|
-
"@intlayer/unmerged-dictionaries-entry": (0, import_config.normalizePath)(
|
|
134
|
-
`./${relativeUnmergedDictionariesPath}`
|
|
135
|
-
),
|
|
136
|
-
"@intlayer/config/built": (0, import_config.normalizePath)(`./${relativeConfigurationPath}`)
|
|
137
|
-
},
|
|
157
|
+
}),
|
|
138
158
|
rules: {
|
|
139
159
|
"*.node": {
|
|
140
160
|
as: "*.node",
|
|
@@ -172,17 +192,10 @@ const withIntlayer = async (nextConfig = {}) => {
|
|
|
172
192
|
}
|
|
173
193
|
},
|
|
174
194
|
webpack: (config, options) => {
|
|
195
|
+
const { isServer, nextRuntime } = options;
|
|
175
196
|
if (typeof nextConfig.webpack === "function") {
|
|
176
197
|
config = nextConfig.webpack(config, options);
|
|
177
198
|
}
|
|
178
|
-
config.resolve.alias = {
|
|
179
|
-
...config.resolve.alias,
|
|
180
|
-
"@intlayer/dictionaries-entry": (0, import_path.resolve)(relativeDictionariesPath),
|
|
181
|
-
"@intlayer/unmerged-dictionaries-entry": (0, import_path.resolve)(
|
|
182
|
-
relativeUnmergedDictionariesPath
|
|
183
|
-
),
|
|
184
|
-
"@intlayer/config/built": (0, import_path.resolve)(relativeConfigurationPath)
|
|
185
|
-
};
|
|
186
199
|
config.externals.push({
|
|
187
200
|
esbuild: "esbuild",
|
|
188
201
|
module: "module",
|
|
@@ -194,9 +207,13 @@ const withIntlayer = async (nextConfig = {}) => {
|
|
|
194
207
|
test: /\.node$/,
|
|
195
208
|
loader: "node-loader"
|
|
196
209
|
});
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
210
|
+
config.resolve.alias = {
|
|
211
|
+
...config.resolve.alias,
|
|
212
|
+
...(0, import_config.getAlias)({
|
|
213
|
+
configuration: intlayerConfig
|
|
214
|
+
})
|
|
215
|
+
};
|
|
216
|
+
if (isDevCommand && isServer && nextRuntime === "nodejs") {
|
|
200
217
|
config.plugins.push(new import_webpack.IntlayerPlugin());
|
|
201
218
|
}
|
|
202
219
|
return config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { prepareIntlayer, runOnce } from '@intlayer/chokidar';\nimport {\n ESMxCJSRequire,\n getAppLogger,\n getConfiguration,\n IntlayerConfig,\n normalizePath,\n} from '@intlayer/config';\nimport { IntlayerPlugin } from '@intlayer/webpack';\nimport merge from 'deepmerge';\nimport fg from 'fast-glob';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\nimport { join, relative, resolve } from 'path';\nimport { compareVersions } from './compareVersion';\nimport { getNextVersion } from './getNextVertion';\n\n// Extract from the start script if --turbo or --turbopack flag is used\nconst isTurbopackEnabled =\n process.env.npm_lifecycle_script?.includes('--turbo');\nconst nextVersion = getNextVersion();\nconst isGteNext13 = compareVersions(nextVersion, '≥', '13.0.0');\nconst isGteNext15 = compareVersions(nextVersion, '≥', '15.0.0');\nconst isTurbopackStable = compareVersions(nextVersion, '≥', '15.3.0');\n\n// Check if SWC plugin is available\nconst getIsSwcPluginAvailable = () => {\n try {\n ESMxCJSRequire.resolve('@intlayer/swc');\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst getPruneConfig = (\n intlayerConfig: IntlayerConfig\n): Partial<NextConfig> => {\n const { optimize, traversePattern, importMode } = intlayerConfig.build;\n const { dictionariesDir, dynamicDictionariesDir, mainDir, baseDir } =\n intlayerConfig.content;\n\n if (!optimize) return {};\n\n if (!isGteNext13) return {};\n\n const isSwcPluginAvailable = getIsSwcPluginAvailable();\n\n if (!isSwcPluginAvailable) return {};\n\n const logger = getAppLogger(intlayerConfig);\n\n runOnce(\n join(baseDir, '.next', 'cache', 'intlayer-prune-plugin-enabled.lock'),\n () => logger('Intlayer prune plugin is enabled'),\n 1000 * 10 // 10 seconds\n );\n\n const dictionariesEntryPath = join(mainDir, 'dictionaries.mjs');\n\n const dynamicDictionariesEntryPath = join(\n mainDir,\n 'dynamic_dictionaries.mjs'\n );\n\n const filesListPattern = fg\n .sync(traversePattern, {\n cwd: baseDir,\n })\n .map((file) => join(baseDir, file));\n\n const filesList = [\n ...filesListPattern,\n dictionariesEntryPath, // should add dictionariesEntryPath to replace it by a empty object if import made dynamic\n ];\n\n return {\n experimental: {\n swcPlugins: [\n [\n ESMxCJSRequire.resolve('@intlayer/swc'),\n {\n dictionariesDir,\n dictionariesEntryPath,\n dynamicDictionariesDir,\n dynamicDictionariesEntryPath,\n importMode,\n filesList,\n replaceDictionaryEntry: false,\n } as any,\n ],\n ],\n },\n };\n};\n\ntype WebpackParams = Parameters<NextJsWebpackConfig>;\n\n/**\n * A Next.js plugin that adds the intlayer configuration to the webpack configuration\n * and sets the environment variablesi\n *\n * Usage:\n *\n * ```ts\n * // next.config.js\n * export default withIntlayer(nextConfig)\n * ```\n */\nexport const withIntlayer = async <T extends Partial<NextConfig>>(\n nextConfig: T = {} as T\n): Promise<NextConfig & T> => {\n if (typeof nextConfig !== 'object') {\n nextConfig = {} as T;\n }\n\n const intlayerConfig = getConfiguration();\n\n const sentinelPath = join(\n intlayerConfig.content.baseDir,\n '.next',\n 'cache',\n 'intlayer-prepared.lock'\n );\n\n // Only call prepareIntlayer once per server startup\n await runOnce(\n sentinelPath,\n async () => await prepareIntlayer(intlayerConfig)\n );\n\n // Format all configuration values as environment variables\n const { mainDir, configDir, baseDir } = intlayerConfig.content;\n\n const dictionariesPath = join(mainDir, 'dictionaries.mjs');\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n\n const unmergedDictionariesPath = join(mainDir, 'unmerged_dictionaries.mjs');\n const relativeUnmergedDictionariesPath = relative(\n baseDir,\n unmergedDictionariesPath\n );\n\n const configurationPath = join(configDir, 'configuration.json');\n const relativeConfigurationPath = relative(baseDir, configurationPath);\n\n // Only provide turbo-specific config if user explicitly sets it\n const turboConfig = {\n resolveAlias: {\n // prefix by './' to consider the path as relative to the project root. This is necessary for turbopack to work correctly.\n // Normalize the path to avoid issues with the path separator on Windows\n '@intlayer/dictionaries-entry': normalizePath(\n `./${relativeDictionariesPath}`\n ),\n '@intlayer/unmerged-dictionaries-entry': normalizePath(\n `./${relativeUnmergedDictionariesPath}`\n ),\n '@intlayer/config/built': normalizePath(`./${relativeConfigurationPath}`),\n },\n rules: {\n '*.node': {\n as: '*.node',\n loaders: ['node-loader'],\n },\n },\n };\n\n const serverExternalPackages = [\n 'esbuild',\n 'module',\n 'fs',\n 'chokidar',\n 'fsevents',\n ];\n\n const newConfig: Partial<NextConfig> = {\n // Only add `serverExternalPackages` if Next.js is v15+\n ...(isGteNext15\n ? {\n // only for Next ≥15\n serverExternalPackages,\n }\n : {\n // only for Next ≥13 and <15.3\n ...(isGteNext13 && {\n serverComponentsExternalPackages: serverExternalPackages,\n }),\n }),\n\n ...(isTurbopackEnabled && {\n ...(isGteNext15 && isTurbopackStable\n ? {\n // only for Next ≥15.3\n turbopack: turboConfig,\n }\n : {\n experimental: {\n // only for Next ≥13 and <15.3\n turbo: turboConfig,\n },\n }),\n }),\n\n webpack: (config: WebpackParams['0'], options: WebpackParams[1]) => {\n // If the user has defined their own webpack config, call it\n if (typeof nextConfig.webpack === 'function') {\n config = nextConfig.webpack(config, options);\n }\n\n // Alias the dictionary entry for all builds\n config.resolve.alias = {\n ...config.resolve.alias,\n '@intlayer/dictionaries-entry': resolve(relativeDictionariesPath),\n '@intlayer/unmerged-dictionaries-entry': resolve(\n relativeUnmergedDictionariesPath\n ),\n '@intlayer/config/built': resolve(relativeConfigurationPath),\n };\n\n // Mark these modules as externals\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n chokidar: 'chokidar',\n fsevents: 'fsevents',\n });\n\n // Use `node-loader` for any `.node` files\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n // Only add Intlayer plugin on server side (node runtime)\n const { isServer, nextRuntime } = options;\n\n // Skip preparation when running next start (production mode)\n const isBuildCommand =\n process.env.npm_lifecycle_event === 'build' ||\n process.argv.some((arg) => arg === 'build');\n\n if (!isBuildCommand && isServer && nextRuntime === 'nodejs') {\n config.plugins.push(new IntlayerPlugin());\n }\n\n return config;\n },\n };\n\n const pruneConfig: Partial<NextConfig> = getPruneConfig(intlayerConfig);\n\n const intlayerNextConfig: Partial<NextConfig> = merge(pruneConfig, newConfig);\n\n // Merge the new config with the user's config\n const result = merge(nextConfig, intlayerNextConfig) as NextConfig & T;\n\n return result;\n};\n"],"mappings":"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","names":["fg","merge"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { prepareIntlayer, runOnce } from '@intlayer/chokidar';\nimport {\n ESMxCJSRequire,\n getAlias,\n getAppLogger,\n getConfiguration,\n IntlayerConfig,\n normalizePath,\n} from '@intlayer/config';\nimport dictionaries from '@intlayer/dictionaries-entry';\nimport { IntlayerPlugin } from '@intlayer/webpack';\nimport merge from 'deepmerge';\nimport fg from 'fast-glob';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\nimport { join, relative } from 'path';\nimport { compareVersions } from './compareVersion';\nimport { getNextVersion } from './getNextVertion';\n\n// Extract from the start script if --turbo or --turbopack flag is used\nconst isTurbopackEnabled =\n process.env.npm_lifecycle_script?.includes('--turbo');\nconst nextVersion = getNextVersion();\nconst isGteNext13 = compareVersions(nextVersion, '≥', '13.0.0');\nconst isGteNext15 = compareVersions(nextVersion, '≥', '15.0.0');\nconst isTurbopackStable = compareVersions(nextVersion, '≥', '15.3.0');\n\n// Check if SWC plugin is available\nconst getIsSwcPluginAvailable = () => {\n try {\n ESMxCJSRequire.resolve('@intlayer/swc');\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst resolvePluginPath = (pluginPath: string): string => {\n const pluginPathResolved = ESMxCJSRequire.resolve(pluginPath);\n\n if (isTurbopackEnabled)\n // Relative path for turbopack\n return normalizePath(`./${relative(process.cwd(), pluginPathResolved)}`);\n\n // Absolute path for webpack\n return pluginPathResolved;\n};\n\nconst getPruneConfig = (\n intlayerConfig: IntlayerConfig\n): Partial<NextConfig> => {\n const { optimize, traversePattern, importMode } = intlayerConfig.build;\n const {\n dictionariesDir,\n dynamicDictionariesDir,\n fetchDictionariesDir,\n mainDir,\n baseDir,\n } = intlayerConfig.content;\n\n if (!optimize) return {};\n\n if (!isGteNext13) return {};\n\n const isSwcPluginAvailable = getIsSwcPluginAvailable();\n\n if (!isSwcPluginAvailable) return {};\n\n const logger = getAppLogger(intlayerConfig);\n\n runOnce(\n join(baseDir, '.next', 'cache', 'intlayer-prune-plugin-enabled.lock'),\n () => logger('Intlayer prune plugin is enabled'),\n undefined,\n 1000 * 10 // 10 seconds\n );\n\n const dictionariesEntryPath = join(mainDir, 'dictionaries.mjs');\n\n const dynamicDictionariesEntryPath = join(\n mainDir,\n 'dynamic_dictionaries.mjs'\n );\n\n const fetchDictionariesEntryPath = join(mainDir, 'fetch_dictionaries.mjs');\n\n const filesListPattern = fg\n .sync(traversePattern, {\n cwd: baseDir,\n })\n .map((file) => join(baseDir, file));\n\n const filesList = [\n ...filesListPattern,\n dictionariesEntryPath, // should add dictionariesEntryPath to replace it by a empty object if import made dynamic\n ];\n\n const liveSyncKeys = Object.values(dictionaries)\n .filter((dictionary) => dictionary.live)\n .map((dictionary) => dictionary.key);\n\n return {\n experimental: {\n swcPlugins: [\n [\n resolvePluginPath('@intlayer/swc'),\n {\n dictionariesDir,\n dictionariesEntryPath,\n dynamicDictionariesDir,\n dynamicDictionariesEntryPath,\n fetchDictionariesDir,\n fetchDictionariesEntryPath,\n importMode,\n filesList,\n replaceDictionaryEntry: false,\n liveSyncKeys,\n } as any,\n ],\n ],\n },\n };\n};\n\nconst getCommandsEvent = () => {\n const lifecycleEvent = process.env.npm_lifecycle_event;\n const lifecycleScript = process.env.npm_lifecycle_script ?? '';\n\n const isDevCommand =\n lifecycleEvent === 'dev' ||\n process.argv.some((arg) => arg === 'dev') ||\n /(^|\\s)(next\\s+)?dev(\\s|$)/.test(lifecycleScript);\n\n const isBuildCommand =\n lifecycleEvent === 'build' ||\n process.argv.some((arg) => arg === 'build') ||\n /(^|\\s)(next\\s+)?build(\\s|$)/.test(lifecycleScript);\n\n const isStartCommand =\n lifecycleEvent === 'start' ||\n process.argv.some((arg) => arg === 'start') ||\n /(^|\\s)(next\\s+)?start(\\s|$)/.test(lifecycleScript);\n\n return {\n isDevCommand,\n isBuildCommand,\n isStartCommand,\n };\n};\n\ntype WebpackParams = Parameters<NextJsWebpackConfig>;\n\n/**\n * A Next.js plugin that adds the intlayer configuration to the webpack configuration\n * and sets the environment variablesi\n *\n * Usage:\n *\n * ```ts\n * // next.config.js\n * export default withIntlayer(nextConfig)\n * ```\n */\nexport const withIntlayer = async <T extends Partial<NextConfig>>(\n nextConfig: T = {} as T\n): Promise<NextConfig & T> => {\n if (typeof nextConfig !== 'object') {\n nextConfig = {} as T;\n }\n\n const intlayerConfig = getConfiguration();\n const { isDevCommand, isBuildCommand } = getCommandsEvent();\n const appLogger = getAppLogger(intlayerConfig);\n\n const sentinelPath = join(\n intlayerConfig.content.baseDir,\n '.next',\n 'cache',\n 'intlayer-prepared.lock'\n );\n\n // Only call prepareIntlayer during `dev` or `build` (not during `start`)\n\n if (isBuildCommand || isDevCommand) {\n await runOnce(\n sentinelPath,\n async () => await prepareIntlayer(intlayerConfig),\n () => appLogger('Intlayer prepared')\n );\n }\n\n // Only provide turbo-specific config if user explicitly sets it\n const turboConfig = {\n resolveAlias: getAlias({\n configuration: intlayerConfig,\n formatter: (value: string) => `./${value}`, // prefix by './' to consider the path as relative to the project root. This is necessary for turbopack to work correctly.\n }),\n\n rules: {\n '*.node': {\n as: '*.node',\n loaders: ['node-loader'],\n },\n },\n };\n\n const serverExternalPackages = [\n 'esbuild',\n 'module',\n 'fs',\n 'chokidar',\n 'fsevents',\n ];\n\n const newConfig: Partial<NextConfig> = {\n // Only add `serverExternalPackages` if Next.js is v15+\n ...(isGteNext15\n ? {\n // only for Next ≥15\n serverExternalPackages,\n }\n : {\n // only for Next ≥13 and <15.3\n ...(isGteNext13 && {\n serverComponentsExternalPackages: serverExternalPackages,\n }),\n }),\n\n ...(isTurbopackEnabled && {\n ...(isGteNext15 && isTurbopackStable\n ? {\n // only for Next ≥15.3\n turbopack: turboConfig,\n }\n : {\n experimental: {\n // only for Next ≥13 and <15.3\n turbo: turboConfig,\n },\n }),\n }),\n\n webpack: (config: WebpackParams['0'], options: WebpackParams[1]) => {\n // Only add Intlayer plugin on server side (node runtime)\n const { isServer, nextRuntime } = options;\n\n // If the user has defined their own webpack config, call it\n if (typeof nextConfig.webpack === 'function') {\n config = nextConfig.webpack(config, options);\n }\n\n // Mark these modules as externals\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n chokidar: 'chokidar',\n fsevents: 'fsevents',\n });\n\n // Use `node-loader` for any `.node` files\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n // Always alias on the server (node/edge) for stability.\n // On the client, alias only when not using live sync.\n config.resolve.alias = {\n ...config.resolve.alias,\n ...getAlias({\n configuration: intlayerConfig,\n }),\n };\n\n // Activate watch mode webpack plugin\n if (isDevCommand && isServer && nextRuntime === 'nodejs') {\n config.plugins.push(new IntlayerPlugin());\n }\n\n return config;\n },\n };\n\n const pruneConfig: Partial<NextConfig> = getPruneConfig(intlayerConfig);\n\n const intlayerNextConfig: Partial<NextConfig> = merge(pruneConfig, newConfig);\n\n // Merge the new config with the user's config\n const result = merge(nextConfig, intlayerNextConfig) as NextConfig & T;\n\n return result;\n};\n"],"mappings":"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","names":["fg","dictionaries","merge"]}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { prepareIntlayer, runOnce } from "@intlayer/chokidar";
|
|
2
2
|
import {
|
|
3
3
|
ESMxCJSRequire,
|
|
4
|
+
getAlias,
|
|
4
5
|
getAppLogger,
|
|
5
6
|
getConfiguration,
|
|
6
7
|
normalizePath
|
|
7
8
|
} from "@intlayer/config";
|
|
9
|
+
import dictionaries from "@intlayer/dictionaries-entry";
|
|
8
10
|
import { IntlayerPlugin } from "@intlayer/webpack";
|
|
9
11
|
import merge from "deepmerge";
|
|
10
12
|
import fg from "fast-glob";
|
|
11
|
-
import { join, relative
|
|
13
|
+
import { join, relative } from "path";
|
|
12
14
|
import { compareVersions } from "./compareVersion.mjs";
|
|
13
15
|
import { getNextVersion } from "./getNextVertion.mjs";
|
|
14
16
|
const isTurbopackEnabled = process.env.npm_lifecycle_script?.includes("--turbo");
|
|
@@ -24,9 +26,21 @@ const getIsSwcPluginAvailable = () => {
|
|
|
24
26
|
return false;
|
|
25
27
|
}
|
|
26
28
|
};
|
|
29
|
+
const resolvePluginPath = (pluginPath) => {
|
|
30
|
+
const pluginPathResolved = ESMxCJSRequire.resolve(pluginPath);
|
|
31
|
+
if (isTurbopackEnabled)
|
|
32
|
+
return normalizePath(`./${relative(process.cwd(), pluginPathResolved)}`);
|
|
33
|
+
return pluginPathResolved;
|
|
34
|
+
};
|
|
27
35
|
const getPruneConfig = (intlayerConfig) => {
|
|
28
36
|
const { optimize, traversePattern, importMode } = intlayerConfig.build;
|
|
29
|
-
const {
|
|
37
|
+
const {
|
|
38
|
+
dictionariesDir,
|
|
39
|
+
dynamicDictionariesDir,
|
|
40
|
+
fetchDictionariesDir,
|
|
41
|
+
mainDir,
|
|
42
|
+
baseDir
|
|
43
|
+
} = intlayerConfig.content;
|
|
30
44
|
if (!optimize) return {};
|
|
31
45
|
if (!isGteNext13) return {};
|
|
32
46
|
const isSwcPluginAvailable = getIsSwcPluginAvailable();
|
|
@@ -35,6 +49,7 @@ const getPruneConfig = (intlayerConfig) => {
|
|
|
35
49
|
runOnce(
|
|
36
50
|
join(baseDir, ".next", "cache", "intlayer-prune-plugin-enabled.lock"),
|
|
37
51
|
() => logger("Intlayer prune plugin is enabled"),
|
|
52
|
+
void 0,
|
|
38
53
|
1e3 * 10
|
|
39
54
|
// 10 seconds
|
|
40
55
|
);
|
|
@@ -43,6 +58,7 @@ const getPruneConfig = (intlayerConfig) => {
|
|
|
43
58
|
mainDir,
|
|
44
59
|
"dynamic_dictionaries.mjs"
|
|
45
60
|
);
|
|
61
|
+
const fetchDictionariesEntryPath = join(mainDir, "fetch_dictionaries.mjs");
|
|
46
62
|
const filesListPattern = fg.sync(traversePattern, {
|
|
47
63
|
cwd: baseDir
|
|
48
64
|
}).map((file) => join(baseDir, file));
|
|
@@ -51,62 +67,67 @@ const getPruneConfig = (intlayerConfig) => {
|
|
|
51
67
|
dictionariesEntryPath
|
|
52
68
|
// should add dictionariesEntryPath to replace it by a empty object if import made dynamic
|
|
53
69
|
];
|
|
70
|
+
const liveSyncKeys = Object.values(dictionaries).filter((dictionary) => dictionary.live).map((dictionary) => dictionary.key);
|
|
54
71
|
return {
|
|
55
72
|
experimental: {
|
|
56
73
|
swcPlugins: [
|
|
57
74
|
[
|
|
58
|
-
|
|
75
|
+
resolvePluginPath("@intlayer/swc"),
|
|
59
76
|
{
|
|
60
77
|
dictionariesDir,
|
|
61
78
|
dictionariesEntryPath,
|
|
62
79
|
dynamicDictionariesDir,
|
|
63
80
|
dynamicDictionariesEntryPath,
|
|
81
|
+
fetchDictionariesDir,
|
|
82
|
+
fetchDictionariesEntryPath,
|
|
64
83
|
importMode,
|
|
65
84
|
filesList,
|
|
66
|
-
replaceDictionaryEntry: false
|
|
85
|
+
replaceDictionaryEntry: false,
|
|
86
|
+
liveSyncKeys
|
|
67
87
|
}
|
|
68
88
|
]
|
|
69
89
|
]
|
|
70
90
|
}
|
|
71
91
|
};
|
|
72
92
|
};
|
|
93
|
+
const getCommandsEvent = () => {
|
|
94
|
+
const lifecycleEvent = process.env.npm_lifecycle_event;
|
|
95
|
+
const lifecycleScript = process.env.npm_lifecycle_script ?? "";
|
|
96
|
+
const isDevCommand = lifecycleEvent === "dev" || process.argv.some((arg) => arg === "dev") || /(^|\s)(next\s+)?dev(\s|$)/.test(lifecycleScript);
|
|
97
|
+
const isBuildCommand = lifecycleEvent === "build" || process.argv.some((arg) => arg === "build") || /(^|\s)(next\s+)?build(\s|$)/.test(lifecycleScript);
|
|
98
|
+
const isStartCommand = lifecycleEvent === "start" || process.argv.some((arg) => arg === "start") || /(^|\s)(next\s+)?start(\s|$)/.test(lifecycleScript);
|
|
99
|
+
return {
|
|
100
|
+
isDevCommand,
|
|
101
|
+
isBuildCommand,
|
|
102
|
+
isStartCommand
|
|
103
|
+
};
|
|
104
|
+
};
|
|
73
105
|
const withIntlayer = async (nextConfig = {}) => {
|
|
74
106
|
if (typeof nextConfig !== "object") {
|
|
75
107
|
nextConfig = {};
|
|
76
108
|
}
|
|
77
109
|
const intlayerConfig = getConfiguration();
|
|
110
|
+
const { isDevCommand, isBuildCommand } = getCommandsEvent();
|
|
111
|
+
const appLogger = getAppLogger(intlayerConfig);
|
|
78
112
|
const sentinelPath = join(
|
|
79
113
|
intlayerConfig.content.baseDir,
|
|
80
114
|
".next",
|
|
81
115
|
"cache",
|
|
82
116
|
"intlayer-prepared.lock"
|
|
83
117
|
);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const unmergedDictionariesPath = join(mainDir, "unmerged_dictionaries.mjs");
|
|
92
|
-
const relativeUnmergedDictionariesPath = relative(
|
|
93
|
-
baseDir,
|
|
94
|
-
unmergedDictionariesPath
|
|
95
|
-
);
|
|
96
|
-
const configurationPath = join(configDir, "configuration.json");
|
|
97
|
-
const relativeConfigurationPath = relative(baseDir, configurationPath);
|
|
118
|
+
if (isBuildCommand || isDevCommand) {
|
|
119
|
+
await runOnce(
|
|
120
|
+
sentinelPath,
|
|
121
|
+
async () => await prepareIntlayer(intlayerConfig),
|
|
122
|
+
() => appLogger("Intlayer prepared")
|
|
123
|
+
);
|
|
124
|
+
}
|
|
98
125
|
const turboConfig = {
|
|
99
|
-
resolveAlias: {
|
|
126
|
+
resolveAlias: getAlias({
|
|
127
|
+
configuration: intlayerConfig,
|
|
128
|
+
formatter: (value) => `./${value}`
|
|
100
129
|
// prefix by './' to consider the path as relative to the project root. This is necessary for turbopack to work correctly.
|
|
101
|
-
|
|
102
|
-
"@intlayer/dictionaries-entry": normalizePath(
|
|
103
|
-
`./${relativeDictionariesPath}`
|
|
104
|
-
),
|
|
105
|
-
"@intlayer/unmerged-dictionaries-entry": normalizePath(
|
|
106
|
-
`./${relativeUnmergedDictionariesPath}`
|
|
107
|
-
),
|
|
108
|
-
"@intlayer/config/built": normalizePath(`./${relativeConfigurationPath}`)
|
|
109
|
-
},
|
|
130
|
+
}),
|
|
110
131
|
rules: {
|
|
111
132
|
"*.node": {
|
|
112
133
|
as: "*.node",
|
|
@@ -144,17 +165,10 @@ const withIntlayer = async (nextConfig = {}) => {
|
|
|
144
165
|
}
|
|
145
166
|
},
|
|
146
167
|
webpack: (config, options) => {
|
|
168
|
+
const { isServer, nextRuntime } = options;
|
|
147
169
|
if (typeof nextConfig.webpack === "function") {
|
|
148
170
|
config = nextConfig.webpack(config, options);
|
|
149
171
|
}
|
|
150
|
-
config.resolve.alias = {
|
|
151
|
-
...config.resolve.alias,
|
|
152
|
-
"@intlayer/dictionaries-entry": resolve(relativeDictionariesPath),
|
|
153
|
-
"@intlayer/unmerged-dictionaries-entry": resolve(
|
|
154
|
-
relativeUnmergedDictionariesPath
|
|
155
|
-
),
|
|
156
|
-
"@intlayer/config/built": resolve(relativeConfigurationPath)
|
|
157
|
-
};
|
|
158
172
|
config.externals.push({
|
|
159
173
|
esbuild: "esbuild",
|
|
160
174
|
module: "module",
|
|
@@ -166,9 +180,13 @@ const withIntlayer = async (nextConfig = {}) => {
|
|
|
166
180
|
test: /\.node$/,
|
|
167
181
|
loader: "node-loader"
|
|
168
182
|
});
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
183
|
+
config.resolve.alias = {
|
|
184
|
+
...config.resolve.alias,
|
|
185
|
+
...getAlias({
|
|
186
|
+
configuration: intlayerConfig
|
|
187
|
+
})
|
|
188
|
+
};
|
|
189
|
+
if (isDevCommand && isServer && nextRuntime === "nodejs") {
|
|
172
190
|
config.plugins.push(new IntlayerPlugin());
|
|
173
191
|
}
|
|
174
192
|
return config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { prepareIntlayer, runOnce } from '@intlayer/chokidar';\nimport {\n ESMxCJSRequire,\n getAppLogger,\n getConfiguration,\n IntlayerConfig,\n normalizePath,\n} from '@intlayer/config';\nimport { IntlayerPlugin } from '@intlayer/webpack';\nimport merge from 'deepmerge';\nimport fg from 'fast-glob';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\nimport { join, relative, resolve } from 'path';\nimport { compareVersions } from './compareVersion';\nimport { getNextVersion } from './getNextVertion';\n\n// Extract from the start script if --turbo or --turbopack flag is used\nconst isTurbopackEnabled =\n process.env.npm_lifecycle_script?.includes('--turbo');\nconst nextVersion = getNextVersion();\nconst isGteNext13 = compareVersions(nextVersion, '≥', '13.0.0');\nconst isGteNext15 = compareVersions(nextVersion, '≥', '15.0.0');\nconst isTurbopackStable = compareVersions(nextVersion, '≥', '15.3.0');\n\n// Check if SWC plugin is available\nconst getIsSwcPluginAvailable = () => {\n try {\n ESMxCJSRequire.resolve('@intlayer/swc');\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst getPruneConfig = (\n intlayerConfig: IntlayerConfig\n): Partial<NextConfig> => {\n const { optimize, traversePattern, importMode } = intlayerConfig.build;\n const { dictionariesDir, dynamicDictionariesDir, mainDir, baseDir } =\n intlayerConfig.content;\n\n if (!optimize) return {};\n\n if (!isGteNext13) return {};\n\n const isSwcPluginAvailable = getIsSwcPluginAvailable();\n\n if (!isSwcPluginAvailable) return {};\n\n const logger = getAppLogger(intlayerConfig);\n\n runOnce(\n join(baseDir, '.next', 'cache', 'intlayer-prune-plugin-enabled.lock'),\n () => logger('Intlayer prune plugin is enabled'),\n 1000 * 10 // 10 seconds\n );\n\n const dictionariesEntryPath = join(mainDir, 'dictionaries.mjs');\n\n const dynamicDictionariesEntryPath = join(\n mainDir,\n 'dynamic_dictionaries.mjs'\n );\n\n const filesListPattern = fg\n .sync(traversePattern, {\n cwd: baseDir,\n })\n .map((file) => join(baseDir, file));\n\n const filesList = [\n ...filesListPattern,\n dictionariesEntryPath, // should add dictionariesEntryPath to replace it by a empty object if import made dynamic\n ];\n\n return {\n experimental: {\n swcPlugins: [\n [\n ESMxCJSRequire.resolve('@intlayer/swc'),\n {\n dictionariesDir,\n dictionariesEntryPath,\n dynamicDictionariesDir,\n dynamicDictionariesEntryPath,\n importMode,\n filesList,\n replaceDictionaryEntry: false,\n } as any,\n ],\n ],\n },\n };\n};\n\ntype WebpackParams = Parameters<NextJsWebpackConfig>;\n\n/**\n * A Next.js plugin that adds the intlayer configuration to the webpack configuration\n * and sets the environment variablesi\n *\n * Usage:\n *\n * ```ts\n * // next.config.js\n * export default withIntlayer(nextConfig)\n * ```\n */\nexport const withIntlayer = async <T extends Partial<NextConfig>>(\n nextConfig: T = {} as T\n): Promise<NextConfig & T> => {\n if (typeof nextConfig !== 'object') {\n nextConfig = {} as T;\n }\n\n const intlayerConfig = getConfiguration();\n\n const sentinelPath = join(\n intlayerConfig.content.baseDir,\n '.next',\n 'cache',\n 'intlayer-prepared.lock'\n );\n\n // Only call prepareIntlayer once per server startup\n await runOnce(\n sentinelPath,\n async () => await prepareIntlayer(intlayerConfig)\n );\n\n // Format all configuration values as environment variables\n const { mainDir, configDir, baseDir } = intlayerConfig.content;\n\n const dictionariesPath = join(mainDir, 'dictionaries.mjs');\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n\n const unmergedDictionariesPath = join(mainDir, 'unmerged_dictionaries.mjs');\n const relativeUnmergedDictionariesPath = relative(\n baseDir,\n unmergedDictionariesPath\n );\n\n const configurationPath = join(configDir, 'configuration.json');\n const relativeConfigurationPath = relative(baseDir, configurationPath);\n\n // Only provide turbo-specific config if user explicitly sets it\n const turboConfig = {\n resolveAlias: {\n // prefix by './' to consider the path as relative to the project root. This is necessary for turbopack to work correctly.\n // Normalize the path to avoid issues with the path separator on Windows\n '@intlayer/dictionaries-entry': normalizePath(\n `./${relativeDictionariesPath}`\n ),\n '@intlayer/unmerged-dictionaries-entry': normalizePath(\n `./${relativeUnmergedDictionariesPath}`\n ),\n '@intlayer/config/built': normalizePath(`./${relativeConfigurationPath}`),\n },\n rules: {\n '*.node': {\n as: '*.node',\n loaders: ['node-loader'],\n },\n },\n };\n\n const serverExternalPackages = [\n 'esbuild',\n 'module',\n 'fs',\n 'chokidar',\n 'fsevents',\n ];\n\n const newConfig: Partial<NextConfig> = {\n // Only add `serverExternalPackages` if Next.js is v15+\n ...(isGteNext15\n ? {\n // only for Next ≥15\n serverExternalPackages,\n }\n : {\n // only for Next ≥13 and <15.3\n ...(isGteNext13 && {\n serverComponentsExternalPackages: serverExternalPackages,\n }),\n }),\n\n ...(isTurbopackEnabled && {\n ...(isGteNext15 && isTurbopackStable\n ? {\n // only for Next ≥15.3\n turbopack: turboConfig,\n }\n : {\n experimental: {\n // only for Next ≥13 and <15.3\n turbo: turboConfig,\n },\n }),\n }),\n\n webpack: (config: WebpackParams['0'], options: WebpackParams[1]) => {\n // If the user has defined their own webpack config, call it\n if (typeof nextConfig.webpack === 'function') {\n config = nextConfig.webpack(config, options);\n }\n\n // Alias the dictionary entry for all builds\n config.resolve.alias = {\n ...config.resolve.alias,\n '@intlayer/dictionaries-entry': resolve(relativeDictionariesPath),\n '@intlayer/unmerged-dictionaries-entry': resolve(\n relativeUnmergedDictionariesPath\n ),\n '@intlayer/config/built': resolve(relativeConfigurationPath),\n };\n\n // Mark these modules as externals\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n chokidar: 'chokidar',\n fsevents: 'fsevents',\n });\n\n // Use `node-loader` for any `.node` files\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n // Only add Intlayer plugin on server side (node runtime)\n const { isServer, nextRuntime } = options;\n\n // Skip preparation when running next start (production mode)\n const isBuildCommand =\n process.env.npm_lifecycle_event === 'build' ||\n process.argv.some((arg) => arg === 'build');\n\n if (!isBuildCommand && isServer && nextRuntime === 'nodejs') {\n config.plugins.push(new IntlayerPlugin());\n }\n\n return config;\n },\n };\n\n const pruneConfig: Partial<NextConfig> = getPruneConfig(intlayerConfig);\n\n const intlayerNextConfig: Partial<NextConfig> = merge(pruneConfig, newConfig);\n\n // Merge the new config with the user's config\n const result = merge(nextConfig, intlayerNextConfig) as NextConfig & T;\n\n return result;\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { prepareIntlayer, runOnce } from '@intlayer/chokidar';\nimport {\n ESMxCJSRequire,\n getAlias,\n getAppLogger,\n getConfiguration,\n IntlayerConfig,\n normalizePath,\n} from '@intlayer/config';\nimport dictionaries from '@intlayer/dictionaries-entry';\nimport { IntlayerPlugin } from '@intlayer/webpack';\nimport merge from 'deepmerge';\nimport fg from 'fast-glob';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\nimport { join, relative } from 'path';\nimport { compareVersions } from './compareVersion';\nimport { getNextVersion } from './getNextVertion';\n\n// Extract from the start script if --turbo or --turbopack flag is used\nconst isTurbopackEnabled =\n process.env.npm_lifecycle_script?.includes('--turbo');\nconst nextVersion = getNextVersion();\nconst isGteNext13 = compareVersions(nextVersion, '≥', '13.0.0');\nconst isGteNext15 = compareVersions(nextVersion, '≥', '15.0.0');\nconst isTurbopackStable = compareVersions(nextVersion, '≥', '15.3.0');\n\n// Check if SWC plugin is available\nconst getIsSwcPluginAvailable = () => {\n try {\n ESMxCJSRequire.resolve('@intlayer/swc');\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst resolvePluginPath = (pluginPath: string): string => {\n const pluginPathResolved = ESMxCJSRequire.resolve(pluginPath);\n\n if (isTurbopackEnabled)\n // Relative path for turbopack\n return normalizePath(`./${relative(process.cwd(), pluginPathResolved)}`);\n\n // Absolute path for webpack\n return pluginPathResolved;\n};\n\nconst getPruneConfig = (\n intlayerConfig: IntlayerConfig\n): Partial<NextConfig> => {\n const { optimize, traversePattern, importMode } = intlayerConfig.build;\n const {\n dictionariesDir,\n dynamicDictionariesDir,\n fetchDictionariesDir,\n mainDir,\n baseDir,\n } = intlayerConfig.content;\n\n if (!optimize) return {};\n\n if (!isGteNext13) return {};\n\n const isSwcPluginAvailable = getIsSwcPluginAvailable();\n\n if (!isSwcPluginAvailable) return {};\n\n const logger = getAppLogger(intlayerConfig);\n\n runOnce(\n join(baseDir, '.next', 'cache', 'intlayer-prune-plugin-enabled.lock'),\n () => logger('Intlayer prune plugin is enabled'),\n undefined,\n 1000 * 10 // 10 seconds\n );\n\n const dictionariesEntryPath = join(mainDir, 'dictionaries.mjs');\n\n const dynamicDictionariesEntryPath = join(\n mainDir,\n 'dynamic_dictionaries.mjs'\n );\n\n const fetchDictionariesEntryPath = join(mainDir, 'fetch_dictionaries.mjs');\n\n const filesListPattern = fg\n .sync(traversePattern, {\n cwd: baseDir,\n })\n .map((file) => join(baseDir, file));\n\n const filesList = [\n ...filesListPattern,\n dictionariesEntryPath, // should add dictionariesEntryPath to replace it by a empty object if import made dynamic\n ];\n\n const liveSyncKeys = Object.values(dictionaries)\n .filter((dictionary) => dictionary.live)\n .map((dictionary) => dictionary.key);\n\n return {\n experimental: {\n swcPlugins: [\n [\n resolvePluginPath('@intlayer/swc'),\n {\n dictionariesDir,\n dictionariesEntryPath,\n dynamicDictionariesDir,\n dynamicDictionariesEntryPath,\n fetchDictionariesDir,\n fetchDictionariesEntryPath,\n importMode,\n filesList,\n replaceDictionaryEntry: false,\n liveSyncKeys,\n } as any,\n ],\n ],\n },\n };\n};\n\nconst getCommandsEvent = () => {\n const lifecycleEvent = process.env.npm_lifecycle_event;\n const lifecycleScript = process.env.npm_lifecycle_script ?? '';\n\n const isDevCommand =\n lifecycleEvent === 'dev' ||\n process.argv.some((arg) => arg === 'dev') ||\n /(^|\\s)(next\\s+)?dev(\\s|$)/.test(lifecycleScript);\n\n const isBuildCommand =\n lifecycleEvent === 'build' ||\n process.argv.some((arg) => arg === 'build') ||\n /(^|\\s)(next\\s+)?build(\\s|$)/.test(lifecycleScript);\n\n const isStartCommand =\n lifecycleEvent === 'start' ||\n process.argv.some((arg) => arg === 'start') ||\n /(^|\\s)(next\\s+)?start(\\s|$)/.test(lifecycleScript);\n\n return {\n isDevCommand,\n isBuildCommand,\n isStartCommand,\n };\n};\n\ntype WebpackParams = Parameters<NextJsWebpackConfig>;\n\n/**\n * A Next.js plugin that adds the intlayer configuration to the webpack configuration\n * and sets the environment variablesi\n *\n * Usage:\n *\n * ```ts\n * // next.config.js\n * export default withIntlayer(nextConfig)\n * ```\n */\nexport const withIntlayer = async <T extends Partial<NextConfig>>(\n nextConfig: T = {} as T\n): Promise<NextConfig & T> => {\n if (typeof nextConfig !== 'object') {\n nextConfig = {} as T;\n }\n\n const intlayerConfig = getConfiguration();\n const { isDevCommand, isBuildCommand } = getCommandsEvent();\n const appLogger = getAppLogger(intlayerConfig);\n\n const sentinelPath = join(\n intlayerConfig.content.baseDir,\n '.next',\n 'cache',\n 'intlayer-prepared.lock'\n );\n\n // Only call prepareIntlayer during `dev` or `build` (not during `start`)\n\n if (isBuildCommand || isDevCommand) {\n await runOnce(\n sentinelPath,\n async () => await prepareIntlayer(intlayerConfig),\n () => appLogger('Intlayer prepared')\n );\n }\n\n // Only provide turbo-specific config if user explicitly sets it\n const turboConfig = {\n resolveAlias: getAlias({\n configuration: intlayerConfig,\n formatter: (value: string) => `./${value}`, // prefix by './' to consider the path as relative to the project root. This is necessary for turbopack to work correctly.\n }),\n\n rules: {\n '*.node': {\n as: '*.node',\n loaders: ['node-loader'],\n },\n },\n };\n\n const serverExternalPackages = [\n 'esbuild',\n 'module',\n 'fs',\n 'chokidar',\n 'fsevents',\n ];\n\n const newConfig: Partial<NextConfig> = {\n // Only add `serverExternalPackages` if Next.js is v15+\n ...(isGteNext15\n ? {\n // only for Next ≥15\n serverExternalPackages,\n }\n : {\n // only for Next ≥13 and <15.3\n ...(isGteNext13 && {\n serverComponentsExternalPackages: serverExternalPackages,\n }),\n }),\n\n ...(isTurbopackEnabled && {\n ...(isGteNext15 && isTurbopackStable\n ? {\n // only for Next ≥15.3\n turbopack: turboConfig,\n }\n : {\n experimental: {\n // only for Next ≥13 and <15.3\n turbo: turboConfig,\n },\n }),\n }),\n\n webpack: (config: WebpackParams['0'], options: WebpackParams[1]) => {\n // Only add Intlayer plugin on server side (node runtime)\n const { isServer, nextRuntime } = options;\n\n // If the user has defined their own webpack config, call it\n if (typeof nextConfig.webpack === 'function') {\n config = nextConfig.webpack(config, options);\n }\n\n // Mark these modules as externals\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n chokidar: 'chokidar',\n fsevents: 'fsevents',\n });\n\n // Use `node-loader` for any `.node` files\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n // Always alias on the server (node/edge) for stability.\n // On the client, alias only when not using live sync.\n config.resolve.alias = {\n ...config.resolve.alias,\n ...getAlias({\n configuration: intlayerConfig,\n }),\n };\n\n // Activate watch mode webpack plugin\n if (isDevCommand && isServer && nextRuntime === 'nodejs') {\n config.plugins.push(new IntlayerPlugin());\n }\n\n return config;\n },\n };\n\n const pruneConfig: Partial<NextConfig> = getPruneConfig(intlayerConfig);\n\n const intlayerNextConfig: Partial<NextConfig> = merge(pruneConfig, newConfig);\n\n // Merge the new config with the user's config\n const result = merge(nextConfig, intlayerNextConfig) as NextConfig & T;\n\n return result;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withIntlayer.d.ts","sourceRoot":"","sources":["../../../src/server/withIntlayer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"withIntlayer.d.ts","sourceRoot":"","sources":["../../../src/server/withIntlayer.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA2IvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,SAAS,OAAO,CAAC,UAAU,CAAC,EAC9D,aAAY,CAAW,KACtB,OAAO,CAAC,UAAU,GAAG,CAAC,CA+HxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-intlayer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0-canary.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Simplify internationalization i18n in Next.js with context providers, hooks, locale detection, and multilingual content integration.",
|
|
6
6
|
"keywords": [
|
|
@@ -79,12 +79,12 @@
|
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"deepmerge": "^4.3.1",
|
|
81
81
|
"node-loader": "^2.1.0",
|
|
82
|
-
"@intlayer/
|
|
83
|
-
"@intlayer/
|
|
84
|
-
"@intlayer/
|
|
85
|
-
"@intlayer/
|
|
86
|
-
"
|
|
87
|
-
"
|
|
82
|
+
"@intlayer/config": "6.0.0-canary.1",
|
|
83
|
+
"@intlayer/chokidar": "6.0.0-canary.1",
|
|
84
|
+
"@intlayer/core": "6.0.0-canary.1",
|
|
85
|
+
"@intlayer/dictionaries-entry": "6.0.0-canary.1",
|
|
86
|
+
"@intlayer/webpack": "6.0.0-canary.1",
|
|
87
|
+
"react-intlayer": "6.0.0-canary.1"
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@types/node": "^24.2.1",
|
|
@@ -92,29 +92,29 @@
|
|
|
92
92
|
"@types/react-dom": ">=16.0.0",
|
|
93
93
|
"@typescript-eslint/parser": "^8.33.1",
|
|
94
94
|
"concurrently": "^9.1.2",
|
|
95
|
-
"eslint": "^9.
|
|
96
|
-
"prettier": "^3.
|
|
95
|
+
"eslint": "^9.34.0",
|
|
96
|
+
"prettier": "^3.6.2",
|
|
97
97
|
"rimraf": "^6.0.1",
|
|
98
98
|
"tsc-alias": "^1.8.16",
|
|
99
99
|
"tsup": "^8.5.0",
|
|
100
100
|
"typescript": "^5.9.2",
|
|
101
|
-
"vitest": "^3.2.
|
|
101
|
+
"vitest": "^3.2.4",
|
|
102
102
|
"@utils/eslint-config": "1.0.4",
|
|
103
103
|
"@utils/ts-config": "1.0.4",
|
|
104
104
|
"@utils/ts-config-types": "1.0.4",
|
|
105
105
|
"@utils/tsup-config": "1.0.4",
|
|
106
|
-
"intlayer": "
|
|
106
|
+
"intlayer": "6.0.0-canary.1"
|
|
107
107
|
},
|
|
108
108
|
"peerDependencies": {
|
|
109
109
|
"next": ">=14.0.0",
|
|
110
110
|
"react": ">=16.0.0",
|
|
111
111
|
"react-dom": ">=16.0.0",
|
|
112
|
-
"@intlayer/
|
|
113
|
-
"@intlayer/
|
|
114
|
-
"@intlayer/
|
|
115
|
-
"@intlayer/
|
|
116
|
-
"intlayer": "
|
|
117
|
-
"react-intlayer": "
|
|
112
|
+
"@intlayer/config": "6.0.0-canary.1",
|
|
113
|
+
"@intlayer/core": "6.0.0-canary.1",
|
|
114
|
+
"@intlayer/webpack": "6.0.0-canary.1",
|
|
115
|
+
"@intlayer/dictionaries-entry": "6.0.0-canary.1",
|
|
116
|
+
"intlayer": "6.0.0-canary.1",
|
|
117
|
+
"react-intlayer": "6.0.0-canary.1"
|
|
118
118
|
},
|
|
119
119
|
"engines": {
|
|
120
120
|
"node": ">=14.18"
|