gt-next 11.0.13 → 11.1.0
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/CHANGELOG.md +18 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/config.mjs +13 -0
- package/dist/config.mjs.map +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# gt-next
|
|
2
2
|
|
|
3
|
+
## 11.1.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1909](https://github.com/generaltranslation/gt/pull/1909) [`f351466`](https://github.com/generaltranslation/gt/commit/f35146669f61ff86bd39747f0126ab0e2855e4a4) Thanks [@JoshKappler](https://github.com/JoshKappler)! - Fix loadDictionary, loadTranslations, and the dictionary option silently loading nothing in webpack builds.
|
|
8
|
+
|
|
9
|
+
Webpack parses .mjs as strict ESM and does not treat require() calls as dependencies, so the require()-backed gt-next/internal aliases never applied: the aliased user files were not bundled and the runtime ReferenceError was swallowed, leaving every dictionary lookup failing with "Dictionary entry X cannot be found". Turbopack builds were unaffected, which is why apps built with --turbopack never hit this.
|
|
10
|
+
|
|
11
|
+
withGTConfig's webpack hook now parses gt-next's ESM dist as javascript/auto whenever any gt-next internal alias is configured, so webpack picks up the require() calls behind the dictionary and loader aliases. Custom getLocale/getRegion paths resolve through static imports and already worked on webpack; they enable the rule only for consistency. Dist output is unchanged and turbopack behavior is untouched.
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`bbf4eb0`](https://github.com/generaltranslation/gt/commit/bbf4eb0cf77160baa615776619acd7afe35697ba), [`d801c41`](https://github.com/generaltranslation/gt/commit/d801c41134554726a0436eaf5b7b3f0242a3a91f), [`f53bb5e`](https://github.com/generaltranslation/gt/commit/f53bb5ea4b4989a2a4ad3aebf464011f01e029ad)]:
|
|
14
|
+
- generaltranslation@9.0.4
|
|
15
|
+
- @generaltranslation/compiler@1.3.33
|
|
16
|
+
- @generaltranslation/format@0.1.3
|
|
17
|
+
- gt-i18n@1.0.8
|
|
18
|
+
- gt-react@11.1.0
|
|
19
|
+
- @generaltranslation/react-core@11.1.0
|
|
20
|
+
|
|
3
21
|
## 11.0.13
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAKvC,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,sCAAsC,CAAC;AAqE9C,KAAK,iBAAiB,CAAC,CAAC,IACtB,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,GACvB,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC5B,WAAW,CAAC,CAAC,GAAG,UAAU,CAAC,GAC3B,CAAC,GAAG,UAAU,CAAC;AAEvB,KAAK,kBAAkB,CAAC,WAAW,SAAS,MAAM,IAAI,WAAW,SAAS,CACxE,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,MAAM,CAAC,GACR,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,iBAAiB,CAAC,CAAC,CAAC,GACpC,WAAW,GAAG,UAAU,CAAC;AAW7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,YAAY,CAAC,WAAW,SAAS,MAAM,GAAG,UAAU,EAClE,UAAU,CAAC,EAAE,WAAW,EACxB,KAAK,GAAE,iBAAsB,GAC5B,kBAAkB,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAKvC,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,sCAAsC,CAAC;AAqE9C,KAAK,iBAAiB,CAAC,CAAC,IACtB,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,GACvB,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAC5B,WAAW,CAAC,CAAC,GAAG,UAAU,CAAC,GAC3B,CAAC,GAAG,UAAU,CAAC;AAEvB,KAAK,kBAAkB,CAAC,WAAW,SAAS,MAAM,IAAI,WAAW,SAAS,CACxE,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,MAAM,CAAC,GACR,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,iBAAiB,CAAC,CAAC,CAAC,GACpC,WAAW,GAAG,UAAU,CAAC;AAW7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,YAAY,CAAC,WAAW,SAAS,MAAM,GAAG,UAAU,EAClE,UAAU,CAAC,EAAE,WAAW,EACxB,KAAK,GAAE,iBAAsB,GAC5B,kBAAkB,CAAC,WAAW,CAAC,CA2rBjC"}
|
package/dist/config.js
CHANGED
|
@@ -324,6 +324,19 @@ function withGTConfig(nextConfig, props = {}) {
|
|
|
324
324
|
const key = require_config_dir_utils_resolveRequestFunctionPaths.REQUEST_FUNCTION_ALIASES[functionName];
|
|
325
325
|
webpackConfig.resolve.alias[key] = path.default.resolve(webpackConfig.context, pathString);
|
|
326
326
|
}
|
|
327
|
+
if (options.isServer && (resolvedDictionaryFilePath || customLoadTranslationsPath || customLoadDictionaryPath || Object.keys(requestFunctionPaths).length > 0)) {
|
|
328
|
+
const gtNextDistDirs = [/node_modules[\\/]gt-next[\\/]dist[\\/]/];
|
|
329
|
+
try {
|
|
330
|
+
if (fs.default.existsSync(path.default.join(__dirname, "config.mjs")) && fs.default.existsSync(path.default.join(__dirname, "internal", "_dictionary.mjs"))) gtNextDistDirs.push(__dirname + path.default.sep);
|
|
331
|
+
} catch {}
|
|
332
|
+
webpackConfig.module ??= {};
|
|
333
|
+
webpackConfig.module.rules ??= [];
|
|
334
|
+
webpackConfig.module.rules.push({
|
|
335
|
+
test: /\.mjs$/,
|
|
336
|
+
include: gtNextDistDirs,
|
|
337
|
+
type: "javascript/auto"
|
|
338
|
+
});
|
|
339
|
+
}
|
|
327
340
|
}
|
|
328
341
|
if (typeof internalNextConfig?.webpack === "function") return internalNextConfig.webpack(webpackConfig, options);
|
|
329
342
|
return webpackConfig;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":["defaultWithGTConfigProps","getRuntimeCredentials","conflictingConfigurationBuildError","createGTCompilerUnresolvedWarning","resolveConfigFilepath","resolveRequestFunctionPaths","createBadFilepathWarning","unresolvedLoadDictionaryBuildError","unresolvedLoadTranslationsBuildError","cacheComponentsMissingLoadTranslationsError","cacheComponentsDevHotReloadDisabledWarning","defaultCacheExpiryTime","invalidLocalesError","invalidCanonicalLocalesError","projectIdMissingWarn","devApiKeyIncludedInProductionError","APIKeyMissingWarn","standardizedLocalesWarning","standardizedCanonicalLocalesWarning","path","REQUEST_FUNCTION_ALIASES","turboConfigStable","rootParamStability"],"sources":["../src/config.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type { NextConfig } from 'next';\nimport {\n defaultWithGTConfigProps,\n defaultCacheExpiryTime,\n} from './config-dir/props/defaultWithGTConfigProps';\nimport {\n type BaseWithGTConfigProps,\n type withGTConfigProps,\n} from './config-dir/props/withGTConfigProps';\nimport {\n APIKeyMissingWarn,\n conflictingConfigurationBuildError,\n createBadFilepathWarning,\n createGTCompilerUnresolvedWarning,\n devApiKeyIncludedInProductionError,\n invalidCanonicalLocalesError,\n invalidLocalesError,\n projectIdMissingWarn,\n standardizedCanonicalLocalesWarning,\n standardizedLocalesWarning,\n unresolvedLoadDictionaryBuildError,\n unresolvedLoadTranslationsBuildError,\n} from './errors/createErrors';\nimport { compilePathRegex } from './utils/pathRegex';\nimport {\n getLocaleProperties,\n isValidLocale,\n standardizeLocale,\n} from '@generaltranslation/format';\nimport type { CustomMapping } from '@generaltranslation/format/types';\nimport {\n rootParamStability,\n turboConfigStable,\n} from './plugin/getStableNextVersionInfo';\nimport { validateCompiler } from './config-dir/utils/validateCompiler';\nimport {\n REQUEST_FUNCTION_ALIASES,\n resolveRequestFunctionPaths,\n} from './config-dir/utils/resolveRequestFunctionPaths';\nimport { resolveConfigFilepath } from './config-dir/utils/resolveConfigFilepath';\nimport { cacheComponentsChecks } from './plugin/checks/cacheComponentsChecks';\nimport {\n cacheComponentsDevHotReloadDisabledWarning,\n cacheComponentsMissingLoadTranslationsError,\n} from './errors/cacheComponents';\nimport { I18nConfigParams } from 'gt-i18n/internal/types';\nimport { getRuntimeCredentials } from './setup/runtimeCredentials';\n\ntype AutoderiveConfig = boolean | { jsx?: boolean; strings?: boolean };\n\ntype ConfigFileShape = {\n customMapping?: CustomMapping;\n files?: {\n gt?: {\n parsingFlags?: {\n autoderive?: AutoderiveConfig;\n };\n };\n };\n};\n\ntype RuntimeCredentialProps = {\n apiKey?: string;\n devApiKey?: string;\n projectId?: string;\n};\n\ntype InternalGTConfigProps = BaseWithGTConfigProps &\n RuntimeCredentialProps &\n ConfigFileShape & {\n loadDictionaryEnabled?: boolean;\n loadTranslationsType?: 'remote' | 'custom' | 'disabled';\n _dictionaryFileType?: string;\n _cacheComponentsEnabled?: boolean;\n _disableDevHotReload?: boolean;\n };\n\ntype WithGTConfigValue<T> =\n T extends Promise<infer U>\n ? Promise<U & NextConfig>\n : T extends PromiseLike<infer U>\n ? PromiseLike<U & NextConfig>\n : T & NextConfig;\n\ntype WithGTConfigResult<TNextConfig extends object> = TNextConfig extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => WithGTConfigValue<R>\n : TNextConfig & NextConfig;\n\nfunction isThenable(value: unknown): value is PromiseLike<NextConfig> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\n/**\n * Initializes General Translation settings for a Next.js application.\n *\n * Use it in `next.config.js` to enable GT translation functionality as a plugin.\n *\n * @example\n * // In next.config.ts\n * import { withGTConfig } from 'gt-next/config';\n * import type { NextConfig } from 'next';\n *\n * const nextConfig = {\n * reactStrictMode: true,\n * } satisfies NextConfig;\n *\n * export default withGTConfig(nextConfig, {\n * locales: ['en', 'es', 'fr'],\n * defaultLocale: 'en'\n * })\n *\n * @param {string|undefined} config - Optional config filepath (defaults to './gt.config.json'). If a file is found, it will be parsed for GT config variables.\n * @param {string|undefined} dictionary - Optional dictionary configuration file path. If a string is provided, it will be used as a path.\n * @param {string|null} [runtimeUrl=defaultInitGTProps.runtimeUrl] - The base URL for the GT API. Set to an empty string to disable automatic translations. Set to null to disable.\n * @param {string|null} [cacheUrl=defaultInitGTProps.cacheUrl] - The URL for cached translations. Set to null to disable.\n * @param {string[]|undefined} - Whether to use local translations.\n * @param {string[]} [locales=defaultInitGTProps.locales] - List of supported locales for the application.\n * @param {string} [defaultLocale=defaultInitGTProps.defaultLocale] - The default locale to use if none is specified.\n * @param {string|undefined} [getLocalePath=\"getLocale\"] - The path to the custom getLocale function.\n * @param {string|undefined} [getRegionPath=\"getRegion\"] - The path to the custom getRegion function.\n * @param {object} [renderSettings=defaultInitGTProps.renderSettings] - Render settings for how translations should be handled.\n * @param {number} [cacheExpiryTime] - The time in milliseconds for how long translations should be cached.\n * @param {number} [maxConcurrentRequests=defaultInitGTProps.maxConcurrentRequests] - Maximum number of concurrent requests allowed.\n * @param {number} [maxBatchSize=defaultInitGTProps.maxBatchSize] - Maximum translation requests in the same batch.\n * @param {number} [batchInterval=defaultInitGTProps.batchInterval] - The interval in milliseconds between batched translation requests.\n * @param {boolean} [ignoreBrowserLocales=defaultWithGTConfigProps.ignoreBrowserLocales] - Whether to ignore browser's preferred locales.\n * @param {boolean} [disableInvalidLocaleWarning=defaultWithGTConfigProps.disableInvalidLocaleWarning] - Whether to disable invalid request locale warnings.\n * @param {string|undefined} [pathRegex] - Regular expression that request pathnames must match for i18n middleware to be applied.\n * @param {object} headersAndCookies - Additional headers and cookies that can be passed for extended configuration.\n * @param {object} metadata - Additional metadata that can be passed for extended configuration.\n *\n * @param {object} nextConfig - The Next.js configuration object to extend\n * @param {withGTConfigProps} props - General Translation configuration properties\n * @returns {NextConfig} - An updated Next.js config with GT settings applied\n *\n * @throws {Error} If the project ID is missing and default URLs are used, or if the API key is required and missing from the environment.\n */\nexport function withGTConfig<TNextConfig extends object = NextConfig>(\n nextConfig?: TNextConfig,\n props: withGTConfigProps = {}\n): WithGTConfigResult<TNextConfig> {\n // Next also accepts the `(phase, context) => config` function form. When given\n // one, call it and wrap the resolved config so `withGTConfig` composes with\n // other Next config plugins that return a config function — matching\n // `@sentry/nextjs`'s `withSentryConfig`. Without this, a function config would\n // be spread as a plain object below, silently dropping the user's config.\n if (typeof nextConfig === 'function') {\n const configFn = nextConfig as (\n phase: string,\n context: { defaultConfig: NextConfig }\n ) => NextConfig | Promise<NextConfig>;\n return ((phase: string, context: { defaultConfig: NextConfig }) => {\n const resolved = configFn(phase, context);\n return isThenable(resolved)\n ? resolved.then((resolvedConfig) => withGTConfig(resolvedConfig, props))\n : withGTConfig(resolved, props);\n }) as unknown as WithGTConfigResult<TNextConfig>;\n }\n\n const internalNextConfig = (nextConfig ?? {}) as unknown as NextConfig;\n\n // ---------- LOAD GT CONFIG FILE ---------- //\n\n let loadedConfig: Partial<InternalGTConfigProps> = {};\n try {\n let configPath: string | undefined;\n if (props.config) {\n configPath = props.config;\n } else if (fs.existsSync(defaultWithGTConfigProps.config)) {\n configPath = defaultWithGTConfigProps.config;\n } else if (fs.existsSync('./.gt/gt.config.json')) {\n // Support config under .gt for parity with .locadex\n configPath = './.gt/gt.config.json';\n } else if (fs.existsSync('./.locadex/gt.config.json')) {\n // Backward compatibility: support legacy .locadex directory\n configPath = './.locadex/gt.config.json';\n }\n if (typeof configPath === 'string' && fs.existsSync(configPath)) {\n const fileContent = fs.readFileSync(configPath, 'utf-8');\n loadedConfig = JSON.parse(fileContent);\n }\n } catch (error) {\n console.error('Error reading GT config file:', error);\n }\n\n // ---------- LOAD ENVIRONMENT VARIABLES ---------- //\n\n const { projectId, apiKey, devApiKey } = getRuntimeCredentials();\n\n // conditionally add environment variables to config\n const envConfig: Partial<InternalGTConfigProps> = {\n ...(projectId ? { projectId } : {}),\n ...(apiKey ? { apiKey } : {}),\n ...(devApiKey ? { devApiKey } : {}),\n };\n\n // ---------- CHECK FOR CONFIG CONFLICTS ---------- //\n\n // Check for conflicts between config and params\n const propsRecord = props as Record<string, unknown>;\n const conflicts = Object.entries(loadedConfig)\n .filter(([key, value]) => {\n // Skip if key doesn't exist in props\n if (!(key in props)) return false;\n\n const propValue = propsRecord[key];\n\n // Handle null/undefined values\n if (value == null || propValue == null) {\n return value !== propValue;\n }\n\n // Handle primitive types (string, number, boolean)\n if (typeof value !== 'object') {\n return value !== propValue;\n }\n\n // Handle arrays (no need for deep equality check)\n if (Array.isArray(value)) {\n if (!Array.isArray(propValue)) return true;\n if (value.length !== propValue.length) return true;\n return value.some((v, i) => v !== propValue[i]);\n }\n\n // Handle objects\n if (typeof value === 'object' && typeof propValue === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const propRecord = propValue as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const propKeys = Object.keys(propRecord);\n const keys = new Set([...valueKeys, ...propKeys]);\n\n // Objects must match exactly (no need to go deeper)\n if (valueKeys.length !== propKeys.length) return true;\n return !Array.from(keys).every((k) => valueRecord[k] === propRecord[k]);\n }\n\n return false;\n })\n .map(\n ([key, value]) =>\n `- Key: ${key} Next Config: ${JSON.stringify(propsRecord[key])} does not match GT Config: ${JSON.stringify(value)}`\n );\n\n if (conflicts.length) {\n throw new Error(conflictingConfigurationBuildError(conflicts));\n }\n\n // ---------- MERGE CONFIGS ---------- //\n\n // Merge cookie and header names\n const mergedHeadersAndCookies = {\n ...defaultWithGTConfigProps.headersAndCookies,\n ...props.headersAndCookies,\n };\n\n // Merge compiler options\n const mergedExperimentalCompilerOptions = {\n ...defaultWithGTConfigProps.experimentalCompilerOptions,\n ...props.experimentalCompilerOptions,\n };\n\n // precedence: input > env > config file > defaults\n const mergedConfig: InternalGTConfigProps = {\n ...defaultWithGTConfigProps,\n ...loadedConfig,\n ...envConfig,\n ...props,\n headersAndCookies: mergedHeadersAndCookies,\n experimentalCompilerOptions: mergedExperimentalCompilerOptions,\n _usingPlugin: true, // flag to indicate plugin usage\n };\n\n compilePathRegex(mergedConfig.pathRegex);\n\n // clear up any issues with the compiler options\n validateCompiler(mergedConfig);\n\n // ----------- RESOLVE ANY EXTERNAL FILES ----------- //\n\n // Resolve wasm filepath\n const turboPackEnabled = !!process.env.TURBOPACK;\n let resolvedWasmFilePath = '';\n if (mergedConfig.experimentalCompilerOptions?.type === 'swc') {\n try {\n if (turboPackEnabled) {\n const absolutePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n resolvedWasmFilePath =\n './' + path.relative(process.cwd(), absolutePath).replace(/\\\\/g, '/');\n } else {\n resolvedWasmFilePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n }\n } catch (error) {\n console.error(\n createGTCompilerUnresolvedWarning('swc'),\n 'Error message:',\n error\n );\n resolvedWasmFilePath = '';\n mergedConfig.experimentalCompilerOptions.type = 'none';\n }\n }\n\n // Resolve dictionary filepath\n let resolvedDictionaryFilePath =\n typeof mergedConfig.dictionary === 'string'\n ? mergedConfig.dictionary\n : resolveConfigFilepath('dictionary', ['.ts', '.js', '.json']); // fallback to dictionary\n\n // Check [defaultLocale].json file\n if (!resolvedDictionaryFilePath && mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(\n mergedConfig.defaultLocale,\n ['.json']\n );\n\n // Check [defaultLanguageCode].json file\n if (!resolvedDictionaryFilePath) {\n const defaultLanguage = getLocaleProperties(\n mergedConfig.defaultLocale\n )?.languageCode;\n\n if (defaultLanguage && defaultLanguage !== mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(defaultLanguage, [\n '.json',\n ]);\n }\n }\n }\n\n // Get the type of dictionary file\n const resolvedDictionaryFilePathType = resolvedDictionaryFilePath\n ? path.extname(resolvedDictionaryFilePath)\n : undefined;\n if (resolvedDictionaryFilePathType) {\n mergedConfig._dictionaryFileType = resolvedDictionaryFilePathType;\n }\n\n // Resolve custom dictionary loader path\n const customLoadDictionaryPath =\n typeof mergedConfig.loadDictionaryPath === 'string'\n ? mergedConfig.loadDictionaryPath\n : resolveConfigFilepath('loadDictionary');\n\n // Resolve custom translation loader path\n const customLoadTranslationsPath =\n typeof mergedConfig.loadTranslationsPath === 'string'\n ? mergedConfig.loadTranslationsPath\n : resolveConfigFilepath('loadTranslations');\n\n // Resolve request function paths\n const requestFunctionPaths = resolveRequestFunctionPaths(mergedConfig);\n\n // Warn if found in /app directory\n if (\n !resolvedDictionaryFilePath &&\n resolveConfigFilepath('dictionary', ['.ts', '.js', '.json'], undefined, [\n './app',\n './src/app',\n ])\n ) {\n console.warn(\n createBadFilepathWarning('dictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadDictionaryPath &&\n resolveConfigFilepath(\n 'loadDictionary',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadDictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadTranslationsPath &&\n resolveConfigFilepath(\n 'loadTranslations',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadTranslations', ['./app', './src/app'])\n );\n }\n\n // ----------- LOCALE STANDARDIZATION ----------- //\n\n // Check if using Services\n const gtRuntimeTranslationEnabled = !!(\n mergedConfig.runtimeUrl === defaultWithGTConfigProps.runtimeUrl &&\n ((process.env.NODE_ENV === 'production' && mergedConfig.apiKey) ||\n (process.env.NODE_ENV === 'development' && mergedConfig.devApiKey))\n );\n const gtRemoteCacheEnabled = !!(\n mergedConfig.cacheUrl === defaultWithGTConfigProps.cacheUrl &&\n mergedConfig.loadTranslationsType === 'remote'\n );\n const gtServicesEnabled = !!(\n (gtRuntimeTranslationEnabled || gtRemoteCacheEnabled) &&\n mergedConfig.projectId\n );\n\n // Standardize locales\n if (mergedConfig.locales && mergedConfig.defaultLocale) {\n mergedConfig.locales.unshift(mergedConfig.defaultLocale);\n }\n const updatedLocales: string[] = [];\n mergedConfig.locales = Array.from(new Set(mergedConfig.locales)).map(\n (locale) => {\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale(locale)\n : locale;\n if (updatedLocale !== locale) {\n updatedLocales.push(`${locale} -> ${updatedLocale}`);\n }\n return updatedLocale;\n }\n );\n\n // Standardize canonical locales\n const updatedCanonicalLocales: string[] = [];\n if (mergedConfig.customMapping) {\n mergedConfig.customMapping = Object.fromEntries(\n Object.entries(mergedConfig.customMapping).map(([key, value]) => {\n if (typeof value !== 'object' || !('code' in value)) {\n return [key, value];\n }\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale((value as { code: string }).code)\n : (value as { code: string }).code;\n if (updatedLocale !== (value as { code: string }).code) {\n updatedCanonicalLocales.push(`${key} -> ${updatedLocale}`);\n }\n return [\n key,\n {\n ...value,\n code: updatedLocale,\n },\n ];\n })\n );\n }\n\n // Run cache component checks\n cacheComponentsChecks({\n nextConfig: internalNextConfig,\n requestFunctionPaths,\n localTranslationsEnabled: !!customLoadTranslationsPath,\n localDictionaryEnabled: !!customLoadDictionaryPath,\n });\n\n // ---------- DERIVED CONFIG ATTRIBUTES ---------- //\n\n // Local dictionary flag\n if (customLoadDictionaryPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadDictionaryPath))) {\n throw new Error(\n unresolvedLoadDictionaryBuildError(customLoadDictionaryPath)\n );\n } else {\n mergedConfig.loadDictionaryEnabled = true;\n }\n } else {\n mergedConfig.loadDictionaryEnabled = false;\n }\n\n // Local translations flag\n if (customLoadTranslationsPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadTranslationsPath))) {\n throw new Error(\n unresolvedLoadTranslationsBuildError(customLoadTranslationsPath)\n );\n } else {\n mergedConfig.loadTranslationsType = 'custom';\n }\n } else {\n mergedConfig.loadTranslationsType = 'remote';\n }\n\n if (internalNextConfig.cacheComponents) {\n if (mergedConfig.loadTranslationsType !== 'custom') {\n throw new Error(cacheComponentsMissingLoadTranslationsError);\n }\n if (isDevHotReloadEnabled(mergedConfig)) {\n console.warn(cacheComponentsDevHotReloadDisabledWarning);\n }\n mergedConfig._cacheComponentsEnabled = true;\n mergedConfig._disableDevHotReload = true;\n mergedConfig.cacheExpiryTime = 0;\n }\n\n // Set default cache expiry if and only if no dev key\n if (\n mergedConfig.loadTranslationsType == 'remote' &&\n !mergedConfig.devApiKey &&\n typeof mergedConfig.cacheExpiryTime === 'undefined'\n ) {\n mergedConfig.cacheExpiryTime = defaultCacheExpiryTime;\n }\n\n // ---------- ERROR CHECKS ---------- //\n\n // Check: invalid locale\n if (!mergedConfig.customMapping && gtServicesEnabled) {\n const invalidLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale)) {\n invalidLocales.push(locale);\n }\n });\n if (invalidLocales.length) {\n throw new Error(invalidLocalesError(invalidLocales));\n }\n }\n\n // Check: invalid canonical locale\n if (mergedConfig.customMapping && gtServicesEnabled) {\n const invalidCanonicalLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale, mergedConfig.customMapping)) {\n invalidCanonicalLocales.push(locale);\n }\n });\n if (invalidCanonicalLocales.length) {\n throw new Error(invalidCanonicalLocalesError(invalidCanonicalLocales));\n }\n }\n\n // Check: projectId is not required for remote infrastructure, but warn if missing for dev, nothing for prod\n if (\n (mergedConfig.cacheUrl || mergedConfig.runtimeUrl) &&\n !mergedConfig.projectId &&\n process.env.NODE_ENV === 'development' &&\n mergedConfig.loadTranslationsType === 'remote' &&\n !mergedConfig.loadDictionaryEnabled // skip warn if using local dictionary\n ) {\n console.warn(projectIdMissingWarn);\n }\n\n // Check: dev API key should not be included in production\n if (process.env.NODE_ENV === 'production' && mergedConfig.devApiKey) {\n throw new Error(devApiKeyIncludedInProductionError);\n }\n\n // Check: An API key is required for runtime translation\n if (\n mergedConfig.projectId && // must have projectId for this check to matter anyways\n mergedConfig.runtimeUrl &&\n !(mergedConfig.apiKey || mergedConfig.devApiKey) &&\n process.env.NODE_ENV === 'development'\n ) {\n console.warn(APIKeyMissingWarn);\n }\n\n // Check: if using GT infrastructure, warn about unsupported locales\n if (gtServicesEnabled) {\n // Warn about standardized locales\n if (updatedLocales.length) {\n console.warn(standardizedLocalesWarning(updatedLocales));\n }\n\n // Warn about standardized canonical locales\n if (updatedCanonicalLocales.length) {\n console.warn(\n standardizedCanonicalLocalesWarning(updatedCanonicalLocales)\n );\n }\n }\n\n // ---------- STORE CONFIGURATIONS ---------- //\n const {\n projectId: _projectId,\n apiKey: _apiKey,\n devApiKey: _devApiKey,\n ...privateConfigParams\n } = mergedConfig;\n const I18NConfigParams = JSON.stringify(privateConfigParams);\n const publicI18NConfigParams: Omit<\n I18nConfigParams,\n 'projectId' | 'devApiKey' | 'apiKey'\n > = {\n defaultLocale: mergedConfig.defaultLocale,\n locales: mergedConfig.locales,\n customMapping: mergedConfig.customMapping,\n runtimeUrl: mergedConfig.runtimeUrl,\n };\n\n const { type: _type, ...compilerOptions } =\n mergedConfig.experimentalCompilerOptions || {};\n\n // Read autoderive from parsingFlags (single source of truth shared with CLI)\n const rawAutoderive: boolean | { jsx?: boolean; strings?: boolean } =\n loadedConfig?.files?.gt?.parsingFlags?.autoderive ?? false;\n const autoderiveJsx =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.jsx ?? false);\n const autoderiveStrings =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.strings ?? false);\n\n const swcPluginOptions: Record<string, unknown> = {\n ...compilerOptions,\n autoderiveJsx,\n autoderiveStrings,\n };\n\n const swcPluginEntry: [string, Record<string, unknown>] | null =\n mergedConfig.experimentalCompilerOptions?.type === 'swc'\n ? [resolvedWasmFilePath, swcPluginOptions]\n : null;\n\n const turboAliases = {\n 'gt-next/internal/_dictionary': resolvedDictionaryFilePath || '',\n 'gt-next/internal/_load-translations': customLoadTranslationsPath || '',\n 'gt-next/internal/_load-dictionary': customLoadDictionaryPath || '',\n ...Object.fromEntries(\n Object.entries(requestFunctionPaths).map(([functionName, path]) => {\n return [\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ],\n path,\n ];\n })\n ),\n };\n\n // experimental.turbo is deprecated in next@15.3.0.\n // Check for experimental.turbo. If we write to turbopack field, experimental fields will be ignored.\n // Yet, if there are other resolveAlias fields, we don't want to be ignored either.\n const experimentalTurbopack = !(\n turboConfigStable &&\n (!internalNextConfig.experimental?.turbo ||\n internalNextConfig.turbopack?.resolveAlias)\n );\n\n const config: NextConfig = {\n ...internalNextConfig,\n transpilePackages: Array.from(\n new Set([...(internalNextConfig.transpilePackages || []), 'gt-next'])\n ),\n env: {\n ...internalNextConfig.env,\n _GENERALTRANSLATION_I18N_CONFIG_PARAMS: I18NConfigParams,\n NEXT_PUBLIC_GENERALTRANSLATION_I18N_CONFIG_PARAMS: JSON.stringify(\n publicI18NConfigParams\n ),\n ...(resolvedDictionaryFilePathType && {\n _GENERALTRANSLATION_DICTIONARY_FILE_TYPE:\n resolvedDictionaryFilePathType,\n }),\n _GENERALTRANSLATION_LOCAL_DICTIONARY_ENABLED:\n mergedConfig.loadDictionaryEnabled.toString(),\n _GENERALTRANSLATION_LOCAL_TRANSLATION_ENABLED: (\n mergedConfig.loadTranslationsType === 'custom'\n ).toString(),\n _GENERALTRANSLATION_DEFAULT_LOCALE: (\n mergedConfig.defaultLocale ||\n defaultWithGTConfigProps.defaultLocale ||\n ''\n ).toString(),\n _GENERALTRANSLATION_GT_SERVICES_ENABLED: gtServicesEnabled.toString(),\n _GENERALTRANSLATION_IGNORE_BROWSER_LOCALES:\n mergedConfig.ignoreBrowserLocales?.toString() ||\n defaultWithGTConfigProps.ignoreBrowserLocales?.toString() ||\n 'false',\n _GENERALTRANSLATION_CUSTOM_GET_LOCALE_ENABLED:\n requestFunctionPaths.getLocale ? 'true' : 'false',\n _GENERALTRANSLATION_CUSTOM_GET_REGION_ENABLED:\n requestFunctionPaths.getRegion ? 'true' : 'false',\n _GENERALTRANSLATION_DISABLE_INVALID_LOCALE_WARNING:\n mergedConfig.disableInvalidLocaleWarning?.toString() || 'false',\n // nextConfig.env intentionally makes this available to client-boundary.tsx.\n ...(mergedConfig.pathRegex !== undefined && {\n _GENERALTRANSLATION_PATH_REGEX: mergedConfig.pathRegex,\n }),\n },\n ...(turboPackEnabled &&\n !experimentalTurbopack && {\n turbopack: {\n ...internalNextConfig.turbopack,\n resolveAlias: {\n ...internalNextConfig.turbopack?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n experimental: {\n ...internalNextConfig.experimental,\n ...(rootParamStability === 'experimental' && {\n rootParams: true,\n }),\n swcPlugins: [\n ...(internalNextConfig.experimental?.swcPlugins || []),\n ...(swcPluginEntry ? [swcPluginEntry] : []),\n ],\n ...(turboPackEnabled &&\n experimentalTurbopack && {\n turbo: {\n ...internalNextConfig.experimental?.turbo,\n resolveAlias: {\n ...internalNextConfig.experimental?.turbo?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n },\n webpack: function webpack(\n ...[webpackConfig, options]: Parameters<\n NonNullable<NextConfig['webpack']>\n >\n ) {\n // Only apply webpack aliases if we're using webpack (not Turbopack)\n if (!turboPackEnabled) {\n // Try to load GT compiler if available\n if (mergedConfig.experimentalCompilerOptions?.type === 'babel') {\n try {\n const {\n webpack: gtUnplugin,\n } = require('@generaltranslation/compiler');\n webpackConfig.plugins.unshift(\n gtUnplugin({\n ...mergedConfig.experimentalCompilerOptions,\n autoJsxImportSource: 'gt-next',\n })\n );\n } catch (e) {\n mergedConfig.experimentalCompilerOptions.type = 'none';\n console.warn(\n createGTCompilerUnresolvedWarning('babel'),\n 'Error message:',\n e\n );\n }\n }\n\n // Disable cache in dev bc people might move around loadTranslations() and loadDictionary() files\n if (process.env.NODE_ENV === 'development') {\n webpackConfig.cache = false;\n }\n if (resolvedDictionaryFilePath) {\n webpackConfig.resolve.alias['gt-next/internal/_dictionary'] =\n path.resolve(webpackConfig.context, resolvedDictionaryFilePath);\n }\n if (customLoadTranslationsPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-translations`] =\n path.resolve(webpackConfig.context, customLoadTranslationsPath);\n }\n if (customLoadDictionaryPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-dictionary`] =\n path.resolve(webpackConfig.context, customLoadDictionaryPath);\n }\n for (const [functionName, pathString] of Object.entries(\n requestFunctionPaths\n )) {\n const key =\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ];\n webpackConfig.resolve.alias[key] = path.resolve(\n webpackConfig.context,\n pathString\n );\n }\n }\n if (typeof internalNextConfig?.webpack === 'function') {\n return internalNextConfig.webpack(webpackConfig, options);\n }\n return webpackConfig;\n },\n };\n return config as WithGTConfigResult<TNextConfig>;\n}\n\nfunction isDevHotReloadEnabled(config: InternalGTConfigProps): boolean {\n return (\n !!config.devApiKey &&\n !!config.projectId &&\n config.runtimeUrl !== null &&\n config.runtimeUrl !== '' &&\n process.env.NODE_ENV === 'development'\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":["defaultWithGTConfigProps","getRuntimeCredentials","conflictingConfigurationBuildError","createGTCompilerUnresolvedWarning","resolveConfigFilepath","resolveRequestFunctionPaths","createBadFilepathWarning","unresolvedLoadDictionaryBuildError","unresolvedLoadTranslationsBuildError","cacheComponentsMissingLoadTranslationsError","cacheComponentsDevHotReloadDisabledWarning","defaultCacheExpiryTime","invalidLocalesError","invalidCanonicalLocalesError","projectIdMissingWarn","devApiKeyIncludedInProductionError","APIKeyMissingWarn","standardizedLocalesWarning","standardizedCanonicalLocalesWarning","path","REQUEST_FUNCTION_ALIASES","turboConfigStable","rootParamStability"],"sources":["../src/config.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type { NextConfig } from 'next';\nimport {\n defaultWithGTConfigProps,\n defaultCacheExpiryTime,\n} from './config-dir/props/defaultWithGTConfigProps';\nimport {\n type BaseWithGTConfigProps,\n type withGTConfigProps,\n} from './config-dir/props/withGTConfigProps';\nimport {\n APIKeyMissingWarn,\n conflictingConfigurationBuildError,\n createBadFilepathWarning,\n createGTCompilerUnresolvedWarning,\n devApiKeyIncludedInProductionError,\n invalidCanonicalLocalesError,\n invalidLocalesError,\n projectIdMissingWarn,\n standardizedCanonicalLocalesWarning,\n standardizedLocalesWarning,\n unresolvedLoadDictionaryBuildError,\n unresolvedLoadTranslationsBuildError,\n} from './errors/createErrors';\nimport { compilePathRegex } from './utils/pathRegex';\nimport {\n getLocaleProperties,\n isValidLocale,\n standardizeLocale,\n} from '@generaltranslation/format';\nimport type { CustomMapping } from '@generaltranslation/format/types';\nimport {\n rootParamStability,\n turboConfigStable,\n} from './plugin/getStableNextVersionInfo';\nimport { validateCompiler } from './config-dir/utils/validateCompiler';\nimport {\n REQUEST_FUNCTION_ALIASES,\n resolveRequestFunctionPaths,\n} from './config-dir/utils/resolveRequestFunctionPaths';\nimport { resolveConfigFilepath } from './config-dir/utils/resolveConfigFilepath';\nimport { cacheComponentsChecks } from './plugin/checks/cacheComponentsChecks';\nimport {\n cacheComponentsDevHotReloadDisabledWarning,\n cacheComponentsMissingLoadTranslationsError,\n} from './errors/cacheComponents';\nimport { I18nConfigParams } from 'gt-i18n/internal/types';\nimport { getRuntimeCredentials } from './setup/runtimeCredentials';\n\ntype AutoderiveConfig = boolean | { jsx?: boolean; strings?: boolean };\n\ntype ConfigFileShape = {\n customMapping?: CustomMapping;\n files?: {\n gt?: {\n parsingFlags?: {\n autoderive?: AutoderiveConfig;\n };\n };\n };\n};\n\ntype RuntimeCredentialProps = {\n apiKey?: string;\n devApiKey?: string;\n projectId?: string;\n};\n\ntype InternalGTConfigProps = BaseWithGTConfigProps &\n RuntimeCredentialProps &\n ConfigFileShape & {\n loadDictionaryEnabled?: boolean;\n loadTranslationsType?: 'remote' | 'custom' | 'disabled';\n _dictionaryFileType?: string;\n _cacheComponentsEnabled?: boolean;\n _disableDevHotReload?: boolean;\n };\n\ntype WithGTConfigValue<T> =\n T extends Promise<infer U>\n ? Promise<U & NextConfig>\n : T extends PromiseLike<infer U>\n ? PromiseLike<U & NextConfig>\n : T & NextConfig;\n\ntype WithGTConfigResult<TNextConfig extends object> = TNextConfig extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => WithGTConfigValue<R>\n : TNextConfig & NextConfig;\n\nfunction isThenable(value: unknown): value is PromiseLike<NextConfig> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\n/**\n * Initializes General Translation settings for a Next.js application.\n *\n * Use it in `next.config.js` to enable GT translation functionality as a plugin.\n *\n * @example\n * // In next.config.ts\n * import { withGTConfig } from 'gt-next/config';\n * import type { NextConfig } from 'next';\n *\n * const nextConfig = {\n * reactStrictMode: true,\n * } satisfies NextConfig;\n *\n * export default withGTConfig(nextConfig, {\n * locales: ['en', 'es', 'fr'],\n * defaultLocale: 'en'\n * })\n *\n * @param {string|undefined} config - Optional config filepath (defaults to './gt.config.json'). If a file is found, it will be parsed for GT config variables.\n * @param {string|undefined} dictionary - Optional dictionary configuration file path. If a string is provided, it will be used as a path.\n * @param {string|null} [runtimeUrl=defaultInitGTProps.runtimeUrl] - The base URL for the GT API. Set to an empty string to disable automatic translations. Set to null to disable.\n * @param {string|null} [cacheUrl=defaultInitGTProps.cacheUrl] - The URL for cached translations. Set to null to disable.\n * @param {string[]|undefined} - Whether to use local translations.\n * @param {string[]} [locales=defaultInitGTProps.locales] - List of supported locales for the application.\n * @param {string} [defaultLocale=defaultInitGTProps.defaultLocale] - The default locale to use if none is specified.\n * @param {string|undefined} [getLocalePath=\"getLocale\"] - The path to the custom getLocale function.\n * @param {string|undefined} [getRegionPath=\"getRegion\"] - The path to the custom getRegion function.\n * @param {object} [renderSettings=defaultInitGTProps.renderSettings] - Render settings for how translations should be handled.\n * @param {number} [cacheExpiryTime] - The time in milliseconds for how long translations should be cached.\n * @param {number} [maxConcurrentRequests=defaultInitGTProps.maxConcurrentRequests] - Maximum number of concurrent requests allowed.\n * @param {number} [maxBatchSize=defaultInitGTProps.maxBatchSize] - Maximum translation requests in the same batch.\n * @param {number} [batchInterval=defaultInitGTProps.batchInterval] - The interval in milliseconds between batched translation requests.\n * @param {boolean} [ignoreBrowserLocales=defaultWithGTConfigProps.ignoreBrowserLocales] - Whether to ignore browser's preferred locales.\n * @param {boolean} [disableInvalidLocaleWarning=defaultWithGTConfigProps.disableInvalidLocaleWarning] - Whether to disable invalid request locale warnings.\n * @param {string|undefined} [pathRegex] - Regular expression that request pathnames must match for i18n middleware to be applied.\n * @param {object} headersAndCookies - Additional headers and cookies that can be passed for extended configuration.\n * @param {object} metadata - Additional metadata that can be passed for extended configuration.\n *\n * @param {object} nextConfig - The Next.js configuration object to extend\n * @param {withGTConfigProps} props - General Translation configuration properties\n * @returns {NextConfig} - An updated Next.js config with GT settings applied\n *\n * @throws {Error} If the project ID is missing and default URLs are used, or if the API key is required and missing from the environment.\n */\nexport function withGTConfig<TNextConfig extends object = NextConfig>(\n nextConfig?: TNextConfig,\n props: withGTConfigProps = {}\n): WithGTConfigResult<TNextConfig> {\n // Next also accepts the `(phase, context) => config` function form. When given\n // one, call it and wrap the resolved config so `withGTConfig` composes with\n // other Next config plugins that return a config function — matching\n // `@sentry/nextjs`'s `withSentryConfig`. Without this, a function config would\n // be spread as a plain object below, silently dropping the user's config.\n if (typeof nextConfig === 'function') {\n const configFn = nextConfig as (\n phase: string,\n context: { defaultConfig: NextConfig }\n ) => NextConfig | Promise<NextConfig>;\n return ((phase: string, context: { defaultConfig: NextConfig }) => {\n const resolved = configFn(phase, context);\n return isThenable(resolved)\n ? resolved.then((resolvedConfig) => withGTConfig(resolvedConfig, props))\n : withGTConfig(resolved, props);\n }) as unknown as WithGTConfigResult<TNextConfig>;\n }\n\n const internalNextConfig = (nextConfig ?? {}) as unknown as NextConfig;\n\n // ---------- LOAD GT CONFIG FILE ---------- //\n\n let loadedConfig: Partial<InternalGTConfigProps> = {};\n try {\n let configPath: string | undefined;\n if (props.config) {\n configPath = props.config;\n } else if (fs.existsSync(defaultWithGTConfigProps.config)) {\n configPath = defaultWithGTConfigProps.config;\n } else if (fs.existsSync('./.gt/gt.config.json')) {\n // Support config under .gt for parity with .locadex\n configPath = './.gt/gt.config.json';\n } else if (fs.existsSync('./.locadex/gt.config.json')) {\n // Backward compatibility: support legacy .locadex directory\n configPath = './.locadex/gt.config.json';\n }\n if (typeof configPath === 'string' && fs.existsSync(configPath)) {\n const fileContent = fs.readFileSync(configPath, 'utf-8');\n loadedConfig = JSON.parse(fileContent);\n }\n } catch (error) {\n console.error('Error reading GT config file:', error);\n }\n\n // ---------- LOAD ENVIRONMENT VARIABLES ---------- //\n\n const { projectId, apiKey, devApiKey } = getRuntimeCredentials();\n\n // conditionally add environment variables to config\n const envConfig: Partial<InternalGTConfigProps> = {\n ...(projectId ? { projectId } : {}),\n ...(apiKey ? { apiKey } : {}),\n ...(devApiKey ? { devApiKey } : {}),\n };\n\n // ---------- CHECK FOR CONFIG CONFLICTS ---------- //\n\n // Check for conflicts between config and params\n const propsRecord = props as Record<string, unknown>;\n const conflicts = Object.entries(loadedConfig)\n .filter(([key, value]) => {\n // Skip if key doesn't exist in props\n if (!(key in props)) return false;\n\n const propValue = propsRecord[key];\n\n // Handle null/undefined values\n if (value == null || propValue == null) {\n return value !== propValue;\n }\n\n // Handle primitive types (string, number, boolean)\n if (typeof value !== 'object') {\n return value !== propValue;\n }\n\n // Handle arrays (no need for deep equality check)\n if (Array.isArray(value)) {\n if (!Array.isArray(propValue)) return true;\n if (value.length !== propValue.length) return true;\n return value.some((v, i) => v !== propValue[i]);\n }\n\n // Handle objects\n if (typeof value === 'object' && typeof propValue === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const propRecord = propValue as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const propKeys = Object.keys(propRecord);\n const keys = new Set([...valueKeys, ...propKeys]);\n\n // Objects must match exactly (no need to go deeper)\n if (valueKeys.length !== propKeys.length) return true;\n return !Array.from(keys).every((k) => valueRecord[k] === propRecord[k]);\n }\n\n return false;\n })\n .map(\n ([key, value]) =>\n `- Key: ${key} Next Config: ${JSON.stringify(propsRecord[key])} does not match GT Config: ${JSON.stringify(value)}`\n );\n\n if (conflicts.length) {\n throw new Error(conflictingConfigurationBuildError(conflicts));\n }\n\n // ---------- MERGE CONFIGS ---------- //\n\n // Merge cookie and header names\n const mergedHeadersAndCookies = {\n ...defaultWithGTConfigProps.headersAndCookies,\n ...props.headersAndCookies,\n };\n\n // Merge compiler options\n const mergedExperimentalCompilerOptions = {\n ...defaultWithGTConfigProps.experimentalCompilerOptions,\n ...props.experimentalCompilerOptions,\n };\n\n // precedence: input > env > config file > defaults\n const mergedConfig: InternalGTConfigProps = {\n ...defaultWithGTConfigProps,\n ...loadedConfig,\n ...envConfig,\n ...props,\n headersAndCookies: mergedHeadersAndCookies,\n experimentalCompilerOptions: mergedExperimentalCompilerOptions,\n _usingPlugin: true, // flag to indicate plugin usage\n };\n\n compilePathRegex(mergedConfig.pathRegex);\n\n // clear up any issues with the compiler options\n validateCompiler(mergedConfig);\n\n // ----------- RESOLVE ANY EXTERNAL FILES ----------- //\n\n // Resolve wasm filepath\n const turboPackEnabled = !!process.env.TURBOPACK;\n let resolvedWasmFilePath = '';\n if (mergedConfig.experimentalCompilerOptions?.type === 'swc') {\n try {\n if (turboPackEnabled) {\n const absolutePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n resolvedWasmFilePath =\n './' + path.relative(process.cwd(), absolutePath).replace(/\\\\/g, '/');\n } else {\n resolvedWasmFilePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n }\n } catch (error) {\n console.error(\n createGTCompilerUnresolvedWarning('swc'),\n 'Error message:',\n error\n );\n resolvedWasmFilePath = '';\n mergedConfig.experimentalCompilerOptions.type = 'none';\n }\n }\n\n // Resolve dictionary filepath\n let resolvedDictionaryFilePath =\n typeof mergedConfig.dictionary === 'string'\n ? mergedConfig.dictionary\n : resolveConfigFilepath('dictionary', ['.ts', '.js', '.json']); // fallback to dictionary\n\n // Check [defaultLocale].json file\n if (!resolvedDictionaryFilePath && mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(\n mergedConfig.defaultLocale,\n ['.json']\n );\n\n // Check [defaultLanguageCode].json file\n if (!resolvedDictionaryFilePath) {\n const defaultLanguage = getLocaleProperties(\n mergedConfig.defaultLocale\n )?.languageCode;\n\n if (defaultLanguage && defaultLanguage !== mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(defaultLanguage, [\n '.json',\n ]);\n }\n }\n }\n\n // Get the type of dictionary file\n const resolvedDictionaryFilePathType = resolvedDictionaryFilePath\n ? path.extname(resolvedDictionaryFilePath)\n : undefined;\n if (resolvedDictionaryFilePathType) {\n mergedConfig._dictionaryFileType = resolvedDictionaryFilePathType;\n }\n\n // Resolve custom dictionary loader path\n const customLoadDictionaryPath =\n typeof mergedConfig.loadDictionaryPath === 'string'\n ? mergedConfig.loadDictionaryPath\n : resolveConfigFilepath('loadDictionary');\n\n // Resolve custom translation loader path\n const customLoadTranslationsPath =\n typeof mergedConfig.loadTranslationsPath === 'string'\n ? mergedConfig.loadTranslationsPath\n : resolveConfigFilepath('loadTranslations');\n\n // Resolve request function paths\n const requestFunctionPaths = resolveRequestFunctionPaths(mergedConfig);\n\n // Warn if found in /app directory\n if (\n !resolvedDictionaryFilePath &&\n resolveConfigFilepath('dictionary', ['.ts', '.js', '.json'], undefined, [\n './app',\n './src/app',\n ])\n ) {\n console.warn(\n createBadFilepathWarning('dictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadDictionaryPath &&\n resolveConfigFilepath(\n 'loadDictionary',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadDictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadTranslationsPath &&\n resolveConfigFilepath(\n 'loadTranslations',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadTranslations', ['./app', './src/app'])\n );\n }\n\n // ----------- LOCALE STANDARDIZATION ----------- //\n\n // Check if using Services\n const gtRuntimeTranslationEnabled = !!(\n mergedConfig.runtimeUrl === defaultWithGTConfigProps.runtimeUrl &&\n ((process.env.NODE_ENV === 'production' && mergedConfig.apiKey) ||\n (process.env.NODE_ENV === 'development' && mergedConfig.devApiKey))\n );\n const gtRemoteCacheEnabled = !!(\n mergedConfig.cacheUrl === defaultWithGTConfigProps.cacheUrl &&\n mergedConfig.loadTranslationsType === 'remote'\n );\n const gtServicesEnabled = !!(\n (gtRuntimeTranslationEnabled || gtRemoteCacheEnabled) &&\n mergedConfig.projectId\n );\n\n // Standardize locales\n if (mergedConfig.locales && mergedConfig.defaultLocale) {\n mergedConfig.locales.unshift(mergedConfig.defaultLocale);\n }\n const updatedLocales: string[] = [];\n mergedConfig.locales = Array.from(new Set(mergedConfig.locales)).map(\n (locale) => {\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale(locale)\n : locale;\n if (updatedLocale !== locale) {\n updatedLocales.push(`${locale} -> ${updatedLocale}`);\n }\n return updatedLocale;\n }\n );\n\n // Standardize canonical locales\n const updatedCanonicalLocales: string[] = [];\n if (mergedConfig.customMapping) {\n mergedConfig.customMapping = Object.fromEntries(\n Object.entries(mergedConfig.customMapping).map(([key, value]) => {\n if (typeof value !== 'object' || !('code' in value)) {\n return [key, value];\n }\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale((value as { code: string }).code)\n : (value as { code: string }).code;\n if (updatedLocale !== (value as { code: string }).code) {\n updatedCanonicalLocales.push(`${key} -> ${updatedLocale}`);\n }\n return [\n key,\n {\n ...value,\n code: updatedLocale,\n },\n ];\n })\n );\n }\n\n // Run cache component checks\n cacheComponentsChecks({\n nextConfig: internalNextConfig,\n requestFunctionPaths,\n localTranslationsEnabled: !!customLoadTranslationsPath,\n localDictionaryEnabled: !!customLoadDictionaryPath,\n });\n\n // ---------- DERIVED CONFIG ATTRIBUTES ---------- //\n\n // Local dictionary flag\n if (customLoadDictionaryPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadDictionaryPath))) {\n throw new Error(\n unresolvedLoadDictionaryBuildError(customLoadDictionaryPath)\n );\n } else {\n mergedConfig.loadDictionaryEnabled = true;\n }\n } else {\n mergedConfig.loadDictionaryEnabled = false;\n }\n\n // Local translations flag\n if (customLoadTranslationsPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadTranslationsPath))) {\n throw new Error(\n unresolvedLoadTranslationsBuildError(customLoadTranslationsPath)\n );\n } else {\n mergedConfig.loadTranslationsType = 'custom';\n }\n } else {\n mergedConfig.loadTranslationsType = 'remote';\n }\n\n if (internalNextConfig.cacheComponents) {\n if (mergedConfig.loadTranslationsType !== 'custom') {\n throw new Error(cacheComponentsMissingLoadTranslationsError);\n }\n if (isDevHotReloadEnabled(mergedConfig)) {\n console.warn(cacheComponentsDevHotReloadDisabledWarning);\n }\n mergedConfig._cacheComponentsEnabled = true;\n mergedConfig._disableDevHotReload = true;\n mergedConfig.cacheExpiryTime = 0;\n }\n\n // Set default cache expiry if and only if no dev key\n if (\n mergedConfig.loadTranslationsType == 'remote' &&\n !mergedConfig.devApiKey &&\n typeof mergedConfig.cacheExpiryTime === 'undefined'\n ) {\n mergedConfig.cacheExpiryTime = defaultCacheExpiryTime;\n }\n\n // ---------- ERROR CHECKS ---------- //\n\n // Check: invalid locale\n if (!mergedConfig.customMapping && gtServicesEnabled) {\n const invalidLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale)) {\n invalidLocales.push(locale);\n }\n });\n if (invalidLocales.length) {\n throw new Error(invalidLocalesError(invalidLocales));\n }\n }\n\n // Check: invalid canonical locale\n if (mergedConfig.customMapping && gtServicesEnabled) {\n const invalidCanonicalLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale, mergedConfig.customMapping)) {\n invalidCanonicalLocales.push(locale);\n }\n });\n if (invalidCanonicalLocales.length) {\n throw new Error(invalidCanonicalLocalesError(invalidCanonicalLocales));\n }\n }\n\n // Check: projectId is not required for remote infrastructure, but warn if missing for dev, nothing for prod\n if (\n (mergedConfig.cacheUrl || mergedConfig.runtimeUrl) &&\n !mergedConfig.projectId &&\n process.env.NODE_ENV === 'development' &&\n mergedConfig.loadTranslationsType === 'remote' &&\n !mergedConfig.loadDictionaryEnabled // skip warn if using local dictionary\n ) {\n console.warn(projectIdMissingWarn);\n }\n\n // Check: dev API key should not be included in production\n if (process.env.NODE_ENV === 'production' && mergedConfig.devApiKey) {\n throw new Error(devApiKeyIncludedInProductionError);\n }\n\n // Check: An API key is required for runtime translation\n if (\n mergedConfig.projectId && // must have projectId for this check to matter anyways\n mergedConfig.runtimeUrl &&\n !(mergedConfig.apiKey || mergedConfig.devApiKey) &&\n process.env.NODE_ENV === 'development'\n ) {\n console.warn(APIKeyMissingWarn);\n }\n\n // Check: if using GT infrastructure, warn about unsupported locales\n if (gtServicesEnabled) {\n // Warn about standardized locales\n if (updatedLocales.length) {\n console.warn(standardizedLocalesWarning(updatedLocales));\n }\n\n // Warn about standardized canonical locales\n if (updatedCanonicalLocales.length) {\n console.warn(\n standardizedCanonicalLocalesWarning(updatedCanonicalLocales)\n );\n }\n }\n\n // ---------- STORE CONFIGURATIONS ---------- //\n const {\n projectId: _projectId,\n apiKey: _apiKey,\n devApiKey: _devApiKey,\n ...privateConfigParams\n } = mergedConfig;\n const I18NConfigParams = JSON.stringify(privateConfigParams);\n const publicI18NConfigParams: Omit<\n I18nConfigParams,\n 'projectId' | 'devApiKey' | 'apiKey'\n > = {\n defaultLocale: mergedConfig.defaultLocale,\n locales: mergedConfig.locales,\n customMapping: mergedConfig.customMapping,\n runtimeUrl: mergedConfig.runtimeUrl,\n };\n\n const { type: _type, ...compilerOptions } =\n mergedConfig.experimentalCompilerOptions || {};\n\n // Read autoderive from parsingFlags (single source of truth shared with CLI)\n const rawAutoderive: boolean | { jsx?: boolean; strings?: boolean } =\n loadedConfig?.files?.gt?.parsingFlags?.autoderive ?? false;\n const autoderiveJsx =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.jsx ?? false);\n const autoderiveStrings =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.strings ?? false);\n\n const swcPluginOptions: Record<string, unknown> = {\n ...compilerOptions,\n autoderiveJsx,\n autoderiveStrings,\n };\n\n const swcPluginEntry: [string, Record<string, unknown>] | null =\n mergedConfig.experimentalCompilerOptions?.type === 'swc'\n ? [resolvedWasmFilePath, swcPluginOptions]\n : null;\n\n const turboAliases = {\n 'gt-next/internal/_dictionary': resolvedDictionaryFilePath || '',\n 'gt-next/internal/_load-translations': customLoadTranslationsPath || '',\n 'gt-next/internal/_load-dictionary': customLoadDictionaryPath || '',\n ...Object.fromEntries(\n Object.entries(requestFunctionPaths).map(([functionName, path]) => {\n return [\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ],\n path,\n ];\n })\n ),\n };\n\n // experimental.turbo is deprecated in next@15.3.0.\n // Check for experimental.turbo. If we write to turbopack field, experimental fields will be ignored.\n // Yet, if there are other resolveAlias fields, we don't want to be ignored either.\n const experimentalTurbopack = !(\n turboConfigStable &&\n (!internalNextConfig.experimental?.turbo ||\n internalNextConfig.turbopack?.resolveAlias)\n );\n\n const config: NextConfig = {\n ...internalNextConfig,\n transpilePackages: Array.from(\n new Set([...(internalNextConfig.transpilePackages || []), 'gt-next'])\n ),\n env: {\n ...internalNextConfig.env,\n _GENERALTRANSLATION_I18N_CONFIG_PARAMS: I18NConfigParams,\n NEXT_PUBLIC_GENERALTRANSLATION_I18N_CONFIG_PARAMS: JSON.stringify(\n publicI18NConfigParams\n ),\n ...(resolvedDictionaryFilePathType && {\n _GENERALTRANSLATION_DICTIONARY_FILE_TYPE:\n resolvedDictionaryFilePathType,\n }),\n _GENERALTRANSLATION_LOCAL_DICTIONARY_ENABLED:\n mergedConfig.loadDictionaryEnabled.toString(),\n _GENERALTRANSLATION_LOCAL_TRANSLATION_ENABLED: (\n mergedConfig.loadTranslationsType === 'custom'\n ).toString(),\n _GENERALTRANSLATION_DEFAULT_LOCALE: (\n mergedConfig.defaultLocale ||\n defaultWithGTConfigProps.defaultLocale ||\n ''\n ).toString(),\n _GENERALTRANSLATION_GT_SERVICES_ENABLED: gtServicesEnabled.toString(),\n _GENERALTRANSLATION_IGNORE_BROWSER_LOCALES:\n mergedConfig.ignoreBrowserLocales?.toString() ||\n defaultWithGTConfigProps.ignoreBrowserLocales?.toString() ||\n 'false',\n _GENERALTRANSLATION_CUSTOM_GET_LOCALE_ENABLED:\n requestFunctionPaths.getLocale ? 'true' : 'false',\n _GENERALTRANSLATION_CUSTOM_GET_REGION_ENABLED:\n requestFunctionPaths.getRegion ? 'true' : 'false',\n _GENERALTRANSLATION_DISABLE_INVALID_LOCALE_WARNING:\n mergedConfig.disableInvalidLocaleWarning?.toString() || 'false',\n // nextConfig.env intentionally makes this available to client-boundary.tsx.\n ...(mergedConfig.pathRegex !== undefined && {\n _GENERALTRANSLATION_PATH_REGEX: mergedConfig.pathRegex,\n }),\n },\n ...(turboPackEnabled &&\n !experimentalTurbopack && {\n turbopack: {\n ...internalNextConfig.turbopack,\n resolveAlias: {\n ...internalNextConfig.turbopack?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n experimental: {\n ...internalNextConfig.experimental,\n ...(rootParamStability === 'experimental' && {\n rootParams: true,\n }),\n swcPlugins: [\n ...(internalNextConfig.experimental?.swcPlugins || []),\n ...(swcPluginEntry ? [swcPluginEntry] : []),\n ],\n ...(turboPackEnabled &&\n experimentalTurbopack && {\n turbo: {\n ...internalNextConfig.experimental?.turbo,\n resolveAlias: {\n ...internalNextConfig.experimental?.turbo?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n },\n webpack: function webpack(\n ...[webpackConfig, options]: Parameters<\n NonNullable<NextConfig['webpack']>\n >\n ) {\n // Only apply webpack aliases if we're using webpack (not Turbopack)\n if (!turboPackEnabled) {\n // Try to load GT compiler if available\n if (mergedConfig.experimentalCompilerOptions?.type === 'babel') {\n try {\n const {\n webpack: gtUnplugin,\n } = require('@generaltranslation/compiler');\n webpackConfig.plugins.unshift(\n gtUnplugin({\n ...mergedConfig.experimentalCompilerOptions,\n autoJsxImportSource: 'gt-next',\n })\n );\n } catch (e) {\n mergedConfig.experimentalCompilerOptions.type = 'none';\n console.warn(\n createGTCompilerUnresolvedWarning('babel'),\n 'Error message:',\n e\n );\n }\n }\n\n // Disable cache in dev bc people might move around loadTranslations() and loadDictionary() files\n if (process.env.NODE_ENV === 'development') {\n webpackConfig.cache = false;\n }\n if (resolvedDictionaryFilePath) {\n webpackConfig.resolve.alias['gt-next/internal/_dictionary'] =\n path.resolve(webpackConfig.context, resolvedDictionaryFilePath);\n }\n if (customLoadTranslationsPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-translations`] =\n path.resolve(webpackConfig.context, customLoadTranslationsPath);\n }\n if (customLoadDictionaryPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-dictionary`] =\n path.resolve(webpackConfig.context, customLoadDictionaryPath);\n }\n for (const [functionName, pathString] of Object.entries(\n requestFunctionPaths\n )) {\n const key =\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ];\n webpackConfig.resolve.alias[key] = path.resolve(\n webpackConfig.context,\n pathString\n );\n }\n // Webpack parses .mjs as strict ESM and does not treat require()\n // calls as dependencies, so the require()-backed internal aliases\n // above would never apply and their runtime errors are swallowed\n // (loaders silently no-op). Parse gt-next's ESM dist as\n // javascript/auto so webpack picks up those require() calls.\n // Server compilation only: the call sites are server-only, and this\n // keeps the rule from ever pulling a user's loader file into the\n // client bundle. Turbopack resolves them through resolveAlias and\n // needs no rule.\n // The guard mirrors the alias block above: any configured alias\n // enables the rule. The request-function aliases are static-imported\n // (initGT.server), and resolve.alias applies at resolution regardless\n // of parser mode, so they work without the rule; they gate it anyway\n // for symmetry and for any future require()-backed consumer.\n if (\n options.isServer &&\n (resolvedDictionaryFilePath ||\n customLoadTranslationsPath ||\n customLoadDictionaryPath ||\n Object.keys(requestFunctionPaths).length > 0)\n ) {\n // gt-next normally resolves inside a node_modules dir (app-local,\n // hoisted monorepo root, or the pnpm store), but symlinked installs\n // (workspace:*, file:) resolve to a real path with no node_modules\n // segment — so also match this package's dist dir, where this\n // compiled file lives.\n const gtNextDistDirs: (string | RegExp)[] = [\n /node_modules[\\\\/]gt-next[\\\\/]dist[\\\\/]/,\n ];\n try {\n // Trust __dirname only when it verifiably is gt-next's dist: a\n // bundler that inlines this file elsewhere would otherwise widen\n // the rule to every .mjs under its output dir. The compiled\n // config always sits beside its ESM twin and the internal\n // modules these aliases target.\n if (\n fs.existsSync(path.join(__dirname, 'config.mjs')) &&\n fs.existsSync(path.join(__dirname, 'internal', '_dictionary.mjs'))\n ) {\n gtNextDistDirs.push(__dirname + path.sep);\n }\n } catch {\n // __dirname is undefined when the ESM dist of this module is\n // loaded natively; the node_modules pattern still applies.\n }\n webpackConfig.module ??= {};\n webpackConfig.module.rules ??= [];\n webpackConfig.module.rules.push({\n test: /\\.mjs$/,\n include: gtNextDistDirs,\n type: 'javascript/auto',\n });\n }\n }\n if (typeof internalNextConfig?.webpack === 'function') {\n return internalNextConfig.webpack(webpackConfig, options);\n }\n return webpackConfig;\n },\n };\n return config as WithGTConfigResult<TNextConfig>;\n}\n\nfunction isDevHotReloadEnabled(config: InternalGTConfigProps): boolean {\n return (\n !!config.devApiKey &&\n !!config.projectId &&\n config.runtimeUrl !== null &&\n config.runtimeUrl !== '' &&\n process.env.NODE_ENV === 'development'\n );\n}\n"],"mappings":"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"}
|
package/dist/config.mjs
CHANGED
|
@@ -320,6 +320,19 @@ function withGTConfig(nextConfig, props = {}) {
|
|
|
320
320
|
const key = REQUEST_FUNCTION_ALIASES[functionName];
|
|
321
321
|
webpackConfig.resolve.alias[key] = path.resolve(webpackConfig.context, pathString);
|
|
322
322
|
}
|
|
323
|
+
if (options.isServer && (resolvedDictionaryFilePath || customLoadTranslationsPath || customLoadDictionaryPath || Object.keys(requestFunctionPaths).length > 0)) {
|
|
324
|
+
const gtNextDistDirs = [/node_modules[\\/]gt-next[\\/]dist[\\/]/];
|
|
325
|
+
try {
|
|
326
|
+
if (fs.existsSync(path.join(__dirname, "config.mjs")) && fs.existsSync(path.join(__dirname, "internal", "_dictionary.mjs"))) gtNextDistDirs.push(__dirname + path.sep);
|
|
327
|
+
} catch {}
|
|
328
|
+
webpackConfig.module ??= {};
|
|
329
|
+
webpackConfig.module.rules ??= [];
|
|
330
|
+
webpackConfig.module.rules.push({
|
|
331
|
+
test: /\.mjs$/,
|
|
332
|
+
include: gtNextDistDirs,
|
|
333
|
+
type: "javascript/auto"
|
|
334
|
+
});
|
|
335
|
+
}
|
|
323
336
|
}
|
|
324
337
|
if (typeof internalNextConfig?.webpack === "function") return internalNextConfig.webpack(webpackConfig, options);
|
|
325
338
|
return webpackConfig;
|
package/dist/config.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type { NextConfig } from 'next';\nimport {\n defaultWithGTConfigProps,\n defaultCacheExpiryTime,\n} from './config-dir/props/defaultWithGTConfigProps';\nimport {\n type BaseWithGTConfigProps,\n type withGTConfigProps,\n} from './config-dir/props/withGTConfigProps';\nimport {\n APIKeyMissingWarn,\n conflictingConfigurationBuildError,\n createBadFilepathWarning,\n createGTCompilerUnresolvedWarning,\n devApiKeyIncludedInProductionError,\n invalidCanonicalLocalesError,\n invalidLocalesError,\n projectIdMissingWarn,\n standardizedCanonicalLocalesWarning,\n standardizedLocalesWarning,\n unresolvedLoadDictionaryBuildError,\n unresolvedLoadTranslationsBuildError,\n} from './errors/createErrors';\nimport { compilePathRegex } from './utils/pathRegex';\nimport {\n getLocaleProperties,\n isValidLocale,\n standardizeLocale,\n} from '@generaltranslation/format';\nimport type { CustomMapping } from '@generaltranslation/format/types';\nimport {\n rootParamStability,\n turboConfigStable,\n} from './plugin/getStableNextVersionInfo';\nimport { validateCompiler } from './config-dir/utils/validateCompiler';\nimport {\n REQUEST_FUNCTION_ALIASES,\n resolveRequestFunctionPaths,\n} from './config-dir/utils/resolveRequestFunctionPaths';\nimport { resolveConfigFilepath } from './config-dir/utils/resolveConfigFilepath';\nimport { cacheComponentsChecks } from './plugin/checks/cacheComponentsChecks';\nimport {\n cacheComponentsDevHotReloadDisabledWarning,\n cacheComponentsMissingLoadTranslationsError,\n} from './errors/cacheComponents';\nimport { I18nConfigParams } from 'gt-i18n/internal/types';\nimport { getRuntimeCredentials } from './setup/runtimeCredentials';\n\ntype AutoderiveConfig = boolean | { jsx?: boolean; strings?: boolean };\n\ntype ConfigFileShape = {\n customMapping?: CustomMapping;\n files?: {\n gt?: {\n parsingFlags?: {\n autoderive?: AutoderiveConfig;\n };\n };\n };\n};\n\ntype RuntimeCredentialProps = {\n apiKey?: string;\n devApiKey?: string;\n projectId?: string;\n};\n\ntype InternalGTConfigProps = BaseWithGTConfigProps &\n RuntimeCredentialProps &\n ConfigFileShape & {\n loadDictionaryEnabled?: boolean;\n loadTranslationsType?: 'remote' | 'custom' | 'disabled';\n _dictionaryFileType?: string;\n _cacheComponentsEnabled?: boolean;\n _disableDevHotReload?: boolean;\n };\n\ntype WithGTConfigValue<T> =\n T extends Promise<infer U>\n ? Promise<U & NextConfig>\n : T extends PromiseLike<infer U>\n ? PromiseLike<U & NextConfig>\n : T & NextConfig;\n\ntype WithGTConfigResult<TNextConfig extends object> = TNextConfig extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => WithGTConfigValue<R>\n : TNextConfig & NextConfig;\n\nfunction isThenable(value: unknown): value is PromiseLike<NextConfig> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\n/**\n * Initializes General Translation settings for a Next.js application.\n *\n * Use it in `next.config.js` to enable GT translation functionality as a plugin.\n *\n * @example\n * // In next.config.ts\n * import { withGTConfig } from 'gt-next/config';\n * import type { NextConfig } from 'next';\n *\n * const nextConfig = {\n * reactStrictMode: true,\n * } satisfies NextConfig;\n *\n * export default withGTConfig(nextConfig, {\n * locales: ['en', 'es', 'fr'],\n * defaultLocale: 'en'\n * })\n *\n * @param {string|undefined} config - Optional config filepath (defaults to './gt.config.json'). If a file is found, it will be parsed for GT config variables.\n * @param {string|undefined} dictionary - Optional dictionary configuration file path. If a string is provided, it will be used as a path.\n * @param {string|null} [runtimeUrl=defaultInitGTProps.runtimeUrl] - The base URL for the GT API. Set to an empty string to disable automatic translations. Set to null to disable.\n * @param {string|null} [cacheUrl=defaultInitGTProps.cacheUrl] - The URL for cached translations. Set to null to disable.\n * @param {string[]|undefined} - Whether to use local translations.\n * @param {string[]} [locales=defaultInitGTProps.locales] - List of supported locales for the application.\n * @param {string} [defaultLocale=defaultInitGTProps.defaultLocale] - The default locale to use if none is specified.\n * @param {string|undefined} [getLocalePath=\"getLocale\"] - The path to the custom getLocale function.\n * @param {string|undefined} [getRegionPath=\"getRegion\"] - The path to the custom getRegion function.\n * @param {object} [renderSettings=defaultInitGTProps.renderSettings] - Render settings for how translations should be handled.\n * @param {number} [cacheExpiryTime] - The time in milliseconds for how long translations should be cached.\n * @param {number} [maxConcurrentRequests=defaultInitGTProps.maxConcurrentRequests] - Maximum number of concurrent requests allowed.\n * @param {number} [maxBatchSize=defaultInitGTProps.maxBatchSize] - Maximum translation requests in the same batch.\n * @param {number} [batchInterval=defaultInitGTProps.batchInterval] - The interval in milliseconds between batched translation requests.\n * @param {boolean} [ignoreBrowserLocales=defaultWithGTConfigProps.ignoreBrowserLocales] - Whether to ignore browser's preferred locales.\n * @param {boolean} [disableInvalidLocaleWarning=defaultWithGTConfigProps.disableInvalidLocaleWarning] - Whether to disable invalid request locale warnings.\n * @param {string|undefined} [pathRegex] - Regular expression that request pathnames must match for i18n middleware to be applied.\n * @param {object} headersAndCookies - Additional headers and cookies that can be passed for extended configuration.\n * @param {object} metadata - Additional metadata that can be passed for extended configuration.\n *\n * @param {object} nextConfig - The Next.js configuration object to extend\n * @param {withGTConfigProps} props - General Translation configuration properties\n * @returns {NextConfig} - An updated Next.js config with GT settings applied\n *\n * @throws {Error} If the project ID is missing and default URLs are used, or if the API key is required and missing from the environment.\n */\nexport function withGTConfig<TNextConfig extends object = NextConfig>(\n nextConfig?: TNextConfig,\n props: withGTConfigProps = {}\n): WithGTConfigResult<TNextConfig> {\n // Next also accepts the `(phase, context) => config` function form. When given\n // one, call it and wrap the resolved config so `withGTConfig` composes with\n // other Next config plugins that return a config function — matching\n // `@sentry/nextjs`'s `withSentryConfig`. Without this, a function config would\n // be spread as a plain object below, silently dropping the user's config.\n if (typeof nextConfig === 'function') {\n const configFn = nextConfig as (\n phase: string,\n context: { defaultConfig: NextConfig }\n ) => NextConfig | Promise<NextConfig>;\n return ((phase: string, context: { defaultConfig: NextConfig }) => {\n const resolved = configFn(phase, context);\n return isThenable(resolved)\n ? resolved.then((resolvedConfig) => withGTConfig(resolvedConfig, props))\n : withGTConfig(resolved, props);\n }) as unknown as WithGTConfigResult<TNextConfig>;\n }\n\n const internalNextConfig = (nextConfig ?? {}) as unknown as NextConfig;\n\n // ---------- LOAD GT CONFIG FILE ---------- //\n\n let loadedConfig: Partial<InternalGTConfigProps> = {};\n try {\n let configPath: string | undefined;\n if (props.config) {\n configPath = props.config;\n } else if (fs.existsSync(defaultWithGTConfigProps.config)) {\n configPath = defaultWithGTConfigProps.config;\n } else if (fs.existsSync('./.gt/gt.config.json')) {\n // Support config under .gt for parity with .locadex\n configPath = './.gt/gt.config.json';\n } else if (fs.existsSync('./.locadex/gt.config.json')) {\n // Backward compatibility: support legacy .locadex directory\n configPath = './.locadex/gt.config.json';\n }\n if (typeof configPath === 'string' && fs.existsSync(configPath)) {\n const fileContent = fs.readFileSync(configPath, 'utf-8');\n loadedConfig = JSON.parse(fileContent);\n }\n } catch (error) {\n console.error('Error reading GT config file:', error);\n }\n\n // ---------- LOAD ENVIRONMENT VARIABLES ---------- //\n\n const { projectId, apiKey, devApiKey } = getRuntimeCredentials();\n\n // conditionally add environment variables to config\n const envConfig: Partial<InternalGTConfigProps> = {\n ...(projectId ? { projectId } : {}),\n ...(apiKey ? { apiKey } : {}),\n ...(devApiKey ? { devApiKey } : {}),\n };\n\n // ---------- CHECK FOR CONFIG CONFLICTS ---------- //\n\n // Check for conflicts between config and params\n const propsRecord = props as Record<string, unknown>;\n const conflicts = Object.entries(loadedConfig)\n .filter(([key, value]) => {\n // Skip if key doesn't exist in props\n if (!(key in props)) return false;\n\n const propValue = propsRecord[key];\n\n // Handle null/undefined values\n if (value == null || propValue == null) {\n return value !== propValue;\n }\n\n // Handle primitive types (string, number, boolean)\n if (typeof value !== 'object') {\n return value !== propValue;\n }\n\n // Handle arrays (no need for deep equality check)\n if (Array.isArray(value)) {\n if (!Array.isArray(propValue)) return true;\n if (value.length !== propValue.length) return true;\n return value.some((v, i) => v !== propValue[i]);\n }\n\n // Handle objects\n if (typeof value === 'object' && typeof propValue === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const propRecord = propValue as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const propKeys = Object.keys(propRecord);\n const keys = new Set([...valueKeys, ...propKeys]);\n\n // Objects must match exactly (no need to go deeper)\n if (valueKeys.length !== propKeys.length) return true;\n return !Array.from(keys).every((k) => valueRecord[k] === propRecord[k]);\n }\n\n return false;\n })\n .map(\n ([key, value]) =>\n `- Key: ${key} Next Config: ${JSON.stringify(propsRecord[key])} does not match GT Config: ${JSON.stringify(value)}`\n );\n\n if (conflicts.length) {\n throw new Error(conflictingConfigurationBuildError(conflicts));\n }\n\n // ---------- MERGE CONFIGS ---------- //\n\n // Merge cookie and header names\n const mergedHeadersAndCookies = {\n ...defaultWithGTConfigProps.headersAndCookies,\n ...props.headersAndCookies,\n };\n\n // Merge compiler options\n const mergedExperimentalCompilerOptions = {\n ...defaultWithGTConfigProps.experimentalCompilerOptions,\n ...props.experimentalCompilerOptions,\n };\n\n // precedence: input > env > config file > defaults\n const mergedConfig: InternalGTConfigProps = {\n ...defaultWithGTConfigProps,\n ...loadedConfig,\n ...envConfig,\n ...props,\n headersAndCookies: mergedHeadersAndCookies,\n experimentalCompilerOptions: mergedExperimentalCompilerOptions,\n _usingPlugin: true, // flag to indicate plugin usage\n };\n\n compilePathRegex(mergedConfig.pathRegex);\n\n // clear up any issues with the compiler options\n validateCompiler(mergedConfig);\n\n // ----------- RESOLVE ANY EXTERNAL FILES ----------- //\n\n // Resolve wasm filepath\n const turboPackEnabled = !!process.env.TURBOPACK;\n let resolvedWasmFilePath = '';\n if (mergedConfig.experimentalCompilerOptions?.type === 'swc') {\n try {\n if (turboPackEnabled) {\n const absolutePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n resolvedWasmFilePath =\n './' + path.relative(process.cwd(), absolutePath).replace(/\\\\/g, '/');\n } else {\n resolvedWasmFilePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n }\n } catch (error) {\n console.error(\n createGTCompilerUnresolvedWarning('swc'),\n 'Error message:',\n error\n );\n resolvedWasmFilePath = '';\n mergedConfig.experimentalCompilerOptions.type = 'none';\n }\n }\n\n // Resolve dictionary filepath\n let resolvedDictionaryFilePath =\n typeof mergedConfig.dictionary === 'string'\n ? mergedConfig.dictionary\n : resolveConfigFilepath('dictionary', ['.ts', '.js', '.json']); // fallback to dictionary\n\n // Check [defaultLocale].json file\n if (!resolvedDictionaryFilePath && mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(\n mergedConfig.defaultLocale,\n ['.json']\n );\n\n // Check [defaultLanguageCode].json file\n if (!resolvedDictionaryFilePath) {\n const defaultLanguage = getLocaleProperties(\n mergedConfig.defaultLocale\n )?.languageCode;\n\n if (defaultLanguage && defaultLanguage !== mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(defaultLanguage, [\n '.json',\n ]);\n }\n }\n }\n\n // Get the type of dictionary file\n const resolvedDictionaryFilePathType = resolvedDictionaryFilePath\n ? path.extname(resolvedDictionaryFilePath)\n : undefined;\n if (resolvedDictionaryFilePathType) {\n mergedConfig._dictionaryFileType = resolvedDictionaryFilePathType;\n }\n\n // Resolve custom dictionary loader path\n const customLoadDictionaryPath =\n typeof mergedConfig.loadDictionaryPath === 'string'\n ? mergedConfig.loadDictionaryPath\n : resolveConfigFilepath('loadDictionary');\n\n // Resolve custom translation loader path\n const customLoadTranslationsPath =\n typeof mergedConfig.loadTranslationsPath === 'string'\n ? mergedConfig.loadTranslationsPath\n : resolveConfigFilepath('loadTranslations');\n\n // Resolve request function paths\n const requestFunctionPaths = resolveRequestFunctionPaths(mergedConfig);\n\n // Warn if found in /app directory\n if (\n !resolvedDictionaryFilePath &&\n resolveConfigFilepath('dictionary', ['.ts', '.js', '.json'], undefined, [\n './app',\n './src/app',\n ])\n ) {\n console.warn(\n createBadFilepathWarning('dictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadDictionaryPath &&\n resolveConfigFilepath(\n 'loadDictionary',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadDictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadTranslationsPath &&\n resolveConfigFilepath(\n 'loadTranslations',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadTranslations', ['./app', './src/app'])\n );\n }\n\n // ----------- LOCALE STANDARDIZATION ----------- //\n\n // Check if using Services\n const gtRuntimeTranslationEnabled = !!(\n mergedConfig.runtimeUrl === defaultWithGTConfigProps.runtimeUrl &&\n ((process.env.NODE_ENV === 'production' && mergedConfig.apiKey) ||\n (process.env.NODE_ENV === 'development' && mergedConfig.devApiKey))\n );\n const gtRemoteCacheEnabled = !!(\n mergedConfig.cacheUrl === defaultWithGTConfigProps.cacheUrl &&\n mergedConfig.loadTranslationsType === 'remote'\n );\n const gtServicesEnabled = !!(\n (gtRuntimeTranslationEnabled || gtRemoteCacheEnabled) &&\n mergedConfig.projectId\n );\n\n // Standardize locales\n if (mergedConfig.locales && mergedConfig.defaultLocale) {\n mergedConfig.locales.unshift(mergedConfig.defaultLocale);\n }\n const updatedLocales: string[] = [];\n mergedConfig.locales = Array.from(new Set(mergedConfig.locales)).map(\n (locale) => {\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale(locale)\n : locale;\n if (updatedLocale !== locale) {\n updatedLocales.push(`${locale} -> ${updatedLocale}`);\n }\n return updatedLocale;\n }\n );\n\n // Standardize canonical locales\n const updatedCanonicalLocales: string[] = [];\n if (mergedConfig.customMapping) {\n mergedConfig.customMapping = Object.fromEntries(\n Object.entries(mergedConfig.customMapping).map(([key, value]) => {\n if (typeof value !== 'object' || !('code' in value)) {\n return [key, value];\n }\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale((value as { code: string }).code)\n : (value as { code: string }).code;\n if (updatedLocale !== (value as { code: string }).code) {\n updatedCanonicalLocales.push(`${key} -> ${updatedLocale}`);\n }\n return [\n key,\n {\n ...value,\n code: updatedLocale,\n },\n ];\n })\n );\n }\n\n // Run cache component checks\n cacheComponentsChecks({\n nextConfig: internalNextConfig,\n requestFunctionPaths,\n localTranslationsEnabled: !!customLoadTranslationsPath,\n localDictionaryEnabled: !!customLoadDictionaryPath,\n });\n\n // ---------- DERIVED CONFIG ATTRIBUTES ---------- //\n\n // Local dictionary flag\n if (customLoadDictionaryPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadDictionaryPath))) {\n throw new Error(\n unresolvedLoadDictionaryBuildError(customLoadDictionaryPath)\n );\n } else {\n mergedConfig.loadDictionaryEnabled = true;\n }\n } else {\n mergedConfig.loadDictionaryEnabled = false;\n }\n\n // Local translations flag\n if (customLoadTranslationsPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadTranslationsPath))) {\n throw new Error(\n unresolvedLoadTranslationsBuildError(customLoadTranslationsPath)\n );\n } else {\n mergedConfig.loadTranslationsType = 'custom';\n }\n } else {\n mergedConfig.loadTranslationsType = 'remote';\n }\n\n if (internalNextConfig.cacheComponents) {\n if (mergedConfig.loadTranslationsType !== 'custom') {\n throw new Error(cacheComponentsMissingLoadTranslationsError);\n }\n if (isDevHotReloadEnabled(mergedConfig)) {\n console.warn(cacheComponentsDevHotReloadDisabledWarning);\n }\n mergedConfig._cacheComponentsEnabled = true;\n mergedConfig._disableDevHotReload = true;\n mergedConfig.cacheExpiryTime = 0;\n }\n\n // Set default cache expiry if and only if no dev key\n if (\n mergedConfig.loadTranslationsType == 'remote' &&\n !mergedConfig.devApiKey &&\n typeof mergedConfig.cacheExpiryTime === 'undefined'\n ) {\n mergedConfig.cacheExpiryTime = defaultCacheExpiryTime;\n }\n\n // ---------- ERROR CHECKS ---------- //\n\n // Check: invalid locale\n if (!mergedConfig.customMapping && gtServicesEnabled) {\n const invalidLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale)) {\n invalidLocales.push(locale);\n }\n });\n if (invalidLocales.length) {\n throw new Error(invalidLocalesError(invalidLocales));\n }\n }\n\n // Check: invalid canonical locale\n if (mergedConfig.customMapping && gtServicesEnabled) {\n const invalidCanonicalLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale, mergedConfig.customMapping)) {\n invalidCanonicalLocales.push(locale);\n }\n });\n if (invalidCanonicalLocales.length) {\n throw new Error(invalidCanonicalLocalesError(invalidCanonicalLocales));\n }\n }\n\n // Check: projectId is not required for remote infrastructure, but warn if missing for dev, nothing for prod\n if (\n (mergedConfig.cacheUrl || mergedConfig.runtimeUrl) &&\n !mergedConfig.projectId &&\n process.env.NODE_ENV === 'development' &&\n mergedConfig.loadTranslationsType === 'remote' &&\n !mergedConfig.loadDictionaryEnabled // skip warn if using local dictionary\n ) {\n console.warn(projectIdMissingWarn);\n }\n\n // Check: dev API key should not be included in production\n if (process.env.NODE_ENV === 'production' && mergedConfig.devApiKey) {\n throw new Error(devApiKeyIncludedInProductionError);\n }\n\n // Check: An API key is required for runtime translation\n if (\n mergedConfig.projectId && // must have projectId for this check to matter anyways\n mergedConfig.runtimeUrl &&\n !(mergedConfig.apiKey || mergedConfig.devApiKey) &&\n process.env.NODE_ENV === 'development'\n ) {\n console.warn(APIKeyMissingWarn);\n }\n\n // Check: if using GT infrastructure, warn about unsupported locales\n if (gtServicesEnabled) {\n // Warn about standardized locales\n if (updatedLocales.length) {\n console.warn(standardizedLocalesWarning(updatedLocales));\n }\n\n // Warn about standardized canonical locales\n if (updatedCanonicalLocales.length) {\n console.warn(\n standardizedCanonicalLocalesWarning(updatedCanonicalLocales)\n );\n }\n }\n\n // ---------- STORE CONFIGURATIONS ---------- //\n const {\n projectId: _projectId,\n apiKey: _apiKey,\n devApiKey: _devApiKey,\n ...privateConfigParams\n } = mergedConfig;\n const I18NConfigParams = JSON.stringify(privateConfigParams);\n const publicI18NConfigParams: Omit<\n I18nConfigParams,\n 'projectId' | 'devApiKey' | 'apiKey'\n > = {\n defaultLocale: mergedConfig.defaultLocale,\n locales: mergedConfig.locales,\n customMapping: mergedConfig.customMapping,\n runtimeUrl: mergedConfig.runtimeUrl,\n };\n\n const { type: _type, ...compilerOptions } =\n mergedConfig.experimentalCompilerOptions || {};\n\n // Read autoderive from parsingFlags (single source of truth shared with CLI)\n const rawAutoderive: boolean | { jsx?: boolean; strings?: boolean } =\n loadedConfig?.files?.gt?.parsingFlags?.autoderive ?? false;\n const autoderiveJsx =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.jsx ?? false);\n const autoderiveStrings =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.strings ?? false);\n\n const swcPluginOptions: Record<string, unknown> = {\n ...compilerOptions,\n autoderiveJsx,\n autoderiveStrings,\n };\n\n const swcPluginEntry: [string, Record<string, unknown>] | null =\n mergedConfig.experimentalCompilerOptions?.type === 'swc'\n ? [resolvedWasmFilePath, swcPluginOptions]\n : null;\n\n const turboAliases = {\n 'gt-next/internal/_dictionary': resolvedDictionaryFilePath || '',\n 'gt-next/internal/_load-translations': customLoadTranslationsPath || '',\n 'gt-next/internal/_load-dictionary': customLoadDictionaryPath || '',\n ...Object.fromEntries(\n Object.entries(requestFunctionPaths).map(([functionName, path]) => {\n return [\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ],\n path,\n ];\n })\n ),\n };\n\n // experimental.turbo is deprecated in next@15.3.0.\n // Check for experimental.turbo. If we write to turbopack field, experimental fields will be ignored.\n // Yet, if there are other resolveAlias fields, we don't want to be ignored either.\n const experimentalTurbopack = !(\n turboConfigStable &&\n (!internalNextConfig.experimental?.turbo ||\n internalNextConfig.turbopack?.resolveAlias)\n );\n\n const config: NextConfig = {\n ...internalNextConfig,\n transpilePackages: Array.from(\n new Set([...(internalNextConfig.transpilePackages || []), 'gt-next'])\n ),\n env: {\n ...internalNextConfig.env,\n _GENERALTRANSLATION_I18N_CONFIG_PARAMS: I18NConfigParams,\n NEXT_PUBLIC_GENERALTRANSLATION_I18N_CONFIG_PARAMS: JSON.stringify(\n publicI18NConfigParams\n ),\n ...(resolvedDictionaryFilePathType && {\n _GENERALTRANSLATION_DICTIONARY_FILE_TYPE:\n resolvedDictionaryFilePathType,\n }),\n _GENERALTRANSLATION_LOCAL_DICTIONARY_ENABLED:\n mergedConfig.loadDictionaryEnabled.toString(),\n _GENERALTRANSLATION_LOCAL_TRANSLATION_ENABLED: (\n mergedConfig.loadTranslationsType === 'custom'\n ).toString(),\n _GENERALTRANSLATION_DEFAULT_LOCALE: (\n mergedConfig.defaultLocale ||\n defaultWithGTConfigProps.defaultLocale ||\n ''\n ).toString(),\n _GENERALTRANSLATION_GT_SERVICES_ENABLED: gtServicesEnabled.toString(),\n _GENERALTRANSLATION_IGNORE_BROWSER_LOCALES:\n mergedConfig.ignoreBrowserLocales?.toString() ||\n defaultWithGTConfigProps.ignoreBrowserLocales?.toString() ||\n 'false',\n _GENERALTRANSLATION_CUSTOM_GET_LOCALE_ENABLED:\n requestFunctionPaths.getLocale ? 'true' : 'false',\n _GENERALTRANSLATION_CUSTOM_GET_REGION_ENABLED:\n requestFunctionPaths.getRegion ? 'true' : 'false',\n _GENERALTRANSLATION_DISABLE_INVALID_LOCALE_WARNING:\n mergedConfig.disableInvalidLocaleWarning?.toString() || 'false',\n // nextConfig.env intentionally makes this available to client-boundary.tsx.\n ...(mergedConfig.pathRegex !== undefined && {\n _GENERALTRANSLATION_PATH_REGEX: mergedConfig.pathRegex,\n }),\n },\n ...(turboPackEnabled &&\n !experimentalTurbopack && {\n turbopack: {\n ...internalNextConfig.turbopack,\n resolveAlias: {\n ...internalNextConfig.turbopack?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n experimental: {\n ...internalNextConfig.experimental,\n ...(rootParamStability === 'experimental' && {\n rootParams: true,\n }),\n swcPlugins: [\n ...(internalNextConfig.experimental?.swcPlugins || []),\n ...(swcPluginEntry ? [swcPluginEntry] : []),\n ],\n ...(turboPackEnabled &&\n experimentalTurbopack && {\n turbo: {\n ...internalNextConfig.experimental?.turbo,\n resolveAlias: {\n ...internalNextConfig.experimental?.turbo?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n },\n webpack: function webpack(\n ...[webpackConfig, options]: Parameters<\n NonNullable<NextConfig['webpack']>\n >\n ) {\n // Only apply webpack aliases if we're using webpack (not Turbopack)\n if (!turboPackEnabled) {\n // Try to load GT compiler if available\n if (mergedConfig.experimentalCompilerOptions?.type === 'babel') {\n try {\n const {\n webpack: gtUnplugin,\n } = require('@generaltranslation/compiler');\n webpackConfig.plugins.unshift(\n gtUnplugin({\n ...mergedConfig.experimentalCompilerOptions,\n autoJsxImportSource: 'gt-next',\n })\n );\n } catch (e) {\n mergedConfig.experimentalCompilerOptions.type = 'none';\n console.warn(\n createGTCompilerUnresolvedWarning('babel'),\n 'Error message:',\n e\n );\n }\n }\n\n // Disable cache in dev bc people might move around loadTranslations() and loadDictionary() files\n if (process.env.NODE_ENV === 'development') {\n webpackConfig.cache = false;\n }\n if (resolvedDictionaryFilePath) {\n webpackConfig.resolve.alias['gt-next/internal/_dictionary'] =\n path.resolve(webpackConfig.context, resolvedDictionaryFilePath);\n }\n if (customLoadTranslationsPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-translations`] =\n path.resolve(webpackConfig.context, customLoadTranslationsPath);\n }\n if (customLoadDictionaryPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-dictionary`] =\n path.resolve(webpackConfig.context, customLoadDictionaryPath);\n }\n for (const [functionName, pathString] of Object.entries(\n requestFunctionPaths\n )) {\n const key =\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ];\n webpackConfig.resolve.alias[key] = path.resolve(\n webpackConfig.context,\n pathString\n );\n }\n }\n if (typeof internalNextConfig?.webpack === 'function') {\n return internalNextConfig.webpack(webpackConfig, options);\n }\n return webpackConfig;\n },\n };\n return config as WithGTConfigResult<TNextConfig>;\n}\n\nfunction isDevHotReloadEnabled(config: InternalGTConfigProps): boolean {\n return (\n !!config.devApiKey &&\n !!config.projectId &&\n config.runtimeUrl !== null &&\n config.runtimeUrl !== '' &&\n process.env.NODE_ENV === 'development'\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport type { NextConfig } from 'next';\nimport {\n defaultWithGTConfigProps,\n defaultCacheExpiryTime,\n} from './config-dir/props/defaultWithGTConfigProps';\nimport {\n type BaseWithGTConfigProps,\n type withGTConfigProps,\n} from './config-dir/props/withGTConfigProps';\nimport {\n APIKeyMissingWarn,\n conflictingConfigurationBuildError,\n createBadFilepathWarning,\n createGTCompilerUnresolvedWarning,\n devApiKeyIncludedInProductionError,\n invalidCanonicalLocalesError,\n invalidLocalesError,\n projectIdMissingWarn,\n standardizedCanonicalLocalesWarning,\n standardizedLocalesWarning,\n unresolvedLoadDictionaryBuildError,\n unresolvedLoadTranslationsBuildError,\n} from './errors/createErrors';\nimport { compilePathRegex } from './utils/pathRegex';\nimport {\n getLocaleProperties,\n isValidLocale,\n standardizeLocale,\n} from '@generaltranslation/format';\nimport type { CustomMapping } from '@generaltranslation/format/types';\nimport {\n rootParamStability,\n turboConfigStable,\n} from './plugin/getStableNextVersionInfo';\nimport { validateCompiler } from './config-dir/utils/validateCompiler';\nimport {\n REQUEST_FUNCTION_ALIASES,\n resolveRequestFunctionPaths,\n} from './config-dir/utils/resolveRequestFunctionPaths';\nimport { resolveConfigFilepath } from './config-dir/utils/resolveConfigFilepath';\nimport { cacheComponentsChecks } from './plugin/checks/cacheComponentsChecks';\nimport {\n cacheComponentsDevHotReloadDisabledWarning,\n cacheComponentsMissingLoadTranslationsError,\n} from './errors/cacheComponents';\nimport { I18nConfigParams } from 'gt-i18n/internal/types';\nimport { getRuntimeCredentials } from './setup/runtimeCredentials';\n\ntype AutoderiveConfig = boolean | { jsx?: boolean; strings?: boolean };\n\ntype ConfigFileShape = {\n customMapping?: CustomMapping;\n files?: {\n gt?: {\n parsingFlags?: {\n autoderive?: AutoderiveConfig;\n };\n };\n };\n};\n\ntype RuntimeCredentialProps = {\n apiKey?: string;\n devApiKey?: string;\n projectId?: string;\n};\n\ntype InternalGTConfigProps = BaseWithGTConfigProps &\n RuntimeCredentialProps &\n ConfigFileShape & {\n loadDictionaryEnabled?: boolean;\n loadTranslationsType?: 'remote' | 'custom' | 'disabled';\n _dictionaryFileType?: string;\n _cacheComponentsEnabled?: boolean;\n _disableDevHotReload?: boolean;\n };\n\ntype WithGTConfigValue<T> =\n T extends Promise<infer U>\n ? Promise<U & NextConfig>\n : T extends PromiseLike<infer U>\n ? PromiseLike<U & NextConfig>\n : T & NextConfig;\n\ntype WithGTConfigResult<TNextConfig extends object> = TNextConfig extends (\n ...args: infer A\n) => infer R\n ? (...args: A) => WithGTConfigValue<R>\n : TNextConfig & NextConfig;\n\nfunction isThenable(value: unknown): value is PromiseLike<NextConfig> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\n/**\n * Initializes General Translation settings for a Next.js application.\n *\n * Use it in `next.config.js` to enable GT translation functionality as a plugin.\n *\n * @example\n * // In next.config.ts\n * import { withGTConfig } from 'gt-next/config';\n * import type { NextConfig } from 'next';\n *\n * const nextConfig = {\n * reactStrictMode: true,\n * } satisfies NextConfig;\n *\n * export default withGTConfig(nextConfig, {\n * locales: ['en', 'es', 'fr'],\n * defaultLocale: 'en'\n * })\n *\n * @param {string|undefined} config - Optional config filepath (defaults to './gt.config.json'). If a file is found, it will be parsed for GT config variables.\n * @param {string|undefined} dictionary - Optional dictionary configuration file path. If a string is provided, it will be used as a path.\n * @param {string|null} [runtimeUrl=defaultInitGTProps.runtimeUrl] - The base URL for the GT API. Set to an empty string to disable automatic translations. Set to null to disable.\n * @param {string|null} [cacheUrl=defaultInitGTProps.cacheUrl] - The URL for cached translations. Set to null to disable.\n * @param {string[]|undefined} - Whether to use local translations.\n * @param {string[]} [locales=defaultInitGTProps.locales] - List of supported locales for the application.\n * @param {string} [defaultLocale=defaultInitGTProps.defaultLocale] - The default locale to use if none is specified.\n * @param {string|undefined} [getLocalePath=\"getLocale\"] - The path to the custom getLocale function.\n * @param {string|undefined} [getRegionPath=\"getRegion\"] - The path to the custom getRegion function.\n * @param {object} [renderSettings=defaultInitGTProps.renderSettings] - Render settings for how translations should be handled.\n * @param {number} [cacheExpiryTime] - The time in milliseconds for how long translations should be cached.\n * @param {number} [maxConcurrentRequests=defaultInitGTProps.maxConcurrentRequests] - Maximum number of concurrent requests allowed.\n * @param {number} [maxBatchSize=defaultInitGTProps.maxBatchSize] - Maximum translation requests in the same batch.\n * @param {number} [batchInterval=defaultInitGTProps.batchInterval] - The interval in milliseconds between batched translation requests.\n * @param {boolean} [ignoreBrowserLocales=defaultWithGTConfigProps.ignoreBrowserLocales] - Whether to ignore browser's preferred locales.\n * @param {boolean} [disableInvalidLocaleWarning=defaultWithGTConfigProps.disableInvalidLocaleWarning] - Whether to disable invalid request locale warnings.\n * @param {string|undefined} [pathRegex] - Regular expression that request pathnames must match for i18n middleware to be applied.\n * @param {object} headersAndCookies - Additional headers and cookies that can be passed for extended configuration.\n * @param {object} metadata - Additional metadata that can be passed for extended configuration.\n *\n * @param {object} nextConfig - The Next.js configuration object to extend\n * @param {withGTConfigProps} props - General Translation configuration properties\n * @returns {NextConfig} - An updated Next.js config with GT settings applied\n *\n * @throws {Error} If the project ID is missing and default URLs are used, or if the API key is required and missing from the environment.\n */\nexport function withGTConfig<TNextConfig extends object = NextConfig>(\n nextConfig?: TNextConfig,\n props: withGTConfigProps = {}\n): WithGTConfigResult<TNextConfig> {\n // Next also accepts the `(phase, context) => config` function form. When given\n // one, call it and wrap the resolved config so `withGTConfig` composes with\n // other Next config plugins that return a config function — matching\n // `@sentry/nextjs`'s `withSentryConfig`. Without this, a function config would\n // be spread as a plain object below, silently dropping the user's config.\n if (typeof nextConfig === 'function') {\n const configFn = nextConfig as (\n phase: string,\n context: { defaultConfig: NextConfig }\n ) => NextConfig | Promise<NextConfig>;\n return ((phase: string, context: { defaultConfig: NextConfig }) => {\n const resolved = configFn(phase, context);\n return isThenable(resolved)\n ? resolved.then((resolvedConfig) => withGTConfig(resolvedConfig, props))\n : withGTConfig(resolved, props);\n }) as unknown as WithGTConfigResult<TNextConfig>;\n }\n\n const internalNextConfig = (nextConfig ?? {}) as unknown as NextConfig;\n\n // ---------- LOAD GT CONFIG FILE ---------- //\n\n let loadedConfig: Partial<InternalGTConfigProps> = {};\n try {\n let configPath: string | undefined;\n if (props.config) {\n configPath = props.config;\n } else if (fs.existsSync(defaultWithGTConfigProps.config)) {\n configPath = defaultWithGTConfigProps.config;\n } else if (fs.existsSync('./.gt/gt.config.json')) {\n // Support config under .gt for parity with .locadex\n configPath = './.gt/gt.config.json';\n } else if (fs.existsSync('./.locadex/gt.config.json')) {\n // Backward compatibility: support legacy .locadex directory\n configPath = './.locadex/gt.config.json';\n }\n if (typeof configPath === 'string' && fs.existsSync(configPath)) {\n const fileContent = fs.readFileSync(configPath, 'utf-8');\n loadedConfig = JSON.parse(fileContent);\n }\n } catch (error) {\n console.error('Error reading GT config file:', error);\n }\n\n // ---------- LOAD ENVIRONMENT VARIABLES ---------- //\n\n const { projectId, apiKey, devApiKey } = getRuntimeCredentials();\n\n // conditionally add environment variables to config\n const envConfig: Partial<InternalGTConfigProps> = {\n ...(projectId ? { projectId } : {}),\n ...(apiKey ? { apiKey } : {}),\n ...(devApiKey ? { devApiKey } : {}),\n };\n\n // ---------- CHECK FOR CONFIG CONFLICTS ---------- //\n\n // Check for conflicts between config and params\n const propsRecord = props as Record<string, unknown>;\n const conflicts = Object.entries(loadedConfig)\n .filter(([key, value]) => {\n // Skip if key doesn't exist in props\n if (!(key in props)) return false;\n\n const propValue = propsRecord[key];\n\n // Handle null/undefined values\n if (value == null || propValue == null) {\n return value !== propValue;\n }\n\n // Handle primitive types (string, number, boolean)\n if (typeof value !== 'object') {\n return value !== propValue;\n }\n\n // Handle arrays (no need for deep equality check)\n if (Array.isArray(value)) {\n if (!Array.isArray(propValue)) return true;\n if (value.length !== propValue.length) return true;\n return value.some((v, i) => v !== propValue[i]);\n }\n\n // Handle objects\n if (typeof value === 'object' && typeof propValue === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const propRecord = propValue as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const propKeys = Object.keys(propRecord);\n const keys = new Set([...valueKeys, ...propKeys]);\n\n // Objects must match exactly (no need to go deeper)\n if (valueKeys.length !== propKeys.length) return true;\n return !Array.from(keys).every((k) => valueRecord[k] === propRecord[k]);\n }\n\n return false;\n })\n .map(\n ([key, value]) =>\n `- Key: ${key} Next Config: ${JSON.stringify(propsRecord[key])} does not match GT Config: ${JSON.stringify(value)}`\n );\n\n if (conflicts.length) {\n throw new Error(conflictingConfigurationBuildError(conflicts));\n }\n\n // ---------- MERGE CONFIGS ---------- //\n\n // Merge cookie and header names\n const mergedHeadersAndCookies = {\n ...defaultWithGTConfigProps.headersAndCookies,\n ...props.headersAndCookies,\n };\n\n // Merge compiler options\n const mergedExperimentalCompilerOptions = {\n ...defaultWithGTConfigProps.experimentalCompilerOptions,\n ...props.experimentalCompilerOptions,\n };\n\n // precedence: input > env > config file > defaults\n const mergedConfig: InternalGTConfigProps = {\n ...defaultWithGTConfigProps,\n ...loadedConfig,\n ...envConfig,\n ...props,\n headersAndCookies: mergedHeadersAndCookies,\n experimentalCompilerOptions: mergedExperimentalCompilerOptions,\n _usingPlugin: true, // flag to indicate plugin usage\n };\n\n compilePathRegex(mergedConfig.pathRegex);\n\n // clear up any issues with the compiler options\n validateCompiler(mergedConfig);\n\n // ----------- RESOLVE ANY EXTERNAL FILES ----------- //\n\n // Resolve wasm filepath\n const turboPackEnabled = !!process.env.TURBOPACK;\n let resolvedWasmFilePath = '';\n if (mergedConfig.experimentalCompilerOptions?.type === 'swc') {\n try {\n if (turboPackEnabled) {\n const absolutePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n resolvedWasmFilePath =\n './' + path.relative(process.cwd(), absolutePath).replace(/\\\\/g, '/');\n } else {\n resolvedWasmFilePath = path.resolve(__dirname, './gt_swc_plugin.wasm');\n }\n } catch (error) {\n console.error(\n createGTCompilerUnresolvedWarning('swc'),\n 'Error message:',\n error\n );\n resolvedWasmFilePath = '';\n mergedConfig.experimentalCompilerOptions.type = 'none';\n }\n }\n\n // Resolve dictionary filepath\n let resolvedDictionaryFilePath =\n typeof mergedConfig.dictionary === 'string'\n ? mergedConfig.dictionary\n : resolveConfigFilepath('dictionary', ['.ts', '.js', '.json']); // fallback to dictionary\n\n // Check [defaultLocale].json file\n if (!resolvedDictionaryFilePath && mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(\n mergedConfig.defaultLocale,\n ['.json']\n );\n\n // Check [defaultLanguageCode].json file\n if (!resolvedDictionaryFilePath) {\n const defaultLanguage = getLocaleProperties(\n mergedConfig.defaultLocale\n )?.languageCode;\n\n if (defaultLanguage && defaultLanguage !== mergedConfig.defaultLocale) {\n resolvedDictionaryFilePath = resolveConfigFilepath(defaultLanguage, [\n '.json',\n ]);\n }\n }\n }\n\n // Get the type of dictionary file\n const resolvedDictionaryFilePathType = resolvedDictionaryFilePath\n ? path.extname(resolvedDictionaryFilePath)\n : undefined;\n if (resolvedDictionaryFilePathType) {\n mergedConfig._dictionaryFileType = resolvedDictionaryFilePathType;\n }\n\n // Resolve custom dictionary loader path\n const customLoadDictionaryPath =\n typeof mergedConfig.loadDictionaryPath === 'string'\n ? mergedConfig.loadDictionaryPath\n : resolveConfigFilepath('loadDictionary');\n\n // Resolve custom translation loader path\n const customLoadTranslationsPath =\n typeof mergedConfig.loadTranslationsPath === 'string'\n ? mergedConfig.loadTranslationsPath\n : resolveConfigFilepath('loadTranslations');\n\n // Resolve request function paths\n const requestFunctionPaths = resolveRequestFunctionPaths(mergedConfig);\n\n // Warn if found in /app directory\n if (\n !resolvedDictionaryFilePath &&\n resolveConfigFilepath('dictionary', ['.ts', '.js', '.json'], undefined, [\n './app',\n './src/app',\n ])\n ) {\n console.warn(\n createBadFilepathWarning('dictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadDictionaryPath &&\n resolveConfigFilepath(\n 'loadDictionary',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadDictionary', ['./app', './src/app'])\n );\n }\n\n if (\n !customLoadTranslationsPath &&\n resolveConfigFilepath(\n 'loadTranslations',\n ['.ts', '.js', '.json'],\n undefined,\n ['./app', './src/app']\n )\n ) {\n console.warn(\n createBadFilepathWarning('loadTranslations', ['./app', './src/app'])\n );\n }\n\n // ----------- LOCALE STANDARDIZATION ----------- //\n\n // Check if using Services\n const gtRuntimeTranslationEnabled = !!(\n mergedConfig.runtimeUrl === defaultWithGTConfigProps.runtimeUrl &&\n ((process.env.NODE_ENV === 'production' && mergedConfig.apiKey) ||\n (process.env.NODE_ENV === 'development' && mergedConfig.devApiKey))\n );\n const gtRemoteCacheEnabled = !!(\n mergedConfig.cacheUrl === defaultWithGTConfigProps.cacheUrl &&\n mergedConfig.loadTranslationsType === 'remote'\n );\n const gtServicesEnabled = !!(\n (gtRuntimeTranslationEnabled || gtRemoteCacheEnabled) &&\n mergedConfig.projectId\n );\n\n // Standardize locales\n if (mergedConfig.locales && mergedConfig.defaultLocale) {\n mergedConfig.locales.unshift(mergedConfig.defaultLocale);\n }\n const updatedLocales: string[] = [];\n mergedConfig.locales = Array.from(new Set(mergedConfig.locales)).map(\n (locale) => {\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale(locale)\n : locale;\n if (updatedLocale !== locale) {\n updatedLocales.push(`${locale} -> ${updatedLocale}`);\n }\n return updatedLocale;\n }\n );\n\n // Standardize canonical locales\n const updatedCanonicalLocales: string[] = [];\n if (mergedConfig.customMapping) {\n mergedConfig.customMapping = Object.fromEntries(\n Object.entries(mergedConfig.customMapping).map(([key, value]) => {\n if (typeof value !== 'object' || !('code' in value)) {\n return [key, value];\n }\n const updatedLocale = gtServicesEnabled\n ? standardizeLocale((value as { code: string }).code)\n : (value as { code: string }).code;\n if (updatedLocale !== (value as { code: string }).code) {\n updatedCanonicalLocales.push(`${key} -> ${updatedLocale}`);\n }\n return [\n key,\n {\n ...value,\n code: updatedLocale,\n },\n ];\n })\n );\n }\n\n // Run cache component checks\n cacheComponentsChecks({\n nextConfig: internalNextConfig,\n requestFunctionPaths,\n localTranslationsEnabled: !!customLoadTranslationsPath,\n localDictionaryEnabled: !!customLoadDictionaryPath,\n });\n\n // ---------- DERIVED CONFIG ATTRIBUTES ---------- //\n\n // Local dictionary flag\n if (customLoadDictionaryPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadDictionaryPath))) {\n throw new Error(\n unresolvedLoadDictionaryBuildError(customLoadDictionaryPath)\n );\n } else {\n mergedConfig.loadDictionaryEnabled = true;\n }\n } else {\n mergedConfig.loadDictionaryEnabled = false;\n }\n\n // Local translations flag\n if (customLoadTranslationsPath) {\n // Check: file exists if provided\n if (!fs.existsSync(path.resolve(customLoadTranslationsPath))) {\n throw new Error(\n unresolvedLoadTranslationsBuildError(customLoadTranslationsPath)\n );\n } else {\n mergedConfig.loadTranslationsType = 'custom';\n }\n } else {\n mergedConfig.loadTranslationsType = 'remote';\n }\n\n if (internalNextConfig.cacheComponents) {\n if (mergedConfig.loadTranslationsType !== 'custom') {\n throw new Error(cacheComponentsMissingLoadTranslationsError);\n }\n if (isDevHotReloadEnabled(mergedConfig)) {\n console.warn(cacheComponentsDevHotReloadDisabledWarning);\n }\n mergedConfig._cacheComponentsEnabled = true;\n mergedConfig._disableDevHotReload = true;\n mergedConfig.cacheExpiryTime = 0;\n }\n\n // Set default cache expiry if and only if no dev key\n if (\n mergedConfig.loadTranslationsType == 'remote' &&\n !mergedConfig.devApiKey &&\n typeof mergedConfig.cacheExpiryTime === 'undefined'\n ) {\n mergedConfig.cacheExpiryTime = defaultCacheExpiryTime;\n }\n\n // ---------- ERROR CHECKS ---------- //\n\n // Check: invalid locale\n if (!mergedConfig.customMapping && gtServicesEnabled) {\n const invalidLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale)) {\n invalidLocales.push(locale);\n }\n });\n if (invalidLocales.length) {\n throw new Error(invalidLocalesError(invalidLocales));\n }\n }\n\n // Check: invalid canonical locale\n if (mergedConfig.customMapping && gtServicesEnabled) {\n const invalidCanonicalLocales: string[] = [];\n mergedConfig.locales.forEach((locale) => {\n if (!isValidLocale(locale, mergedConfig.customMapping)) {\n invalidCanonicalLocales.push(locale);\n }\n });\n if (invalidCanonicalLocales.length) {\n throw new Error(invalidCanonicalLocalesError(invalidCanonicalLocales));\n }\n }\n\n // Check: projectId is not required for remote infrastructure, but warn if missing for dev, nothing for prod\n if (\n (mergedConfig.cacheUrl || mergedConfig.runtimeUrl) &&\n !mergedConfig.projectId &&\n process.env.NODE_ENV === 'development' &&\n mergedConfig.loadTranslationsType === 'remote' &&\n !mergedConfig.loadDictionaryEnabled // skip warn if using local dictionary\n ) {\n console.warn(projectIdMissingWarn);\n }\n\n // Check: dev API key should not be included in production\n if (process.env.NODE_ENV === 'production' && mergedConfig.devApiKey) {\n throw new Error(devApiKeyIncludedInProductionError);\n }\n\n // Check: An API key is required for runtime translation\n if (\n mergedConfig.projectId && // must have projectId for this check to matter anyways\n mergedConfig.runtimeUrl &&\n !(mergedConfig.apiKey || mergedConfig.devApiKey) &&\n process.env.NODE_ENV === 'development'\n ) {\n console.warn(APIKeyMissingWarn);\n }\n\n // Check: if using GT infrastructure, warn about unsupported locales\n if (gtServicesEnabled) {\n // Warn about standardized locales\n if (updatedLocales.length) {\n console.warn(standardizedLocalesWarning(updatedLocales));\n }\n\n // Warn about standardized canonical locales\n if (updatedCanonicalLocales.length) {\n console.warn(\n standardizedCanonicalLocalesWarning(updatedCanonicalLocales)\n );\n }\n }\n\n // ---------- STORE CONFIGURATIONS ---------- //\n const {\n projectId: _projectId,\n apiKey: _apiKey,\n devApiKey: _devApiKey,\n ...privateConfigParams\n } = mergedConfig;\n const I18NConfigParams = JSON.stringify(privateConfigParams);\n const publicI18NConfigParams: Omit<\n I18nConfigParams,\n 'projectId' | 'devApiKey' | 'apiKey'\n > = {\n defaultLocale: mergedConfig.defaultLocale,\n locales: mergedConfig.locales,\n customMapping: mergedConfig.customMapping,\n runtimeUrl: mergedConfig.runtimeUrl,\n };\n\n const { type: _type, ...compilerOptions } =\n mergedConfig.experimentalCompilerOptions || {};\n\n // Read autoderive from parsingFlags (single source of truth shared with CLI)\n const rawAutoderive: boolean | { jsx?: boolean; strings?: boolean } =\n loadedConfig?.files?.gt?.parsingFlags?.autoderive ?? false;\n const autoderiveJsx =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.jsx ?? false);\n const autoderiveStrings =\n typeof rawAutoderive === 'boolean'\n ? rawAutoderive\n : (rawAutoderive.strings ?? false);\n\n const swcPluginOptions: Record<string, unknown> = {\n ...compilerOptions,\n autoderiveJsx,\n autoderiveStrings,\n };\n\n const swcPluginEntry: [string, Record<string, unknown>] | null =\n mergedConfig.experimentalCompilerOptions?.type === 'swc'\n ? [resolvedWasmFilePath, swcPluginOptions]\n : null;\n\n const turboAliases = {\n 'gt-next/internal/_dictionary': resolvedDictionaryFilePath || '',\n 'gt-next/internal/_load-translations': customLoadTranslationsPath || '',\n 'gt-next/internal/_load-dictionary': customLoadDictionaryPath || '',\n ...Object.fromEntries(\n Object.entries(requestFunctionPaths).map(([functionName, path]) => {\n return [\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ],\n path,\n ];\n })\n ),\n };\n\n // experimental.turbo is deprecated in next@15.3.0.\n // Check for experimental.turbo. If we write to turbopack field, experimental fields will be ignored.\n // Yet, if there are other resolveAlias fields, we don't want to be ignored either.\n const experimentalTurbopack = !(\n turboConfigStable &&\n (!internalNextConfig.experimental?.turbo ||\n internalNextConfig.turbopack?.resolveAlias)\n );\n\n const config: NextConfig = {\n ...internalNextConfig,\n transpilePackages: Array.from(\n new Set([...(internalNextConfig.transpilePackages || []), 'gt-next'])\n ),\n env: {\n ...internalNextConfig.env,\n _GENERALTRANSLATION_I18N_CONFIG_PARAMS: I18NConfigParams,\n NEXT_PUBLIC_GENERALTRANSLATION_I18N_CONFIG_PARAMS: JSON.stringify(\n publicI18NConfigParams\n ),\n ...(resolvedDictionaryFilePathType && {\n _GENERALTRANSLATION_DICTIONARY_FILE_TYPE:\n resolvedDictionaryFilePathType,\n }),\n _GENERALTRANSLATION_LOCAL_DICTIONARY_ENABLED:\n mergedConfig.loadDictionaryEnabled.toString(),\n _GENERALTRANSLATION_LOCAL_TRANSLATION_ENABLED: (\n mergedConfig.loadTranslationsType === 'custom'\n ).toString(),\n _GENERALTRANSLATION_DEFAULT_LOCALE: (\n mergedConfig.defaultLocale ||\n defaultWithGTConfigProps.defaultLocale ||\n ''\n ).toString(),\n _GENERALTRANSLATION_GT_SERVICES_ENABLED: gtServicesEnabled.toString(),\n _GENERALTRANSLATION_IGNORE_BROWSER_LOCALES:\n mergedConfig.ignoreBrowserLocales?.toString() ||\n defaultWithGTConfigProps.ignoreBrowserLocales?.toString() ||\n 'false',\n _GENERALTRANSLATION_CUSTOM_GET_LOCALE_ENABLED:\n requestFunctionPaths.getLocale ? 'true' : 'false',\n _GENERALTRANSLATION_CUSTOM_GET_REGION_ENABLED:\n requestFunctionPaths.getRegion ? 'true' : 'false',\n _GENERALTRANSLATION_DISABLE_INVALID_LOCALE_WARNING:\n mergedConfig.disableInvalidLocaleWarning?.toString() || 'false',\n // nextConfig.env intentionally makes this available to client-boundary.tsx.\n ...(mergedConfig.pathRegex !== undefined && {\n _GENERALTRANSLATION_PATH_REGEX: mergedConfig.pathRegex,\n }),\n },\n ...(turboPackEnabled &&\n !experimentalTurbopack && {\n turbopack: {\n ...internalNextConfig.turbopack,\n resolveAlias: {\n ...internalNextConfig.turbopack?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n experimental: {\n ...internalNextConfig.experimental,\n ...(rootParamStability === 'experimental' && {\n rootParams: true,\n }),\n swcPlugins: [\n ...(internalNextConfig.experimental?.swcPlugins || []),\n ...(swcPluginEntry ? [swcPluginEntry] : []),\n ],\n ...(turboPackEnabled &&\n experimentalTurbopack && {\n turbo: {\n ...internalNextConfig.experimental?.turbo,\n resolveAlias: {\n ...internalNextConfig.experimental?.turbo?.resolveAlias,\n ...turboAliases,\n },\n },\n }),\n },\n webpack: function webpack(\n ...[webpackConfig, options]: Parameters<\n NonNullable<NextConfig['webpack']>\n >\n ) {\n // Only apply webpack aliases if we're using webpack (not Turbopack)\n if (!turboPackEnabled) {\n // Try to load GT compiler if available\n if (mergedConfig.experimentalCompilerOptions?.type === 'babel') {\n try {\n const {\n webpack: gtUnplugin,\n } = require('@generaltranslation/compiler');\n webpackConfig.plugins.unshift(\n gtUnplugin({\n ...mergedConfig.experimentalCompilerOptions,\n autoJsxImportSource: 'gt-next',\n })\n );\n } catch (e) {\n mergedConfig.experimentalCompilerOptions.type = 'none';\n console.warn(\n createGTCompilerUnresolvedWarning('babel'),\n 'Error message:',\n e\n );\n }\n }\n\n // Disable cache in dev bc people might move around loadTranslations() and loadDictionary() files\n if (process.env.NODE_ENV === 'development') {\n webpackConfig.cache = false;\n }\n if (resolvedDictionaryFilePath) {\n webpackConfig.resolve.alias['gt-next/internal/_dictionary'] =\n path.resolve(webpackConfig.context, resolvedDictionaryFilePath);\n }\n if (customLoadTranslationsPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-translations`] =\n path.resolve(webpackConfig.context, customLoadTranslationsPath);\n }\n if (customLoadDictionaryPath) {\n webpackConfig.resolve.alias[`gt-next/internal/_load-dictionary`] =\n path.resolve(webpackConfig.context, customLoadDictionaryPath);\n }\n for (const [functionName, pathString] of Object.entries(\n requestFunctionPaths\n )) {\n const key =\n REQUEST_FUNCTION_ALIASES[\n functionName as keyof typeof REQUEST_FUNCTION_ALIASES\n ];\n webpackConfig.resolve.alias[key] = path.resolve(\n webpackConfig.context,\n pathString\n );\n }\n // Webpack parses .mjs as strict ESM and does not treat require()\n // calls as dependencies, so the require()-backed internal aliases\n // above would never apply and their runtime errors are swallowed\n // (loaders silently no-op). Parse gt-next's ESM dist as\n // javascript/auto so webpack picks up those require() calls.\n // Server compilation only: the call sites are server-only, and this\n // keeps the rule from ever pulling a user's loader file into the\n // client bundle. Turbopack resolves them through resolveAlias and\n // needs no rule.\n // The guard mirrors the alias block above: any configured alias\n // enables the rule. The request-function aliases are static-imported\n // (initGT.server), and resolve.alias applies at resolution regardless\n // of parser mode, so they work without the rule; they gate it anyway\n // for symmetry and for any future require()-backed consumer.\n if (\n options.isServer &&\n (resolvedDictionaryFilePath ||\n customLoadTranslationsPath ||\n customLoadDictionaryPath ||\n Object.keys(requestFunctionPaths).length > 0)\n ) {\n // gt-next normally resolves inside a node_modules dir (app-local,\n // hoisted monorepo root, or the pnpm store), but symlinked installs\n // (workspace:*, file:) resolve to a real path with no node_modules\n // segment — so also match this package's dist dir, where this\n // compiled file lives.\n const gtNextDistDirs: (string | RegExp)[] = [\n /node_modules[\\\\/]gt-next[\\\\/]dist[\\\\/]/,\n ];\n try {\n // Trust __dirname only when it verifiably is gt-next's dist: a\n // bundler that inlines this file elsewhere would otherwise widen\n // the rule to every .mjs under its output dir. The compiled\n // config always sits beside its ESM twin and the internal\n // modules these aliases target.\n if (\n fs.existsSync(path.join(__dirname, 'config.mjs')) &&\n fs.existsSync(path.join(__dirname, 'internal', '_dictionary.mjs'))\n ) {\n gtNextDistDirs.push(__dirname + path.sep);\n }\n } catch {\n // __dirname is undefined when the ESM dist of this module is\n // loaded natively; the node_modules pattern still applies.\n }\n webpackConfig.module ??= {};\n webpackConfig.module.rules ??= [];\n webpackConfig.module.rules.push({\n test: /\\.mjs$/,\n include: gtNextDistDirs,\n type: 'javascript/auto',\n });\n }\n }\n if (typeof internalNextConfig?.webpack === 'function') {\n return internalNextConfig.webpack(webpackConfig, options);\n }\n return webpackConfig;\n },\n };\n return config as WithGTConfigResult<TNextConfig>;\n}\n\nfunction isDevHotReloadEnabled(config: InternalGTConfigProps): boolean {\n return (\n !!config.devApiKey &&\n !!config.projectId &&\n config.runtimeUrl !== null &&\n config.runtimeUrl !== '' &&\n process.env.NODE_ENV === 'development'\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gt-next",
|
|
3
|
-
"version": "11.0
|
|
3
|
+
"version": "11.1.0",
|
|
4
4
|
"description": "A Next.js library for automatic internationalization.",
|
|
5
5
|
"main": "dist/index.server.js",
|
|
6
6
|
"peerDependencies": {
|
|
7
|
-
"@generaltranslation/compiler": "^1.3.
|
|
7
|
+
"@generaltranslation/compiler": "^1.3.33",
|
|
8
8
|
"next": ">=13.0.0 <15.2.1 || >15.2.2",
|
|
9
9
|
"react": ">=16.8.0 <20.0.0",
|
|
10
10
|
"react-dom": ">=16.8.0 <20.0.0"
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"./dist/utils/client-boundary.*"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@generaltranslation/format": "0.1.
|
|
32
|
-
"@generaltranslation/react-core": "11.0
|
|
33
|
-
"generaltranslation": "9.0.
|
|
34
|
-
"gt-react": "11.0
|
|
35
|
-
"gt-i18n": "1.0.
|
|
31
|
+
"@generaltranslation/format": "0.1.3",
|
|
32
|
+
"@generaltranslation/react-core": "11.1.0",
|
|
33
|
+
"generaltranslation": "9.0.4",
|
|
34
|
+
"gt-react": "11.1.0",
|
|
35
|
+
"gt-i18n": "1.0.8"
|
|
36
36
|
},
|
|
37
37
|
"repository": {
|
|
38
38
|
"type": "git",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"next": "15.2.3",
|
|
53
53
|
"tsdown": "^0.21.10",
|
|
54
54
|
"typescript": "^5.9.2",
|
|
55
|
-
"@generaltranslation/compiler": "1.3.
|
|
55
|
+
"@generaltranslation/compiler": "1.3.33"
|
|
56
56
|
},
|
|
57
57
|
"exports": {
|
|
58
58
|
".": {
|