next-intlayer 6.0.1 → 6.0.2
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.
- package/dist/cjs/middleware/index.cjs +5 -1
- package/dist/cjs/middleware/index.cjs.map +1 -1
- package/dist/cjs/middleware/multipleMiddlewares.cjs +70 -0
- package/dist/cjs/middleware/multipleMiddlewares.cjs.map +1 -0
- package/dist/cjs/server/withIntlayer.cjs +4 -1
- package/dist/cjs/server/withIntlayer.cjs.map +1 -1
- package/dist/esm/middleware/index.mjs +2 -0
- package/dist/esm/middleware/index.mjs.map +1 -1
- package/dist/esm/middleware/multipleMiddlewares.mjs +48 -0
- package/dist/esm/middleware/multipleMiddlewares.mjs.map +1 -0
- package/dist/esm/server/withIntlayer.mjs +4 -1
- package/dist/esm/server/withIntlayer.mjs.map +1 -1
- package/dist/types/middleware/index.d.ts +2 -0
- package/dist/types/middleware/index.d.ts.map +1 -1
- package/dist/types/middleware/multipleMiddlewares.d.ts +28 -0
- package/dist/types/middleware/multipleMiddlewares.d.ts.map +1 -0
- package/dist/types/server/withIntlayer.d.ts.map +1 -1
- package/package.json +17 -17
|
@@ -16,8 +16,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
16
16
|
var middleware_exports = {};
|
|
17
17
|
module.exports = __toCommonJS(middleware_exports);
|
|
18
18
|
__reExport(middleware_exports, require('./intlayerMiddleware.cjs'), module.exports);
|
|
19
|
+
__reExport(middleware_exports, require('./localeDetector.cjs'), module.exports);
|
|
20
|
+
__reExport(middleware_exports, require('./multipleMiddlewares.cjs'), module.exports);
|
|
19
21
|
// Annotate the CommonJS export names for ESM import in node:
|
|
20
22
|
0 && (module.exports = {
|
|
21
|
-
...require('./intlayerMiddleware.cjs')
|
|
23
|
+
...require('./intlayerMiddleware.cjs'),
|
|
24
|
+
...require('./localeDetector.cjs'),
|
|
25
|
+
...require('./multipleMiddlewares.cjs')
|
|
22
26
|
});
|
|
23
27
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/middleware/index.ts"],"sourcesContent":["export * from './intlayerMiddleware';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,+BAAc,iCAAd;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/middleware/index.ts"],"sourcesContent":["export * from './intlayerMiddleware';\nexport * from './localeDetector';\nexport * from './multipleMiddlewares';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,+BAAc,iCAAd;AACA,+BAAc,6BADd;AAEA,+BAAc,kCAFd;","names":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var multipleMiddlewares_exports = {};
|
|
20
|
+
__export(multipleMiddlewares_exports, {
|
|
21
|
+
multipleMiddlewares: () => multipleMiddlewares
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(multipleMiddlewares_exports);
|
|
24
|
+
var import_server = require("next/server");
|
|
25
|
+
const multipleMiddlewares = (middlewares) => async (req, event, response) => {
|
|
26
|
+
const middlewareHeader = [];
|
|
27
|
+
for (const middleware of middlewares) {
|
|
28
|
+
const result = await middleware(req, event, response);
|
|
29
|
+
if (!result.ok) {
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
middlewareHeader.push(result.headers);
|
|
33
|
+
}
|
|
34
|
+
const mergedHeaders = new Headers();
|
|
35
|
+
const transmittedHeaders = new Headers();
|
|
36
|
+
middlewareHeader.forEach((header) => {
|
|
37
|
+
for (const [key, value] of header.entries()) {
|
|
38
|
+
mergedHeaders.append(key, value);
|
|
39
|
+
if (key.startsWith("x-middleware-request-")) {
|
|
40
|
+
const fixedKey = key.replace("x-middleware-request-", "");
|
|
41
|
+
transmittedHeaders.append(fixedKey, value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
const redirect = mergedHeaders.get("x-middleware-request-redirect");
|
|
46
|
+
if (redirect) {
|
|
47
|
+
return import_server.NextResponse.redirect(new URL(redirect, req.url), {
|
|
48
|
+
status: 307
|
|
49
|
+
// Temporary redirect
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const rewrite = mergedHeaders.get("x-middleware-rewrite");
|
|
53
|
+
if (rewrite) {
|
|
54
|
+
return import_server.NextResponse.rewrite(new URL(rewrite, req.url), {
|
|
55
|
+
request: {
|
|
56
|
+
headers: transmittedHeaders
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return import_server.NextResponse.next({
|
|
61
|
+
request: {
|
|
62
|
+
headers: transmittedHeaders
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
67
|
+
0 && (module.exports = {
|
|
68
|
+
multipleMiddlewares
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=multipleMiddlewares.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/middleware/multipleMiddlewares.ts"],"sourcesContent":["import {\n type NextFetchEvent,\n type NextRequest,\n NextResponse,\n} from 'next/server';\n\n/**\n * Utility to combine multiple Next.js middlewares into one.\n *\n * It executes middlewares in order, merges headers, and correctly handles\n * redirects and rewrites.\n *\n * @example\n * import { multipleMiddlewares, intlayerMiddleware } from \"next-intlayer/middleware\";\n * import { NextResponse } from \"next/server\";\n *\n * const authMiddleware = (req: NextRequest) => {\n * if (!req.cookies.get(\"token\")) {\n * return NextResponse.redirect(new URL(\"/login\", req.url));\n * }\n * return NextResponse.next();\n * };\n *\n * export default multipleMiddlewares([\n * intlayerMiddleware,\n * authMiddleware,\n * ]);\n *\n * @param middlewares - An array of middleware functions to execute in order.\n * @returns A single middleware function that runs all provided middlewares.\n */\nexport const multipleMiddlewares =\n (\n middlewares: ((\n req: NextRequest,\n event?: NextFetchEvent,\n response?: NextResponse\n ) => NextResponse | Promise<NextResponse>)[]\n ) =>\n async (req: NextRequest, event?: NextFetchEvent, response?: NextResponse) => {\n // Array to store middleware headers\n const middlewareHeader = [];\n\n // Loop through middleware functions\n for (const middleware of middlewares) {\n // Execute middleware function and await the result\n const result = await middleware(req, event, response);\n\n // Check if the result is not okay and return it\n if (!result.ok) {\n return result;\n }\n\n // Push middleware headers to the array\n middlewareHeader.push(result.headers);\n }\n\n // Merge all the headers to check if there is a redirection or rewrite\n const mergedHeaders = new Headers();\n\n // Merge all the custom headers added by the middlewares\n const transmittedHeaders = new Headers();\n\n // Merge headers\n middlewareHeader.forEach((header) => {\n for (const [key, value] of header.entries()) {\n mergedHeaders.append(key, value);\n\n // check if it's a custom header added by one of the middlewares\n if (key.startsWith('x-middleware-request-')) {\n // remove the prefix to get the original key\n const fixedKey = key.replace('x-middleware-request-', '');\n\n // add the original key to the transmitted headers\n transmittedHeaders.append(fixedKey, value);\n }\n }\n });\n\n // Look for the 'x-middleware-request-redirect' header\n const redirect = mergedHeaders.get('x-middleware-request-redirect');\n\n // If a redirection is required based on the middleware headers\n if (redirect) {\n // Perform the redirection\n return NextResponse.redirect(new URL(redirect, req.url), {\n status: 307, // Temporary redirect\n });\n }\n\n // Look for the 'x-middleware-rewrite' header\n const rewrite = mergedHeaders.get('x-middleware-rewrite');\n if (rewrite) {\n // Perform the rewrite\n return NextResponse.rewrite(new URL(rewrite, req.url), {\n request: {\n headers: transmittedHeaders,\n },\n });\n }\n\n // Default: continue to next middleware\n return NextResponse.next({\n request: {\n headers: transmittedHeaders,\n },\n });\n };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAIO;AA2BA,MAAM,sBACX,CACE,gBAMF,OAAO,KAAkB,OAAwB,aAA4B;AAE3E,QAAM,mBAAmB,CAAC;AAG1B,aAAW,cAAc,aAAa;AAEpC,UAAM,SAAS,MAAM,WAAW,KAAK,OAAO,QAAQ;AAGpD,QAAI,CAAC,OAAO,IAAI;AACd,aAAO;AAAA,IACT;AAGA,qBAAiB,KAAK,OAAO,OAAO;AAAA,EACtC;AAGA,QAAM,gBAAgB,IAAI,QAAQ;AAGlC,QAAM,qBAAqB,IAAI,QAAQ;AAGvC,mBAAiB,QAAQ,CAAC,WAAW;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,oBAAc,OAAO,KAAK,KAAK;AAG/B,UAAI,IAAI,WAAW,uBAAuB,GAAG;AAE3C,cAAM,WAAW,IAAI,QAAQ,yBAAyB,EAAE;AAGxD,2BAAmB,OAAO,UAAU,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,cAAc,IAAI,+BAA+B;AAGlE,MAAI,UAAU;AAEZ,WAAO,2BAAa,SAAS,IAAI,IAAI,UAAU,IAAI,GAAG,GAAG;AAAA,MACvD,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,cAAc,IAAI,sBAAsB;AACxD,MAAI,SAAS;AAEX,WAAO,2BAAa,QAAQ,IAAI,IAAI,SAAS,IAAI,GAAG,GAAG;AAAA,MACrD,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO,2BAAa,KAAK;AAAA,IACvB,SAAS;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -237,7 +237,10 @@ const withIntlayer = async (nextConfig = {}) => {
|
|
|
237
237
|
}
|
|
238
238
|
return config;
|
|
239
239
|
};
|
|
240
|
-
|
|
240
|
+
let pruneConfig = {};
|
|
241
|
+
if (isBuildCommand) {
|
|
242
|
+
pruneConfig = getPruneConfig(intlayerConfig);
|
|
243
|
+
}
|
|
241
244
|
const intlayerNextConfig = (0, import_deepmerge.default)(
|
|
242
245
|
pruneConfig,
|
|
243
246
|
getNewConfig()
|
|
@@ -1 +1 @@
|
|
|
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, 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 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, '.intlayer', '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 '.intlayer',\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 getNewConfig = (): Partial<NextConfig> => {\n let config: Partial<NextConfig> = {};\n\n if (isGteNext15) {\n config = {\n ...config,\n serverExternalPackages,\n };\n }\n\n if (isGteNext13 && !isGteNext15) {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n serverComponentsExternalPackages: serverExternalPackages,\n },\n };\n }\n\n if (isTurbopackEnabled) {\n if (isGteNext15 && isTurbopackStable) {\n config = {\n ...config,\n turbopack: turboConfig,\n };\n } else {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n turbo: turboConfig,\n },\n };\n }\n } else {\n config = {\n ...config,\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 formatter: (value: string) => resolve(value), // get absolute path\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\n return config;\n };\n\n const pruneConfig: Partial<NextConfig> = getPruneConfig(intlayerConfig);\n\n const intlayerNextConfig: Partial<NextConfig> = merge(\n pruneConfig,\n getNewConfig()\n );\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","config","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, 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 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, '.intlayer', '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 '.intlayer',\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 getNewConfig = (): Partial<NextConfig> => {\n let config: Partial<NextConfig> = {};\n\n if (isGteNext15) {\n config = {\n ...config,\n serverExternalPackages,\n };\n }\n\n if (isGteNext13 && !isGteNext15) {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n serverComponentsExternalPackages: serverExternalPackages,\n },\n };\n }\n\n if (isTurbopackEnabled) {\n if (isGteNext15 && isTurbopackStable) {\n config = {\n ...config,\n turbopack: turboConfig,\n };\n } else {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n turbo: turboConfig,\n },\n };\n }\n } else {\n config = {\n ...config,\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 formatter: (value: string) => resolve(value), // get absolute path\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\n return config;\n };\n\n let pruneConfig: Partial<NextConfig> = {};\n\n if (isBuildCommand) {\n pruneConfig = getPruneConfig(intlayerConfig);\n }\n\n const intlayerNextConfig: Partial<NextConfig> = merge(\n pruneConfig,\n getNewConfig()\n );\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","config","merge"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/middleware/index.ts"],"sourcesContent":["export * from './intlayerMiddleware';\n"],"mappings":"AAAA,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/middleware/index.ts"],"sourcesContent":["export * from './intlayerMiddleware';\nexport * from './localeDetector';\nexport * from './multipleMiddlewares';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NextResponse
|
|
3
|
+
} from "next/server";
|
|
4
|
+
const multipleMiddlewares = (middlewares) => async (req, event, response) => {
|
|
5
|
+
const middlewareHeader = [];
|
|
6
|
+
for (const middleware of middlewares) {
|
|
7
|
+
const result = await middleware(req, event, response);
|
|
8
|
+
if (!result.ok) {
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
middlewareHeader.push(result.headers);
|
|
12
|
+
}
|
|
13
|
+
const mergedHeaders = new Headers();
|
|
14
|
+
const transmittedHeaders = new Headers();
|
|
15
|
+
middlewareHeader.forEach((header) => {
|
|
16
|
+
for (const [key, value] of header.entries()) {
|
|
17
|
+
mergedHeaders.append(key, value);
|
|
18
|
+
if (key.startsWith("x-middleware-request-")) {
|
|
19
|
+
const fixedKey = key.replace("x-middleware-request-", "");
|
|
20
|
+
transmittedHeaders.append(fixedKey, value);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
const redirect = mergedHeaders.get("x-middleware-request-redirect");
|
|
25
|
+
if (redirect) {
|
|
26
|
+
return NextResponse.redirect(new URL(redirect, req.url), {
|
|
27
|
+
status: 307
|
|
28
|
+
// Temporary redirect
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const rewrite = mergedHeaders.get("x-middleware-rewrite");
|
|
32
|
+
if (rewrite) {
|
|
33
|
+
return NextResponse.rewrite(new URL(rewrite, req.url), {
|
|
34
|
+
request: {
|
|
35
|
+
headers: transmittedHeaders
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return NextResponse.next({
|
|
40
|
+
request: {
|
|
41
|
+
headers: transmittedHeaders
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
export {
|
|
46
|
+
multipleMiddlewares
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=multipleMiddlewares.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/middleware/multipleMiddlewares.ts"],"sourcesContent":["import {\n type NextFetchEvent,\n type NextRequest,\n NextResponse,\n} from 'next/server';\n\n/**\n * Utility to combine multiple Next.js middlewares into one.\n *\n * It executes middlewares in order, merges headers, and correctly handles\n * redirects and rewrites.\n *\n * @example\n * import { multipleMiddlewares, intlayerMiddleware } from \"next-intlayer/middleware\";\n * import { NextResponse } from \"next/server\";\n *\n * const authMiddleware = (req: NextRequest) => {\n * if (!req.cookies.get(\"token\")) {\n * return NextResponse.redirect(new URL(\"/login\", req.url));\n * }\n * return NextResponse.next();\n * };\n *\n * export default multipleMiddlewares([\n * intlayerMiddleware,\n * authMiddleware,\n * ]);\n *\n * @param middlewares - An array of middleware functions to execute in order.\n * @returns A single middleware function that runs all provided middlewares.\n */\nexport const multipleMiddlewares =\n (\n middlewares: ((\n req: NextRequest,\n event?: NextFetchEvent,\n response?: NextResponse\n ) => NextResponse | Promise<NextResponse>)[]\n ) =>\n async (req: NextRequest, event?: NextFetchEvent, response?: NextResponse) => {\n // Array to store middleware headers\n const middlewareHeader = [];\n\n // Loop through middleware functions\n for (const middleware of middlewares) {\n // Execute middleware function and await the result\n const result = await middleware(req, event, response);\n\n // Check if the result is not okay and return it\n if (!result.ok) {\n return result;\n }\n\n // Push middleware headers to the array\n middlewareHeader.push(result.headers);\n }\n\n // Merge all the headers to check if there is a redirection or rewrite\n const mergedHeaders = new Headers();\n\n // Merge all the custom headers added by the middlewares\n const transmittedHeaders = new Headers();\n\n // Merge headers\n middlewareHeader.forEach((header) => {\n for (const [key, value] of header.entries()) {\n mergedHeaders.append(key, value);\n\n // check if it's a custom header added by one of the middlewares\n if (key.startsWith('x-middleware-request-')) {\n // remove the prefix to get the original key\n const fixedKey = key.replace('x-middleware-request-', '');\n\n // add the original key to the transmitted headers\n transmittedHeaders.append(fixedKey, value);\n }\n }\n });\n\n // Look for the 'x-middleware-request-redirect' header\n const redirect = mergedHeaders.get('x-middleware-request-redirect');\n\n // If a redirection is required based on the middleware headers\n if (redirect) {\n // Perform the redirection\n return NextResponse.redirect(new URL(redirect, req.url), {\n status: 307, // Temporary redirect\n });\n }\n\n // Look for the 'x-middleware-rewrite' header\n const rewrite = mergedHeaders.get('x-middleware-rewrite');\n if (rewrite) {\n // Perform the rewrite\n return NextResponse.rewrite(new URL(rewrite, req.url), {\n request: {\n headers: transmittedHeaders,\n },\n });\n }\n\n // Default: continue to next middleware\n return NextResponse.next({\n request: {\n headers: transmittedHeaders,\n },\n });\n };\n"],"mappings":"AAAA;AAAA,EAGE;AAAA,OACK;AA2BA,MAAM,sBACX,CACE,gBAMF,OAAO,KAAkB,OAAwB,aAA4B;AAE3E,QAAM,mBAAmB,CAAC;AAG1B,aAAW,cAAc,aAAa;AAEpC,UAAM,SAAS,MAAM,WAAW,KAAK,OAAO,QAAQ;AAGpD,QAAI,CAAC,OAAO,IAAI;AACd,aAAO;AAAA,IACT;AAGA,qBAAiB,KAAK,OAAO,OAAO;AAAA,EACtC;AAGA,QAAM,gBAAgB,IAAI,QAAQ;AAGlC,QAAM,qBAAqB,IAAI,QAAQ;AAGvC,mBAAiB,QAAQ,CAAC,WAAW;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,oBAAc,OAAO,KAAK,KAAK;AAG/B,UAAI,IAAI,WAAW,uBAAuB,GAAG;AAE3C,cAAM,WAAW,IAAI,QAAQ,yBAAyB,EAAE;AAGxD,2BAAmB,OAAO,UAAU,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,cAAc,IAAI,+BAA+B;AAGlE,MAAI,UAAU;AAEZ,WAAO,aAAa,SAAS,IAAI,IAAI,UAAU,IAAI,GAAG,GAAG;AAAA,MACvD,QAAQ;AAAA;AAAA,IACV,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,cAAc,IAAI,sBAAsB;AACxD,MAAI,SAAS;AAEX,WAAO,aAAa,QAAQ,IAAI,IAAI,SAAS,IAAI,GAAG,GAAG;AAAA,MACrD,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO,aAAa,KAAK;AAAA,IACvB,SAAS;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -210,7 +210,10 @@ const withIntlayer = async (nextConfig = {}) => {
|
|
|
210
210
|
}
|
|
211
211
|
return config;
|
|
212
212
|
};
|
|
213
|
-
|
|
213
|
+
let pruneConfig = {};
|
|
214
|
+
if (isBuildCommand) {
|
|
215
|
+
pruneConfig = getPruneConfig(intlayerConfig);
|
|
216
|
+
}
|
|
214
217
|
const intlayerNextConfig = merge(
|
|
215
218
|
pruneConfig,
|
|
216
219
|
getNewConfig()
|
|
@@ -1 +1 @@
|
|
|
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, 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 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, '.intlayer', '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 '.intlayer',\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 getNewConfig = (): Partial<NextConfig> => {\n let config: Partial<NextConfig> = {};\n\n if (isGteNext15) {\n config = {\n ...config,\n serverExternalPackages,\n };\n }\n\n if (isGteNext13 && !isGteNext15) {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n serverComponentsExternalPackages: serverExternalPackages,\n },\n };\n }\n\n if (isTurbopackEnabled) {\n if (isGteNext15 && isTurbopackStable) {\n config = {\n ...config,\n turbopack: turboConfig,\n };\n } else {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n turbo: turboConfig,\n },\n };\n }\n } else {\n config = {\n ...config,\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 formatter: (value: string) => resolve(value), // get absolute path\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\n return config;\n };\n\n const pruneConfig: Partial<NextConfig> = getPruneConfig(intlayerConfig);\n\n const intlayerNextConfig: Partial<NextConfig> = merge(\n pruneConfig,\n getNewConfig()\n );\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":["config"]}
|
|
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, 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 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, '.intlayer', '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 '.intlayer',\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 getNewConfig = (): Partial<NextConfig> => {\n let config: Partial<NextConfig> = {};\n\n if (isGteNext15) {\n config = {\n ...config,\n serverExternalPackages,\n };\n }\n\n if (isGteNext13 && !isGteNext15) {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n serverComponentsExternalPackages: serverExternalPackages,\n },\n };\n }\n\n if (isTurbopackEnabled) {\n if (isGteNext15 && isTurbopackStable) {\n config = {\n ...config,\n turbopack: turboConfig,\n };\n } else {\n config = {\n ...config,\n experimental: {\n ...(config?.experimental ?? {}),\n turbo: turboConfig,\n },\n };\n }\n } else {\n config = {\n ...config,\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 formatter: (value: string) => resolve(value), // get absolute path\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\n return config;\n };\n\n let pruneConfig: Partial<NextConfig> = {};\n\n if (isBuildCommand) {\n pruneConfig = getPruneConfig(intlayerConfig);\n }\n\n const intlayerNextConfig: Partial<NextConfig> = merge(\n pruneConfig,\n getNewConfig()\n );\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":["config"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type NextFetchEvent, type NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
/**
|
|
3
|
+
* Utility to combine multiple Next.js middlewares into one.
|
|
4
|
+
*
|
|
5
|
+
* It executes middlewares in order, merges headers, and correctly handles
|
|
6
|
+
* redirects and rewrites.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { multipleMiddlewares, intlayerMiddleware } from "next-intlayer/middleware";
|
|
10
|
+
* import { NextResponse } from "next/server";
|
|
11
|
+
*
|
|
12
|
+
* const authMiddleware = (req: NextRequest) => {
|
|
13
|
+
* if (!req.cookies.get("token")) {
|
|
14
|
+
* return NextResponse.redirect(new URL("/login", req.url));
|
|
15
|
+
* }
|
|
16
|
+
* return NextResponse.next();
|
|
17
|
+
* };
|
|
18
|
+
*
|
|
19
|
+
* export default multipleMiddlewares([
|
|
20
|
+
* intlayerMiddleware,
|
|
21
|
+
* authMiddleware,
|
|
22
|
+
* ]);
|
|
23
|
+
*
|
|
24
|
+
* @param middlewares - An array of middleware functions to execute in order.
|
|
25
|
+
* @returns A single middleware function that runs all provided middlewares.
|
|
26
|
+
*/
|
|
27
|
+
export declare const multipleMiddlewares: (middlewares: ((req: NextRequest, event?: NextFetchEvent, response?: NextResponse) => NextResponse | Promise<NextResponse>)[]) => (req: NextRequest, event?: NextFetchEvent, response?: NextResponse) => Promise<NextResponse<unknown>>;
|
|
28
|
+
//# sourceMappingURL=multipleMiddlewares.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipleMiddlewares.d.ts","sourceRoot":"","sources":["../../../src/middleware/multipleMiddlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB,GAE5B,aAAa,CAAC,CACZ,GAAG,EAAE,WAAW,EAChB,KAAK,CAAC,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,YAAY,KACpB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,MAEvC,KAAK,WAAW,EAAE,QAAQ,cAAc,EAAE,WAAW,YAAY,mCAoEvE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CAqJxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "next-intlayer",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.2",
|
|
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/core": "6.0.2",
|
|
83
|
+
"@intlayer/dictionaries-entry": "6.0.2",
|
|
84
|
+
"@intlayer/config": "6.0.2",
|
|
85
|
+
"@intlayer/webpack": "6.0.2",
|
|
86
|
+
"react-intlayer": "6.0.2",
|
|
87
|
+
"@intlayer/chokidar": "6.0.2"
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@types/node": "^24.2.1",
|
|
@@ -99,22 +99,22 @@
|
|
|
99
99
|
"tsup": "^8.5.0",
|
|
100
100
|
"typescript": "^5.9.2",
|
|
101
101
|
"vitest": "^3.2.4",
|
|
102
|
-
"@utils/ts-config": "1.0.4",
|
|
103
|
-
"@utils/ts-config-types": "1.0.4",
|
|
104
|
-
"@utils/tsup-config": "1.0.4",
|
|
105
102
|
"@utils/eslint-config": "1.0.4",
|
|
106
|
-
"
|
|
103
|
+
"@utils/ts-config-types": "1.0.4",
|
|
104
|
+
"intlayer": "6.0.2",
|
|
105
|
+
"@utils/ts-config": "1.0.4",
|
|
106
|
+
"@utils/tsup-config": "1.0.4"
|
|
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/config": "6.0.
|
|
113
|
-
"@intlayer/
|
|
114
|
-
"
|
|
115
|
-
"intlayer": "6.0.
|
|
116
|
-
"
|
|
117
|
-
"@intlayer/
|
|
112
|
+
"@intlayer/config": "6.0.2",
|
|
113
|
+
"@intlayer/core": "6.0.2",
|
|
114
|
+
"intlayer": "6.0.2",
|
|
115
|
+
"react-intlayer": "6.0.2",
|
|
116
|
+
"@intlayer/dictionaries-entry": "6.0.2",
|
|
117
|
+
"@intlayer/webpack": "6.0.2"
|
|
118
118
|
},
|
|
119
119
|
"engines": {
|
|
120
120
|
"node": ">=14.18"
|