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.js","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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;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,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;CAC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"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "rfc-bcp47",
3
+ "version": "0.0.0",
4
+ "description": "Zero-dependency BCP 47 language tag parser, normalizer and matcher for JavaScript and TypeScript",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "sideEffects": false,
25
+ "keywords": [
26
+ "bcp47",
27
+ "parser",
28
+ "internationalization",
29
+ "i18n",
30
+ "language",
31
+ "locale",
32
+ "language-tag",
33
+ "ietf",
34
+ "rfc4647",
35
+ "rfc5646",
36
+ "normalize",
37
+ "match",
38
+ "filter",
39
+ "lookup",
40
+ "accept-language",
41
+ "wcag"
42
+ ],
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/gagle/node-bcp47.git"
47
+ },
48
+ "homepage": "https://github.com/gagle/node-bcp47#readme",
49
+ "bugs": {
50
+ "url": "https://github.com/gagle/node-bcp47/issues"
51
+ },
52
+ "engines": {
53
+ "node": ">=20"
54
+ },
55
+ "scripts": {
56
+ "build": "tsdown",
57
+ "test": "vitest run",
58
+ "test:watch": "vitest",
59
+ "test:coverage": "vitest run --coverage",
60
+ "lint": "tsc --noEmit",
61
+ "prepare": "husky",
62
+ "dev:pages": "npm run build && cp dist/index.js github-pages/bcp47.js"
63
+ },
64
+ "devDependencies": {
65
+ "@commitlint/cli": "^20.5.0",
66
+ "@commitlint/config-conventional": "^20.5.0",
67
+ "@vitest/coverage-v8": "^3.0.0",
68
+ "husky": "^9.1.7",
69
+ "tsdown": "^0.12.0",
70
+ "typescript": "^5.7.0",
71
+ "vitest": "^3.0.0"
72
+ }
73
+ }