{"version":3,"sources":["../../src/i18n/index.ts","../../src/base-path.ts","../../src/i18n/routing.ts","../../src/i18n/resolver.ts"],"sourcesContent":["export type {\n  FarmI18nCatalog,\n  FarmI18nCatalogs,\n  FarmI18nClientSnapshot,\n  FarmI18nCookieConfig,\n  FarmI18nDetectionSignal,\n  FarmI18nDirection,\n  FarmI18nLocale,\n  FarmI18nLocaleRegistry,\n  FarmI18nLocaleSource,\n  FarmI18nMessageArgs,\n  FarmI18nMessageKey,\n  FarmI18nMessageRegistry,\n  FarmI18nMessageValues,\n  FarmI18nRouting,\n  FarmI18nUserConfig,\n  FarmTranslator,\n  ResolvedFarmI18nConfig,\n} from \"./types\";\nexport {\n  localizeFarmHref,\n  localizeFarmPathname,\n  resolveFarmLocalePath,\n  stripFarmLocaleFromPathname,\n} from \"./routing\";\nexport { createFarmLocaleCookie, getFarmLocaleVaryHeaders, matchFarmLocale } from \"./resolver\";\n","const FARM_BASE_PATH = Symbol.for(\"farm.basePath\");\n\nfunction getFarmGlobalState(): Record<PropertyKey, unknown> {\n  return globalThis as unknown as Record<PropertyKey, unknown>;\n}\n\n/** @internal Configure the app-wide base path for framework link rendering. */\nexport function setFarmBasePath(basePath: string | undefined): void {\n  getFarmGlobalState()[FARM_BASE_PATH] = normalizeFarmBasePath(basePath);\n}\n\n/** @internal Read the app-wide base path used by framework links. */\nexport function getFarmBasePath(): string {\n  return (getFarmGlobalState()[FARM_BASE_PATH] as string | undefined) ?? \"\";\n}\n\nexport function applyFarmBasePath(href: string, basePath = getFarmBasePath()): string {\n  const normalizedBasePath = normalizeFarmBasePath(basePath);\n  if (!normalizedBasePath || !href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n  const canonicalHref = canonicalizeAppRelativeHref(href);\n  if (\n    canonicalHref === normalizedBasePath ||\n    canonicalHref.startsWith(`${normalizedBasePath}/`) ||\n    canonicalHref.startsWith(`${normalizedBasePath}?`) ||\n    canonicalHref.startsWith(`${normalizedBasePath}#`)\n  ) {\n    return canonicalHref;\n  }\n  return `${normalizedBasePath}${canonicalHref}`;\n}\n\nfunction canonicalizeAppRelativeHref(href: string): string {\n  const origin = \"http://farm.local\";\n  const resolved = new URL(href, origin);\n  if (resolved.origin !== origin) {\n    throw new Error(\"Farm app-relative href cannot change the URL origin.\");\n  }\n  return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n}\n\nexport function stripFarmBasePath(pathname: string, basePath = getFarmBasePath()): string {\n  const normalizedBasePath = normalizeFarmBasePath(basePath);\n  if (!normalizedBasePath) return pathname || \"/\";\n  if (pathname === normalizedBasePath) return \"/\";\n  if (!pathname.startsWith(`${normalizedBasePath}/`)) return pathname || \"/\";\n  return pathname.slice(normalizedBasePath.length) || \"/\";\n}\n\nexport function normalizeFarmBasePath(basePath: string | undefined): string {\n  if (!basePath || basePath === \"/\") return \"\";\n\n  const hasUnstableCharacters = (candidate: string) =>\n    candidate.includes(\"\\\\\") ||\n    Array.from(candidate).some((character) => {\n      const code = character.charCodeAt(0);\n      return code <= 31 || (code >= 127 && code <= 159);\n    });\n\n  if (hasUnstableCharacters(basePath)) {\n    throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n  }\n\n  const pathname = basePath.trim();\n  if (!pathname || pathname === \"/\") return \"\";\n  if (pathname.includes(\"?\") || pathname.includes(\"#\")) {\n    throw new Error(\"Farm basePath cannot contain a query string or hash.\");\n  }\n  if (pathname.startsWith(\"//\") || /^[a-z][a-z\\d+.-]*:\\/\\//i.test(pathname)) {\n    throw new Error('Farm basePath must be a pathname such as \"/docs\", not a URL.');\n  }\n\n  for (const segment of pathname.split(\"/\")) {\n    let decoded = segment;\n    try {\n      decoded = decodeURIComponent(segment);\n    } catch {\n      // Malformed escapes remain literal in URL pathnames and cannot be dot segments.\n    }\n    if (hasUnstableCharacters(decoded)) {\n      throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n    }\n    if (decoded.includes(\"/\")) {\n      throw new Error(\"Farm basePath cannot contain percent-encoded path separators.\");\n    }\n    if (decoded === \".\" || decoded === \"..\") {\n      throw new Error('Farm basePath cannot contain \".\" or \"..\" path segments.');\n    }\n  }\n\n  return `/${pathname}`.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\");\n}\n\n/** Normalize a configured application base path while preserving `/` for root. */\nexport function normalizeFarmConfigBasePath(basePath: string | undefined): string {\n  return normalizeFarmBasePath(basePath) || \"/\";\n}\n","import { applyFarmBasePath, stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nDirection, FarmI18nRouting, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocalePathConfig {\n  locales: readonly string[];\n  defaultLocale: string;\n  routing: FarmI18nRouting;\n  basePath?: string;\n}\n\nexport interface FarmLocalePathMatch {\n  locale?: string;\n  pathname: string;\n  explicit: boolean;\n}\n\nconst RTL_LANGUAGES = new Set([\n  \"ar\",\n  \"arc\",\n  \"ckb\",\n  \"dv\",\n  \"fa\",\n  \"he\",\n  \"ku\",\n  \"nqo\",\n  \"ps\",\n  \"sd\",\n  \"syr\",\n  \"ug\",\n  \"ur\",\n  \"yi\",\n]);\n\nexport function resolveFarmLocalePath(\n  pathname: string,\n  config: FarmLocalePathConfig,\n): FarmLocalePathMatch {\n  const normalized = normalizePathname(stripFarmBasePath(pathname, config.basePath));\n  if (config.routing === \"none\") {\n    return { pathname: normalized, explicit: false };\n  }\n\n  const segments = normalized.split(\"/\").filter(Boolean);\n  const firstSegment = segments[0];\n  const locale = config.locales.find(\n    (candidate) => candidate.toLowerCase() === firstSegment?.toLowerCase(),\n  );\n  if (!locale) {\n    return { pathname: normalized, explicit: false };\n  }\n\n  const remaining = segments.slice(1);\n  return {\n    locale,\n    pathname: remaining.length > 0 ? `/${remaining.join(\"/\")}` : \"/\",\n    explicit: true,\n  };\n}\n\nexport function stripFarmLocaleFromPathname(\n  pathname: string,\n  config: FarmLocalePathConfig,\n): string {\n  return resolveFarmLocalePath(pathname, config).pathname;\n}\n\nexport function localizeFarmPathname(\n  pathname: string,\n  locale: string,\n  config: FarmLocalePathConfig,\n): string {\n  const internalPathname = resolveFarmLocalePath(pathname, config).pathname;\n  let localizedPathname = internalPathname;\n  if (config.routing === \"none\") {\n    return applyFarmBasePath(localizedPathname, config.basePath);\n  }\n  if (config.routing === \"prefix-except-default\" && locale === config.defaultLocale) {\n    return applyFarmBasePath(localizedPathname, config.basePath);\n  }\n  localizedPathname = internalPathname === \"/\" ? `/${locale}` : `/${locale}${internalPathname}`;\n  return applyFarmBasePath(localizedPathname, config.basePath);\n}\n\nexport function localizeFarmHref(\n  href: string,\n  locale: string,\n  config: FarmLocalePathConfig,\n): string {\n  if (!href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n  const url = new URL(href, \"http://farm.local\");\n  url.pathname = localizeFarmPathname(url.pathname, locale, config);\n  return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function getFarmLocaleDirection(\n  locale: string,\n  direction: ResolvedFarmI18nConfig[\"direction\"] | undefined,\n): FarmI18nDirection {\n  const configured = direction?.[locale];\n  if (configured) return configured;\n  const language = locale.split(\"-\")[0]?.toLowerCase() || locale.toLowerCase();\n  return RTL_LANGUAGES.has(language) ? \"rtl\" : \"ltr\";\n}\n\nfunction normalizePathname(pathname: string): string {\n  const withLeadingSlash = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n  if (withLeadingSlash === \"/\") return \"/\";\n  return withLeadingSlash.replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n}\n","import { localizeFarmPathname, resolveFarmLocalePath } from \"./routing\";\nimport { stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nLocaleSource, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocaleResolution {\n  locale: string;\n  source: FarmI18nLocaleSource;\n  pathname: string;\n  redirect?: string;\n  persist: boolean;\n}\n\nexport function getFarmLocaleVaryHeaders(\n  config: ResolvedFarmI18nConfig,\n  resolution: FarmLocaleResolution,\n): string[] {\n  if (!config.enabled || resolution.source === \"url\") return [];\n\n  const headers: string[] = [];\n  if (config.detection.includes(\"cookie\")) headers.push(\"Cookie\");\n  if (config.detection.includes(\"accept-language\")) headers.push(\"Accept-Language\");\n  return headers;\n}\n\nexport function resolveFarmLocaleRequest(\n  request: Request,\n  config: ResolvedFarmI18nConfig,\n  options: { redirect?: boolean } = {},\n): FarmLocaleResolution {\n  const url = new URL(request.url);\n  if (!config.enabled) {\n    return {\n      locale: config.defaultLocale,\n      source: \"default\",\n      pathname: url.pathname,\n      persist: false,\n    };\n  }\n\n  const pathMatch = resolveFarmLocalePath(url.pathname, config);\n  if (pathMatch.explicit && pathMatch.locale) {\n    const canonicalPath = localizeFarmPathname(pathMatch.pathname, pathMatch.locale, config);\n    // The locale canonical is always trailing-slash-free, but the app's dedicated\n    // trailing-slash redirect owns that normalization. When the only difference is\n    // a trailing slash, defer to it: otherwise, under trailingSlash: true, the i18n\n    // redirect (strip) and the trailing-slash redirect (add) bounce a locale URL\n    // between 307 and 308 forever and every locale page becomes unreachable.\n    const differsOnlyByTrailingSlash =\n      canonicalPath !== url.pathname &&\n      (url.pathname.length > 1 ? url.pathname.replace(/\\/+$/, \"\") : url.pathname) === canonicalPath;\n    const redirect =\n      options.redirect !== false && canonicalPath !== url.pathname && !differsOnlyByTrailingSlash\n        ? `${canonicalPath}${url.search}${url.hash}`\n        : undefined;\n    return {\n      locale: pathMatch.locale,\n      source: \"url\",\n      pathname: pathMatch.pathname,\n      redirect,\n      // Locale-prefixed pages are canonical and can be cached publicly. Locale\n      // switchers persist the same choice before navigating in the browser.\n      persist: false,\n    };\n  }\n\n  const detected = detectLocale(request, config);\n  const shouldRedirect =\n    options.redirect !== false &&\n    !isInternalOrApiPath(stripFarmBasePath(url.pathname, config.basePath)) &&\n    config.routing !== \"none\" &&\n    (config.routing === \"prefix-always\" || detected.locale !== config.defaultLocale);\n\n  return {\n    locale: detected.locale,\n    source: detected.source,\n    pathname: pathMatch.pathname,\n    redirect: shouldRedirect\n      ? `${localizeFarmPathname(pathMatch.pathname, detected.locale, config)}${url.search}${url.hash}`\n      : undefined,\n    persist: detected.source !== \"default\",\n  };\n}\n\nexport function createFarmLocaleCookie(\n  locale: string,\n  config: Pick<ResolvedFarmI18nConfig, \"cookie\">,\n): string {\n  const cookie = config.cookie;\n  let value = `${encodeURIComponent(cookie.name)}=${encodeURIComponent(locale)}`;\n  value += `; Max-Age=${cookie.maxAge}`;\n  value += `; Path=${cookie.path}`;\n  value += `; SameSite=${capitalize(cookie.sameSite)}`;\n  if (cookie.secure) value += \"; Secure\";\n  return value;\n}\n\nexport function matchFarmLocale(\n  requested: string | null | undefined,\n  locales: readonly string[],\n): string | undefined {\n  if (!requested) return undefined;\n  let canonical: string;\n  try {\n    canonical = Intl.getCanonicalLocales(requested)[0]!;\n  } catch {\n    return undefined;\n  }\n\n  const exact = locales.find((locale) => locale.toLowerCase() === canonical.toLowerCase());\n  if (exact) return exact;\n\n  const language = canonical.split(\"-\")[0]?.toLowerCase();\n  const base = locales.find((locale) => locale.toLowerCase() === language);\n  if (base) return base;\n  return locales.find((locale) => locale.split(\"-\")[0]?.toLowerCase() === language);\n}\n\nfunction detectLocale(\n  request: Request,\n  config: ResolvedFarmI18nConfig,\n): { locale: string; source: FarmI18nLocaleSource } {\n  for (const signal of config.detection) {\n    if (signal === \"url\") continue;\n\n    if (signal === \"cookie\") {\n      const locale = matchFarmLocale(\n        readCookie(request.headers.get(\"cookie\"), config.cookie.name),\n        config.locales,\n      );\n      if (locale) return { locale, source: \"cookie\" };\n    }\n\n    if (signal === \"accept-language\") {\n      const locale = resolveAcceptLanguage(request.headers.get(\"accept-language\"), config.locales);\n      if (locale) return { locale, source: \"accept-language\" };\n    }\n  }\n\n  return { locale: config.defaultLocale, source: \"default\" };\n}\n\nfunction resolveAcceptLanguage(\n  header: string | null,\n  locales: readonly string[],\n): string | undefined {\n  if (!header) return undefined;\n\n  const byRange = new Map<string, { locale: string; quality: number; index: number }>();\n  for (const [index, entry] of header.split(\",\").entries()) {\n    const [rawLocale = \"\", ...parameters] = entry.trim().split(\";\");\n    const locale = rawLocale.trim();\n    if (!locale) continue;\n\n    let quality = 1;\n    for (const parameter of parameters) {\n      const [rawName, rawValue] = parameter.trim().split(\"=\", 2);\n      if (rawName?.trim().toLowerCase() !== \"q\") continue;\n      const value = rawValue?.trim() ?? \"\";\n      quality = /^(?:0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)$/.test(value) ? Number(value) : 0;\n    }\n\n    const key = locale.toLowerCase();\n    const previous = byRange.get(key);\n    if (!previous || quality > previous.quality) {\n      byRange.set(key, { locale, quality, index: previous?.index ?? index });\n    }\n  }\n\n  const candidates = [...byRange.values()]\n    .filter((candidate) => candidate.quality > 0)\n    .sort((a, b) => b.quality - a.quality || a.index - b.index);\n  const explicitRanges = [...byRange.values()].filter(({ locale }) => locale !== \"*\");\n\n  for (const candidate of candidates) {\n    if (candidate.locale === \"*\") {\n      const wildcardMatch = locales.find(\n        (locale) =>\n          !explicitRanges.some((range) => matchFarmLocale(range.locale, [locale]) !== undefined),\n      );\n      if (wildcardMatch) return wildcardMatch;\n      continue;\n    }\n\n    const locale = matchFarmLocale(candidate.locale, locales);\n    if (locale) return locale;\n  }\n  return undefined;\n}\n\nfunction readCookie(header: string | null, name: string): string | undefined {\n  if (!header) return undefined;\n  for (const part of header.split(\";\")) {\n    const separator = part.indexOf(\"=\");\n    if (separator < 0) continue;\n    let key: string;\n    try {\n      key = decodeURIComponent(part.slice(0, separator).trim());\n    } catch {\n      continue;\n    }\n    if (key !== name) continue;\n    try {\n      return decodeURIComponent(part.slice(separator + 1).trim());\n    } catch {\n      return part.slice(separator + 1).trim();\n    }\n  }\n  return undefined;\n}\n\nfunction isInternalOrApiPath(pathname: string): boolean {\n  return (\n    pathname === \"/api\" ||\n    pathname.startsWith(\"/api/\") ||\n    pathname.startsWith(\"/__farm/\") ||\n    pathname.startsWith(\"/_farm/\")\n  );\n}\n\nfunction capitalize(value: string): string {\n  return value.charAt(0).toUpperCase() + value.slice(1);\n}\n"],"mappings":"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","names":[]}