{"version":3,"sources":["../src/config.ts","../src/scripts.ts","../src/translation-loader.ts","../src/validation.ts","../src/vite-plugin.ts","../src/integration.ts"],"names":["resolve","existsSync","readFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IntegrationOptions, I18nBaseConfig } from \"./types\";\n\n/**\n * Creates the base i18next configuration\n */\nexport function createBaseConfig(options: IntegrationOptions): I18nBaseConfig {\n  return {\n    lng: options.defaultLocale,\n    fallbackLng: options.defaultLocale,\n    supportedLngs: options.locales,\n    defaultNS: options.defaultNamespace,\n    fallbackNS: options.defaultNamespace,\n    ns: [options.defaultNamespace],\n  };\n}\n","import type {\n  I18nBaseConfig,\n  IntegrationOptions,\n  TranslationMap,\n} from \"./types\";\n\n/**\n * Generates the server-side initialization script\n */\nexport function generateServerScript(\n  baseConfig: I18nBaseConfig,\n  allTranslations: TranslationMap,\n  options: IntegrationOptions\n): string {\n  return `\n    import i18next from \"i18next\";\n    \n    const resources = ${JSON.stringify(allTranslations)};\n    globalThis.__astroI18nConfig = ${JSON.stringify(options)};\n    \n    i18next.init({\n      ...${JSON.stringify(baseConfig)},\n      resources,\n      initImmediate: false\n    }).catch(err => console.error('[i18next] Server initialization failed:', err));\n  `;\n}\n\n/**\n * Generates the client-side initialization script with on-demand loading\n */\nexport function generateClientScript(\n  baseConfig: I18nBaseConfig,\n  options: IntegrationOptions\n): string {\n  return `\n    import i18next from \"i18next\";\n    import LanguageDetector from \"i18next-browser-languagedetector\";\n    window.__astroI18nConfig = ${JSON.stringify(options)};\n    \n    const dynamicBackend = {\n      type: 'backend',\n      init: function() {},\n      read: async function(language, namespace, callback) {\n        try {\n          const { loadTranslation } = await import('virtual:i18n-loader');\n          const data = await loadTranslation(language, namespace);\n          callback(null, data);\n        } catch (err) {\n          console.warn(\\`[i18next] Failed to load \\${language}/\\${namespace}:\\`, err);\n          callback(null, {});\n        }\n      }\n    };\n    \n    // Global namespace loader for route-based loading\n    window.__i18nLoadNamespaces = async function(namespaces) {\n      const currentLang = i18next.language || '${baseConfig.lng}';\n      const promises = namespaces.map(ns => \n        new Promise((resolve) => {\n          if (i18next.hasResourceBundle(currentLang, ns)) {\n            resolve(null);\n          } else {\n            i18next.loadNamespaces(ns, resolve);\n          }\n        })\n      );\n      await Promise.all(promises);\n    };\n    \n    i18next\n      .use(LanguageDetector)\n      .use(dynamicBackend)\n      .init({\n        ...${JSON.stringify(baseConfig)},\n        initImmediate: false,\n        detection: {\n          order: [\"htmlTag\", \"path\"],\n          lookupFromPathIndex: 0,\n          caches: []\n        },\n        load: 'currentOnly',\n        partialBundledLanguages: true,\n        ns: [], // Start with empty namespaces\n        defaultNS: false // Disable default namespace preloading\n      })\n      .catch(err => console.error('[i18next] Client initialization failed:', err));\n  `;\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { resolve } from \"pathe\";\nimport type {\n  IntegrationOptions,\n  TranslationContent,\n  TranslationMap,\n} from \"./types\";\n\n/**\n * Loads a translation file for a specific locale and namespace\n */\nexport function loadTranslation(\n  srcDir: string,\n  translationsDir: string,\n  locale: string,\n  namespace: string\n): TranslationContent {\n  const filePath = resolve(\n    srcDir,\n    translationsDir,\n    `${locale}/${namespace}.json`\n  );\n\n  if (!existsSync(filePath)) {\n    console.warn(\n      `[astro-i18next] Translation file not found: ${filePath}\\n` +\n        `Expected structure: ${translationsDir}/${locale}/${namespace}.json`\n    );\n    return {};\n  }\n\n  try {\n    const content = readFileSync(filePath, \"utf-8\");\n    const parsed = JSON.parse(content) as string;\n\n    // Validate that the parsed content is an object\n    if (\n      typeof parsed !== \"object\" ||\n      parsed === null ||\n      Array.isArray(parsed)\n    ) {\n      console.error(\n        `[astro-i18next] Invalid translation file format: ${filePath}\\n` +\n          `Expected JSON object, got ${typeof parsed}`\n      );\n      return {};\n    }\n\n    return parsed;\n  } catch (error) {\n    console.error(\n      `[astro-i18next] Failed to parse translation file: ${filePath}`,\n      error instanceof Error ? error.message : String(error)\n    );\n    return {};\n  }\n}\n\n/**\n * Pre-loads all translations for server-side rendering\n */\nexport function loadAllTranslations(\n  srcDir: string,\n  options: IntegrationOptions\n): TranslationMap {\n  const allTranslations: TranslationMap = {};\n\n  for (const locale of options.locales) {\n    allTranslations[locale] = {};\n    for (const namespace of options.namespaces) {\n      allTranslations[locale][namespace] = loadTranslation(\n        srcDir,\n        options.translationsDir,\n        locale,\n        namespace\n      );\n    }\n  }\n\n  return allTranslations;\n}\n","import { IntegrationOptions } from \"./types\";\n\nexport class I18nConfigError extends Error {\n  constructor(\n    message: string,\n    public field?: string\n  ) {\n    super(message);\n    this.name = \"I18nConfigError\";\n  }\n}\n\nexport function validateOptions(options: IntegrationOptions): void {\n  if (!options) {\n    throw new I18nConfigError(\"Integration options are required\");\n  }\n\n  if (\n    !options.locales ||\n    !Array.isArray(options.locales) ||\n    options.locales.length === 0\n  ) {\n    throw new I18nConfigError(\n      \"At least one locale must be specified\",\n      \"locales\"\n    );\n  }\n\n  if (!options.defaultLocale || typeof options.defaultLocale !== \"string\") {\n    throw new I18nConfigError(\n      \"Default locale is required and must be a string\",\n      \"defaultLocale\"\n    );\n  }\n\n  if (!options.locales.includes(options.defaultLocale)) {\n    throw new I18nConfigError(\n      `Default locale \"${options.defaultLocale}\" must be included in locales array`,\n      \"defaultLocale\"\n    );\n  }\n\n  if (\n    !options.namespaces ||\n    !Array.isArray(options.namespaces) ||\n    options.namespaces.length === 0\n  ) {\n    throw new I18nConfigError(\n      \"At least one namespace must be specified\",\n      \"namespaces\"\n    );\n  }\n\n  if (\n    !options.defaultNamespace ||\n    typeof options.defaultNamespace !== \"string\"\n  ) {\n    throw new I18nConfigError(\n      \"Default namespace is required and must be a string\",\n      \"defaultNamespace\"\n    );\n  }\n\n  if (!options.namespaces.includes(options.defaultNamespace)) {\n    throw new I18nConfigError(\n      `Default namespace \"${options.defaultNamespace}\" must be included in namespaces array`,\n      \"defaultNamespace\"\n    );\n  }\n\n  if (!options.translationsDir || typeof options.translationsDir !== \"string\") {\n    throw new I18nConfigError(\n      \"Translations directory is required and must be a string\",\n      \"translationsDir\"\n    );\n  }\n\n  // Validate locale format (basic check)\n  const invalidLocales = options.locales.filter(\n    (locale: string) =>\n      typeof locale !== \"string\" || !/^[a-z]{2}(-[A-Z]{2})?$/.test(locale)\n  );\n  if (invalidLocales.length > 0) {\n    throw new I18nConfigError(\n      `Invalid locale format: ${invalidLocales.join(\", \")}. Use format: \"en\", \"en-US\"`,\n      \"locales\"\n    );\n  }\n\n  // Validate namespace format (no special characters that could break file paths)\n  const invalidNamespaces = options.namespaces.filter(\n    (ns: string) => typeof ns !== \"string\" || !/^[a-zA-Z0-9_-]+$/.test(ns)\n  );\n  if (invalidNamespaces.length > 0) {\n    throw new I18nConfigError(\n      `Invalid namespace format: ${invalidNamespaces.join(\", \")}. Use only letters, numbers, hyphens, and underscores`,\n      \"namespaces\"\n    );\n  }\n}\n","import { loadTranslation } from \"./translation-loader\";\nimport type { IntegrationOptions } from \"./types\";\n\n/**\n * Creates a Vite plugin for handling i18n virtual modules\n */\nexport function createI18nVitePlugin(\n  options: IntegrationOptions,\n  srcDir: string\n) {\n  return {\n    name: \"i18n-virtual-modules\",\n    resolveId(id: string) {\n      if (id === \"virtual:i18n-config\") return id;\n      if (id === \"virtual:i18n-loader\") return id;\n\n      const match = id.match(/^virtual:i18n-translation:(.+)\\/(.+)$/);\n      if (match) return id;\n\n      // Handle generated virtual modules\n      const virtualMatch = id.match(/^\\.?\\/virtual-i18n-(.+)-(.+)\\.js$/);\n      if (virtualMatch)\n        return `virtual:i18n-translation:${virtualMatch[1]}/${virtualMatch[2]}`;\n    },\n    load(id: string) {\n      if (id === \"virtual:i18n-config\") {\n        return `export const i18nConfig = ${JSON.stringify(options)};`;\n      }\n\n      if (id === \"virtual:i18n-loader\") {\n        return generateDynamicTranslationLoader(options);\n      }\n\n      const match = id.match(/^virtual:i18n-translation:(.+)\\/(.+)$/);\n      if (match) {\n        const [, locale, namespace] = match;\n        const translation = loadTranslation(\n          srcDir,\n          options.translationsDir,\n          locale,\n          namespace\n        );\n        return `export default ${JSON.stringify(translation)};`;\n      }\n    },\n  };\n}\n\nfunction generateDynamicTranslationLoader(options: IntegrationOptions): string {\n  // Generate import mapping for all locale/namespace combinations\n  const importMap: string[] = [];\n  const caseStatements: string[] = [];\n\n  options.locales.forEach((locale) => {\n    options.namespaces.forEach((namespace) => {\n      const importVar = `${locale}_${namespace}`.replace(/[^a-zA-Z0-9_]/g, \"_\");\n      importMap.push(\n        `const ${importVar} = () => import('./virtual-i18n-${locale}-${namespace}.js');`\n      );\n      caseStatements.push(\n        `    case '${locale}/${namespace}': return (await ${importVar}()).default || {};`\n      );\n    });\n  });\n\n  return `\n${importMap.join(\"\\n\")}\n\nexport async function loadTranslation(locale, namespace) {\n  try {\n    const key = \\`\\${locale}/\\${namespace}\\`;\n    switch (key) {\n${caseStatements.join(\"\\n\")}\n      default:\n        console.warn(\\`[i18next] Unknown translation: \\${locale}/\\${namespace}\\`);\n        return {};\n    }\n  } catch (err) {\n    console.warn(\\`[i18next] Failed to load translation \\${locale}/\\${namespace}:\\`, err);\n    return {};\n  }\n}\n\n// Helper to preload specific namespaces\nexport async function preloadNamespaces(locale, namespaces) {\n  const promises = namespaces.map(ns => loadTranslation(locale, ns));\n  return Promise.all(promises);\n}\n\n// Available locales and namespaces for validation\nexport const availableLocales = ${JSON.stringify(options.locales)};\nexport const availableNamespaces = ${JSON.stringify(options.namespaces)};\n`;\n}\n","import type { AstroIntegration } from \"astro\";\nimport { createBaseConfig } from \"./config\";\nimport { generateClientScript, generateServerScript } from \"./scripts\";\nimport { loadAllTranslations } from \"./translation-loader\";\nimport type { IntegrationOptions } from \"./types\";\nimport { validateOptions } from \"./validation\";\nimport { createI18nVitePlugin } from \"./vite-plugin\";\n\n/**\n * Creates an Astro integration for i18next internationalization\n */\nexport function i18nIntegration(options: IntegrationOptions): AstroIntegration {\n  return {\n    name: \"astro-i18next\",\n    hooks: {\n      \"astro:config:setup\": async ({ config, injectScript, updateConfig }) => {\n        try {\n          validateOptions(options);\n\n          const baseConfig = createBaseConfig(options);\n          const allTranslations = loadAllTranslations(\n            config.srcDir.pathname,\n            options\n          );\n\n          updateConfig({\n            vite: {\n              plugins: [createI18nVitePlugin(options, config.srcDir.pathname)],\n            },\n          });\n\n          injectScript(\n            \"page-ssr\",\n            generateServerScript(baseConfig, allTranslations, options)\n          );\n          injectScript(\n            \"before-hydration\",\n            generateClientScript(baseConfig, options)\n          );\n        } catch (error) {\n          if (error instanceof Error) {\n            throw new Error(\n              `[astro-i18next] Configuration error: ${error.message}`\n            );\n          }\n          throw error;\n        }\n      },\n    },\n  };\n}\n"]}