{"version":3,"file":"buildConfigurationFields.mjs","names":[],"sources":["../../../src/configFile/buildConfigurationFields.ts"],"sourcesContent":["import { statSync } from 'node:fs';\nimport { dirname, isAbsolute, join } from 'node:path';\nimport type {\n  AiConfig,\n  BuildConfig,\n  CompilerConfig,\n  ContentConfig,\n  CustomIntlayerConfig,\n  DictionaryConfig,\n  IntlayerConfig,\n  LogFunctions,\n  SystemConfig,\n} from '@intlayer/types/config';\nimport {\n  BUILD_MODE,\n  CACHE,\n  MINIFY,\n  OUTPUT_FORMAT,\n  PURGE,\n  TRAVERSE_PATTERN,\n  TYPE_CHECKING,\n} from '../defaultValues/build';\nimport {\n  COMPILER_DICTIONARY_KEY_PREFIX,\n  COMPILER_ENABLED,\n  COMPILER_NO_METADATA,\n  COMPILER_SAVE_COMPONENTS,\n} from '../defaultValues/compiler';\nimport {\n  CODE_DIR,\n  CONTENT_DIR,\n  EXCLUDED_PATHS,\n  FILE_EXTENSIONS,\n  WATCH,\n} from '../defaultValues/content';\nimport {\n  CONTENT_AUTO_TRANSFORMATION,\n  FILL,\n  IMPORT_MODE,\n  LOCATION,\n} from '../defaultValues/dictionary';\nimport {\n  CACHE_DIR,\n  CONFIG_DIR,\n  DICTIONARIES_DIR,\n  DYNAMIC_DICTIONARIES_DIR,\n  FETCH_DICTIONARIES_DIR,\n  MAIN_DIR,\n  MODULE_AUGMENTATION_DIR,\n  REMOTE_DICTIONARIES_DIR,\n  TEMP_DIR,\n  TYPES_DIR,\n  UNMERGED_DICTIONARIES_DIR,\n} from '../defaultValues/system';\nimport { getProjectRequire } from '../utils';\nimport {\n  buildBrowserConfiguration,\n  buildEditorFields,\n  buildInternationalizationFields,\n  buildLogFields,\n} from './buildBrowserConfiguration';\nimport { intlayerConfigSchema } from './configurationSchema';\n\nexport {\n  type BrowserIntlayerConfig,\n  buildBrowserConfiguration,\n  buildEditorFields,\n  buildInternationalizationFields,\n  buildLogFields,\n  buildRoutingFields,\n  extractBrowserConfiguration,\n} from './buildBrowserConfiguration';\n\nlet storedConfiguration: IntlayerConfig;\n\n// ---------------------------------------------------------------------------\n// Server-only field builders (Node.js — not browser-safe)\n// ---------------------------------------------------------------------------\n\n/**\n * Build the `system` section of the Intlayer configuration.\n *\n * Resolves all directory paths (dictionaries, types, cache, …) relative to\n * the project base directory, using Node.js `require.resolve` where available\n * and falling back to `path.join` otherwise.\n *\n * @param baseDir - Project root directory. Defaults to `process.cwd()`.\n * @param customConfiguration - Partial user-supplied system config.\n * @returns A fully-resolved {@link SystemConfig}.\n */\nconst buildSystemFields = (\n  baseDir?: string,\n  customConfiguration?: Partial<SystemConfig>\n): SystemConfig => {\n  const projectBaseDir = baseDir ?? process.cwd();\n\n  const optionalJoinBaseDir = (pathInput: string) => {\n    let absolutePath: string;\n\n    try {\n      const requireFunction = getProjectRequire(projectBaseDir);\n      absolutePath = requireFunction.resolve(pathInput, {\n        paths: [projectBaseDir],\n      });\n    } catch {\n      absolutePath = isAbsolute(pathInput)\n        ? pathInput\n        : join(projectBaseDir, pathInput);\n    }\n\n    try {\n      const stats = statSync(absolutePath);\n      if (stats.isFile()) {\n        return dirname(absolutePath);\n      }\n    } catch {\n      if (/\\.[a-z0-9]+$/i.test(absolutePath)) {\n        return dirname(absolutePath);\n      }\n    }\n\n    return absolutePath;\n  };\n\n  const dictionariesDir = optionalJoinBaseDir(\n    customConfiguration?.dictionariesDir ?? DICTIONARIES_DIR\n  );\n\n  return {\n    baseDir: projectBaseDir,\n    moduleAugmentationDir: optionalJoinBaseDir(\n      customConfiguration?.moduleAugmentationDir ?? MODULE_AUGMENTATION_DIR\n    ),\n    unmergedDictionariesDir: optionalJoinBaseDir(\n      customConfiguration?.unmergedDictionariesDir ?? UNMERGED_DICTIONARIES_DIR\n    ),\n    remoteDictionariesDir: optionalJoinBaseDir(\n      customConfiguration?.remoteDictionariesDir ?? REMOTE_DICTIONARIES_DIR\n    ),\n    dictionariesDir,\n    dynamicDictionariesDir: optionalJoinBaseDir(\n      customConfiguration?.dynamicDictionariesDir ?? DYNAMIC_DICTIONARIES_DIR\n    ),\n    fetchDictionariesDir: optionalJoinBaseDir(\n      customConfiguration?.fetchDictionariesDir ?? FETCH_DICTIONARIES_DIR\n    ),\n    typesDir: optionalJoinBaseDir(customConfiguration?.typesDir ?? TYPES_DIR),\n    mainDir: optionalJoinBaseDir(customConfiguration?.mainDir ?? MAIN_DIR),\n    configDir: optionalJoinBaseDir(\n      customConfiguration?.configDir ?? CONFIG_DIR\n    ),\n    cacheDir: optionalJoinBaseDir(customConfiguration?.cacheDir ?? CACHE_DIR),\n    tempDir: optionalJoinBaseDir(customConfiguration?.tempDir ?? TEMP_DIR),\n  };\n};\n\n/**\n * Build the `content` section of the Intlayer configuration.\n *\n * Resolves content and code directories relative to the project base using\n * `require.resolve`, falling back to `path.join`.\n *\n * @param systemConfig - Already-built system configuration (provides `baseDir`).\n * @param customConfiguration - Partial user-supplied content config.\n * @returns A fully-resolved {@link ContentConfig}.\n */\nconst buildContentFields = (\n  systemConfig: SystemConfig,\n  customConfiguration?: Partial<ContentConfig>\n): ContentConfig => {\n  const fileExtensions = customConfiguration?.fileExtensions ?? FILE_EXTENSIONS;\n\n  const optionalJoinBaseDir = (pathInput: string) => {\n    let absolutePath: string;\n\n    try {\n      const requireFunction = getProjectRequire(systemConfig.baseDir);\n      absolutePath = requireFunction.resolve(pathInput, {\n        paths: [systemConfig.baseDir],\n      });\n    } catch {\n      try {\n        absolutePath = require.resolve(pathInput, {\n          paths: [systemConfig.baseDir],\n        });\n      } catch {\n        absolutePath = isAbsolute(pathInput)\n          ? pathInput\n          : join(systemConfig.baseDir, pathInput);\n      }\n    }\n\n    try {\n      const stats = statSync(absolutePath);\n      if (stats.isFile()) {\n        return dirname(absolutePath);\n      }\n    } catch {\n      if (/\\.[a-z0-9]+$/i.test(absolutePath)) {\n        return dirname(absolutePath);\n      }\n    }\n\n    return absolutePath;\n  };\n\n  const contentDir = (customConfiguration?.contentDir ?? CONTENT_DIR).map(\n    optionalJoinBaseDir\n  );\n  const codeDir = (customConfiguration?.codeDir ?? CODE_DIR).map(\n    optionalJoinBaseDir\n  );\n\n  return {\n    fileExtensions,\n    contentDir,\n    codeDir,\n    excludedPath: customConfiguration?.excludedPath ?? EXCLUDED_PATHS,\n    watch: customConfiguration?.watch ?? WATCH,\n    formatCommand: customConfiguration?.formatCommand,\n  };\n};\n\n/**\n * Build the `ai` section of the Intlayer configuration.\n *\n * @param customConfiguration - Partial user-supplied AI config.\n * @returns A fully-defaulted {@link AiConfig}.\n */\nconst buildAiFields = (customConfiguration?: Partial<AiConfig>): AiConfig => ({\n  /**\n   * AI configuration\n   */\n  provider: customConfiguration?.provider,\n\n  /**\n   * API key\n   */\n  apiKey: customConfiguration?.apiKey,\n\n  /**\n   * API model\n   */\n  model: customConfiguration?.model,\n\n  /**\n   * Temperature\n   */\n  temperature: customConfiguration?.temperature,\n\n  /**\n   * Application context\n   *\n   * Default: undefined\n   *\n   * The application context.\n   *\n   * Example: `'My application context'`\n   *\n   * Note: Can be used to provide additional context about the application to the AI model. You can add more rules (e.g. \"You should not transform urls\").\n   */\n  applicationContext: customConfiguration?.applicationContext,\n\n  /**\n   * Base URL for the AI API\n   *\n   * Default: undefined\n   *\n   * The base URL for the AI API.\n   *\n   * Example: `'http://localhost:5000'`\n   *\n   * Note: Can be used to point to a local, or custom AI API endpoint.\n   */\n  baseURL: customConfiguration?.baseURL,\n\n  /**\n   * Data serialization\n   *\n   * Options:\n   * - \"json\": The industry standard. Highly reliable and structured, but consumes more tokens.\n   * - \"toon\": An optimized format designed to reduce token consumption (cost-effective). However, it may slightly increase the risk of output inconsistency compared to standard JSON\n   *\n   * Default: `\"json\"`\n   */\n  dataSerialization: customConfiguration?.dataSerialization,\n});\n\n/**\n * Build the `build` section of the Intlayer configuration.\n *\n * @param customConfiguration - Partial user-supplied build config.\n * @returns A fully-defaulted {@link BuildConfig}.\n */\nconst buildBuildFields = (\n  customConfiguration?: Partial<BuildConfig>\n): BuildConfig => ({\n  /**\n   * Indicates the mode of the build\n   *\n   * Default: 'auto'\n   *\n   * If 'auto', the build will be enabled automatically when the application is built.\n   * If 'manual', the build will be set only when the build command is executed.\n   *\n   * Can be used to disable dictionaries build, for instance when execution on Node.js environment should be avoided.\n   */\n  mode: customConfiguration?.mode ?? BUILD_MODE,\n\n  /**\n   * Indicates if the build should be optimized\n   *\n   * Default: process.env.NODE_ENV === 'production'\n   *\n   * If true, the build will be optimized.\n   * If false, the build will not be optimized.\n   *\n   * Intlayer will replace all calls of dictionaries to optimize chunking. That way the final bundle will import only the dictionaries that are used.\n   * All imports will stay as static import to avoid async processing when loading the dictionaries.\n   *\n   * Note:\n   * - Intlayer will replace all call of `useIntlayer` with the defined mode by the `importMode` option.\n   * - Intlayer will replace all call of `getIntlayer` with `getDictionary`.\n   * - This option relies on the `@intlayer/babel` and `@intlayer/swc` plugins.\n   * - In most cases, \"dynamic\" will be used for React applications, \"async\" for Vue.js applications.\n   * - Ensure all keys are declared statically in the `useIntlayer` calls. e.g. `useIntlayer('navbar')`.\n   */\n  optimize: customConfiguration?.optimize,\n\n  /**\n   * Indicates the mode of import to use for the dictionaries.\n   *\n   * Available modes:\n   * - \"static\": The dictionaries are imported statically.\n   *   In that case, Intlayer will replace all calls to `useIntlayer` with `useDictionary`.\n   * - \"dynamic\": The dictionaries are imported dynamically in a synchronous component using the suspense API.\n   *   In that case, Intlayer will replace all calls to `useIntlayer` with `useDictionaryDynamic`.\n   * - \"live\": The dictionaries are imported dynamically using the live sync API.\n   *   In that case, Intlayer will replace all calls to `useIntlayer` with `useDictionaryDynamic`.\n   *   Live mode will use the live sync API to fetch the dictionaries. If the API call fails, the dictionaries will be imported dynamically as \"dynamic\" mode.\n   *\n   * Default: \"static\"\n   *\n   * By default, when a dictionary is loaded, it imports content for all locales as it's imported statically.\n   *\n   * Note:\n   * - Dynamic imports rely on Suspense and may slightly impact rendering performance.\n   * - If disabled all locales will be loaded at once, even if they are not used.\n   * - This option relies on the `@intlayer/babel` and `@intlayer/swc` plugins.\n   * - Ensure all keys are declared statically in the `useIntlayer` calls. e.g. `useIntlayer('navbar')`.\n   * - This option will be ignored if `optimize` is disabled.\n   * - This option will not impact the `getIntlayer`, `getDictionary`, `useDictionary`, `useDictionaryAsync` and `useDictionaryDynamic` functions. You can still use them to refine you code on manual optimization.\n   * - The \"live\" allows to sync the dictionaries to the live sync server.\n   *\n   * @deprecated Use `dictionary.importMode` instead.\n   */\n  importMode: customConfiguration?.importMode,\n\n  /**\n   * Minify the dictionaries to reduce the bundle size.\n   *\n   * Default: false\n   *\n   * Note:\n   * - This option will be ignored if `optimize` is disabled.\n   * - This option will be ignore if `editor.enabled` is true.\n   * - If there is edge cases where the minification is not working properly, the dictionary will be not minified.\n   */\n  minify: customConfiguration?.minify ?? MINIFY,\n\n  /**\n   * Purge the unused keys in a dictionaries\n   *\n   * Default: false\n   *\n   * Note:\n   * - This option will be ignored if `optimize` is disabled.\n   * - This option will be ignored if `editor.enabled` is true.\n   */\n  purge: customConfiguration?.purge ?? PURGE,\n\n  /**\n   * Pattern to traverse the code to optimize.\n   *\n   * Allows to avoid to traverse the code that is not relevant to the optimization.\n   * Improve build performance.\n   *\n   * Default: ['**\\/*.{js,ts,mjs,cjs,jsx,tsx}', '!**\\/node_modules/**']\n   *\n   * Example: `['src/**\\/*.{ts,tsx}', '../ui-library/**\\/*.{ts,tsx}']`\n   *\n   * Note:\n   * - This option will be ignored if `optimize` is disabled.\n   * - Use glob pattern.\n   */\n  traversePattern: customConfiguration?.traversePattern ?? TRAVERSE_PATTERN,\n\n  /**\n   * Output format of the dictionaries\n   *\n   * Can be set on large projects to improve build performance.\n   *\n   * Default: ['cjs', 'esm']\n   *\n   * The output format of the dictionaries. It can be either 'cjs' or 'esm'.\n   * - 'cjs': The dictionaries are outputted as CommonJS modules.\n   * - 'esm': The dictionaries are outputted as ES modules.\n   */\n  outputFormat: customConfiguration?.outputFormat ?? OUTPUT_FORMAT,\n\n  /**\n   * Cache\n   */\n  cache: customConfiguration?.cache ?? CACHE,\n\n  /**\n   * Require function\n   */\n  require: customConfiguration?.require,\n\n  /**\n   * Indicates if the build should check TypeScript types\n   *\n   * Default: `false`\n   *\n   * If true, the build will check TypeScript types and log errors.\n   * Note: This can slow down the build.\n   */\n  checkTypes: customConfiguration?.checkTypes ?? TYPE_CHECKING,\n});\n\n/**\n * Build the `compiler` section of the Intlayer configuration.\n *\n * @param customConfiguration - Partial user-supplied compiler config.\n * @returns A fully-defaulted {@link CompilerConfig}.\n */\nconst buildCompilerFields = (\n  customConfiguration?: Partial<CompilerConfig>\n): CompilerConfig => ({\n  /**\n   * Indicates if the compiler should be enabled\n   */\n  enabled: customConfiguration?.enabled ?? COMPILER_ENABLED,\n\n  /**\n   * Prefix for the extracted dictionary keys\n   */\n  dictionaryKeyPrefix:\n    customConfiguration?.dictionaryKeyPrefix ?? COMPILER_DICTIONARY_KEY_PREFIX,\n\n  /**\n   * Pattern to traverse the code to optimize.\n   *\n   * @deprecated use `build.traversePattern` instead\n   */\n  transformPattern: customConfiguration?.transformPattern,\n\n  /**\n   * Pattern to exclude from the optimization.\n   *\n   * @deprecated use `build.traversePattern` instead\n   */\n  excludePattern: customConfiguration?.excludePattern,\n\n  /**\n   * Defines the output files path. Replaces `outputDir`.\n   *\n   * - `./` paths are resolved relative to the component directory.\n   * - `/` paths are resolved relative to the project root (`baseDir`).\n   *\n   * - Including the `{{locale}}` variable in the path will trigger the generation of separate dictionaries per locale.\n   *\n   * @example:\n   * ```ts\n   * {\n   *   // Create Multilingual .content.ts files close to the component\n   *   output: ({ fileName, extension }) => `./${fileName}${extension}`,\n   *\n   *   // output: './{{fileName}}{{extension}}', // Equivalent using template string\n   * }\n   * ```\n   *\n   * ```ts\n   * {\n   *   // Create centralize per-locale JSON at the root of the project\n   *   output: ({ key, locale }) => `/locales/${locale}/${key}.content.json`,\n   *\n   *   // output: '/locales/{{locale}}/{{key}}.content.json', // Equivalent using template string\n   * }\n   * ```\n   *\n   * ```ts\n   * {\n   *   // Create per-locale JSON files with locale-specific output paths\n   *   output: {\n   *     en: ({ fileName, locale }) => `${fileName}.${locale}.content.json`,\n   *     fr: '{{fileName}}.{{locale}}.content.json',\n   *     es: false, // skip this locale\n   *   },\n   * }\n   * ```\n   *\n   * Variable list:\n   *   - `fileName`: The name of the file.\n   *   - `key`: The key of the content.\n   *   - `locale`: The locale of the content.\n   *   - `extension`: The extension of the file.\n   *   - `componentFileName`: The name of the component file.\n   *   - `componentExtension`: The extension of the component file.\n   *   - `format`: The format of the dictionary.\n   *   - `componentFormat`: The format of the component dictionary.\n   *   - `componentDirPath`: The directory path of the component.\n   */\n  output: customConfiguration?.output,\n\n  /**\n   * Indicates if the metadata should be saved in the file.\n   *\n   * If true, the compiler will not save the metadata of the dictionaries.\n   *\n   * If `true`:\n   *\n   * ```json\n   * {\n   *   \"key\": \"value\"\n   * }\n   * ```\n   *\n   * If `false`:\n   *\n   * ```json\n   * {\n   *   \"key\": \"value\",\n   *   \"content\": {\n   *      \"key\": \"value\"\n   *   }\n   * }\n   * ```\n   *\n   * Default: `false`\n   *\n   * Note: Useful if used with loadJSON plugin\n   */\n  noMetadata: customConfiguration?.noMetadata ?? COMPILER_NO_METADATA,\n\n  /**\n   * Indicates if the components should be saved after being transformed.\n   */\n  saveComponents:\n    customConfiguration?.saveComponents ?? COMPILER_SAVE_COMPONENTS,\n});\n\n/**\n * Build the `dictionary` section of the Intlayer configuration.\n *\n * @param customConfiguration - Partial user-supplied dictionary config.\n * @returns A fully-defaulted {@link DictionaryConfig}.\n */\nconst buildDictionaryFields = (\n  customConfiguration?: Partial<DictionaryConfig>\n): DictionaryConfig => {\n  const contentAutoTransformation =\n    customConfiguration?.contentAutoTransformation ??\n    CONTENT_AUTO_TRANSFORMATION;\n\n  return {\n    /**\n     * Indicate how the dictionary should be filled using AI.\n     *\n     * Default: `true`\n     *\n     * - If `true`, will consider the `compiler.output` field.\n     * - If `false`, will skip the fill process.\n     *\n     * - `./` paths are resolved relative to the component directory.\n     * - `/` paths are resolved relative to the project root (`baseDir`).\n     *\n     * - If includes `{{locale}}` variable in the path, will trigger the generation of separate dictionaries per locale.\n     *\n     * Example:\n     * ```ts\n     * {\n     *   // Create Multilingual .content.ts files close to the component\n     *   fill: ({ fileName, extension }) => `./${fileName}${extension}`,\n     *\n     *   // fill: './{{fileName}}{{extension}}', // Equivalent using template string\n     * }\n     * ```\n     *\n     * ```ts\n     * {\n     *   // Create centralize per-locale JSON at the root of the project\n     *   fill: ({ key, locale }) => `/locales/${locale}/${key}.content.json`,\n     *\n     *   // fill: '/locales/{{locale}}/{{key}}.content.json', // Equivalent using template string\n     * }\n     * ```\n     *\n     * ```ts\n     * {\n     *   // Create custom output based on the locale\n     *   fill: {\n     *     en: ({ key }) => `/locales/en/${key}.content.json`,\n     *     fr: '/locales/fr/{{key}}.content.json',\n     *     es: false,\n     *     de: true,\n     *   },\n     * }\n     * ```\n     *\n     *\n     * Variable list:\n     *   - `fileName`: The name of the file.\n     *   - `key`: The key of the content.\n     *   - `locale`: The locale of the content.\n     *   - `extension`: The extension of the file.\n     *   - `componentFileName`: The name of the component file.\n     *   - `componentExtension`: The extension of the component file.\n     *   - `format`: The format of the dictionary.\n     *   - `componentFormat`: The format of the component dictionary.\n     *   - `componentDirPath`: The directory path of the component.\n     */\n    fill: customConfiguration?.fill ?? FILL,\n\n    /**\n     * Indicates if the content of the dictionary should be automatically transformed.\n     *\n     * Default: `false`\n     */\n    contentAutoTransformation:\n      typeof contentAutoTransformation === 'object'\n        ? {\n            markdown: contentAutoTransformation.markdown ?? false,\n            html: contentAutoTransformation.html ?? false,\n            insertion: contentAutoTransformation.insertion ?? false,\n          }\n        : contentAutoTransformation,\n\n    /**\n     * The location of the dictionary.\n     *\n     * Default: `\"local\"`\n     */\n    location: customConfiguration?.location ?? LOCATION,\n\n    /**\n     * Transform the dictionary in a per-locale dictionary.\n     * Each field declared in a per-locale dictionary will be transformed in a translation node.\n     * If missing, the dictionary will be treated as a multilingual dictionary.\n     */\n    locale: customConfiguration?.locale,\n\n    /**\n     * The title of the dictionary.\n     */\n    title: customConfiguration?.title,\n\n    /**\n     * The description of the dictionary.\n     */\n    description: customConfiguration?.description,\n\n    /**\n     * Tags to categorize the dictionaries.\n     */\n    tags: customConfiguration?.tags,\n\n    /**\n     * The priority of the dictionary.\n     */\n    priority: customConfiguration?.priority,\n\n    /**\n     * Indicates the mode of import to use for the dictionary.\n     *\n     * Available modes:\n     * - \"static\": The dictionaries are imported statically.\n     * - \"dynamic\": The dictionaries are imported dynamically in a synchronous component using the suspense API.\n     * - \"live\": The dictionaries are imported dynamically using the live sync API.\n     *\n     * Default: `\"static\"`\n     */\n    importMode: customConfiguration?.importMode ?? IMPORT_MODE,\n  };\n};\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\n/**\n * Build the complete Intlayer configuration by merging user-supplied values\n * with defaults.\n *\n * Internally this function:\n * 1. Calls {@link buildBrowserConfiguration} to produce the browser-safe\n *    subset (internationalization, routing, editor public fields, log, metadata).\n * 2. Extends the result with full server-side fields:\n *    - `internationalization` — adds `requiredLocales` and `strictMode`.\n *    - `editor` — adds `clientId` and `clientSecret`.\n *    - `log` — adds custom log functions.\n *    - `system`, `content`, `ai`, `build`, `compiler`, `dictionary`.\n *\n * @param customConfiguration - Optional user-supplied configuration object.\n * @param baseDir - Project root directory. Defaults to `process.cwd()`.\n * @param logFunctions - Optional custom logging functions.\n * @returns A fully-built {@link IntlayerConfig}.\n */\nexport const buildConfigurationFields = (\n  customConfiguration?: CustomIntlayerConfig,\n  baseDir?: string,\n  logFunctions?: LogFunctions\n): IntlayerConfig => {\n  if (customConfiguration) {\n    const result = intlayerConfigSchema.safeParse(customConfiguration);\n\n    if (!result.success) {\n      const logError = logFunctions?.error ?? console.error;\n\n      for (const issue of result.error.issues) {\n        logError(`${issue.path.join('.')}: ${issue.message}`);\n      }\n    }\n  }\n\n  // build browser-safe config (shared defaults, no Node.js deps)\n  const browserConfig = buildBrowserConfiguration(customConfiguration);\n\n  // extend shared fields with server-only additions\n  const internationalizationConfig = buildInternationalizationFields(\n    customConfiguration?.internationalization\n  );\n\n  const editorConfig = buildEditorFields(customConfiguration?.editor);\n\n  const logConfig = buildLogFields(customConfiguration?.log, logFunctions);\n\n  // build server-only fields\n  const systemConfig = buildSystemFields(baseDir, customConfiguration?.system);\n\n  const contentConfig = buildContentFields(\n    systemConfig,\n    customConfiguration?.content\n  );\n\n  storedConfiguration = {\n    // Shared browser fields\n    routing: browserConfig.routing,\n    // Full (extended) shared fields\n    internationalization: internationalizationConfig,\n    editor: editorConfig,\n    log: logConfig,\n    // Server-only fields\n    system: systemConfig,\n    content: contentConfig,\n    ai: buildAiFields(customConfiguration?.ai),\n    build: buildBuildFields(customConfiguration?.build),\n    compiler: buildCompilerFields(customConfiguration?.compiler),\n    dictionary: buildDictionaryFields(customConfiguration?.dictionary),\n    plugins: customConfiguration?.plugins,\n    schemas: customConfiguration?.schemas,\n  } as IntlayerConfig;\n\n  return storedConfiguration;\n};\n"],"mappings":"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"}