rfc-bcp47 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["UKEY_RE","TKEY_RE"],"sources":["../src/utilities.ts","../src/operators/parse/parse.ts","../src/operators/stringify/stringify.ts","../src/operators/langtag/langtag.ts","../src/language-subtag-registry.ts","../src/operators/canonicalize/canonicalize.ts","../src/operators/filter/filter.ts","../src/operators/lookup/lookup.ts","../src/operators/extension/extension.ts","../src/operators/extension/cldr-keys.ts","../src/operators/accept-language/accept-language.ts"],"sourcesContent":["export function titleCase(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();\n}\n","// RFC 5646 §2.1 — Syntax (ABNF grammar for Language-Tag)\n// https://www.rfc-editor.org/rfc/rfc5646#section-2.1\n\nimport type { BCP47Extension, BCP47Tag } from '../../types';\nimport { titleCase } from '../../utilities';\n\nconst IRREGULAR_GRANDFATHERED: Record<string, string> = {\n 'en-gb-oed': 'en-GB-oed',\n 'i-ami': 'i-ami',\n 'i-bnn': 'i-bnn',\n 'i-default': 'i-default',\n 'i-enochian': 'i-enochian',\n 'i-hak': 'i-hak',\n 'i-klingon': 'i-klingon',\n 'i-lux': 'i-lux',\n 'i-mingo': 'i-mingo',\n 'i-navajo': 'i-navajo',\n 'i-pwn': 'i-pwn',\n 'i-tao': 'i-tao',\n 'i-tay': 'i-tay',\n 'i-tsu': 'i-tsu',\n 'sgn-be-fr': 'sgn-BE-FR',\n 'sgn-be-nl': 'sgn-BE-NL',\n 'sgn-ch-de': 'sgn-CH-DE',\n};\n\nconst REGULAR_GRANDFATHERED: Record<string, string> = {\n 'art-lojban': 'art-lojban',\n 'cel-gaulish': 'cel-gaulish',\n 'no-bok': 'no-bok',\n 'no-nyn': 'no-nyn',\n 'zh-guoyu': 'zh-guoyu',\n 'zh-hakka': 'zh-hakka',\n 'zh-min': 'zh-min',\n 'zh-min-nan': 'zh-min-nan',\n 'zh-xiang': 'zh-xiang',\n};\n\nconst LANGTAG_RE = /^(?:(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$|^((?:[a-z]{2,3}(?:(?:-[a-z]{3}){1,3})?)|[a-z]{4}|[a-z]{5,8})(?:-([a-z]{4}))?(?:-([a-z]{2}|\\d{3}))?((?:-(?:[\\da-z]{5,8}|\\d[\\da-z]{3}))*)?((?:-[\\da-wy-z](?:-[\\da-z]{2,8})+)*)?(-x(?:-[\\da-z]{1,8})+)?$|^(x(?:-[\\da-z]{1,8})+)$/i;\n\n/*\n/\n^\n (?:\n (\n en-GB-oed | i-ami | i-bnn | i-default | i-enochian | i-hak | i-klingon |\n i-lux | i-mingo | i-navajo | i-pwn | i-tao | i-tay | i-tsu | sgn-BE-FR |\n sgn-BE-NL | sgn-CH-DE\n ) |\n (\n art-lojban | cel-gaulish | no-bok | no-nyn | zh-guoyu | zh-hakka |\n zh-min | zh-min-nan | zh-xiang\n )\n )\n$\n|\n^\n (\n (?:\n [a-z]{2,3}\n (?:\n (?:\n -[a-z]{3}\n ){1,3}\n )?\n ) |\n [a-z]{4} |\n [a-z]{5,8}\n )\n (?:\n -\n (\n [a-z]{4}\n )\n )?\n (?:\n -\n (\n [a-z]{2} |\n \\d{3}\n )\n )?\n (\n (?:\n -\n (?:\n [\\da-z]{5,8} |\n \\d[\\da-z]{3}\n )\n )*\n )?\n (\n (?:\n -\n [\\da-wy-z]\n (?:\n -[\\da-z]{2,8}\n )+\n )*\n )?\n (\n -x\n (?:\n -[\\da-z]{1,8}\n )+\n )?\n$\n|\n^\n (\n x\n (?:\n -[\\da-z]{1,8}\n )+\n )\n$\n/i\n*/\n\nfunction splitSubtags(raw: string): Array<string> {\n const parts = raw.split('-');\n parts.shift();\n return parts.map((subtag) => subtag.toLowerCase());\n}\n\nfunction hasDuplicates(subtags: ReadonlyArray<string>): boolean {\n const seen = new Set<string>();\n for (const subtag of subtags) {\n if (seen.has(subtag)) {\n return true;\n }\n seen.add(subtag);\n }\n return false;\n}\n\nfunction parseLanguageAndExtlang(raw: string): { language: string; extlang: Array<string> } {\n const parts = raw.split('-');\n const language = parts.shift()!.toLowerCase();\n const extlang = parts.map((subtag) => subtag.toLowerCase());\n return { language, extlang };\n}\n\nfunction parseExtensions(raw: string): Array<BCP47Extension> | null {\n const tokens = raw.split('-');\n tokens.shift();\n\n const result: Array<BCP47Extension> = [];\n const singletonsSeen = new Set<string>();\n let currentSingleton: string | undefined;\n let currentSubtags: Array<string> = [];\n\n for (const token of tokens) {\n if (token.length === 1) {\n if (currentSingleton) {\n result.push({\n singleton: currentSingleton.toLowerCase(),\n subtags: currentSubtags.map((subtag) => subtag.toLowerCase())\n });\n }\n const lower = token.toLowerCase();\n if (singletonsSeen.has(lower)) {\n return null;\n }\n singletonsSeen.add(lower);\n currentSingleton = token;\n currentSubtags = [];\n } else {\n currentSubtags.push(token);\n }\n }\n\n // Guaranteed by regex: extension always starts with a singleton\n result.push({\n singleton: currentSingleton!.toLowerCase(),\n subtags: currentSubtags.map((subtag) => subtag.toLowerCase())\n });\n\n return result;\n}\n\n/** Parse a BCP 47 language tag string into a structured object. Returns `null` for invalid input. */\nexport function parse(tag: string): BCP47Tag | null {\n const match = LANGTAG_RE.exec(tag);\n if (!match) {\n return null;\n }\n\n match.shift();\n const [\n irregular, regular, languageGroup, script, region,\n variantGroup, extensionGroup, langPrivateuseGroup, standalonePrivateuseGroup\n ] = match;\n\n if (irregular) {\n return {\n type: 'grandfathered',\n grandfathered: {\n type: 'irregular',\n tag: IRREGULAR_GRANDFATHERED[irregular.toLowerCase()]!\n }\n };\n }\n\n if (regular) {\n return {\n type: 'grandfathered',\n grandfathered: {\n type: 'regular',\n tag: REGULAR_GRANDFATHERED[regular.toLowerCase()]!\n }\n };\n }\n\n if (standalonePrivateuseGroup) {\n const parts = standalonePrivateuseGroup.split('-');\n parts.shift();\n return {\n type: 'privateuse',\n privateuse: parts.map((subtag) => subtag.toLowerCase())\n };\n }\n\n // Guaranteed by regex: if not grandfathered or standalone privateuse, languageGroup exists\n const { language, extlang } = parseLanguageAndExtlang(languageGroup!);\n\n const variant = variantGroup ? splitSubtags(variantGroup) : [];\n if (hasDuplicates(variant)) {\n return null;\n }\n\n const extension = extensionGroup ? parseExtensions(extensionGroup) : [];\n if (!extension) {\n return null;\n }\n\n return {\n type: 'langtag',\n langtag: {\n language,\n extlang,\n script: script ? titleCase(script) : null,\n region: region ? region.toUpperCase() : null,\n variant,\n extension,\n privateuse: langPrivateuseGroup ? splitSubtags(langPrivateuseGroup).slice(1) : []\n }\n };\n}\n","// RFC 5646 §2.1.1 — Formatting of Language Tags (case conventions)\n// https://www.rfc-editor.org/rfc/rfc5646#section-2.1.1\n\nimport type { BCP47Tag } from '../../types';\nimport { titleCase } from '../../utilities';\n\n/** Convert a parsed `BCP47Tag` object back into a well-formed language tag string. */\nexport function stringify(tag: BCP47Tag): string {\n switch (tag.type) {\n case 'grandfathered':\n return tag.grandfathered.tag;\n\n case 'privateuse':\n return 'x-' + tag.privateuse.map((subtag) => subtag.toLowerCase()).join('-');\n\n case 'langtag': {\n const parts: Array<string> = [];\n\n parts.push(tag.langtag.language.toLowerCase());\n for (const subtag of tag.langtag.extlang) {\n parts.push(subtag.toLowerCase());\n }\n\n if (tag.langtag.script) {\n parts.push(titleCase(tag.langtag.script));\n }\n\n if (tag.langtag.region) {\n parts.push(tag.langtag.region.toUpperCase());\n }\n\n for (const subtag of tag.langtag.variant) {\n parts.push(subtag.toLowerCase());\n }\n\n for (const extension of tag.langtag.extension) {\n parts.push(extension.singleton.toLowerCase());\n for (const subtag of extension.subtags) {\n parts.push(subtag.toLowerCase());\n }\n }\n\n if (tag.langtag.privateuse.length > 0) {\n parts.push('x');\n for (const subtag of tag.langtag.privateuse) {\n parts.push(subtag.toLowerCase());\n }\n }\n\n return parts.join('-');\n }\n }\n}\n","import type { BCP47Extension, BCP47Tag } from '../../types';\nimport { titleCase } from '../../utilities';\n\nexport interface LangtagOptions {\n readonly extlang?: ReadonlyArray<string>;\n readonly script?: string;\n readonly region?: string;\n readonly variant?: ReadonlyArray<string>;\n readonly extension?: ReadonlyArray<BCP47Extension>;\n readonly privateuse?: ReadonlyArray<string>;\n}\n\nconst LANGUAGE_RE = /^[a-z]{2,8}$/i;\nconst EXTLANG_RE = /^[a-z]{3}$/i;\nconst SCRIPT_RE = /^[a-z]{4}$/i;\nconst REGION_RE = /^(?:[a-z]{2}|\\d{3})$/i;\nconst VARIANT_RE = /^(?:[\\da-z]{5,8}|\\d[\\da-z]{3})$/i;\nconst SINGLETON_RE = /^[\\da-wy-z]$/i;\nconst EXTENSION_SUBTAG_RE = /^[\\da-z]{2,8}$/i;\nconst PRIVATEUSE_RE = /^[\\da-z]{1,8}$/i;\n\nfunction validate(condition: boolean, message: string): void {\n if (!condition) {\n throw new RangeError(message);\n }\n}\n\n/** Build a `BCP47Tag` from parts with sensible defaults. Throws `RangeError` on invalid input. */\nexport function langtag(language: string, options?: LangtagOptions): BCP47Tag {\n validate(LANGUAGE_RE.test(language), `Invalid language: '${language}'`);\n\n const extlang = options?.extlang ?? [];\n if (extlang.length > 0) {\n validate(language.length <= 3, `Extlang is only valid with 2-3 character language subtags, got '${language}'`);\n }\n for (const subtag of extlang) {\n validate(EXTLANG_RE.test(subtag), `Invalid extlang: '${subtag}'`);\n }\n validate(extlang.length <= 3, `Too many extlang subtags: ${extlang.length} (max 3)`);\n\n if (options?.script !== undefined) {\n validate(SCRIPT_RE.test(options.script), `Invalid script: '${options.script}'`);\n }\n\n if (options?.region !== undefined) {\n validate(REGION_RE.test(options.region), `Invalid region: '${options.region}'`);\n }\n\n const variant = options?.variant ?? [];\n const variantsSeen = new Set<string>();\n for (const subtag of variant) {\n validate(VARIANT_RE.test(subtag), `Invalid variant: '${subtag}'`);\n const lower = subtag.toLowerCase();\n validate(!variantsSeen.has(lower), `Duplicate variant: '${subtag}'`);\n variantsSeen.add(lower);\n }\n\n const extension = options?.extension ?? [];\n const singletons = new Set<string>();\n for (const entry of extension) {\n validate(SINGLETON_RE.test(entry.singleton), `Invalid extension singleton: '${entry.singleton}'`);\n const lower = entry.singleton.toLowerCase();\n validate(!singletons.has(lower), `Duplicate extension singleton: '${entry.singleton}'`);\n singletons.add(lower);\n validate(entry.subtags.length > 0, `Extension '${entry.singleton}' must have at least one subtag`);\n for (const subtag of entry.subtags) {\n validate(EXTENSION_SUBTAG_RE.test(subtag), `Invalid extension subtag: '${subtag}'`);\n }\n }\n\n const privateuse = options?.privateuse ?? [];\n for (const subtag of privateuse) {\n validate(PRIVATEUSE_RE.test(subtag), `Invalid privateuse subtag: '${subtag}'`);\n }\n\n return {\n type: 'langtag',\n langtag: {\n language: language.toLowerCase(),\n extlang: extlang.map((subtag) => subtag.toLowerCase()),\n script: options?.script ? titleCase(options.script) : null,\n region: options?.region ? options.region.toUpperCase() : null,\n variant: variant.map((subtag) => subtag.toLowerCase()),\n extension: extension.map((entry) => ({\n singleton: entry.singleton.toLowerCase(),\n subtags: entry.subtags.map((subtag) => subtag.toLowerCase()),\n })),\n privateuse: privateuse.map((subtag) => subtag.toLowerCase()),\n }\n };\n}\n","// Source: IANA Language Subtag Registry, File-Date: 2025-08-25\n// https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry\n// Registry format: RFC 5646 §3 — IANA Language Subtag Registry\n\nexport const DEPRECATED_LANGUAGES: Record<string, string> = {\n aam: 'aas',\n adp: 'dz',\n ajp: 'apc',\n ajt: 'aeb',\n asd: 'snz',\n aue: 'ktz',\n ayx: 'nun',\n bgm: 'bcg',\n bic: 'bir',\n bjd: 'drl',\n blg: 'iba',\n ccq: 'rki',\n cjr: 'mom',\n cka: 'cmr',\n cmk: 'xch',\n coy: 'pij',\n cqu: 'quh',\n dek: 'sqm',\n dit: 'dif',\n drh: 'khk',\n drr: 'kzk',\n drw: 'prs',\n gav: 'dev',\n gfx: 'vaj',\n ggn: 'gvr',\n gli: 'kzk',\n gti: 'nyc',\n guv: 'duz',\n hrr: 'jal',\n ibi: 'opa',\n ilw: 'gal',\n in: 'id',\n iw: 'he',\n jeg: 'oyb',\n ji: 'yi',\n jw: 'jv',\n kgc: 'tdf',\n kgh: 'kml',\n kgm: 'plu',\n koj: 'kwv',\n krm: 'bmf',\n ktr: 'dtp',\n kvs: 'gdj',\n kwq: 'yam',\n kxe: 'tvd',\n kxl: 'kru',\n kzj: 'dtp',\n kzt: 'dtp',\n lak: 'ksp',\n lii: 'raq',\n llo: 'ngt',\n lmm: 'rmx',\n meg: 'cir',\n mo: 'ro',\n mst: 'mry',\n mwj: 'vaj',\n myd: 'aog',\n myt: 'mry',\n nad: 'xny',\n ncp: 'kdz',\n nns: 'nbr',\n nnx: 'ngv',\n nom: 'cbr',\n nte: 'eko',\n nts: 'pij',\n nxu: 'bpp',\n oun: 'vaj',\n pat: 'kxr',\n pcr: 'adx',\n pmc: 'huw',\n pmk: 'crr',\n pmu: 'phr',\n ppa: 'bfy',\n ppr: 'lcq',\n prp: 'gu',\n pry: 'prt',\n puz: 'pub',\n sca: 'hle',\n skk: 'oyb',\n smd: 'kmb',\n snb: 'iba',\n szd: 'umi',\n tdu: 'dtp',\n thc: 'tpo',\n thw: 'ola',\n thx: 'oyb',\n tie: 'ras',\n tkk: 'twm',\n tlw: 'weo',\n tmk: 'tdg',\n tmp: 'tyj',\n tne: 'kak',\n tnf: 'prs',\n tpw: 'tpn',\n tsf: 'taj',\n uok: 'ema',\n xba: 'cax',\n xia: 'acn',\n xkh: 'waw',\n xrq: 'dmw',\n xss: 'zko',\n ybd: 'rki',\n yma: 'lrr',\n ymt: 'mtm',\n yos: 'zom',\n yuu: 'yug',\n zir: 'scv',\n zkb: 'kjh',\n};\n\nexport const EXTLANG_PREFIXES: Record<string, string> = {\n aao: 'ar',\n abh: 'ar',\n abv: 'ar',\n acm: 'ar',\n acq: 'ar',\n acw: 'ar',\n acx: 'ar',\n acy: 'ar',\n adf: 'ar',\n ads: 'sgn',\n aeb: 'ar',\n aec: 'ar',\n aed: 'sgn',\n aen: 'sgn',\n afb: 'ar',\n afg: 'sgn',\n ajs: 'sgn',\n apc: 'ar',\n apd: 'ar',\n arb: 'ar',\n arq: 'ar',\n ars: 'ar',\n ary: 'ar',\n arz: 'ar',\n ase: 'sgn',\n asf: 'sgn',\n asp: 'sgn',\n asq: 'sgn',\n asw: 'sgn',\n auz: 'ar',\n avl: 'ar',\n ayh: 'ar',\n ayl: 'ar',\n ayn: 'ar',\n ayp: 'ar',\n bfi: 'sgn',\n bfk: 'sgn',\n bjn: 'ms',\n bog: 'sgn',\n bqn: 'sgn',\n bqy: 'sgn',\n btj: 'ms',\n bve: 'ms',\n bvl: 'sgn',\n bvu: 'ms',\n bzs: 'sgn',\n cdo: 'zh',\n cds: 'sgn',\n cjy: 'zh',\n cmn: 'zh',\n cnp: 'zh',\n coa: 'ms',\n cpx: 'zh',\n csc: 'sgn',\n csd: 'sgn',\n cse: 'sgn',\n csf: 'sgn',\n csg: 'sgn',\n csl: 'sgn',\n csn: 'sgn',\n csp: 'zh',\n csq: 'sgn',\n csr: 'sgn',\n csx: 'sgn',\n czh: 'zh',\n czo: 'zh',\n doq: 'sgn',\n dse: 'sgn',\n dsl: 'sgn',\n dsz: 'sgn',\n dup: 'ms',\n ecs: 'sgn',\n ehs: 'sgn',\n esl: 'sgn',\n esn: 'sgn',\n eso: 'sgn',\n eth: 'sgn',\n fcs: 'sgn',\n fse: 'sgn',\n fsl: 'sgn',\n fss: 'sgn',\n gan: 'zh',\n gds: 'sgn',\n gom: 'kok',\n gse: 'sgn',\n gsg: 'sgn',\n gsm: 'sgn',\n gss: 'sgn',\n gus: 'sgn',\n hab: 'sgn',\n haf: 'sgn',\n hak: 'zh',\n hds: 'sgn',\n hji: 'ms',\n hks: 'sgn',\n hnm: 'zh',\n hos: 'sgn',\n hps: 'sgn',\n hsh: 'sgn',\n hsl: 'sgn',\n hsn: 'zh',\n icl: 'sgn',\n iks: 'sgn',\n ils: 'sgn',\n inl: 'sgn',\n ins: 'sgn',\n ise: 'sgn',\n isg: 'sgn',\n isr: 'sgn',\n jak: 'ms',\n jax: 'ms',\n jcs: 'sgn',\n jhs: 'sgn',\n jks: 'sgn',\n jls: 'sgn',\n jos: 'sgn',\n jsl: 'sgn',\n jus: 'sgn',\n kgi: 'sgn',\n knn: 'kok',\n kvb: 'ms',\n kvk: 'sgn',\n kvr: 'ms',\n kxd: 'ms',\n lbs: 'sgn',\n lce: 'ms',\n lcf: 'ms',\n lgs: 'sgn',\n liw: 'ms',\n lls: 'sgn',\n lsb: 'sgn',\n lsc: 'sgn',\n lsl: 'sgn',\n lsn: 'sgn',\n lso: 'sgn',\n lsp: 'sgn',\n lst: 'sgn',\n lsv: 'sgn',\n lsw: 'sgn',\n lsy: 'sgn',\n ltg: 'lv',\n luh: 'zh',\n lvs: 'lv',\n lws: 'sgn',\n lzh: 'zh',\n max: 'ms',\n mdl: 'sgn',\n meo: 'ms',\n mfa: 'ms',\n mfb: 'ms',\n mfs: 'sgn',\n min: 'ms',\n mnp: 'zh',\n mqg: 'ms',\n mre: 'sgn',\n msd: 'sgn',\n msi: 'ms',\n msr: 'sgn',\n mui: 'ms',\n mzc: 'sgn',\n mzg: 'sgn',\n mzy: 'sgn',\n nan: 'zh',\n nbs: 'sgn',\n ncs: 'sgn',\n nsi: 'sgn',\n nsl: 'sgn',\n nsp: 'sgn',\n nsr: 'sgn',\n nzs: 'sgn',\n okl: 'sgn',\n orn: 'ms',\n ors: 'ms',\n pel: 'ms',\n pga: 'ar',\n pgz: 'sgn',\n pks: 'sgn',\n prl: 'sgn',\n prz: 'sgn',\n psc: 'sgn',\n psd: 'sgn',\n pse: 'ms',\n psg: 'sgn',\n psl: 'sgn',\n pso: 'sgn',\n psp: 'sgn',\n psr: 'sgn',\n pys: 'sgn',\n rib: 'sgn',\n rms: 'sgn',\n rnb: 'sgn',\n rsl: 'sgn',\n rsm: 'sgn',\n rsn: 'sgn',\n sdl: 'sgn',\n sfb: 'sgn',\n sfs: 'sgn',\n sgg: 'sgn',\n sgx: 'sgn',\n shu: 'ar',\n sjc: 'zh',\n slf: 'sgn',\n sls: 'sgn',\n sqk: 'sgn',\n sqs: 'sgn',\n sqx: 'sgn',\n ssh: 'ar',\n ssp: 'sgn',\n ssr: 'sgn',\n svk: 'sgn',\n swc: 'sw',\n swh: 'sw',\n swl: 'sgn',\n syy: 'sgn',\n szs: 'sgn',\n tmw: 'ms',\n tse: 'sgn',\n tsm: 'sgn',\n tsq: 'sgn',\n tss: 'sgn',\n tsy: 'sgn',\n tza: 'sgn',\n ugn: 'sgn',\n ugy: 'sgn',\n ukl: 'sgn',\n uks: 'sgn',\n urk: 'ms',\n uzn: 'uz',\n uzs: 'uz',\n vgt: 'sgn',\n vkk: 'ms',\n vkt: 'ms',\n vsi: 'sgn',\n vsl: 'sgn',\n vsv: 'sgn',\n wbs: 'sgn',\n wuu: 'zh',\n xki: 'sgn',\n xml: 'sgn',\n xmm: 'ms',\n xms: 'sgn',\n ygs: 'sgn',\n yhs: 'sgn',\n ysl: 'sgn',\n ysm: 'sgn',\n yue: 'zh',\n zib: 'sgn',\n zlm: 'ms',\n zmi: 'ms',\n zsl: 'sgn',\n zsm: 'ms',\n};\n\nexport const SUPPRESS_SCRIPTS: Record<string, string> = {\n ab: 'Cyrl',\n af: 'Latn',\n am: 'Ethi',\n ar: 'Arab',\n as: 'Beng',\n ay: 'Latn',\n be: 'Cyrl',\n bg: 'Cyrl',\n bn: 'Beng',\n bs: 'Latn',\n ca: 'Latn',\n ch: 'Latn',\n cs: 'Latn',\n cy: 'Latn',\n da: 'Latn',\n de: 'Latn',\n dsb: 'Latn',\n dv: 'Thaa',\n dz: 'Tibt',\n el: 'Grek',\n en: 'Latn',\n eo: 'Latn',\n es: 'Latn',\n et: 'Latn',\n eu: 'Latn',\n fa: 'Arab',\n fi: 'Latn',\n fj: 'Latn',\n fo: 'Latn',\n fr: 'Latn',\n frr: 'Latn',\n frs: 'Latn',\n fy: 'Latn',\n ga: 'Latn',\n gl: 'Latn',\n gn: 'Latn',\n gsw: 'Latn',\n gu: 'Gujr',\n gv: 'Latn',\n he: 'Hebr',\n hi: 'Deva',\n hr: 'Latn',\n hsb: 'Latn',\n ht: 'Latn',\n hu: 'Latn',\n hy: 'Armn',\n id: 'Latn',\n is: 'Latn',\n it: 'Latn',\n ja: 'Jpan',\n ka: 'Geor',\n kk: 'Cyrl',\n kl: 'Latn',\n km: 'Khmr',\n kn: 'Knda',\n ko: 'Kore',\n kok: 'Deva',\n la: 'Latn',\n lb: 'Latn',\n ln: 'Latn',\n lo: 'Laoo',\n lt: 'Latn',\n lv: 'Latn',\n mai: 'Deva',\n men: 'Latn',\n mg: 'Latn',\n mh: 'Latn',\n mk: 'Cyrl',\n ml: 'Mlym',\n mr: 'Deva',\n ms: 'Latn',\n mt: 'Latn',\n my: 'Mymr',\n na: 'Latn',\n nb: 'Latn',\n nd: 'Latn',\n nds: 'Latn',\n ne: 'Deva',\n niu: 'Latn',\n nl: 'Latn',\n nn: 'Latn',\n no: 'Latn',\n nqo: 'Nkoo',\n nr: 'Latn',\n nso: 'Latn',\n ny: 'Latn',\n om: 'Latn',\n or: 'Orya',\n pa: 'Guru',\n pl: 'Latn',\n ps: 'Arab',\n pt: 'Latn',\n qu: 'Latn',\n rm: 'Latn',\n rn: 'Latn',\n ro: 'Latn',\n ru: 'Cyrl',\n rw: 'Latn',\n sg: 'Latn',\n si: 'Sinh',\n sk: 'Latn',\n sl: 'Latn',\n sm: 'Latn',\n so: 'Latn',\n sq: 'Latn',\n ss: 'Latn',\n st: 'Latn',\n sv: 'Latn',\n sw: 'Latn',\n ta: 'Taml',\n te: 'Telu',\n tem: 'Latn',\n th: 'Thai',\n ti: 'Ethi',\n tkl: 'Latn',\n tl: 'Latn',\n tmh: 'Latn',\n tn: 'Latn',\n to: 'Latn',\n tpi: 'Latn',\n tr: 'Latn',\n ts: 'Latn',\n tvl: 'Latn',\n uk: 'Cyrl',\n ur: 'Arab',\n ve: 'Latn',\n vi: 'Latn',\n xh: 'Latn',\n yi: 'Hebr',\n zbl: 'Blis',\n zu: 'Latn',\n};\n\nexport const DEPRECATED_REGIONS: Record<string, string> = {\n BU: 'MM',\n DD: 'DE',\n FX: 'FR',\n TP: 'TL',\n YD: 'YE',\n ZR: 'CD',\n};\n\nexport const DEPRECATED_VARIANTS: Record<string, string> = {\n heploc: 'alalc97',\n};\n\n// Redundant tags with Preferred-Value (RFC 5646 §4.5)\n// These are well-formed langtags that have a simpler preferred form.\n// The zh-* entries are handled by extlang promotion and excluded here.\nexport const REDUNDANT_PREFERRED: Record<string, string> = {\n 'sgn-BR': 'bzs',\n 'sgn-CO': 'csn',\n 'sgn-DE': 'gsg',\n 'sgn-DK': 'dsl',\n 'sgn-ES': 'ssp',\n 'sgn-FR': 'fsl',\n 'sgn-GB': 'bfi',\n 'sgn-GR': 'gss',\n 'sgn-IE': 'isg',\n 'sgn-IT': 'ise',\n 'sgn-JP': 'jsl',\n 'sgn-MX': 'mfs',\n 'sgn-NI': 'ncs',\n 'sgn-NL': 'dse',\n 'sgn-NO': 'nsl',\n 'sgn-PT': 'psr',\n 'sgn-SE': 'swl',\n 'sgn-US': 'ase',\n 'sgn-ZA': 'sfs',\n};\n\n// Grandfathered tags with Preferred-Value (RFC 5646 §4.5)\n// Tags without preferred values (i-default, i-enochian, i-mingo,\n// cel-gaulish, zh-min) are not included.\nexport const GRANDFATHERED_PREFERRED: Record<string, string> = {\n 'art-lojban': 'jbo',\n 'en-gb-oed': 'en-GB-oxendict',\n 'i-ami': 'ami',\n 'i-bnn': 'bnn',\n 'i-hak': 'hak',\n 'i-klingon': 'tlh',\n 'i-lux': 'lb',\n 'i-navajo': 'nv',\n 'i-pwn': 'pwn',\n 'i-tao': 'tao',\n 'i-tay': 'tay',\n 'i-tsu': 'tsu',\n 'no-bok': 'nb',\n 'no-nyn': 'nn',\n 'sgn-be-fr': 'sfb',\n 'sgn-be-nl': 'vgt',\n 'sgn-ch-de': 'sgg',\n 'zh-guoyu': 'cmn',\n 'zh-hakka': 'hak',\n 'zh-min-nan': 'nan',\n 'zh-xiang': 'hsn',\n};\n","// RFC 5646 §4.5 — Canonicalization of Language Tags (preferred values, suppress-script)\n// https://www.rfc-editor.org/rfc/rfc5646#section-4.5\n\nimport type { BCP47Tag } from '../../types';\nimport { parse } from '../parse/parse';\nimport { stringify } from '../stringify/stringify';\nimport {\n DEPRECATED_LANGUAGES,\n DEPRECATED_REGIONS,\n DEPRECATED_VARIANTS,\n EXTLANG_PREFIXES,\n GRANDFATHERED_PREFERRED,\n REDUNDANT_PREFERRED,\n SUPPRESS_SCRIPTS,\n} from '../../language-subtag-registry';\n\nfunction canonicalizeTag(tag: BCP47Tag): BCP47Tag {\n if (tag.type !== 'langtag') {\n return tag;\n }\n\n let language = tag.langtag.language;\n let extlang: ReadonlyArray<string> = tag.langtag.extlang;\n let script = tag.langtag.script;\n let region = tag.langtag.region;\n\n const preferred = DEPRECATED_LANGUAGES[language];\n if (preferred) {\n language = preferred;\n }\n\n if (extlang.length > 0) {\n const prefix = EXTLANG_PREFIXES[extlang[0]!];\n if (prefix && prefix === language) {\n language = extlang[0]!;\n extlang = extlang.slice(1);\n }\n }\n\n if (script) {\n const suppressed = SUPPRESS_SCRIPTS[language];\n if (suppressed && suppressed === script) {\n script = null;\n }\n }\n\n if (region) {\n const preferredRegion = DEPRECATED_REGIONS[region];\n if (preferredRegion) {\n region = preferredRegion;\n }\n }\n\n if (region) {\n const redundantKey = `${language}-${region}`;\n const redundant = REDUNDANT_PREFERRED[redundantKey];\n if (redundant) {\n language = redundant;\n extlang = [];\n region = null;\n }\n }\n\n const variant = tag.langtag.variant.map((subtag) => {\n const preferredVariant = DEPRECATED_VARIANTS[subtag];\n return preferredVariant ?? subtag;\n });\n\n const canonicalizedExtensions = tag.langtag.extension.map((extension) => {\n if (extension.singleton === 'u') {\n return canonicalizeUExtension(extension);\n }\n if (extension.singleton === 't') {\n return canonicalizeTExtension(extension);\n }\n return extension;\n });\n\n const sorted = canonicalizedExtensions.length > 1\n ? [...canonicalizedExtensions].sort((left, right) => {\n if (left.singleton < right.singleton) {\n return -1;\n }\n if (left.singleton > right.singleton) {\n return 1;\n }\n return 0;\n })\n : canonicalizedExtensions;\n\n return {\n type: 'langtag',\n langtag: {\n ...tag.langtag,\n language,\n extlang,\n script,\n region,\n variant,\n extension: sorted,\n },\n };\n}\n\nconst UKEY_RE = /^[a-z\\d][a-z]$/;\nconst TKEY_RE = /^[a-z]\\d$/;\n\nfunction canonicalizeUExtension(extension: { readonly singleton: string; readonly subtags: ReadonlyArray<string> }): { readonly singleton: string; readonly subtags: ReadonlyArray<string> } {\n const attributes: Array<string> = [];\n const keywords: Array<{ key: string; values: Array<string> }> = [];\n let currentKey: string | null = null;\n let currentValues: Array<string> = [];\n\n for (const subtag of extension.subtags) {\n if (subtag.length === 2 && UKEY_RE.test(subtag)) {\n if (currentKey) {\n keywords.push({ key: currentKey, values: currentValues });\n }\n currentKey = subtag;\n currentValues = [];\n } else if (currentKey) {\n currentValues.push(subtag);\n } else {\n attributes.push(subtag);\n }\n }\n\n if (currentKey) {\n keywords.push({ key: currentKey, values: currentValues });\n }\n\n keywords.sort((left, right) => {\n if (left.key < right.key) {\n return -1;\n }\n if (left.key > right.key) {\n return 1;\n }\n return 0;\n });\n\n attributes.sort();\n\n const subtags: Array<string> = [...attributes];\n for (const keyword of keywords) {\n subtags.push(keyword.key, ...keyword.values);\n }\n\n return { singleton: extension.singleton, subtags };\n}\n\nfunction canonicalizeTExtension(extension: { readonly singleton: string; readonly subtags: ReadonlyArray<string> }): { readonly singleton: string; readonly subtags: ReadonlyArray<string> } {\n const sourceParts: Array<string> = [];\n const fields: Array<{ key: string; values: Array<string> }> = [];\n let currentKey: string | null = null;\n let currentValues: Array<string> = [];\n let inSource = true;\n\n for (const subtag of extension.subtags) {\n if (TKEY_RE.test(subtag)) {\n inSource = false;\n if (currentKey) {\n fields.push({ key: currentKey, values: currentValues });\n }\n currentKey = subtag;\n currentValues = [];\n } else if (inSource) {\n sourceParts.push(subtag);\n } else {\n currentValues.push(subtag);\n }\n }\n\n if (currentKey) {\n fields.push({ key: currentKey, values: currentValues });\n }\n\n fields.sort((left, right) => {\n if (left.key < right.key) {\n return -1;\n }\n if (left.key > right.key) {\n return 1;\n }\n return 0;\n });\n\n const subtags: Array<string> = [...sourceParts];\n for (const field of fields) {\n subtags.push(field.key, ...field.values);\n }\n\n return { singleton: extension.singleton, subtags };\n}\n\n/** Canonicalize a BCP 47 tag per RFC 5646 §4.5 (case, deprecated subtags, suppress-script, extlang). Returns `null` for invalid input. */\nexport function canonicalize(tag: string): string | null {\n const parsed = parse(tag);\n if (!parsed) {\n return null;\n }\n\n if (parsed.type === 'grandfathered') {\n const preferred = GRANDFATHERED_PREFERRED[parsed.grandfathered.tag.toLowerCase()];\n if (preferred) {\n return canonicalize(preferred);\n }\n return stringify(parsed);\n }\n\n return stringify(canonicalizeTag(parsed));\n}\n","// RFC 4647 §3.3.2 — Extended Filtering\n// https://www.rfc-editor.org/rfc/rfc4647#section-3.3.2\n\n\nfunction matchSubtags(rangeSubtags: ReadonlyArray<string>, tagSubtags: ReadonlyArray<string>): boolean {\n let rangeIndex = 0;\n let tagIndex = 0;\n\n if (rangeSubtags[0] !== '*' && rangeSubtags[0]!.toLowerCase() !== tagSubtags[0]!.toLowerCase()) {\n return false;\n }\n rangeIndex++;\n tagIndex++;\n\n while (rangeIndex < rangeSubtags.length) {\n const rangeSubtag = rangeSubtags[rangeIndex]!;\n\n if (rangeSubtag === '*') {\n rangeIndex++;\n continue;\n }\n\n if (tagIndex >= tagSubtags.length) {\n return false;\n }\n\n const tagSubtag = tagSubtags[tagIndex]!;\n\n if (rangeSubtag.toLowerCase() === tagSubtag.toLowerCase()) {\n rangeIndex++;\n tagIndex++;\n continue;\n }\n\n if (tagSubtag.length === 1) {\n return false;\n }\n\n tagIndex++;\n }\n\n return true;\n}\n\n/** Find all matching tags via Extended Filtering per RFC 4647 §3.3.2. Supports `*` wildcards. */\nexport function filter(\n tags: ReadonlyArray<string>,\n patterns: ReadonlyArray<string> | string,\n): Array<string> {\n const rangeList = typeof patterns === 'string' ? [patterns] : patterns;\n const results: Array<string> = [];\n const seen = new Set<string>();\n\n for (const range of rangeList) {\n if (range === '*') {\n for (const tag of tags) {\n const lower = tag.toLowerCase();\n if (!seen.has(lower)) {\n seen.add(lower);\n results.push(tag);\n }\n }\n continue;\n }\n\n const rangeSubtags = range.split('-');\n for (const tag of tags) {\n const tagLower = tag.toLowerCase();\n if (seen.has(tagLower)) {\n continue;\n }\n\n if (matchSubtags(rangeSubtags, tag.split('-'))) {\n seen.add(tagLower);\n results.push(tag);\n }\n }\n }\n\n return results;\n}\n","// RFC 4647 §3.4 — Lookup\n// https://www.rfc-editor.org/rfc/rfc4647#section-3.4\n\nfunction truncate(subtags: Array<string>): Array<string> {\n subtags.pop();\n while (subtags.length > 0 && subtags[subtags.length - 1]!.length === 1) {\n subtags.pop();\n }\n return subtags;\n}\n\n/** Find the single best matching tag via Lookup per RFC 4647 §3.4. Returns first match, `defaultValue`, or `null`. */\nexport function lookup(\n tags: ReadonlyArray<string>,\n preferences: ReadonlyArray<string> | string,\n defaultValue?: string,\n): string | null {\n const rangeList = typeof preferences === 'string' ? [preferences] : preferences;\n const tagMap = new Map<string, string>();\n for (const tag of tags) {\n const lower = tag.toLowerCase();\n if (!tagMap.has(lower)) {\n tagMap.set(lower, tag);\n }\n }\n\n for (const range of rangeList) {\n if (range === '*') {\n continue;\n }\n\n let subtags = range.split('-');\n while (subtags.length > 0) {\n const candidate = subtags.join('-').toLowerCase();\n const matched = tagMap.get(candidate);\n if (matched) {\n return matched;\n }\n subtags = truncate(subtags);\n }\n }\n\n return defaultValue ?? null;\n}\n","// RFC 6067 — BCP 47 Extension U (Unicode Locale Extensions)\n// RFC 6497 — BCP 47 Extension T (Transformed Content)\n// https://www.rfc-editor.org/rfc/rfc6067\n// https://www.rfc-editor.org/rfc/rfc6497\n\nimport type { BCP47Tag } from '../../types';\n\nexport interface BCP47ExtensionU {\n readonly attributes: ReadonlyArray<string>;\n readonly keywords: Record<string, string>;\n}\n\nexport interface BCP47ExtensionT {\n readonly source: string | null;\n readonly fields: Record<string, string>;\n}\n\nconst TKEY_RE = /^[a-z]\\d$/i;\nconst UKEY_RE = /^[a-z\\d][a-z]$/i;\n\nfunction isUnicodeKey(subtag: string): boolean {\n return subtag.length === 2 && UKEY_RE.test(subtag);\n}\n\n/** Extract Unicode locale attributes and keywords from the `u` extension (RFC 6067). Returns `null` if absent. */\nexport function extensionU(tag: BCP47Tag): BCP47ExtensionU | null {\n if (tag.type !== 'langtag') {\n return null;\n }\n\n const uExtension = tag.langtag.extension.find(\n (entry) => entry.singleton === 'u'\n );\n if (!uExtension) {\n return null;\n }\n\n const attributes: Array<string> = [];\n const attributesSeen = new Set<string>();\n const keywords: Record<string, string> = {};\n let currentKey: string | null = null;\n let currentValues: Array<string> = [];\n\n for (const subtag of uExtension.subtags) {\n if (isUnicodeKey(subtag)) {\n if (currentKey && !(currentKey in keywords)) {\n keywords[currentKey] = currentValues.join('-');\n }\n currentKey = subtag;\n currentValues = [];\n } else if (currentKey) {\n currentValues.push(subtag);\n } else if (!attributesSeen.has(subtag)) {\n attributesSeen.add(subtag);\n attributes.push(subtag);\n }\n }\n\n if (currentKey && !(currentKey in keywords)) {\n keywords[currentKey] = currentValues.join('-');\n }\n\n return { attributes, keywords };\n}\n\n/** Extract transformed content data from the `t` extension (RFC 6497). Returns `null` if absent. */\nexport function extensionT(tag: BCP47Tag): BCP47ExtensionT | null {\n if (tag.type !== 'langtag') {\n return null;\n }\n\n const tExtension = tag.langtag.extension.find(\n (entry) => entry.singleton === 't'\n );\n if (!tExtension) {\n return null;\n }\n\n const sourceParts: Array<string> = [];\n const fields: Record<string, string> = {};\n let currentKey: string | null = null;\n let currentValues: Array<string> = [];\n let inSource = true;\n\n for (const subtag of tExtension.subtags) {\n if (TKEY_RE.test(subtag)) {\n inSource = false;\n if (currentKey && !(currentKey in fields)) {\n fields[currentKey] = currentValues.join('-');\n }\n currentKey = subtag;\n currentValues = [];\n } else if (inSource) {\n sourceParts.push(subtag);\n } else {\n currentValues.push(subtag);\n }\n }\n\n if (currentKey && !(currentKey in fields)) {\n fields[currentKey] = currentValues.join('-');\n }\n\n return {\n source: sourceParts.length > 0 ? sourceParts.join('-') : null,\n fields,\n };\n}\n","// CLDR BCP 47 Unicode locale extension keys\n// Source: https://github.com/unicode-org/cldr/tree/main/common/bcp47\nexport const UNICODE_LOCALE_KEYS = {\n ca: 'Calendar',\n cf: 'Currency format',\n co: 'Collation',\n cu: 'Currency',\n dx: 'Dictionary break exclusions',\n em: 'Emoji presentation',\n fw: 'First day of week',\n hc: 'Hour cycle',\n ka: 'Collation alternate handling',\n kb: 'Collation backward sorting',\n kc: 'Collation case level',\n kf: 'Collation case first',\n kk: 'Collation normalization',\n kn: 'Collation numeric ordering',\n kr: 'Collation reorder',\n ks: 'Collation strength',\n kv: 'Collation max variable',\n lb: 'Line break',\n lw: 'Word break',\n ms: 'Measurement system',\n mu: 'Measurement unit',\n nu: 'Numbering system',\n rg: 'Region override',\n sd: 'Subdivision',\n ss: 'Sentence break suppressions',\n tz: 'Timezone',\n va: 'Common variant',\n} as const satisfies Record<string, string>;\n\n// CLDR BCP 47 transformed content extension keys\n// Source: https://github.com/unicode-org/cldr/tree/main/common/bcp47\nexport const TRANSFORM_KEYS = {\n d0: 'Transform destination',\n h0: 'Hybrid locale',\n i0: 'Input method',\n k0: 'Keyboard',\n m0: 'Transform mechanism',\n s0: 'Transform source',\n t0: 'Machine translation',\n x0: 'Private use transform',\n} as const satisfies Record<string, string>;\n","// RFC 9110 §12.5.4 — Accept-Language (weight: §12.4.2)\n// https://www.rfc-editor.org/rfc/rfc9110#section-12.5.4\n\nexport interface AcceptLanguage {\n readonly tag: string;\n readonly quality: number;\n}\n\n// RFC 9110 §12.4.2: qvalue = ( \"0\" [ \".\" 0*3DIGIT ] ) / ( \"1\" [ \".\" 0*3(\"0\") ] )\nconst QUALITY_RE = /;\\s*q=(0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)(?:\\s*$|\\s*,|\\s*;)/i;\nconst HAS_QUALITY_PARAM_RE = /;\\s*q=/i;\nconst SEMICOLON_PARAMS_RE = /;.*/;\nconst LANGUAGE_RANGE_RE = /^(?:\\*|[a-z]{1,8}(?:-[a-z\\d]{1,8})*)$/i;\n\n/** Parse an `Accept-Language` header into entries sorted by quality descending (RFC 9110 §12.5.4). */\nexport function acceptLanguage(header: string): ReadonlyArray<AcceptLanguage> {\n if (!header.trim()) {\n return [];\n }\n\n const entries: Array<AcceptLanguage> = [];\n\n for (const segment of header.split(',')) {\n const trimmed = segment.trim();\n if (!trimmed) {\n continue;\n }\n\n const tag = trimmed.replace(SEMICOLON_PARAMS_RE, '').trim();\n if (!tag || !LANGUAGE_RANGE_RE.test(tag)) {\n continue;\n }\n\n const qualityMatch = QUALITY_RE.exec(trimmed);\n if (!qualityMatch && HAS_QUALITY_PARAM_RE.test(trimmed)) {\n continue;\n }\n const quality = qualityMatch ? parseFloat(qualityMatch[1]!) : 1.0;\n\n entries.push({ tag, quality });\n }\n\n entries.sort((left, right) => right.quality - left.quality);\n\n return entries;\n}\n"],"mappings":"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K;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACN;AAED,MAAa,mBAA2C;CACtD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACN;AAED,MAAa,mBAA2C;CACtD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,IAAI;CA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"}
@@ -0,0 +1,129 @@
1
+ //#region src/types.d.ts
2
+ interface BCP47Extension {
3
+ readonly singleton: string;
4
+ readonly subtags: ReadonlyArray<string>;
5
+ }
6
+ interface BCP47Langtag {
7
+ readonly language: string;
8
+ readonly extlang: ReadonlyArray<string>;
9
+ readonly script: string | null;
10
+ readonly region: string | null;
11
+ readonly variant: ReadonlyArray<string>;
12
+ readonly extension: ReadonlyArray<BCP47Extension>;
13
+ readonly privateuse: ReadonlyArray<string>;
14
+ }
15
+ type BCP47Grandfathered = {
16
+ readonly type: 'irregular';
17
+ readonly tag: string;
18
+ } | {
19
+ readonly type: 'regular';
20
+ readonly tag: string;
21
+ };
22
+ type BCP47Tag = {
23
+ readonly type: 'langtag';
24
+ readonly langtag: BCP47Langtag;
25
+ } | {
26
+ readonly type: 'privateuse';
27
+ readonly privateuse: ReadonlyArray<string>;
28
+ } | {
29
+ readonly type: 'grandfathered';
30
+ readonly grandfathered: BCP47Grandfathered;
31
+ };
32
+ //#endregion
33
+ //#region src/operators/parse/parse.d.ts
34
+ /** Parse a BCP 47 language tag string into a structured object. Returns `null` for invalid input. */
35
+ declare function parse(tag: string): BCP47Tag | null;
36
+ //#endregion
37
+ //#region src/operators/stringify/stringify.d.ts
38
+ /** Convert a parsed `BCP47Tag` object back into a well-formed language tag string. */
39
+ declare function stringify(tag: BCP47Tag): string;
40
+ //#endregion
41
+ //#region src/operators/langtag/langtag.d.ts
42
+ interface LangtagOptions {
43
+ readonly extlang?: ReadonlyArray<string>;
44
+ readonly script?: string;
45
+ readonly region?: string;
46
+ readonly variant?: ReadonlyArray<string>;
47
+ readonly extension?: ReadonlyArray<BCP47Extension>;
48
+ readonly privateuse?: ReadonlyArray<string>;
49
+ }
50
+ /** Build a `BCP47Tag` from parts with sensible defaults. Throws `RangeError` on invalid input. */
51
+ declare function langtag(language: string, options?: LangtagOptions): BCP47Tag;
52
+ //#endregion
53
+ //#region src/operators/canonicalize/canonicalize.d.ts
54
+ /** Canonicalize a BCP 47 tag per RFC 5646 §4.5 (case, deprecated subtags, suppress-script, extlang). Returns `null` for invalid input. */
55
+ declare function canonicalize(tag: string): string | null;
56
+ //#endregion
57
+ //#region src/operators/filter/filter.d.ts
58
+ /** Find all matching tags via Extended Filtering per RFC 4647 §3.3.2. Supports `*` wildcards. */
59
+ declare function filter(tags: ReadonlyArray<string>, patterns: ReadonlyArray<string> | string): Array<string>;
60
+ //#endregion
61
+ //#region src/operators/lookup/lookup.d.ts
62
+ /** Find the single best matching tag via Lookup per RFC 4647 §3.4. Returns first match, `defaultValue`, or `null`. */
63
+ declare function lookup(tags: ReadonlyArray<string>, preferences: ReadonlyArray<string> | string, defaultValue?: string): string | null;
64
+ //#endregion
65
+ //#region src/operators/extension/extension.d.ts
66
+ interface BCP47ExtensionU {
67
+ readonly attributes: ReadonlyArray<string>;
68
+ readonly keywords: Record<string, string>;
69
+ }
70
+ interface BCP47ExtensionT {
71
+ readonly source: string | null;
72
+ readonly fields: Record<string, string>;
73
+ }
74
+ /** Extract Unicode locale attributes and keywords from the `u` extension (RFC 6067). Returns `null` if absent. */
75
+ declare function extensionU(tag: BCP47Tag): BCP47ExtensionU | null;
76
+ /** Extract transformed content data from the `t` extension (RFC 6497). Returns `null` if absent. */
77
+ declare function extensionT(tag: BCP47Tag): BCP47ExtensionT | null;
78
+ //#endregion
79
+ //#region src/operators/extension/cldr-keys.d.ts
80
+ declare const UNICODE_LOCALE_KEYS: {
81
+ readonly ca: "Calendar";
82
+ readonly cf: "Currency format";
83
+ readonly co: "Collation";
84
+ readonly cu: "Currency";
85
+ readonly dx: "Dictionary break exclusions";
86
+ readonly em: "Emoji presentation";
87
+ readonly fw: "First day of week";
88
+ readonly hc: "Hour cycle";
89
+ readonly ka: "Collation alternate handling";
90
+ readonly kb: "Collation backward sorting";
91
+ readonly kc: "Collation case level";
92
+ readonly kf: "Collation case first";
93
+ readonly kk: "Collation normalization";
94
+ readonly kn: "Collation numeric ordering";
95
+ readonly kr: "Collation reorder";
96
+ readonly ks: "Collation strength";
97
+ readonly kv: "Collation max variable";
98
+ readonly lb: "Line break";
99
+ readonly lw: "Word break";
100
+ readonly ms: "Measurement system";
101
+ readonly mu: "Measurement unit";
102
+ readonly nu: "Numbering system";
103
+ readonly rg: "Region override";
104
+ readonly sd: "Subdivision";
105
+ readonly ss: "Sentence break suppressions";
106
+ readonly tz: "Timezone";
107
+ readonly va: "Common variant";
108
+ };
109
+ declare const TRANSFORM_KEYS: {
110
+ readonly d0: "Transform destination";
111
+ readonly h0: "Hybrid locale";
112
+ readonly i0: "Input method";
113
+ readonly k0: "Keyboard";
114
+ readonly m0: "Transform mechanism";
115
+ readonly s0: "Transform source";
116
+ readonly t0: "Machine translation";
117
+ readonly x0: "Private use transform";
118
+ };
119
+ //#endregion
120
+ //#region src/operators/accept-language/accept-language.d.ts
121
+ interface AcceptLanguage {
122
+ readonly tag: string;
123
+ readonly quality: number;
124
+ }
125
+ /** Parse an `Accept-Language` header into entries sorted by quality descending (RFC 9110 §12.5.4). */
126
+ declare function acceptLanguage(header: string): ReadonlyArray<AcceptLanguage>;
127
+ //#endregion
128
+ export { type AcceptLanguage, type BCP47Extension, type BCP47ExtensionT, type BCP47ExtensionU, type BCP47Grandfathered, type BCP47Langtag, type BCP47Tag, type LangtagOptions, TRANSFORM_KEYS, UNICODE_LOCALE_KEYS, acceptLanguage, canonicalize, extensionT, extensionU, filter, langtag, lookup, parse, stringify };
129
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,129 @@
1
+ //#region src/types.d.ts
2
+ interface BCP47Extension {
3
+ readonly singleton: string;
4
+ readonly subtags: ReadonlyArray<string>;
5
+ }
6
+ interface BCP47Langtag {
7
+ readonly language: string;
8
+ readonly extlang: ReadonlyArray<string>;
9
+ readonly script: string | null;
10
+ readonly region: string | null;
11
+ readonly variant: ReadonlyArray<string>;
12
+ readonly extension: ReadonlyArray<BCP47Extension>;
13
+ readonly privateuse: ReadonlyArray<string>;
14
+ }
15
+ type BCP47Grandfathered = {
16
+ readonly type: 'irregular';
17
+ readonly tag: string;
18
+ } | {
19
+ readonly type: 'regular';
20
+ readonly tag: string;
21
+ };
22
+ type BCP47Tag = {
23
+ readonly type: 'langtag';
24
+ readonly langtag: BCP47Langtag;
25
+ } | {
26
+ readonly type: 'privateuse';
27
+ readonly privateuse: ReadonlyArray<string>;
28
+ } | {
29
+ readonly type: 'grandfathered';
30
+ readonly grandfathered: BCP47Grandfathered;
31
+ };
32
+ //#endregion
33
+ //#region src/operators/parse/parse.d.ts
34
+ /** Parse a BCP 47 language tag string into a structured object. Returns `null` for invalid input. */
35
+ declare function parse(tag: string): BCP47Tag | null;
36
+ //#endregion
37
+ //#region src/operators/stringify/stringify.d.ts
38
+ /** Convert a parsed `BCP47Tag` object back into a well-formed language tag string. */
39
+ declare function stringify(tag: BCP47Tag): string;
40
+ //#endregion
41
+ //#region src/operators/langtag/langtag.d.ts
42
+ interface LangtagOptions {
43
+ readonly extlang?: ReadonlyArray<string>;
44
+ readonly script?: string;
45
+ readonly region?: string;
46
+ readonly variant?: ReadonlyArray<string>;
47
+ readonly extension?: ReadonlyArray<BCP47Extension>;
48
+ readonly privateuse?: ReadonlyArray<string>;
49
+ }
50
+ /** Build a `BCP47Tag` from parts with sensible defaults. Throws `RangeError` on invalid input. */
51
+ declare function langtag(language: string, options?: LangtagOptions): BCP47Tag;
52
+ //#endregion
53
+ //#region src/operators/canonicalize/canonicalize.d.ts
54
+ /** Canonicalize a BCP 47 tag per RFC 5646 §4.5 (case, deprecated subtags, suppress-script, extlang). Returns `null` for invalid input. */
55
+ declare function canonicalize(tag: string): string | null;
56
+ //#endregion
57
+ //#region src/operators/filter/filter.d.ts
58
+ /** Find all matching tags via Extended Filtering per RFC 4647 §3.3.2. Supports `*` wildcards. */
59
+ declare function filter(tags: ReadonlyArray<string>, patterns: ReadonlyArray<string> | string): Array<string>;
60
+ //#endregion
61
+ //#region src/operators/lookup/lookup.d.ts
62
+ /** Find the single best matching tag via Lookup per RFC 4647 §3.4. Returns first match, `defaultValue`, or `null`. */
63
+ declare function lookup(tags: ReadonlyArray<string>, preferences: ReadonlyArray<string> | string, defaultValue?: string): string | null;
64
+ //#endregion
65
+ //#region src/operators/extension/extension.d.ts
66
+ interface BCP47ExtensionU {
67
+ readonly attributes: ReadonlyArray<string>;
68
+ readonly keywords: Record<string, string>;
69
+ }
70
+ interface BCP47ExtensionT {
71
+ readonly source: string | null;
72
+ readonly fields: Record<string, string>;
73
+ }
74
+ /** Extract Unicode locale attributes and keywords from the `u` extension (RFC 6067). Returns `null` if absent. */
75
+ declare function extensionU(tag: BCP47Tag): BCP47ExtensionU | null;
76
+ /** Extract transformed content data from the `t` extension (RFC 6497). Returns `null` if absent. */
77
+ declare function extensionT(tag: BCP47Tag): BCP47ExtensionT | null;
78
+ //#endregion
79
+ //#region src/operators/extension/cldr-keys.d.ts
80
+ declare const UNICODE_LOCALE_KEYS: {
81
+ readonly ca: "Calendar";
82
+ readonly cf: "Currency format";
83
+ readonly co: "Collation";
84
+ readonly cu: "Currency";
85
+ readonly dx: "Dictionary break exclusions";
86
+ readonly em: "Emoji presentation";
87
+ readonly fw: "First day of week";
88
+ readonly hc: "Hour cycle";
89
+ readonly ka: "Collation alternate handling";
90
+ readonly kb: "Collation backward sorting";
91
+ readonly kc: "Collation case level";
92
+ readonly kf: "Collation case first";
93
+ readonly kk: "Collation normalization";
94
+ readonly kn: "Collation numeric ordering";
95
+ readonly kr: "Collation reorder";
96
+ readonly ks: "Collation strength";
97
+ readonly kv: "Collation max variable";
98
+ readonly lb: "Line break";
99
+ readonly lw: "Word break";
100
+ readonly ms: "Measurement system";
101
+ readonly mu: "Measurement unit";
102
+ readonly nu: "Numbering system";
103
+ readonly rg: "Region override";
104
+ readonly sd: "Subdivision";
105
+ readonly ss: "Sentence break suppressions";
106
+ readonly tz: "Timezone";
107
+ readonly va: "Common variant";
108
+ };
109
+ declare const TRANSFORM_KEYS: {
110
+ readonly d0: "Transform destination";
111
+ readonly h0: "Hybrid locale";
112
+ readonly i0: "Input method";
113
+ readonly k0: "Keyboard";
114
+ readonly m0: "Transform mechanism";
115
+ readonly s0: "Transform source";
116
+ readonly t0: "Machine translation";
117
+ readonly x0: "Private use transform";
118
+ };
119
+ //#endregion
120
+ //#region src/operators/accept-language/accept-language.d.ts
121
+ interface AcceptLanguage {
122
+ readonly tag: string;
123
+ readonly quality: number;
124
+ }
125
+ /** Parse an `Accept-Language` header into entries sorted by quality descending (RFC 9110 §12.5.4). */
126
+ declare function acceptLanguage(header: string): ReadonlyArray<AcceptLanguage>;
127
+ //#endregion
128
+ export { type AcceptLanguage, type BCP47Extension, type BCP47ExtensionT, type BCP47ExtensionU, type BCP47Grandfathered, type BCP47Langtag, type BCP47Tag, type LangtagOptions, TRANSFORM_KEYS, UNICODE_LOCALE_KEYS, acceptLanguage, canonicalize, extensionT, extensionU, filter, langtag, lookup, parse, stringify };
129
+ //# sourceMappingURL=index.d.ts.map