@fgv/ts-bcp47 5.1.0-19 → 5.1.0-20
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.
- package/dist/index.browser.js.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/converters.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/index.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/model.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/validate.js.map +1 -0
- package/dist/packlets/bcp47/common.js.map +1 -0
- package/dist/packlets/bcp47/helpers.js.map +1 -0
- package/dist/packlets/bcp47/index.js.map +1 -0
- package/dist/packlets/bcp47/languageRegistryData.js.map +1 -0
- package/dist/packlets/bcp47/languageTag.js.map +1 -0
- package/dist/packlets/bcp47/languageTagParser.js.map +1 -0
- package/dist/packlets/bcp47/match/chooser.js.map +1 -0
- package/dist/packlets/bcp47/match/common.js.map +1 -0
- package/dist/packlets/bcp47/match/index.js.map +1 -0
- package/dist/packlets/bcp47/match/similarity.js.map +1 -0
- package/dist/packlets/bcp47/normalization/baseNormalizer.js.map +1 -0
- package/dist/packlets/bcp47/normalization/canonicalNormalizer.js.map +1 -0
- package/dist/packlets/bcp47/normalization/common.js.map +1 -0
- package/dist/packlets/bcp47/normalization/index.js.map +1 -0
- package/dist/packlets/bcp47/normalization/normalizeTag.js.map +1 -0
- package/dist/packlets/bcp47/normalization/preferredTagNormalizer.js.map +1 -0
- package/dist/packlets/bcp47/overrides/converters.js.map +1 -0
- package/dist/packlets/bcp47/overrides/defaultRegistries.js.map +1 -0
- package/dist/packlets/bcp47/overrides/index.js.map +1 -0
- package/dist/packlets/bcp47/overrides/model.js.map +1 -0
- package/dist/packlets/bcp47/overrides/overridesRegistry.js.map +1 -0
- package/dist/packlets/bcp47/validation/baseValidator.js.map +1 -0
- package/dist/packlets/bcp47/validation/common.js.map +1 -0
- package/dist/packlets/bcp47/validation/index.js.map +1 -0
- package/dist/packlets/bcp47/validation/isCanonical.js.map +1 -0
- package/dist/packlets/bcp47/validation/isInPreferredForm.js.map +1 -0
- package/dist/packlets/bcp47/validation/isStrictlyValid.js.map +1 -0
- package/dist/packlets/bcp47/validation/isValid.js.map +1 -0
- package/dist/packlets/bcp47/validation/isWellFormed.js.map +1 -0
- package/dist/packlets/bcp47/validation/validateTag.js.map +1 -0
- package/dist/packlets/iana/common/converters.js.map +1 -0
- package/dist/packlets/iana/common/model.js.map +1 -0
- package/dist/packlets/iana/common/registeredItems.js.map +1 -0
- package/dist/packlets/iana/common/utils.js.map +1 -0
- package/dist/packlets/iana/common/validate.js.map +1 -0
- package/dist/packlets/iana/converters.js.map +1 -0
- package/dist/packlets/iana/defaultRegistries.js.map +1 -0
- package/dist/packlets/iana/iana-data-embedded.js.map +1 -0
- package/dist/packlets/iana/index.browser.js.map +1 -0
- package/dist/packlets/iana/index.js.map +1 -0
- package/dist/packlets/iana/jar/converters.js.map +1 -0
- package/dist/packlets/iana/jar/index.js.map +1 -0
- package/dist/packlets/iana/jar/jarConverters.js.map +1 -0
- package/dist/packlets/iana/jar/jarModel.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/converters.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/index.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/model.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/registry/converters.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/registry/index.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/registry/model.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/converters.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/index.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/model.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/tagValidation.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/validate.js.map +1 -0
- package/dist/packlets/iana/jar/model.js.map +1 -0
- package/dist/packlets/iana/language-subtags/common.js.map +1 -0
- package/dist/packlets/iana/language-subtags/converters.js.map +1 -0
- package/dist/packlets/iana/language-subtags/index.browser.js.map +1 -0
- package/dist/packlets/iana/language-subtags/index.js.map +1 -0
- package/dist/packlets/iana/language-subtags/jarConverters.js.map +1 -0
- package/dist/packlets/iana/language-subtags/model.js.map +1 -0
- package/dist/packlets/iana/language-subtags/scope.js.map +1 -0
- package/dist/packlets/iana/language-subtags/subtagRegistry.js.map +1 -0
- package/dist/packlets/iana/language-subtags/validate.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/converters.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/extensionsRegistry.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/extensionsScope.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/index.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/jarConverters.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/model.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/validate.js.map +1 -0
- package/dist/packlets/iana/languageRegistries.js.map +1 -0
- package/dist/packlets/iana/languageRegistriesFileLoader.js.map +1 -0
- package/dist/packlets/iana/languageRegistriesLoader.js.map +1 -0
- package/dist/packlets/iana/model.js.map +1 -0
- package/dist/packlets/iana/validate.js.map +1 -0
- package/dist/packlets/unsd/areas.js.map +1 -0
- package/dist/packlets/unsd/common.js.map +1 -0
- package/dist/packlets/unsd/csv/converters.js.map +1 -0
- package/dist/packlets/unsd/csv/index.js.map +1 -0
- package/dist/packlets/unsd/csv/model.js.map +1 -0
- package/dist/packlets/unsd/defaultRegistries.js.map +1 -0
- package/dist/packlets/unsd/index.js.map +1 -0
- package/dist/packlets/unsd/regionCodes.js.map +1 -0
- package/dist/packlets/unsd/regions.js.map +1 -0
- package/dist/packlets/utils/index.js.map +1 -0
- package/dist/packlets/utils/jsonHelpers.js.map +1 -0
- package/dist/packlets/utils/public.js.map +1 -0
- package/dist/packlets/utils/validationHelpers.js.map +1 -0
- package/lib/index.browser.d.ts.map +1 -0
- package/lib/index.browser.js.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/converters.d.ts.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/converters.js.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/index.d.ts.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/index.js.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/model.d.ts.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/model.js.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/validate.d.ts.map +1 -0
- package/lib/packlets/bcp47/bcp47Subtags/validate.js.map +1 -0
- package/lib/packlets/bcp47/common.d.ts.map +1 -0
- package/lib/packlets/bcp47/common.js.map +1 -0
- package/lib/packlets/bcp47/helpers.d.ts.map +1 -0
- package/lib/packlets/bcp47/helpers.js.map +1 -0
- package/lib/packlets/bcp47/index.d.ts.map +1 -0
- package/lib/packlets/bcp47/index.js.map +1 -0
- package/lib/packlets/bcp47/languageRegistryData.d.ts.map +1 -0
- package/lib/packlets/bcp47/languageRegistryData.js.map +1 -0
- package/lib/packlets/bcp47/languageTag.d.ts.map +1 -0
- package/lib/packlets/bcp47/languageTag.js.map +1 -0
- package/lib/packlets/bcp47/languageTagParser.d.ts.map +1 -0
- package/lib/packlets/bcp47/languageTagParser.js.map +1 -0
- package/lib/packlets/bcp47/match/chooser.d.ts.map +1 -0
- package/lib/packlets/bcp47/match/chooser.js.map +1 -0
- package/lib/packlets/bcp47/match/common.d.ts.map +1 -0
- package/lib/packlets/bcp47/match/common.js.map +1 -0
- package/lib/packlets/bcp47/match/index.d.ts.map +1 -0
- package/lib/packlets/bcp47/match/index.js.map +1 -0
- package/lib/packlets/bcp47/match/similarity.d.ts.map +1 -0
- package/lib/packlets/bcp47/match/similarity.js.map +1 -0
- package/lib/packlets/bcp47/normalization/baseNormalizer.d.ts.map +1 -0
- package/lib/packlets/bcp47/normalization/baseNormalizer.js.map +1 -0
- package/lib/packlets/bcp47/normalization/canonicalNormalizer.d.ts.map +1 -0
- package/lib/packlets/bcp47/normalization/canonicalNormalizer.js.map +1 -0
- package/lib/packlets/bcp47/normalization/common.d.ts.map +1 -0
- package/lib/packlets/bcp47/normalization/common.js.map +1 -0
- package/lib/packlets/bcp47/normalization/index.d.ts.map +1 -0
- package/lib/packlets/bcp47/normalization/index.js.map +1 -0
- package/lib/packlets/bcp47/normalization/normalizeTag.d.ts.map +1 -0
- package/lib/packlets/bcp47/normalization/normalizeTag.js.map +1 -0
- package/lib/packlets/bcp47/normalization/preferredTagNormalizer.d.ts.map +1 -0
- package/lib/packlets/bcp47/normalization/preferredTagNormalizer.js.map +1 -0
- package/lib/packlets/bcp47/overrides/converters.d.ts.map +1 -0
- package/lib/packlets/bcp47/overrides/converters.js.map +1 -0
- package/lib/packlets/bcp47/overrides/defaultRegistries.d.ts.map +1 -0
- package/lib/packlets/bcp47/overrides/defaultRegistries.js.map +1 -0
- package/lib/packlets/bcp47/overrides/index.d.ts.map +1 -0
- package/lib/packlets/bcp47/overrides/index.js.map +1 -0
- package/lib/packlets/bcp47/overrides/model.d.ts.map +1 -0
- package/lib/packlets/bcp47/overrides/model.js.map +1 -0
- package/lib/packlets/bcp47/overrides/overridesRegistry.d.ts.map +1 -0
- package/lib/packlets/bcp47/overrides/overridesRegistry.js.map +1 -0
- package/lib/packlets/bcp47/validation/baseValidator.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/baseValidator.js.map +1 -0
- package/lib/packlets/bcp47/validation/common.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/common.js.map +1 -0
- package/lib/packlets/bcp47/validation/index.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/index.js.map +1 -0
- package/lib/packlets/bcp47/validation/isCanonical.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/isCanonical.js.map +1 -0
- package/lib/packlets/bcp47/validation/isInPreferredForm.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/isInPreferredForm.js.map +1 -0
- package/lib/packlets/bcp47/validation/isStrictlyValid.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/isStrictlyValid.js.map +1 -0
- package/lib/packlets/bcp47/validation/isValid.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/isValid.js.map +1 -0
- package/lib/packlets/bcp47/validation/isWellFormed.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/isWellFormed.js.map +1 -0
- package/lib/packlets/bcp47/validation/validateTag.d.ts.map +1 -0
- package/lib/packlets/bcp47/validation/validateTag.js.map +1 -0
- package/lib/packlets/iana/common/converters.d.ts.map +1 -0
- package/lib/packlets/iana/common/converters.js.map +1 -0
- package/lib/packlets/iana/common/model.d.ts.map +1 -0
- package/lib/packlets/iana/common/model.js.map +1 -0
- package/lib/packlets/iana/common/registeredItems.d.ts.map +1 -0
- package/lib/packlets/iana/common/registeredItems.js.map +1 -0
- package/lib/packlets/iana/common/utils.d.ts.map +1 -0
- package/lib/packlets/iana/common/utils.js.map +1 -0
- package/lib/packlets/iana/common/validate.d.ts.map +1 -0
- package/lib/packlets/iana/common/validate.js.map +1 -0
- package/lib/packlets/iana/converters.d.ts.map +1 -0
- package/lib/packlets/iana/converters.js.map +1 -0
- package/lib/packlets/iana/defaultRegistries.d.ts.map +1 -0
- package/lib/packlets/iana/defaultRegistries.js.map +1 -0
- package/lib/packlets/iana/iana-data-embedded.d.ts.map +1 -0
- package/lib/packlets/iana/iana-data-embedded.js.map +1 -0
- package/lib/packlets/iana/index.browser.d.ts.map +1 -0
- package/lib/packlets/iana/index.browser.js.map +1 -0
- package/lib/packlets/iana/index.d.ts.map +1 -0
- package/lib/packlets/iana/index.js.map +1 -0
- package/lib/packlets/iana/jar/converters.d.ts.map +1 -0
- package/lib/packlets/iana/jar/converters.js.map +1 -0
- package/lib/packlets/iana/jar/index.d.ts.map +1 -0
- package/lib/packlets/iana/jar/index.js.map +1 -0
- package/lib/packlets/iana/jar/jarConverters.d.ts.map +1 -0
- package/lib/packlets/iana/jar/jarConverters.js.map +1 -0
- package/lib/packlets/iana/jar/jarModel.d.ts.map +1 -0
- package/lib/packlets/iana/jar/jarModel.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/converters.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/converters.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/index.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/index.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/model.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/model.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/registry/converters.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/registry/converters.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/registry/index.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/registry/index.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/registry/model.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/registry/model.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/converters.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/converters.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/index.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/index.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/model.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/model.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/tagValidation.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/tagValidation.js.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/validate.d.ts.map +1 -0
- package/lib/packlets/iana/jar/language-subtags/tags/validate.js.map +1 -0
- package/lib/packlets/iana/jar/model.d.ts.map +1 -0
- package/lib/packlets/iana/jar/model.js.map +1 -0
- package/lib/packlets/iana/language-subtags/common.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/common.js.map +1 -0
- package/lib/packlets/iana/language-subtags/converters.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/converters.js.map +1 -0
- package/lib/packlets/iana/language-subtags/index.browser.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/index.browser.js.map +1 -0
- package/lib/packlets/iana/language-subtags/index.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/index.js.map +1 -0
- package/lib/packlets/iana/language-subtags/jarConverters.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/jarConverters.js.map +1 -0
- package/lib/packlets/iana/language-subtags/model.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/model.js.map +1 -0
- package/lib/packlets/iana/language-subtags/scope.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/scope.js.map +1 -0
- package/lib/packlets/iana/language-subtags/subtagRegistry.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/subtagRegistry.js.map +1 -0
- package/lib/packlets/iana/language-subtags/validate.d.ts.map +1 -0
- package/lib/packlets/iana/language-subtags/validate.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/converters.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/converters.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/extensionsScope.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/extensionsScope.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/index.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/index.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/jarConverters.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/jarConverters.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/model.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/model.js.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/validate.d.ts.map +1 -0
- package/lib/packlets/iana/language-tag-extensions/validate.js.map +1 -0
- package/lib/packlets/iana/languageRegistries.d.ts.map +1 -0
- package/lib/packlets/iana/languageRegistries.js.map +1 -0
- package/lib/packlets/iana/languageRegistriesFileLoader.d.ts.map +1 -0
- package/lib/packlets/iana/languageRegistriesFileLoader.js.map +1 -0
- package/lib/packlets/iana/languageRegistriesLoader.d.ts.map +1 -0
- package/lib/packlets/iana/languageRegistriesLoader.js.map +1 -0
- package/lib/packlets/iana/model.d.ts.map +1 -0
- package/lib/packlets/iana/model.js.map +1 -0
- package/lib/packlets/iana/validate.d.ts.map +1 -0
- package/lib/packlets/iana/validate.js.map +1 -0
- package/lib/packlets/unsd/areas.d.ts.map +1 -0
- package/lib/packlets/unsd/areas.js.map +1 -0
- package/lib/packlets/unsd/common.d.ts.map +1 -0
- package/lib/packlets/unsd/common.js.map +1 -0
- package/lib/packlets/unsd/csv/converters.d.ts.map +1 -0
- package/lib/packlets/unsd/csv/converters.js.map +1 -0
- package/lib/packlets/unsd/csv/index.d.ts.map +1 -0
- package/lib/packlets/unsd/csv/index.js.map +1 -0
- package/lib/packlets/unsd/csv/model.d.ts.map +1 -0
- package/lib/packlets/unsd/csv/model.js.map +1 -0
- package/lib/packlets/unsd/defaultRegistries.d.ts.map +1 -0
- package/lib/packlets/unsd/defaultRegistries.js.map +1 -0
- package/lib/packlets/unsd/index.d.ts.map +1 -0
- package/lib/packlets/unsd/index.js.map +1 -0
- package/lib/packlets/unsd/regionCodes.d.ts.map +1 -0
- package/lib/packlets/unsd/regionCodes.js.map +1 -0
- package/lib/packlets/unsd/regions.d.ts.map +1 -0
- package/lib/packlets/unsd/regions.js.map +1 -0
- package/lib/packlets/utils/index.d.ts.map +1 -0
- package/lib/packlets/utils/index.js.map +1 -0
- package/lib/packlets/utils/jsonHelpers.d.ts.map +1 -0
- package/lib/packlets/utils/jsonHelpers.js.map +1 -0
- package/lib/packlets/utils/public.d.ts.map +1 -0
- package/lib/packlets/utils/public.js.map +1 -0
- package/lib/packlets/utils/validationHelpers.d.ts.map +1 -0
- package/lib/packlets/utils/validationHelpers.js.map +1 -0
- package/package.json +10 -10
- package/dist/test/unit/bcp47/commonTestCases.js +0 -475
- package/dist/test/unit/bcp47/languageTagHelpers.js +0 -178
- package/dist/test/unit/iana/testConstants.js +0 -68
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,kEAAkE;AAElE,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,yDAAyD;AACzD,OAAO,KAAK,IAAI,MAAM,+BAA+B,CAAC;AACtD,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,yDAAyD;AACzD,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// Browser-safe exports - excludes Node.js filesystem dependencies\n\nimport * as Bcp47 from './packlets/bcp47';\n// eslint-disable-next-line @rushstack/packlets/mechanics\nimport * as Iana from './packlets/iana/index.browser';\nimport * as Unsd from './packlets/unsd';\n// eslint-disable-next-line @rushstack/packlets/mechanics\nimport * as Utils from './packlets/utils/public';\n\nexport { Bcp47, Iana, Unsd, Utils };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,yDAAyD;AACzD,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Bcp47 from './packlets/bcp47';\nimport * as Iana from './packlets/iana';\nimport * as Unsd from './packlets/unsd';\n// eslint-disable-next-line @rushstack/packlets/mechanics\nimport * as Utils from './packlets/utils/public';\n\nexport { Bcp47, Iana, Unsd, Utils };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/bcp47Subtags/converters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,2CAA2C;AAE3C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;AAClE;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/* eslint-disable @rushstack/typedef-var */\n\nimport * as Validate from './validate';\n\n/**\n * @internal\n */\nexport const extensionSubtag = Validate.extensionSubtag.converter;\n/**\n * @internal\n */\nexport const privateUsePrefix = Validate.privateUsePrefix.converter;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/bcp47Subtags/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Converters from './converters';\nimport * as Model from './model';\nimport * as Validate from './validate';\n\nexport { Converters, Model, Validate };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/bcp47Subtags/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Brand } from '@fgv/ts-utils';\n\n/**\n * @public\n */\nexport type ExtensionSubtag = Brand<string, 'ExtensionSubtag'>;\n\n/**\n * @internal\n */\nexport type PrivateUseSubtag = Brand<string, 'PrivateUseSubtag'>;\n\n/**\n * @internal\n */\nexport type PrivateUsePrefix = Brand<string, 'PrivateUsePrefix'>;\n\nimport * as Iana from '../../iana';\n\n/**\n * @public\n */\ntype ExtensionSingleton = Iana.LanguageTagExtensions.Model.ExtensionSingleton;\nexport { ExtensionSingleton };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/bcp47Subtags/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,2CAA2C;AAE3C,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAEzF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,uBAAuB,CAA0B;IAClF,WAAW,EAAE,+BAA+B;IAC5C,UAAU,EAAE,0CAA0C;IACtD,SAAS,EAAE,oCAAoC;IAC/C,WAAW,EAAE,CAAC,IAA6B,EAAE,EAAE,CAC7C,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC;CAClF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,uBAAuB,CAA2B;IACpF,WAAW,EAAE,iCAAiC;IAC9C,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,CAAC,IAA8B,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAA8B,CAAC;CACzG,CAAC,CAAC","sourcesContent":["/*\n * Copyright (c) 2021 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/* eslint-disable @rushstack/typedef-var */\n\nimport * as Iana from '../../iana';\nimport * as Subtags from './model';\n\nimport { RegExpValidationHelpers } from '../../utils';\n\nimport { succeed } from '@fgv/ts-utils';\n\n/**\n * @public\n */\nexport const extensionSingleton = Iana.LanguageTagExtensions.Validate.extensionSingleton;\n\n/**\n * @public\n */\nexport const extensionSubtag = new RegExpValidationHelpers<Subtags.ExtensionSubtag>({\n description: 'language tag extension subtag',\n wellFormed: /^([a-zA-Z0-9]{2,8})(-[a-zA-Z0-9]{2,8})*$/,\n canonical: /^([a-z0-9]{2,8})(-[a-z0-9]{2,8})*$/,\n toCanonical: (from: Subtags.ExtensionSubtag) =>\n Iana.Jar.LanguageSubtags.Tags.Helpers.TagValidationHelpers.toCanonicalTag(from)\n});\n\n/**\n * @public\n */\nexport const privateUsePrefix = new RegExpValidationHelpers<Subtags.PrivateUsePrefix>({\n description: 'language tag private-use prefix',\n wellFormed: /^[xX]$/,\n canonical: /^x$/,\n toCanonical: (from: Subtags.PrivateUsePrefix) => succeed(from.toLowerCase() as Subtags.PrivateUsePrefix)\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA8BH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAiB;;IAC/C,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,aAAa,CAAC;IAC/B,CAAC;IACD,OAAO;QACL,OAAO,CAAC,eAAe;QACvB,GAAG,CAAC,MAAA,OAAO,CAAC,QAAQ,mCAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM;QACd,OAAO,CAAC,MAAM;QACd,GAAG,CAAC,MAAA,OAAO,CAAC,QAAQ,mCAAI,EAAE,CAAC;QAC3B,GAAG,CAAC,MAAA,OAAO,CAAC,UAAU,mCAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACtG;SACE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAC3C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,KAA4C,CAAC;AAE/C;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAsC,KAA0C,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../iana';\n\nimport { ExtensionSingleton, ExtensionSubtag } from './bcp47Subtags/model';\nexport { ExtensionSingleton, ExtensionSubtag };\n\n/**\n * @public\n */\nexport interface IExtensionSubtagValue {\n readonly singleton: ExtensionSingleton;\n readonly value: ExtensionSubtag;\n}\n\n/**\n * @public\n */\nexport interface ISubtags {\n primaryLanguage?: Iana.LanguageSubtags.LanguageSubtag;\n extlangs?: Iana.LanguageSubtags.ExtLangSubtag[];\n script?: Iana.LanguageSubtags.ScriptSubtag;\n region?: Iana.LanguageSubtags.RegionSubtag;\n variants?: Iana.LanguageSubtags.VariantSubtag[];\n extensions?: IExtensionSubtagValue[];\n privateUse?: Iana.LanguageSubtags.ExtendedLanguageRange[];\n\n grandfathered?: Iana.LanguageSubtags.GrandfatheredTag;\n}\n\n/**\n * Converts {@link Bcp47.Subtags | subtags} to a string.\n * @param subtags - The {@link Bcp47.Subtags | subtags} to be converted.\n * @returns A string representing the supplied {@link Bcp47.Subtags | subtags}.\n * @public\n */\nexport function subtagsToString(subtags: ISubtags): string {\n if (subtags.grandfathered) {\n return subtags.grandfathered;\n }\n return [\n subtags.primaryLanguage,\n ...(subtags.extlangs ?? []),\n subtags.script,\n subtags.region,\n ...(subtags.variants ?? []),\n ...(subtags.extensions ?? []).map((e) => `${e.singleton}-${e.value}`),\n ...(subtags.privateUse && subtags.privateUse.length > 0 ? [`x-${subtags.privateUse.join('-')}`] : [])\n ]\n .filter((s): s is string => s !== undefined)\n .join('-');\n}\n\n/**\n * @public\n */\n\nexport const UndeterminedLanguage: Iana.LanguageSubtags.LanguageSubtag =\n 'und' as Iana.LanguageSubtags.LanguageSubtag;\n\n/**\n * @public\n */\n\nexport const GlobalRegion: Iana.LanguageSubtags.RegionSubtag = '001' as Iana.LanguageSubtags.RegionSubtag;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAU,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAA2B,WAAW,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAA2B,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAU3E;;;;;;;;;;;;;;GAcG;AACH,2DAA2D;AAC3D,MAAM,UAAU,GAAG,CAAC,IAAkB,EAAE,OAAiC;IACvE,OAAO,IAAI,YAAY,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAC,IAAoB,EAAE,OAAiC;IAC1E,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,yDAAyD;AACzD,MAAM,UAAU,UAAU,CACxB,EAAgB,EAChB,EAAgB,EAChB,OAAiC;IAEjC,OAAO,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QAChD,OAAO,OAAO,CAAC,IAAI,yBAAyB,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CACpB,OAAuB,EACvB,SAAyB,EACzB,OAA2D;IAE3D,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5C,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9C,OAAO,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, mapResults, succeed } from '@fgv/ts-utils';\nimport { ISubtags } from './common';\nimport { ILanguageTagInitOptions, LanguageTag } from './languageTag';\nimport { LanguageSimilarityMatcher } from './match';\nimport { ILanguageChooserOptions, LanguageChooser } from './match/chooser';\n\n/**\n * Any of the possible ways to represent a language - as a `string`,\n * parsed {@link Bcp47.Subtags | subtags} or an instantiated\n * {@link Bcp47.LanguageTag | language tag}.\n * @public\n */\nexport type LanguageSpec = string | ISubtags | LanguageTag;\n\n/**\n * Creates a new {@link Bcp47.LanguageTag | language tag} from a {@link Bcp47.LanguageSpec | language specifier}\n *\n * The supplied initializer must be at least\n * {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | well-formed according to RFC 5646}.\n * Higher degrees of validation along with any normalizations may be optionally specified.\n *\n * @param from - The {@link Bcp47.LanguageSpec | language specifier} from which the tag is to\n * be created.\n * @param options - (optional) The {@link Bcp47.ILanguageTagInitOptions | options} used to construct\n * and validate the tag.\n * @returns `Success` with a valid {@link Bcp47.LanguageTag | language tag} or `Failure` with details\n * if an error occurs.\n * @public\n */\n/* c8 ignore next 3 - tests applied for wrapped function */\nexport function tag(from: LanguageSpec, options?: ILanguageTagInitOptions): Result<LanguageTag> {\n return from instanceof LanguageTag ? succeed(from) : LanguageTag.create(from, options);\n}\n\n/**\n * Creates an array of {@link Bcp47.LanguageTag | language tags} from an incoming array of\n * {@link Bcp47.LanguageSpec | language specifiers}.\n * @param from - The array of {@link Bcp47.LanguageSpec} to be converted.\n * @param options - (optional) The {@link Bcp47.ILanguageTagInitOptions | options} used to construct\n * and validate any created tags.\n * @returns `Success` with an array of {@link Bcp47.LanguageTag | language tags}, or `Failure`\n * with details if an error occurs.\n * @public\n */\nexport function tags(from: LanguageSpec[], options?: ILanguageTagInitOptions): Result<LanguageTag[]> {\n return mapResults(from.map((f) => tag(f, options)));\n}\n\n/**\n * Determine how similar two language tags are to each other.\n *\n * @param t1 - First tag to match, supplied as one of `string`, individual\n * {@link Bcp47.Subtags | subtags}, or constructed\n * {@link Bcp47.LanguageTag | language tag}.\n * @param t2 - Second tag to match, supplied as one of `string`, individual\n * {@link Bcp47.Subtags | subtags}, or constructed\n * {@link Bcp47.LanguageTag | language tag}.\n * @param options - (optional) A set of {@link Bcp47.ILanguageTagInitOptions | language tag options}\n * which control any necessary conversion or parsing.\n * @returns A numeric value in the range 1.0 (exact match) to 0.0 (no match).\n * @see For a set of common levels of similarity, see {@link Bcp47.tagSimilarity | similarity}.\n * @public\n */\n/* c8 ignore next - tests applied for wrapped function */\nexport function similarity(\n t1: LanguageSpec,\n t2: LanguageSpec,\n options?: ILanguageTagInitOptions\n): Result<number> {\n return tags([t1, t2], options).onSuccess((tags) => {\n return succeed(new LanguageSimilarityMatcher().matchLanguageTags(tags[0], tags[1]));\n });\n}\n\n/**\n * Matches a list of desired {@link Bcp47.LanguageSpec | languages} to a list of available {@link Bcp47.LanguageSpec | languages},\n * return a list of matching languages ordered from best to worst.\n * @param desired - An array of {@link Bcp47.LanguageSpec | language specifications} containing an ordered list of preferred languages.\n * @param available - An array of {@link Bcp47.LanguageSpec | language specifications} containing an unordered list of available languages.\n * @param options - (optional) Parameters to control language tag conversion or comparison\n * @returns `Success` with an ordered list of matching {@link Bcp47.LanguageTag | languages}, or `Failure` with details if\n * an error occurs.\n * @public\n */\nexport function choose(\n desired: LanguageSpec[],\n available: LanguageSpec[],\n options?: ILanguageTagInitOptions & ILanguageChooserOptions\n): Result<LanguageTag[]> {\n return tags(desired, options).onSuccess((w) => {\n return tags(available, options).onSuccess((h) => {\n return succeed(new LanguageChooser().filterLanguageTags(w, h, options));\n });\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAuB;AACvB,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAEzC,OAAO,EAKL,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAA2B,WAAW,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAA2B,yBAAyB,EAAiB,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAe,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// istanbul ignore file\nimport * as Subtags from './bcp47Subtags';\nimport * as Overrides from './overrides';\n\nexport {\n ExtensionSingleton,\n ExtensionSubtag,\n IExtensionSubtagValue,\n ISubtags,\n subtagsToString\n} from './common';\nexport * from './helpers';\nexport { ILanguageTagInitOptions, LanguageTag } from './languageTag';\nexport { ILanguageChooserOptions, LanguageSimilarityMatcher, TagSimilarity, tagSimilarity } from './match';\nexport { NormalizeTag, TagNormalization } from './normalization';\nexport { TagValidity, ValidateTag } from './validation';\nexport { Overrides, Subtags };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageRegistryData.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/languageRegistryData.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../iana';\n\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from './common';\n\n/**\n * Represents a single extlang subtag with corresponding registry data,\n * if present.\n * @public\n */\nexport interface IRegisteredExtLangValue {\n /**\n * A {@link Iana.LanguageSubtags.ExtLangSubtag | extlang subtag} from\n * the original language tag.\n */\n subtag: Iana.LanguageSubtags.ExtLangSubtag;\n /**\n * The {@link Iana.LanguageSubtag.Model.RegisteredExtLang | IANA subtag registry entry}\n * for this subtag, or `undefined` if the subtag is not registered.\n */\n registry?: Iana.LanguageSubtags.Model.IRegisteredExtLang;\n}\n\n/**\n * Represents a single variant subtag with corresponding registry data,\n * if present.\n * @public\n */\nexport interface IRegisteredVariantValue {\n /**\n * A {@link Iana.LanguageSubtags.VariantSubtag | variant subtag} from\n * the original language tag.\n */\n subtag: Iana.LanguageSubtags.VariantSubtag;\n /**\n * The {@link Iana.LanguageSubtag.Model.RegisteredVariant | IANA subtag registry entry}\n * for this subtag, or `undefined` if the subtag is not registered.\n */\n registry?: Iana.LanguageSubtags.Model.IRegisteredVariant;\n}\n\n/**\n * Represents a single extension subtag with corresponding registry data,\n * if present.\n * @public\n */\nexport interface IRegisteredExtensionValue extends IExtensionSubtagValue {\n /**\n * The language extensions registry entry for the associated subtag,\n * or `undefined` if the extension is not registered.\n */\n registry?: Iana.LanguageTagExtensions.Model.ILanguageTagExtension;\n}\n\n/**\n * Returns all of the data in the IANA language subtags registry for\n * a set of supplied {@link Bcp47.Subtags | subtags}.\n * @public\n */\nexport class LanguageRegistryData {\n /**\n * @internal\n */\n protected _iana: Iana.LanguageRegistries;\n /**\n * @internal\n */\n protected _subtags: ISubtags;\n /**\n * @internal\n */\n protected _primaryLanguage?: Iana.LanguageSubtags.Model.IRegisteredLanguage | false;\n /**\n * @internal\n */\n protected _extlangs?: IRegisteredExtLangValue[] | false;\n /**\n * @internal\n */\n protected _script?: Iana.LanguageSubtags.Model.IRegisteredScript | false;\n /**\n * @internal\n */\n protected _effectiveScript?: Iana.LanguageSubtags.Model.IRegisteredScript | false;\n /**\n * @internal\n */\n protected _region?: Iana.LanguageSubtags.Model.IRegisteredRegion | false;\n /**\n * @internal\n */\n protected _variants?: IRegisteredVariantValue[] | false;\n /**\n * @internal\n */\n protected _extensions?: IRegisteredExtensionValue[] | false;\n /**\n * @internal\n */\n protected _grandfathered?: Iana.LanguageSubtags.Model.IRegisteredGrandfatheredTag | false;\n\n /**\n * Constructs a new {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * from a supplied {@link Bcp47.Subtags | subtags} and {@link Iana.LanguageRegistries | language registries}.\n * @public\n */\n public constructor(subtags: ISubtags, iana: Iana.LanguageRegistries) {\n this._iana = iana;\n this._subtags = subtags;\n }\n\n /**\n * Registry data associated with the primary language subtag of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if the primary language is missing or invalid.\n * @public\n */\n public get primaryLanguage(): Iana.LanguageSubtags.Model.IRegisteredLanguage | undefined {\n if (this._primaryLanguage === undefined) {\n this._primaryLanguage = this._iana.subtags.languages.tryGet(this._subtags.primaryLanguage) ?? false;\n }\n return this._primaryLanguage ? this._primaryLanguage : undefined;\n }\n\n /**\n * Registry data associated with the extlang subtag of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if extlang is missing or invalid.\n * @public\n */\n public get extlangs(): IRegisteredExtLangValue[] | undefined {\n if (this._extlangs === undefined) {\n if (this._subtags.extlangs !== undefined) {\n this._extlangs = this._subtags.extlangs.map((e) => {\n return {\n subtag: e,\n registry: this._iana.subtags.extlangs.tryGet(e)\n };\n });\n }\n if (!this._subtags.extlangs || this._subtags.extlangs.length === 0) {\n this._extlangs = false;\n }\n }\n return this._extlangs ? this._extlangs : undefined;\n }\n\n /**\n * Registry data associated with the script of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if the script cannot be determined.\n *\n * @public\n */\n public get script(): Iana.LanguageSubtags.Model.IRegisteredScript | undefined {\n if (this._script === undefined) {\n if (this._subtags.script) {\n this._script = this._iana.subtags.scripts.tryGet(this._subtags.script);\n }\n if (!this._script) {\n this._script = false;\n }\n }\n return this._script ? this._script : undefined;\n }\n\n /**\n * Registry data associated with the script of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if the script cannot be determined.\n *\n * Note that effectiveScript will default to the registry `Suppress-Script` value of the\n * primary language if no script subtag is present.\n * @public\n */\n public get effectiveScript(): Iana.LanguageSubtags.Model.IRegisteredScript | undefined {\n if (this._effectiveScript === undefined) {\n if (this._subtags.script) {\n this._effectiveScript = this._iana.subtags.scripts.tryGet(this._subtags.script);\n } else if (!this._effectiveScript) {\n const suppressed = this.primaryLanguage?.suppressScript;\n if (suppressed) {\n this._effectiveScript = this._iana.subtags.scripts.tryGet(suppressed);\n }\n }\n if (!this._effectiveScript) {\n this._effectiveScript = false;\n }\n }\n return this._effectiveScript ? this._effectiveScript : undefined;\n }\n\n /**\n * Registry data associated with the region subtag of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if the region is missing or invalid.\n * @public\n */\n public get region(): Iana.LanguageSubtags.Model.IRegisteredRegion | undefined {\n if (this._region === undefined) {\n if (this._subtags.region) {\n this._region = this._iana.subtags.regions.tryGet(this._subtags.region);\n }\n if (!this._region) {\n this._region = false;\n }\n }\n return this._region ? this._region : undefined;\n }\n\n /**\n * Registry data associated with the variant subtags of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if variant subtags are missing or invalid.\n * @public\n */\n public get variants(): IRegisteredVariantValue[] | undefined {\n if (this._variants === undefined) {\n if (this._subtags.variants !== undefined) {\n this._variants = this._subtags.variants.map((v) => {\n return {\n subtag: v,\n registry: this._iana.subtags.variants.tryGet(v)\n };\n });\n }\n if (!this._subtags.variants || this._subtags.variants.length === 0) {\n this._variants = false;\n }\n }\n return this._variants ? this._variants : undefined;\n }\n\n /**\n * Registry data associated with the extension subtags of the language tag from\n * which this {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was constructed, or `undefined` if extension subtags are missing or invalid.\n * @public\n */\n public get extensions(): IRegisteredExtensionValue[] | undefined {\n if (this._extensions === undefined) {\n if (this._subtags.extensions !== undefined) {\n this._extensions = this._subtags.extensions.map((e) => {\n return {\n ...e,\n registry: this._iana.extensions.extensions.tryGet(e.singleton)\n };\n });\n }\n if (!this._subtags.variants || this._subtags.variants.length === 0) {\n this._variants = false;\n }\n }\n return this._extensions ? this._extensions : undefined;\n }\n\n /**\n * Registry data for grandfathered tags, or `undefined` if the tag is not recognized\n * as a grandfathered tag.\n * @public\n */\n public get grandfathered(): Iana.LanguageSubtags.Model.IRegisteredGrandfatheredTag | undefined {\n if (this._grandfathered === undefined) {\n if (this._subtags.grandfathered) {\n this._grandfathered = this._iana.subtags.grandfathered.tryGet(this._subtags.grandfathered);\n }\n if (!this._grandfathered) {\n this._grandfathered = false;\n }\n }\n return this._grandfathered ? this._grandfathered : undefined;\n }\n\n /**\n * @returns A string representation of the subtags from which this\n * {@link Bcp47.LanguageTagRegistryData | Bcp47.LanguageTagRegistryData}\n * was created.\n * @public\n */\n public toString(): string {\n return subtagsToString(this._subtags);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageTag.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/languageTag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAU,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAY,oBAAoB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAe,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsB3C;;;GAGG;AACH,MAAM,OAAO,WAAW;IA0DtB;;;;;;;;;;;OAWG;IACH,YACE,OAAiB,EACjB,QAAqB,EACrB,aAA+B,EAC/B,IAA6B;QAE7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,mBAAM,OAAO,EAAG,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAE7D,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,IAAW,eAAe;;QACxB,OAAO,MAAA,IAAI,CAAC,OAAO,CAAC,MAAM,mCAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;;QACvB,oBAAoB;QACpB,OAAO,CAAA,MAAA,IAAI,CAAC,OAAO,CAAC,eAAe,0CAAE,WAAW,EAAE,MAAK,oBAAoB,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QAChB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAW,eAAe;QACxB,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACpB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;;QACpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBAClE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,0CAAE,WAAW,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAE,CAAC,CAAC;YAC/F,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACvC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAA,MAAA,CAAC,CAAC,QAAQ,0CAAE,WAAW,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,MAAM,MAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,0CAAE,WAAW,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;YACzF,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAA,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,0CAAE,WAAW,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBACvC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAA,MAAA,CAAC,CAAC,QAAQ,0CAAE,WAAW,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAA,MAAA,CAAC,CAAC,QAAQ,0CAAE,WAAW,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;;;;;;;OASG;IACI,MAAM,CAAC,aAAa,CAAC,GAAW,EAAE,OAAiC;QACxE,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,OAAO,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACtE,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;OAUG;IACI,MAAM,CAAC,iBAAiB,CAAC,OAAiB,EAAE,OAAiC;QAClF,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;;;;OAUG;IACI,MAAM,CAAC,MAAM,CAAC,IAAuB,EAAE,OAAiC;QAC7E,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACO,MAAM,CAAC,kBAAkB,CACjC,OAAiB,EACjB,YAAyB,EACzB,iBAAmC,EACnC,cAAwC;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACjD,OAAO,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC;aACxE,SAAS,CAAC,GAAG,EAAE;YACd,OAAO,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC1F,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE;YACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YAC/E,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;OAOG;IACO,MAAM,CAAC,WAAW,CAAC,OAAiC;;QAC5D,OAAO;YACL,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,IAAI,CAAC,iBAAiB,CAAC,kBAAkB;YAChE,QAAQ,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,aAAa;YAC5C,aAAa,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,mCAAI,MAAM;SAChD,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,mBAAmB;QACxB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,MAAK,SAAS,EAAE,CAAC;oBAC3C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACI,OAAO;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,OAAO;YACjB,aAAa,EAAE,IAAI,CAAC,cAAc;SACnC,CAAC;QACF,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpG,CAAC;IAED;;;;OAIG;IACI,eAAe;QACpB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,gBAAgB;YAC1B,aAAa,EAAE,IAAI,CAAC,cAAc;SACnC,CAAC;QACF,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpG,CAAC;IAED;;;;OAIG;IACI,WAAW;QAChB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,aAAa,EAAE,WAAW;SAC3B,CAAC;QACF,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpG,CAAC;IAED;;;;OAIG;IACI,WAAW;QAChB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,OAAO,GAA4B;YACvC,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,OAAO,EAAE,8BAA8B;YACjD,aAAa,EAAE,WAAW;SAC3B,CAAC;QACF,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpG,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../iana';\n\nimport { Result, captureResult, succeed } from '@fgv/ts-utils';\nimport { ISubtags, UndeterminedLanguage, subtagsToString } from './common';\nimport { TagNormalization, mostNormalized } from './normalization/common';\nimport { TagValidity, mostValid } from './validation/common';\n\nimport { LanguageRegistryData } from './languageRegistryData';\nimport { LanguageTagParser } from './languageTagParser';\nimport { NormalizeTag } from './normalization';\nimport { ValidateTag } from './validation';\n\n/**\n * Initialization options for parsing or creation of {@link Bcp47.LanguageTag | language tag} objects.\n * @public\n */\nexport interface ILanguageTagInitOptions {\n /**\n * Desired {@link Bcp47.TagValidity | validity level} (optional).\n */\n validity?: TagValidity;\n /**\n * Desired {@link Bcp47.TagNormalization | normalization level} (optional).\n */\n normalization?: TagNormalization;\n /**\n * The {@link Iana.LanguageRegistries | IANA language subtag and extension registries} to\n * be used for the request (optional).\n */\n iana?: Iana.LanguageRegistries;\n}\n\n/**\n * Represents a single BCP-47 language tag.\n * @public\n */\nexport class LanguageTag {\n /**\n * The individual {@link Bcp47.Subtags | subtags} for\n * this language tag.\n */\n public readonly subtags: Readonly<ISubtags>;\n\n /**\n * A string representation of this language tag.\n */\n public readonly tag: string;\n\n /**\n * Details about this language tag from the IANA language\n * registries.\n */\n public readonly registry: LanguageRegistryData;\n\n /**\n * @internal\n */\n protected readonly _iana: Iana.LanguageRegistries;\n\n /**\n * @internal\n */\n protected _validity: TagValidity;\n\n /**\n * @internal\n */\n protected _normalization: TagNormalization;\n\n /**\n * @internal\n */\n protected _isValid: undefined | boolean;\n\n /**\n * @internal\n */\n protected _isStrictlyValid: undefined | boolean;\n\n /**\n * @internal\n */\n protected _isCanonical: undefined | boolean;\n\n /**\n * @internal\n */\n protected _isPreferred: undefined | boolean;\n\n /**\n * @internal\n */\n protected _suppressedScript: undefined | Iana.LanguageSubtags.ScriptSubtag | false;\n\n /**\n * Constructs a {@link Bcp47.LanguageTag | LanguageTag }.\n * @param subtags - The {@link Bcp47.Subtags | subtags } from\n * which the tag is constructed.\n * @param validity - Known {@link Bcp47.TagValidity | validation level} of the\n * supplied subtags.\n * @param normalization - Known {@link Bcp47.TagNormalization | normalization level}\n * of the supplied subtags.\n * @param iana - The {@link Iana.LanguageRegistries} used to validate and normalize\n * this tag.\n * @internal\n */\n protected constructor(\n subtags: ISubtags,\n validity: TagValidity,\n normalization: TagNormalization,\n iana: Iana.LanguageRegistries\n ) {\n this.subtags = Object.freeze({ ...subtags });\n this._normalization = normalization;\n this._validity = validity;\n this.tag = subtagsToString(subtags);\n this._iana = iana;\n this.registry = new LanguageRegistryData(this.subtags, iana);\n\n if (validity === 'strictly-valid') {\n this._isStrictlyValid = true;\n this._isValid = true;\n } else if (validity === 'valid') {\n this._isValid = true;\n }\n\n if (normalization === 'preferred') {\n this._isPreferred = true;\n this._isCanonical = true;\n } else if (normalization === 'canonical') {\n this._isCanonical = true;\n }\n }\n\n /**\n * The effective script of this language tag, if known.\n * The effective script is the script subtag in the tag itself,\n * if present, or the `Suppress-Script` defined in the\n * {@link https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry | IANA subtag registry}\n * for the primary language of this tag. Can be `undefined`\n * if neither the tag nor the IANA registry define a script.\n */\n public get effectiveScript(): Iana.LanguageSubtags.ScriptSubtag | undefined {\n return this.subtags.script ?? this.getSuppressedScript();\n }\n\n /**\n * Determines if this tag represents the special `undetermined` language.\n */\n public get isUndetermined(): boolean {\n /* c8 ignore next */\n return this.subtags.primaryLanguage?.toLowerCase() === UndeterminedLanguage;\n }\n\n /**\n * Whether this language tag is valid.\n */\n public get isValid(): boolean {\n if (this._isValid === undefined) {\n this._isValid = ValidateTag.isValid(this.subtags);\n if (this._isValid) {\n this._validity = 'valid';\n }\n }\n return this._isValid === true;\n }\n\n /**\n * Whether if this language tag is strictly valid.\n */\n public get isStrictlyValid(): boolean {\n if (this._isStrictlyValid === undefined) {\n this._isStrictlyValid = ValidateTag.isStrictlyValid(this.subtags);\n if (this._isStrictlyValid) {\n this._validity = 'strictly-valid';\n }\n }\n return this._isStrictlyValid === true;\n }\n\n /**\n * Whether this language tag is in canonical form.\n */\n public get isCanonical(): boolean {\n if (this._isCanonical === undefined) {\n this._isCanonical = ValidateTag.isCanonical(this.subtags);\n if (this._isCanonical) {\n this._normalization = 'canonical';\n }\n }\n return this._isCanonical === true;\n }\n\n /**\n * Whether this language tag is in preferred form.\n */\n public get isPreferred(): boolean {\n if (this._isPreferred === undefined) {\n this._isPreferred = ValidateTag.isInPreferredForm(this.subtags);\n if (this._isPreferred) {\n this._normalization = 'preferred';\n }\n }\n return this._isPreferred === true;\n }\n\n /**\n * Whether this language tag is a grandfathered tag.\n */\n public get isGrandfathered(): boolean {\n return this.subtags.grandfathered !== undefined;\n }\n\n /**\n * Gets a text description of this tag.\n */\n public get description(): string {\n const parts: string[] = [];\n if (!this.subtags.grandfathered) {\n if (this.registry.primaryLanguage || this.subtags.primaryLanguage) {\n parts.push((this.registry.primaryLanguage?.description[0] ?? this.subtags.primaryLanguage)!);\n }\n if (this.registry.extlangs) {\n for (const e of this.registry.extlangs) {\n parts.push(`/ ${e.registry?.description[0] ?? e.subtag}`);\n }\n }\n if (this.subtags.script) {\n parts.push(`in ${this.registry.script?.description[0] ?? this.subtags.script} script`);\n }\n if (this.subtags.region) {\n parts.push(`as spoken in ${this.registry.region?.description[0] ?? this.subtags.region}`);\n }\n if (this.registry.variants && this.registry.variants.length > 0) {\n for (const e of this.registry.variants) {\n parts.push(`(${e.registry?.description[0] ?? e.subtag})`);\n }\n }\n if (this.registry.extensions && this.registry.extensions.length > 0) {\n for (const e of this.registry.extensions) {\n parts.push(`(${e.registry?.description[0] ?? `-${e.singleton}`} \"${e.value}\")`);\n }\n }\n if (this.subtags.privateUse && this.subtags.privateUse.length > 0) {\n parts.push(`(-x \"${this.subtags.privateUse.join('-')}\")`);\n }\n } else {\n parts.push(`${this.tag} (grandfathered)`);\n }\n return parts.join(' ');\n }\n\n /**\n * Creates a new {@link Bcp47.LanguageTag | language tag} from a supplied `string` tag\n * using optional configuration, if supplied.\n * @param tag - The `string` tag from which the {@link Bcp47.LanguageTag | language tag}\n * is te be constructed.\n * @param options - (optional) set of {@link Bcp47.ILanguageTagInitOptions | init options}\n * to guide the validation and normalization of this tag.\n * @returns `Success` with the new {@link Bcp47.LanguageTag | language tag} or `Failure`\n * with details if an error occurs.\n */\n public static createFromTag(tag: string, options?: ILanguageTagInitOptions): Result<LanguageTag> {\n options = this._getOptions(options);\n\n return LanguageTagParser.parse(tag, options.iana).onSuccess((subtags) => {\n return this._createTransformed(subtags, 'unknown', 'unknown', options);\n });\n }\n\n /**\n * Creates a new {@link Bcp47.LanguageTag | language tag} from a supplied\n * {@link Bcp47.Subtags | subtags} using optional configuration,\n * if supplied.\n * @param subtags - The {@link Bcp47.Subtags | subtags} from which the\n * {@link Bcp47.LanguageTag | language tag} is te be constructed.\n * @param options - (optional) set of {@link Bcp47.ILanguageTagInitOptions | init options}\n * to guide the validation and normalization of this tag.\n * @returns `Success` with the new {@link Bcp47.LanguageTag | language tag} or `Failure`\n * with details if an error occurs.\n */\n public static createFromSubtags(subtags: ISubtags, options?: ILanguageTagInitOptions): Result<LanguageTag> {\n return this._createTransformed(subtags, 'unknown', 'unknown', options);\n }\n\n /**\n * Creates a new {@link Bcp47.LanguageTag | language tag} from a supplied `string`\n * tag or {@link Bcp47.Subtags | subtags} using optional configuration,\n * if supplied.\n * @param from - The `string` tag or {@link Bcp47.Subtags | subtags} from\n * which the {@link Bcp47.LanguageTag | language tag} is te be constructed.\n * @param options - (optional) set of {@link Bcp47.ILanguageTagInitOptions | init options}\n * to guide the validation and normalization of this tag.\n * @returns `Success` with the new {@link Bcp47.LanguageTag | language tag} or `Failure`\n * with details if an error occurs.\n */\n public static create(from: string | ISubtags, options?: ILanguageTagInitOptions): Result<LanguageTag> {\n if (typeof from === 'string') {\n return this.createFromTag(from, options);\n } else {\n return this.createFromSubtags(from, options);\n }\n }\n\n /**\n * Constructs a new {@link Bcp47.LanguageTag | language tag} by applying appropriate transformations\n * to as supplied {@link Bcp47.Subtags | Bcp47.Subtags}.\n * @param subtags - The {@link Bcp47.Subtags | subtags} which represent the tag.\n * @param fromValidity - The {@link Bcp47.TagValidity | validation level} of the supplied subtags.\n * @param fromNormalization - The {@link Bcp47.TagNormalization | normalization level} fo the\n * supplied subtags.\n * @param partialOptions - Any {@link Bcp47.ILanguageTagInitOptions | initialization options}.\n * @returns `Success` with the corresponding {@link Bcp47.LanguageTag | language tag} or `Failure`\n * with details if an error occurs.\n * @internal\n */\n protected static _createTransformed(\n subtags: ISubtags,\n fromValidity: TagValidity,\n fromNormalization: TagNormalization,\n partialOptions?: ILanguageTagInitOptions\n ): Result<LanguageTag> {\n const options = this._getOptions(partialOptions);\n return ValidateTag.validateSubtags(subtags, options.validity, fromValidity)\n .onSuccess(() => {\n return NormalizeTag.normalizeSubtags(subtags, options.normalization, fromNormalization);\n })\n .onSuccess((normalized) => {\n const validity = mostValid(fromValidity, options.validity);\n const normalization = mostNormalized(fromNormalization, options.normalization);\n return captureResult(() => new LanguageTag(normalized, validity, normalization, options.iana));\n });\n }\n\n /**\n * Gets a fully-specified {@link Bcp47.ILanguageTagInitOptions} from partial or undefined\n * options, substituting defaults as appropriate.\n * @param options - The {@link Bcp47.ILanguageTagInitOptions} to be expanded, or `undefined`\n * for default options.\n * @returns Fully-specified {@link Bcp47.ILanguageTagInitOptions | init options}.\n * @internal\n */\n protected static _getOptions(options?: ILanguageTagInitOptions): Required<ILanguageTagInitOptions> {\n return {\n iana: options?.iana ?? Iana.DefaultRegistries.languageRegistries,\n validity: options?.validity ?? 'well-formed',\n normalization: options?.normalization ?? 'none'\n };\n }\n\n /**\n * Returns the `Suppress-Script` value defined for the primary language of this tag,\n * regardless of whether a different script is defined in this subtag.\n * @returns The suppress-script defined for the primary language, or undefined if\n * the primary language is invalid or has no defined suppressed script.\n */\n public getSuppressedScript(): Iana.LanguageSubtags.ScriptSubtag | undefined {\n if (this._suppressedScript === undefined) {\n this._suppressedScript = false;\n if (this.subtags.primaryLanguage) {\n const language = this._iana.subtags.languages.tryGet(this.subtags.primaryLanguage);\n if (language?.suppressScript !== undefined) {\n this._suppressedScript = language.suppressScript;\n }\n }\n }\n return this._suppressedScript ? this._suppressedScript : undefined;\n }\n\n /**\n * Gets a confirmed valid representation of this language tag.\n * @returns `Success` with a valid representation of this {@link Bcp47.LanguageTag | language tag},\n * or `Failure` with details if the tag cannot be validated.\n */\n public toValid(): Result<LanguageTag> {\n if (this.isValid) {\n return succeed(this);\n }\n const options: ILanguageTagInitOptions = {\n iana: this._iana,\n validity: 'valid',\n normalization: this._normalization\n };\n return LanguageTag._createTransformed(this.subtags, this._validity, this._normalization, options);\n }\n\n /**\n * Gets a confirmed strictly valid representation of this language tag.\n * @returns `Success` with a strictly valid representation of this {@link Bcp47.LanguageTag | language tag},\n * or `Failure` with details if the tag cannot be strictly validated.\n */\n public toStrictlyValid(): Result<LanguageTag> {\n if (this.isStrictlyValid) {\n return succeed(this);\n }\n const options: ILanguageTagInitOptions = {\n iana: this._iana,\n validity: 'strictly-valid',\n normalization: this._normalization\n };\n return LanguageTag._createTransformed(this.subtags, this._validity, this._normalization, options);\n }\n\n /**\n * Gets a confirmed canonical representation of this language tag.\n * @returns `Success` with a canonical representation of this {@link Bcp47.LanguageTag | language tag},\n * or `Failure` with details if the tag cannot be normalized to canonical form.\n */\n public toCanonical(): Result<LanguageTag> {\n if (this.isCanonical) {\n return succeed(this);\n }\n const options: ILanguageTagInitOptions = {\n iana: this._iana,\n validity: this._validity,\n normalization: 'canonical'\n };\n return LanguageTag._createTransformed(this.subtags, this._validity, this._normalization, options);\n }\n\n /**\n * Gets a confirmed preferred representation of this language tag.\n * @returns `Success` with a preferred representation of this {@link Bcp47.LanguageTag | language tag},\n * or `Failure` with details if the tag cannot be normalized to preferred form.\n */\n public toPreferred(): Result<LanguageTag> {\n if (this.isPreferred) {\n return succeed(this);\n }\n const options: ILanguageTagInitOptions = {\n iana: this._iana,\n validity: 'valid', // preferred requires validity\n normalization: 'preferred'\n };\n return LanguageTag._createTransformed(this.subtags, this._validity, this._normalization, options);\n }\n\n /**\n * Gets a string representation of this language tag.\n * @returns A string representation of this language tag.\n */\n public toString(): string {\n return this.tag;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languageTagParser.js","sourceRoot":"","sources":["../../../src/packlets/bcp47/languageTagParser.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../iana';\n\nimport { Result, Success, allSucceed, fail, succeed } from '@fgv/ts-utils';\n\nimport { Validate } from './bcp47Subtags';\nimport { ExtensionSingleton, ExtensionSubtag } from './bcp47Subtags/model';\nimport { ISubtags } from './common';\n\n/**\n * @internal\n */\ninterface IParserState {\n readonly iana: Iana.LanguageRegistries;\n readonly tag: string;\n readonly subtags: string[];\n readonly parsedSubtags: ISubtags;\n next?: string;\n}\n\n/**\n * @public\n */\nexport class LanguageTagParser {\n /* c8 ignore next */\n private constructor() {}\n\n /**\n * Parses a string representation of a BCP-47 ({@link https://www.rfc-editor.org/rfc/rfc5646.html | RFC 5646})\n * language tag, to produce a {@link Bcp47.Subtags | Subtags} object which\n * breaks out each of the subtags.\n * @param tag - The `string` language tag to be parsed.\n * @param iana - Optional {@link Iana.LanguageRegistries | IANA language registries}\n * to be used.\n * @returns `Success` with the resulting {@link Bcp47.Subtags | subtags}\n * or `Failure` with details if an error occurs.\n * @public\n */\n public static parse(tag: string, iana?: Iana.LanguageRegistries): Result<ISubtags> {\n /* c8 ignore next */\n iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n const status: IParserState = {\n tag,\n iana,\n subtags: tag.split('-'),\n parsedSubtags: {}\n };\n status.next = status.subtags.shift();\n\n return allSucceed(\n [\n this._parseGrandfatheredTag(status),\n this._parsePrimaryLanguage(status),\n this._parseExtlang(status),\n this._parseScript(status),\n this._parseRegion(status),\n this._parseVariants(status),\n this._parseExtensions(status),\n this._parsePrivateSubtags(status),\n this._parseTagEnd(status)\n ],\n status\n ).onSuccess(() => {\n return succeed(status.parsedSubtags);\n });\n }\n\n /**\n * Determines if the entire tag matches a registered grandfathered tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with the updated {@link Bcp47.Subtags | subtags}\n * if a grandfathered tag is found, or `Success` with the supplied subtags\n * if no matching grandfathered tag is found.\n * @internal\n */\n protected static _parseGrandfatheredTag(state: IParserState): Success<ISubtags> {\n const grandfathered = state.iana.subtags.grandfathered.tryGet(state.tag);\n if (grandfathered) {\n state.parsedSubtags.grandfathered = state.tag as Iana.LanguageSubtags.GrandfatheredTag;\n // we consumed the whole thing\n state.subtags.splice(0, state.subtags.length);\n state.next = undefined;\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the primary language subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the primary language subtag, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parsePrimaryLanguage(state: IParserState): Result<ISubtags> {\n // primary language subtag is required unless the entire tag is grandfathered or consists\n // of only private tags\n if (state.iana.subtags.languages.isWellFormed(state.next)) {\n state.parsedSubtags.primaryLanguage = state.next;\n state.next = state.subtags.shift();\n return succeed(state.parsedSubtags);\n } else if (state.parsedSubtags.grandfathered !== undefined) {\n return succeed(state.parsedSubtags);\n } else if (Validate.privateUsePrefix.isWellFormed(state.next)) {\n // just return with no primary language and the private tag\n // parser will be invoked by the parent flow.\n return succeed(state.parsedSubtags);\n }\n return fail(`${state.tag}: no primary language subtag`);\n }\n\n /**\n * Parses the extlang subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include extlang subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseExtlang(state: IParserState): Result<ISubtags> {\n // optional extlangs subtags\n while (state.iana.subtags.extlangs.isWellFormed(state.next)) {\n if (state.parsedSubtags.extlangs === undefined) {\n state.parsedSubtags.extlangs = [state.next];\n } else if (state.parsedSubtags.extlangs.length < 3) {\n state.parsedSubtags.extlangs.push(state.next);\n } else {\n return fail(`${state.next}: too many extlang subtags`);\n }\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the script subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the script subtag if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseScript(state: IParserState): Result<ISubtags> {\n // optional script subtag\n if (state.iana.subtags.scripts.isWellFormed(state.next)) {\n state.parsedSubtags.script = state.next;\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the region subtag of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the region subtag if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseRegion(state: IParserState): Result<ISubtags> {\n // optional region subtag\n if (state.iana.subtags.regions.isWellFormed(state.next)) {\n state.parsedSubtags.region = state.next;\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the variant subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the variant subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseVariants(state: IParserState): Result<ISubtags> {\n // optional variant subtags\n while (state.iana.subtags.variants.isWellFormed(state.next)) {\n if (state.parsedSubtags.variants === undefined) {\n state.parsedSubtags.variants = [state.next];\n } else {\n state.parsedSubtags.variants.push(state.next);\n }\n state.next = state.subtags.shift();\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the extension subtag(s) of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the extension subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parseExtensions(state: IParserState): Result<ISubtags> {\n // optional extension subtags\n while (state.next !== undefined && Validate.extensionSingleton.isWellFormed(state.next)) {\n const singleton: ExtensionSingleton = state.next as ExtensionSingleton;\n const values: ExtensionSubtag[] = [];\n state.next = state.subtags.shift();\n\n while (Validate.extensionSubtag.isWellFormed(state.next)) {\n values.push(state.next as ExtensionSubtag);\n state.next = state.subtags.shift();\n }\n if (\n state.next !== undefined &&\n !Validate.extensionSingleton.isWellFormed(state.next) &&\n !Validate.privateUsePrefix.isWellFormed(state.next)\n ) {\n return fail(`${state.next}: malformed extension subtag`);\n } else if (values.length < 1) {\n return fail(`${state.tag}: extension '${singleton}' must have at least one subtag.`);\n }\n\n const value = values.join('-') as ExtensionSubtag;\n if (state.parsedSubtags.extensions === undefined) {\n state.parsedSubtags.extensions = [{ singleton, value }];\n } else {\n state.parsedSubtags.extensions.push({ singleton, value });\n }\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Parses the private use subtags of a supplied language tag.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` with supplied {@link Bcp47.Subtags | subtags}\n * updated to include the private-use subtags if present, or `Failure` with details if an error\n * occurs.\n * @internal\n */\n protected static _parsePrivateSubtags(state: IParserState): Result<ISubtags> {\n // optional private use subtags\n if (state.next !== undefined && Validate.privateUsePrefix.isWellFormed(state.next)) {\n const values: string[] = [];\n state.next = state.subtags.shift();\n\n while (\n state.next &&\n state.next.length > 1 &&\n Iana.LanguageSubtags.Validate.extendedLanguageRange.isWellFormed(state.next)\n ) {\n values.push(state.next);\n state.next = state.subtags.shift();\n }\n\n if (state.next !== undefined) {\n return fail(`${state.next}: malformed private-use subtag`);\n } else if (values.length < 1) {\n return fail(`${state.tag}: private-use tag must have at least one subtag.`);\n }\n\n state.parsedSubtags.privateUse = values as Iana.LanguageSubtags.ExtendedLanguageRange[];\n }\n return succeed(state.parsedSubtags);\n }\n\n /**\n * Verifies {@link Bcp47.ParserState | parser state} at the end of a parse operation.\n * @param state - The {@link Bcp47.ParserState | current state} of the\n * parse operation.\n * @returns `Success` if the tag was fully consumed, or `Failure` with details\n * if unexpected subtags remain to be parsed.\n * @internal\n */\n protected static _parseTagEnd(state: IParserState): Result<ISubtags> {\n if (state.next !== undefined) {\n return fail(`${state.next}: unexpected subtag`);\n }\n return succeed(state.parsedSubtags);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chooser.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/chooser.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\nimport { ISubtags } from '../common';\nimport { LanguageTag } from '../languageTag';\nimport { LanguageSimilarityMatcher } from './similarity';\n\n/**\n * Represents a single matching filtered language.\n * @public\n */\nexport interface IMatchingLanguage {\n /**\n * Numeric indication of how well the language matches,\n * from perfect (`1.0`) to not at all (`0.0`). When\n * matching an ordered list, languages at the front of\n * the desired language list are always higher quality.\n */\n quality: number;\n /**\n * The `string` tag of the matched language.\n */\n tag: string;\n /**\n * The matched {@link Bcp47.LanguageTag | language tag}.\n */\n languageTag: LanguageTag;\n}\n\n/**\n * Options for {@link Bcp47.choose | language tag list filter} functions.\n * @public\n */\nexport interface ILanguageChooserOptions {\n /**\n * Indicates whether to return the matching language from the\n * desired list or the available list. Default is `'availableLanguage'`.\n */\n use?: 'desiredLanguage' | 'availableLanguage';\n\n /**\n * Indicates how to filter the language list - `'primaryLanguage'`\n * indicates the each primary language should appear only once in\n * the list in its most similar form. A filter value of `'none'`\n * reports all matching variants of any primary language in order\n * of similarity. Default is `'primaryLanguage'`\n */\n filter?: 'primaryLanguage' | 'none';\n\n /**\n * An optional {@link Bcp47.LanguageSpec | language specification}\n * indicating a language to be returned if the filter call would\n * otherwise return an empty list (i.e. no languages match).\n */\n ultimateFallback?: string | ISubtags | LanguageTag;\n}\n\n/**\n * Default values for a{@link Bcp47.LanguageFilterOptions}.\n * @public\n */\nexport const defaultLanguageChooserOptions: ILanguageChooserOptions = Object.freeze({\n use: 'availableLanguage',\n filter: 'primaryLanguage'\n});\n\n/**\n * Helper to compare a list of 'desired' languages to a list of 'available' language\n * and return the intersection in order of preference, taking tag semantics into account.\n * @public\n */\nexport class LanguageChooser {\n /**\n * @internal\n */\n protected readonly _matcher: LanguageSimilarityMatcher;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n this._matcher = new LanguageSimilarityMatcher(iana);\n }\n\n public chooseLanguageTagsWithDetails(\n desiredLanguages: LanguageTag[],\n availableLanguages: LanguageTag[],\n options?: ILanguageChooserOptions\n ): IMatchingLanguage[] {\n const matched = new Map<string, IMatchingLanguage>();\n const decrement = desiredLanguages.length < 10 ? 0.1 : 1.0 / desiredLanguages.length;\n let base = 1.0;\n\n // fill any missing fields from the default\n options = { ...defaultLanguageChooserOptions, ...options };\n\n for (const want of desiredLanguages) {\n base -= decrement;\n for (const have of availableLanguages) {\n const similarity = this._matcher.matchLanguageTags(want, have);\n if (similarity > 0.0) {\n const quality = base + similarity * decrement;\n const languageTag = options.use === 'availableLanguage' ? have : want;\n const tag = languageTag.tag;\n const key = options.filter === 'primaryLanguage' ? languageTag.subtags.primaryLanguage ?? tag : tag;\n\n const match: IMatchingLanguage = {\n quality,\n tag,\n languageTag\n };\n\n const existing = matched.get(key);\n if (!existing || existing.quality < quality) {\n matched.set(key, match);\n }\n }\n }\n }\n\n const values = Array.from(matched.values());\n if (values.length > 1) {\n // want descending order\n values.sort((m1, m2) => m2.quality - m1.quality);\n } else if (values.length === 0 && options.ultimateFallback) {\n const languageTag =\n options.ultimateFallback instanceof LanguageTag\n ? options.ultimateFallback\n : LanguageTag.create(options.ultimateFallback).orDefault();\n if (languageTag) {\n return [{ languageTag, tag: languageTag.tag, quality: 0 }];\n }\n }\n return values;\n }\n\n public filterLanguageTags(\n desiredLanguages: LanguageTag[],\n availableLanguages: LanguageTag[],\n options?: ILanguageChooserOptions\n ): LanguageTag[] {\n return this.chooseLanguageTagsWithDetails(desiredLanguages, availableLanguages, options).map(\n (t) => t.languageTag\n );\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,2CAA2C;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,GAAG;CACb,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;IACX,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,GAAG;IAClB,iBAAiB,EAAE,IAAI;IACvB,QAAQ,EAAE,GAAG;IACb,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,GAAG;IACZ,YAAY,EAAE,GAAG;IACjB,IAAI,EAAE,CAAC;CACR,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/* eslint-disable @rushstack/typedef-var */\n\n/**\n * Penalty for a mismatched value for some subtags.\n * @public\n */\nexport const subtagMismatchPenalty = {\n private: 0.05,\n extension: 0.04,\n variant: 0.1\n};\n\n/**\n * Common levels of match quality for a single language match.\n * @public\n */\nexport const tagSimilarity = {\n exact: 1.0,\n variant: 0.9,\n region: 0.8,\n macroRegion: 0.65,\n neutralRegion: 0.5,\n preferredAffinity: 0.45,\n affinity: 0.4,\n preferredRegion: 0.35,\n sibling: 0.3,\n undetermined: 0.1,\n none: 0\n};\n\n/**\n * Numeric representation of the quality of a language match.\n * Range is 0 (no match) to 1 (exact match).\n * @public\n */\nexport type TagSimilarity = keyof typeof tagSimilarity;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAuB;AAEvB,OAAO,EAA8C,eAAe,EAAE,MAAM,WAAW,CAAC;AACxF,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// istanbul ignore file\n\nexport { ILanguageChooserOptions, IMatchingLanguage, LanguageChooser } from './chooser';\nexport * from './common';\nexport { LanguageSimilarityMatcher } from './similarity';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/similarity.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Unsd from '../../unsd';\n\nimport { DefaultRegistries, OverridesRegistry } from '../overrides';\n\nimport { GlobalRegion } from '../common';\nimport { LanguageTag } from '../languageTag';\nimport { tagSimilarity } from './common';\n\n/**\n * Helper to compare two language tags to determine how closely related they are,\n * applying normalization and language semantics as appropriate.\n * @public\n */\nexport class LanguageSimilarityMatcher {\n public iana: Iana.LanguageRegistries;\n public unsd: Unsd.RegionCodes;\n public overrides: OverridesRegistry;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next */\n this.iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n this.unsd = Unsd.DefaultRegistries.regionCodes;\n this.overrides = DefaultRegistries.overridesRegistry;\n }\n\n public matchLanguageTags(t1: LanguageTag, t2: LanguageTag): number {\n // no primary tag is either all private or grandfathered, which must match\n // exactly.\n if (!t1.subtags.primaryLanguage || !t2.subtags.primaryLanguage) {\n return t1.toString().toLowerCase() === t2.toString().toLowerCase()\n ? tagSimilarity.exact\n : tagSimilarity.none;\n }\n\n let quality = this.matchPrimaryLanguage(t1, t2);\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtlang(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchScript(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchRegion(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchVariants(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtensions(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchPrivateUseTags(t1, t2), quality) : quality;\n\n return quality;\n }\n\n public matchPrimaryLanguage(lt1: LanguageTag, lt2: LanguageTag): number {\n /* c8 ignore next 2 */\n const l1 = lt1.subtags.primaryLanguage?.toLowerCase();\n const l2 = lt2.subtags.primaryLanguage?.toLowerCase();\n\n if (l1 === l2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchExtlang(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extlangs?.length !== lt2.subtags.extlangs?.length) {\n return tagSimilarity.none;\n }\n\n if (lt1.subtags.extlangs) {\n for (let i = 0; i < lt1.subtags.extlangs.length; i++) {\n if (lt1.subtags.extlangs[i].toLowerCase() !== lt2.subtags.extlangs![i].toLowerCase()) {\n return tagSimilarity.none;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchScript(lt1: LanguageTag, lt2: LanguageTag): number {\n const s1 = lt1.effectiveScript?.toLowerCase();\n const s2 = lt2.effectiveScript?.toLowerCase();\n\n if (s1 === s2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchRegion(lt1: LanguageTag, lt2: LanguageTag): number {\n const r1 = lt1.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n const r2 = lt2.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n\n if (r1 === r2) {\n return tagSimilarity.exact;\n }\n\n // region 001 is equivalent to neutral (no region)\n if (r1 === GlobalRegion || r2 === GlobalRegion) {\n // if one tag is 001 and the other in neutral, exact match\n // otherwise, one tag is 001 so neutral region match\n return !r1 || !r2 ? tagSimilarity.exact : tagSimilarity.neutralRegion;\n }\n\n if (!r1 || !r2) {\n return tagSimilarity.neutralRegion;\n }\n\n // macro-region match\n const r1IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r1);\n const r2IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r2);\n if (r1IsMacroRegion || r2IsMacroRegion) {\n let contained: Unsd.ICountryOrArea | Unsd.Region | undefined;\n let container: Unsd.Region | undefined;\n if (r1IsMacroRegion) {\n container = this.unsd.regions.tryGetRegion(r1 as unknown as Iana.Model.UnM49RegionCode);\n contained =\n this.unsd.areas.tryGetAlpha2Area(r2 as unknown as Iana.Model.IsoAlpha2RegionCode) ??\n this.unsd.tryGetRegionOrArea(r2 as unknown as Iana.Model.UnM49RegionCode);\n } else {\n container = this.unsd.regions.tryGetRegion(r2 as unknown as Iana.Model.UnM49RegionCode);\n contained = this.unsd.areas.tryGetAlpha2Area(r1 as unknown as Iana.Model.IsoAlpha2RegionCode);\n }\n if (container && contained) {\n if (this.unsd.getIsContained(container, contained)) {\n return tagSimilarity.macroRegion;\n }\n\n // if they're both regions, also check to see if the second region contains the\n // first\n if (contained.tier !== 'area' && this.unsd.getIsContained(contained, container)) {\n return tagSimilarity.macroRegion;\n }\n }\n }\n\n /* c8 ignore next 6 */\n const o1 = this.overrides.overrides.get(\n lt1.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n const o2 = this.overrides.overrides.get(\n lt2.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n\n // orthographic affinity\n if (o1 && o2) {\n /* c8 ignore next 2 */\n const a1 = o1.affinity?.get(r1) ?? o1.defaultAffinity;\n const a2 = o2.affinity?.get(r2) ?? o2.defaultAffinity;\n if (a1 && a2) {\n if (r1 === a2.toUpperCase() || r2 === a1.toUpperCase()) {\n return tagSimilarity.preferredAffinity;\n }\n if (a1 === a2) {\n return tagSimilarity.affinity;\n }\n }\n }\n\n // preferred region\n if (o1?.preferredRegion === r1 || o2?.preferredRegion === r2) {\n return tagSimilarity.preferredRegion;\n }\n\n return tagSimilarity.sibling;\n }\n\n public matchVariants(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.variants?.length !== lt2.subtags.variants?.length) {\n return tagSimilarity.region;\n }\n\n if (lt1.subtags.variants) {\n for (let i = 0; i < lt1.subtags.variants.length; i++) {\n if (lt1.subtags.variants[i].toLowerCase() !== lt2.subtags.variants![i].toLowerCase()) {\n return tagSimilarity.region;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchExtensions(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extensions?.length !== lt2.subtags.extensions?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.extensions) {\n for (let i = 0; i < lt1.subtags.extensions.length; i++) {\n if (\n lt1.subtags.extensions[i].singleton.toLowerCase() !==\n lt2.subtags.extensions![i].singleton.toLowerCase() ||\n lt1.subtags.extensions[i].value.toLowerCase() !== lt2.subtags.extensions![i].value.toLowerCase()\n ) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchPrivateUseTags(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.privateUse?.length !== lt2.subtags.privateUse?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.privateUse) {\n for (let i = 0; i < lt1.subtags.privateUse.length; i++) {\n if (lt1.subtags.privateUse[i].toLowerCase() !== lt2.subtags.privateUse![i].toLowerCase()) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/baseNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\nimport { Result, allSucceed, fail, mapResults, populateObject, succeed } from '@fgv/ts-utils';\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\nimport { TagNormalization } from './common';\n\n/**\n * @public\n */\nexport interface ITagNormalizer {\n readonly normalization: TagNormalization;\n\n processSubtags(subtags: ISubtags): Result<ISubtags>;\n}\n\n/**\n * @public\n */\nexport abstract class TagNormalizerBase {\n protected readonly _iana: Iana.LanguageRegistries;\n\n public abstract readonly normalization: TagNormalization;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next - dependency injection primarily for test */\n this._iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n }\n\n public processSubtags(subtags: ISubtags): Result<ISubtags> {\n return populateObject<ISubtags>(\n {\n primaryLanguage: () => this._processLanguage(subtags),\n extlangs: () => this._processExtlangs(subtags),\n script: () => this._processScript(subtags),\n region: () => this._processRegion(subtags),\n variants: () => this._processVariants(subtags),\n extensions: () => this._processExtensions(subtags),\n privateUse: () => this._processPrivateUseTags(subtags),\n grandfathered: () => this._processGrandfatheredTags(subtags)\n },\n { suppressUndefined: true }\n ).onSuccess((processed) => {\n return this._postValidate(processed);\n });\n }\n\n protected _basicPostValidation(subtags: ISubtags): Result<ISubtags> {\n /* c8 ignore next 7 - any validation whatsoever catches these so should never happen in practice */\n if (\n subtags.primaryLanguage === undefined &&\n subtags.grandfathered === undefined &&\n subtags.privateUse === undefined\n ) {\n return fail(`${subtagsToString(subtags)}: missing primary language subtag.`);\n }\n\n /* c8 ignore next 3 - any validation whatsoever catches these so should never happen in practice */\n if (subtags.extlangs && subtags.extlangs.length > 3) {\n return fail(`${subtagsToString(subtags)}: too many extlang subtags`);\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return this._basicPostValidation(subtags);\n }\n\n protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n if (subtags.extensions) {\n return mapResults(\n subtags.extensions.map((ex) => {\n return populateObject<IExtensionSubtagValue>({\n singleton: () => this._processExtensionSingleton(ex.singleton),\n value: () => this._processExtensionSubtagValue(ex.value)\n });\n })\n );\n }\n return succeed(subtags.extensions);\n }\n\n protected _verifyUnique<T, TK extends string>(\n description: string,\n items: T[] | undefined,\n getKey: (item: T) => TK\n ): Result<T[] | undefined> {\n if (items) {\n const present = new Set<TK>();\n return allSucceed(\n items.map((i) => {\n const key = getKey(i);\n if (present.has(key)) {\n return fail(`${key}: duplicate ${description}`);\n }\n present.add(key);\n return succeed(key);\n }),\n items\n );\n }\n return succeed(items);\n }\n\n protected abstract _processLanguage(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.LanguageSubtag | undefined>;\n protected abstract _processExtlangs(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined>;\n protected abstract _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined>;\n protected abstract _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined>;\n protected abstract _processVariants(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined>;\n protected abstract _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton>;\n protected abstract _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag>;\n protected abstract _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined>;\n protected abstract _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/canonicalNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, mapResults, succeed } from '@fgv/ts-utils';\n\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { ISubtags } from '../common';\nimport { TagNormalizerBase } from './baseNormalizer';\nimport { TagNormalization } from './common';\n\n/**\n * @internal\n */\nexport class CanonicalNormalizer extends TagNormalizerBase {\n public readonly normalization: TagNormalization = 'canonical';\n\n protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n return this._iana.subtags.languages.toCanonical(subtags.primaryLanguage);\n }\n return succeed(subtags.primaryLanguage);\n }\n\n protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return mapResults(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toCanonical(e)));\n }\n return succeed(undefined);\n }\n\n protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n if (subtags.script) {\n return this._iana.subtags.scripts.toCanonical(subtags.script);\n }\n return succeed(undefined);\n }\n\n protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n if (subtags.region) {\n return this._iana.subtags.regions.toCanonical(subtags.region);\n }\n return succeed(undefined);\n }\n\n protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return mapResults(subtags.variants.map((v) => this._iana.subtags.variants.toCanonical(v)));\n }\n return succeed(undefined);\n }\n\n protected _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton> {\n return this._iana.extensions.extensions.toCanonical(singleton);\n }\n\n protected _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);\n }\n\n protected _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const merged = subtags.privateUse.join('-');\n return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {\n return succeed(canon.split('-') as Iana.LanguageSubtags.ExtendedLanguageRange[]);\n });\n }\n return succeed(subtags.privateUse);\n }\n\n protected _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.toCanonical(subtags.grandfathered);\n }\n return succeed(undefined);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH;;;;GAIG;AACH,MAAM,iBAAiB,GAAqC;IAC1D;;OAEG;IACH,OAAO,EAAE,CAAC;IACV;;OAEG;IACH,IAAI,EAAE,GAAG;IACT;;;;OAIG;IACH,SAAS,EAAE,GAAG;IACd;;;;OAIG;IACH,SAAS,EAAE,GAAG;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAoB,EAAE,EAAoB;IAC7E,IAAI,iBAAiB,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,iBAAiB,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAAoB,EAAE,EAAoB;IACvE,gDAAgD;IAChD,OAAO,iBAAiB,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Describes the degree of normalization of a language tag.\n * @public\n */\nexport type TagNormalization = 'unknown' | 'none' | 'canonical' | 'preferred';\n\n/**\n * Ordered ranking of the degrees of normalization, from `unknown` (least\n * normalized) to `preferred` (most normalized).\n * @public\n */\nconst normalizationRank: Record<TagNormalization, number> = {\n /**\n * Normalization level is unknown.\n */\n unknown: 0,\n /**\n * Not normalized.\n */\n none: 0.1,\n /**\n * Tag and subtag case has been normalized to canonical\n * letter case (e.g. lower-case language and upper-case\n * region) but no other normalization has been applied.\n */\n canonical: 0.9,\n /**\n * All tag recommendations have been applied - e.g. suppressed\n * script is removed, deprecated or grandfathered values are\n * replaced with preferred values.\n */\n preferred: 1.0\n};\n\n/**\n * Determines which of two normalization ranks is most normalized.\n * @param n1 - The first {@link TagNormalization} to be compared.\n * @param n2 - The second {@link TagNormalization} to me compared.\n * @returns `1` if `n1` is more normalized, `-1` if `n2` is more\n * normalized, or `0` if they are identical.\n * @public\n */\nexport function compareNormalization(n1: TagNormalization, n2: TagNormalization): -1 | 0 | 1 {\n if (normalizationRank[n1] > normalizationRank[n2]) {\n return 1;\n } else if (normalizationRank[n1] < normalizationRank[n2]) {\n return -1;\n }\n return 0;\n}\n\n/**\n * Chooses the most normalized of two normalization ranks.\n * @param n1 - The first {@link TagNormalization} to be compared.\n * @param n2 - The second {@link TagNormalization} to me compared.\n * @returns The most normalized of `n1` or `n2`.\n * @public\n */\nexport function mostNormalized(n1: TagNormalization, n2: TagNormalization): TagNormalization {\n /* c8 ignore next - hard to hit due to guards */\n return normalizationRank[n1] > normalizationRank[n2] ? n1 : n2;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAuB;AAEvB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// istanbul ignore file\n\nexport * from './common';\nexport { NormalizeTag } from './normalizeTag';\nexport { CanonicalNormalizer } from './canonicalNormalizer';\nexport { PreferredNormalizer } from './preferredTagNormalizer';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeTag.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/normalizeTag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAU,OAAO,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAoB,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAIlE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;GAGG;AACH,MAAM,OAAO,YAAY;IAMvB;;;;;;;;OAQG;IACI,MAAM,CAAC,WAAW,CAAC,OAAiB;QACzC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,WAAW,CAAC,OAAiB;QACzC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,gBAAgB,CAC5B,iBAAmC,EACnC,iBAAoC;QAEpC,IAAI,iBAAiB,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YACzF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG;gBAClB,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,IAAI,mBAAmB,EAAE;gBACpC,SAAS,EAAE,IAAI,mBAAmB,EAAE;aACrC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,YAAa,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;;OASG;IACI,MAAM,CAAC,gBAAgB,CAC5B,OAAiB,EACjB,iBAAmC,EACnC,iBAAoC;;QAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;QAC/E,OAAO,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,cAAc,CAAC,OAAO,CAAC,mCAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;;AA/ED;;GAEG;AACY,yBAAY,GAAqE,SAAS,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Result, succeed } from '@fgv/ts-utils';\nimport { TagNormalization, compareNormalization } from './common';\n\nimport { ISubtags } from '../common';\nimport { ITagNormalizer } from './baseNormalizer';\nimport { CanonicalNormalizer } from './canonicalNormalizer';\nimport { PreferredNormalizer } from './preferredTagNormalizer';\n\n/**\n * Normalization helpers for BCP-47 language tags.\n * @public\n */\nexport class NormalizeTag {\n /**\n * @internal\n */\n private static _normalizers: Record<TagNormalization, ITagNormalizer | undefined> | undefined = undefined;\n\n /**\n * Converts a BCP-47 language tag to canonical form. Canonical form uses the recommended capitalization rules\n * specified in {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.1.1 | RFC 5646} but are not\n * otherwise modified.\n *\n * @param subtags - The individual {@link Bcp47.Subtags | subtags} to be normalized.\n * @returns `Success` with the normalized equivalent {@link Bcp47.Subtags | subtags},\n * or `Failure` with details if an error occurs.\n */\n public static toCanonical(subtags: ISubtags): Result<ISubtags> {\n return this.normalizeSubtags(subtags, 'canonical');\n }\n\n /**\n * Converts a BCP-47 language tag to preferred form. Preferred form uses the recommended capitalization rules\n * specified in {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.1.1 | RFC 5646} and also\n * applies additional preferred values specified in the\n * {@link https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry | language subtag registry}:\n * extraneous (suppressed) script tags are removed, deprecated language, extlang, script or region tags are replaced\n * with up-to-date preferred values, and grandfathered or redundant tags with a defined preferred-value are replaced\n * in their entirety with the new preferred value.\n * @param subtags - The individual {@link Bcp47.Subtags | subtags} to be normalized.\n * @returns `Success` with the normalized equivalent {@link Bcp47.Subtags | subtags},\n * or `Failure` with details if an error occurs.\n */\n public static toPreferred(subtags: ISubtags): Result<ISubtags> {\n return this.normalizeSubtags(subtags, 'preferred');\n }\n\n /**\n * Chooses an appropriate default tag normalizer given desired and optional current\n * {@link Bcp47.TagNormalization | normalization level}.\n * @param wantNormalization - The desired {@link Bcp47.TagNormalization | normalization level}.\n * @param haveNormalization - (optional) The current {@link Bcp47.TagNormalization | normalization level}.\n * @returns An appropriate {@link Bcp47.TagNormalizer | tag normalizer} or `undefined` if no additional\n * normalization is necessary.\n * @internal\n */\n public static chooseNormalizer(\n wantNormalization: TagNormalization,\n haveNormalization?: TagNormalization\n ): ITagNormalizer | undefined {\n if (haveNormalization && compareNormalization(haveNormalization, wantNormalization) >= 0) {\n return undefined;\n }\n\n if (!this._normalizers) {\n this._normalizers = {\n unknown: undefined,\n none: undefined,\n canonical: new CanonicalNormalizer(),\n preferred: new PreferredNormalizer()\n };\n }\n return this._normalizers![wantNormalization];\n }\n\n /**\n * Normalizes supplied {@link Bcp47.Subtags | subtags} to a requested\n * {@link Bcp47.TagNormalization | normalization level}, if necessary. If\n * no normalization is necessary, returns the supplied subtags.\n * @param subtags - The {@link Bcp47.Subtags | subtags} to be normalized.\n * @param wantNormalization - The desired {@link Bcp47.TagNormalization | normalization level}.\n * @param haveNormalization - (optional) The current {@link Bcp47.TagNormalization | normalization level}.\n * @returns `Success` with the normalized {@link Bcp47.Subtags | subtags}, or\n * `Failure` with details if an error occurs.\n */\n public static normalizeSubtags(\n subtags: ISubtags,\n wantNormalization: TagNormalization,\n haveNormalization?: TagNormalization\n ): Result<ISubtags> {\n const normalizer = this.chooseNormalizer(wantNormalization, haveNormalization);\n return normalizer?.processSubtags(subtags) ?? succeed(subtags);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferredTagNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/preferredTagNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, fail, mapResults, succeed } from '@fgv/ts-utils';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\n\nimport { sanitizeJson } from '../../utils';\nimport { LanguageTagParser } from '../languageTagParser';\nimport { TagNormalizerBase } from './baseNormalizer';\nimport { TagNormalization } from './common';\n\n/**\n * @public\n */\nexport class PreferredNormalizer extends TagNormalizerBase {\n public readonly normalization: TagNormalization = 'preferred';\n\n protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n const language = this._iana.subtags.languages.tryGet(subtags.primaryLanguage);\n if (!language) {\n return fail(`invalid language subtag \"${subtags.primaryLanguage}\"`);\n }\n return succeed(language.preferredValue ?? language.subtag);\n }\n return succeed(undefined);\n }\n\n protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return mapResults(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toValidCanonical(e)));\n }\n return succeed(undefined);\n }\n\n protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n if (subtags.primaryLanguage && subtags.script) {\n const language = this._iana.subtags.languages.tryGet(subtags.primaryLanguage);\n /* c8 ignore next 3 - internal error difficult to test */\n if (!language) {\n return fail(`invalid primary language subtag \"${subtags.primaryLanguage}.`);\n }\n\n const script = this._iana.subtags.scripts.toValidCanonical(subtags.script).orDefault();\n if (!script) {\n return fail(`invalid script subtag \"${subtags.script}`);\n }\n\n if (language.suppressScript !== script) {\n return succeed(script);\n }\n }\n return succeed(undefined);\n }\n\n protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n if (subtags.region) {\n return this._iana.subtags.regions.get(subtags.region).onSuccess((region) => {\n return succeed(region.preferredValue ?? region.subtag);\n });\n }\n return succeed(undefined);\n }\n\n protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return mapResults(\n subtags.variants.map((v) => this._iana.subtags.variants.toValidCanonical(v))\n ).onSuccess((v) => this._verifyUnique('variant', v, (v) => v));\n }\n return succeed(undefined);\n }\n\n protected _processExtensionSingleton(\n singleton: Bcp47Subtags.Model.ExtensionSingleton\n ): Result<Bcp47Subtags.Model.ExtensionSingleton> {\n return this._iana.extensions.extensions.toValidCanonical(singleton);\n }\n\n protected _processExtensionSubtagValue(\n value: Bcp47Subtags.Model.ExtensionSubtag\n ): Result<Bcp47Subtags.Model.ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);\n }\n\n protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n return super._processExtensions(subtags).onSuccess((extensions) => {\n return this._verifyUnique('extensions', extensions, (e) => e.singleton);\n });\n }\n\n protected _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const merged = subtags.privateUse.join('-');\n return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {\n return succeed(canon.split('-') as Iana.LanguageSubtags.ExtendedLanguageRange[]);\n });\n }\n return succeed(undefined);\n }\n\n protected _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.toValidCanonical(subtags.grandfathered);\n }\n return succeed(undefined);\n }\n\n protected _postValidateGrandfatheredTag(subtags: ISubtags): Result<ISubtags> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.get(subtags.grandfathered).onSuccess((grandfathered) => {\n if (grandfathered.preferredValue) {\n return LanguageTagParser.parse(grandfathered.preferredValue, this._iana)\n .onSuccess((gfSubtags) => {\n /* c8 ignore next 5 - would require a registry error too hard to test */\n if (gfSubtags.grandfathered !== undefined) {\n return fail<ISubtags>(\n `preferred value ${grandfathered.preferredValue} of grandfathered tag ${subtags.grandfathered} is also grandfathered.`\n );\n }\n return this.processSubtags(gfSubtags);\n })\n .onFailure((message) => {\n /* c8 ignore next 4 - would require a registry error too hard to test */\n return fail(\n `grandfathered tag \"${subtags.grandfathered}\" has invalid preferred value \"${grandfathered.preferredValue}\":\\n${message}`\n );\n });\n }\n return succeed(subtags);\n });\n }\n return succeed(subtags);\n }\n\n protected _postValidateRedundantTag(subtags: ISubtags): Result<ISubtags> {\n const tag = subtagsToString(subtags);\n const redundant = this._iana.subtags.redundant.tryGetCanonical(tag);\n if (redundant?.preferredValue) {\n return LanguageTagParser.parse(redundant.preferredValue, this._iana);\n }\n return succeed(subtags);\n }\n\n protected _postValidateExtLangs(subtags: ISubtags): Result<ISubtags> {\n if (subtags.extlangs) {\n if (subtags.extlangs.length > 1) {\n return fail(`${subtags.extlangs.join('-')}: multiple extlang subtags is invalid`);\n }\n if (subtags.extlangs.length > 0) {\n const registry = this._iana.subtags.extlangs.tryGet(subtags.extlangs[0]);\n if (registry) {\n if (\n registry.preferredValue &&\n registry.prefix === /* c8 ignore next */ subtags.primaryLanguage?.toLowerCase()\n ) {\n const preferred = this._iana.subtags.languages.tryGet(registry.preferredValue);\n if (preferred) {\n return succeed(\n sanitizeJson({\n ...subtags,\n primaryLanguage: preferred.subtag,\n extlangs: undefined\n })\n );\n }\n }\n }\n }\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return super\n ._postValidate(subtags)\n .onSuccess((subtags) => {\n return this._postValidateExtLangs(subtags);\n })\n .onSuccess((subtags) => {\n return this._postValidateGrandfatheredTag(subtags);\n })\n .onSuccess((subtags) => {\n return this._postValidateRedundantTag(subtags);\n });\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/converters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,2CAA2C;AAE3C,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAa,UAAU,EAAU,MAAM,eAAe,CAAC;AAE9D;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GACjC,UAAU,CAAC,YAAY,CACrB;IACE,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc;IAC7D,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY;IAClE,eAAe,EAAE,UAAU,CAAC,MAAM;IAClC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;CACrG,EACD,EAAE,cAAc,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,EAAE,CACvE,CAAC;AAEJ;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,OAAO,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AACnE,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n/* eslint-disable @rushstack/typedef-var */\n\nimport * as Iana from '../../iana';\nimport * as Model from './model';\n\nimport { JsonFile } from '@fgv/ts-json-base';\nimport { Converter, Converters, Result } from '@fgv/ts-utils';\n\n/**\n * @internal\n */\nexport const languageOverrideRecord: Converter<Model.ILanguageOverrideRecord, unknown> =\n Converters.strictObject<Model.ILanguageOverrideRecord>(\n {\n language: Iana.LanguageSubtags.Converters.Tags.languageSubtag,\n preferredRegion: Iana.LanguageSubtags.Converters.Tags.regionSubtag,\n defaultAffinity: Converters.string,\n affinity: Converters.recordOf(Converters.arrayOf(Iana.LanguageSubtags.Converters.Tags.regionSubtag))\n },\n { optionalFields: ['affinity', 'defaultAffinity', 'preferredRegion'] }\n );\n\n/**\n * @internal\n */\nexport const languageOverridesFile = Converters.arrayOf(languageOverrideRecord);\n\n/**\n * Loads a language overrides JSON file.\n * @internal\n * @param path - Path from which overrides should be loaded.\n * @returns `Success` with the loaded overrides or `Failure` with details if an\n * error occurs.\n */\nexport function loadLanguageOverridesFileSync(path: string): Result<Model.ILanguageOverrideRecord[]> {\n return JsonFile.convertJsonFileSync(path, languageOverridesFile);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultRegistries.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/defaultRegistries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAMrB,MAAM,KAAK,iBAAiB;QACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;;AAVD;;GAEG;AACY,oCAAkB,GAAuB,SAAS,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { OverridesRegistry } from './overridesRegistry';\n\n/**\n * @public\n */\nexport class DefaultRegistries {\n /**\n * @internal\n */\n private static _overridesRegistry?: OverridesRegistry = undefined;\n\n public static get overridesRegistry(): OverridesRegistry {\n if (!this._overridesRegistry) {\n this._overridesRegistry = OverridesRegistry.loadDefault().orThrow();\n }\n return this._overridesRegistry;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAuB;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// istanbul ignore file\n\nexport { OverridesRegistry } from './overridesRegistry';\nexport { DefaultRegistries } from './defaultRegistries';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\n/**\n * @internal\n */\nexport interface ILanguageOverrideRecord {\n language: Iana.LanguageSubtags.LanguageSubtag;\n preferredRegion?: Iana.LanguageSubtags.RegionSubtag;\n defaultAffinity?: string;\n affinity?: Record<string, Iana.LanguageSubtags.RegionSubtag[]>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overridesRegistry.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/overrides/overridesRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAU,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC5D,yDAAyD;AACzD,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAYhE;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAG5B;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,SAA8B;QACjD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACzC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,cAAc,CAAC,IAAa;QACxC,OAAO,UAAU,CAAC,qBAAqB;aACpC,OAAO,CAAC,IAAI,CAAC;aACb,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACrB,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC;aACD,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACvB,OAAO,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,IAAY;QACjC,OAAO,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACpG,CAAC;IAED;;;;;;;;OAQG;IACO,MAAM,CAAC,mBAAmB,CAAC,MAAqC;QACxE,MAAM,QAAQ,GAAsB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,QAAQ,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QACpD,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6C,CAAC;YACtE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClD,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5B,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;CACF","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Converters from './converters';\nimport * as Model from './model';\n\nimport { Result, mapResults, succeed } from '@fgv/ts-utils';\n// eslint-disable-next-line @rushstack/packlets/mechanics\nimport defaultOverrides from '../../../data/bcp/overrides.json';\n\n/**\n * @public\n */\nexport interface ILanguageOverride {\n language: Iana.LanguageSubtags.LanguageSubtag;\n preferredRegion?: Iana.LanguageSubtags.RegionSubtag;\n defaultAffinity?: string;\n affinity?: Map<Iana.LanguageSubtags.RegionSubtag, string>;\n}\n\n/**\n * @public\n */\nexport class OverridesRegistry {\n public readonly overrides: Map<Iana.LanguageSubtags.LanguageSubtag, ILanguageOverride>;\n\n protected constructor() {\n this.overrides = new Map();\n }\n\n public static create(overrides: ILanguageOverride[]): Result<OverridesRegistry> {\n const registry = new OverridesRegistry();\n overrides.forEach((o) => registry.overrides.set(o.language, o));\n return succeed(registry);\n }\n\n public static createFromJson(from: unknown): Result<OverridesRegistry> {\n return Converters.languageOverridesFile\n .convert(from)\n .onSuccess((records) => {\n return mapResults(records.map(OverridesRegistry._overrideFromRecord));\n })\n .onSuccess((overrides) => {\n return OverridesRegistry.create(overrides);\n });\n }\n\n public static loadDefault(): Result<OverridesRegistry> {\n return this.createFromJson(defaultOverrides);\n }\n\n public static loadJson(path: string): Result<OverridesRegistry> {\n return Converters.loadLanguageOverridesFileSync(path).onSuccess(OverridesRegistry.createFromJson);\n }\n\n /**\n * Converts a file {@link Bcp47.Overrides.Model.LanguageOverrideRecord | LanguageOverrideRecord }\n * to a runtime {@link Bcp47.Overrides.LanguageOverride | LanguageOverride}.\n * @param record - The {@link Bcp47.Overrides.Model.LanguageOverrideRecord | LanguageOverrideRecord } to\n * be converted.\n * @returns `Success` with the resulting {@link Bcp47.Overrides.LanguageOverride | LanguageOverride}\n * or `Error` with details if an error occurs.\n * @internal\n */\n protected static _overrideFromRecord(record: Model.ILanguageOverrideRecord): Result<ILanguageOverride> {\n const override: ILanguageOverride = { language: record.language };\n if (record.preferredRegion) {\n override.preferredRegion = record.preferredRegion;\n }\n if (record.defaultAffinity) {\n override.defaultAffinity = record.defaultAffinity;\n }\n if (record.affinity) {\n const affinity = new Map<Iana.LanguageSubtags.RegionSubtag, string>();\n for (const kvp of Object.entries(record.affinity)) {\n for (const region of kvp[1]) {\n affinity.set(region, kvp[0]);\n }\n }\n override.affinity = affinity;\n }\n return succeed(override);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseValidator.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/baseValidator.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\nimport { Result, allSucceed, fail, succeed } from '@fgv/ts-utils';\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\nimport { TagValidity } from './common';\n\n/**\n * @public\n */\nexport interface ITagValidator {\n readonly validity: TagValidity;\n\n validateSubtags(subtags: ISubtags): Result<true>;\n}\n\n/**\n * @internal\n */\nexport abstract class TagValidatorBase implements ITagValidator {\n public readonly iana: Iana.LanguageRegistries;\n public abstract readonly validity: TagValidity;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next */\n this.iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n }\n\n public validateSubtags(subtags: ISubtags): Result<true> {\n return allSucceed(\n [\n this._checkLanguage(subtags),\n this._checkExtlangs(subtags),\n this._checkScript(subtags),\n this._checkRegion(subtags),\n this._checkVariants(subtags),\n this._checkExtensions(subtags),\n this._checkPrivateUseTags(subtags),\n this._checkGrandfatheredTags(subtags)\n ],\n true\n ).onSuccess(() => {\n return this._postValidate(subtags).onSuccess(() => succeed(true));\n });\n }\n\n protected _basicPostValidation(subtags: ISubtags): Result<ISubtags> {\n if (\n subtags.primaryLanguage === undefined &&\n subtags.grandfathered === undefined &&\n subtags.privateUse === undefined\n ) {\n return fail(`${subtagsToString(subtags)}: missing primary language subtag.`);\n }\n if (subtags.extlangs && subtags.extlangs.length > 3) {\n return fail(`${subtagsToString(subtags)}: too many extlang subtags`);\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return this._basicPostValidation(subtags);\n }\n\n protected _checkExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n if (subtags.extensions) {\n return allSucceed(\n subtags.extensions.map((ext) => {\n return this._checkExtensionSingleton(ext.singleton).onSuccess(() => {\n return this._checkExtensionSubtagValue(ext.value);\n });\n }),\n subtags.extensions\n );\n }\n return succeed(undefined);\n }\n\n protected _verifyUnique<T, TK extends string>(\n description: string,\n items: T[] | undefined,\n getKey: (item: T) => TK\n ): Result<T[] | undefined> {\n if (items) {\n const present = new Set<TK>();\n return allSucceed(\n items.map((i) => {\n const key = getKey(i);\n if (present.has(key)) {\n return fail(`${key}: duplicate ${description}`);\n }\n present.add(key);\n return succeed(key);\n }),\n items\n );\n }\n return succeed(items);\n }\n\n protected abstract _checkLanguage(subtags: ISubtags): Result<unknown>;\n protected abstract _checkExtlangs(subtags: ISubtags): Result<unknown>;\n protected abstract _checkScript(subtags: ISubtags): Result<unknown>;\n protected abstract _checkRegion(subtags: ISubtags): Result<unknown>;\n protected abstract _checkVariants(subtags: ISubtags): Result<unknown>;\n protected abstract _checkExtensionSingleton(singleton: ExtensionSingleton): Result<unknown>;\n protected abstract _checkExtensionSubtagValue(value: ExtensionSubtag): Result<unknown>;\n protected abstract _checkPrivateUseTags(subtags: ISubtags): Result<unknown>;\n protected abstract _checkGrandfatheredTags(subtags: ISubtags): Result<unknown>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH;;;;GAIG;AACH,MAAM,YAAY,GAAgC;IAChD;;OAEG;IACH,OAAO,EAAE,CAAC;IACV;;OAEG;IACH,aAAa,EAAE,GAAG;IAClB;;;;OAIG;IACH,KAAK,EAAE,GAAG;IACV;;;;;OAKG;IACH,gBAAgB,EAAE,GAAG;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,EAAe,EAAE,EAAe;IAC9D,IAAI,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC;IACX,CAAC;SAAM,IAAI,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,EAAe,EAAE,EAAe;IACxD,OAAO,YAAY,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Describes the validation level of a particular tag.\n * @public\n */\nexport type TagValidity = 'unknown' | 'well-formed' | 'valid' | 'strictly-valid';\n\n/**\n * Ordered ranking of the degrees of validity, from `unknown` (least\n * validation) to `strictly-valid` (fully validated).\n * @public\n */\nconst validityRank: Record<TagValidity, number> = {\n /**\n * No validation has been performed.\n */\n unknown: 0,\n /**\n * Tag is well-formed {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | according to RFC 5646}.\n */\n 'well-formed': 0.5,\n /**\n * Tag is valid {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | according to RFC 5646} -\n * well-formed, and is a registered grandfathered tag or all subtags are registered,\n * with no duplicate extensions or variant subtags.\n */\n valid: 0.9,\n /**\n * Tag is valid {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | according to RFC 5646} and meets\n * other constraints described by the RFC - e.g. if present, any extlang or variant subtags have a\n * {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-3.1.8 | valid prefix} as specified by\n * the registry.\n */\n 'strictly-valid': 1.0\n};\n\n/**\n * Determines which of two validity ranks is most normalized.\n * @param v1 - The first {@link TagValidity} to be compared.\n * @param v2 - The second {@link TagValidity} to be compared.\n * @returns `1` if `v1` is more normalized, `-1` if `v2` is more\n * normalized, or `0` if they are identical.\n * @public\n */\nexport function compareValidity(v1: TagValidity, v2: TagValidity): -1 | 0 | 1 {\n if (validityRank[v1] > validityRank[v2]) {\n return 1;\n } else if (validityRank[v1] < validityRank[v2]) {\n return -1;\n }\n return 0;\n}\n\n/**\n * Chooses the most valid of two normalization ranks.\n * @param v1 - The first {@link TagValidity} to be compared.\n * @param v2 - The second {@link TagValidity} to be compared.\n * @returns The most validated of `v1` or `v2`.\n * @public\n */\nexport function mostValid(v1: TagValidity, v2: TagValidity): TagValidity {\n return validityRank[v1] >= validityRank[v2] ? v1 : v2;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uBAAuB;AAEvB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n// istanbul ignore file\n\nexport * from './common';\nexport { IsCanonicalValidator } from './isCanonical';\nexport { IsStrictlyValidValidator } from './isStrictlyValid';\nexport { IsValidValidator } from './isValid';\nexport { IsWellFormedValidator } from './isWellFormed';\nexport { ValidateTag } from './validateTag';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isCanonical.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/isCanonical.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, allSucceed, fail, succeed } from '@fgv/ts-utils';\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\n\nimport { ISubtags } from '../common';\nimport { TagValidatorBase } from './baseValidator';\nimport { TagValidity } from './common';\n\n/**\n * @internal\n */\nexport class IsCanonicalValidator extends TagValidatorBase {\n public validity: TagValidity = 'well-formed';\n\n protected _checkLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n return this.iana.subtags.languages.verifyIsCanonical(subtags.primaryLanguage);\n }\n return succeed(undefined);\n }\n\n protected _checkExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return allSucceed(\n subtags.extlangs.map((e) => this.iana.subtags.extlangs.verifyIsCanonical(e)),\n subtags.extlangs\n );\n }\n return succeed(undefined);\n }\n\n protected _checkScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n return subtags.script ? this.iana.subtags.scripts.verifyIsCanonical(subtags.script) : succeed(undefined);\n }\n\n protected _checkRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n return subtags.region ? this.iana.subtags.regions.verifyIsCanonical(subtags.region) : succeed(undefined);\n }\n\n protected _checkVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return allSucceed(\n subtags.variants.map((v) => this.iana.subtags.variants.verifyIsCanonical(v)),\n subtags.variants\n );\n }\n return succeed(undefined);\n }\n\n protected _checkExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton> {\n return this.iana.extensions.extensions.verifyIsCanonical(singleton);\n }\n\n protected _checkExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.verifyIsCanonical(value);\n }\n\n protected _checkPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const result = Iana.LanguageSubtags.Validate.extendedLanguageRange.verifyIsCanonical(\n subtags.privateUse.join('-') as Iana.LanguageSubtags.ExtendedLanguageRange\n );\n if (result.isFailure()) {\n return fail(result.message);\n }\n }\n return succeed(subtags.privateUse);\n }\n\n protected _checkGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n return subtags.grandfathered\n ? this.iana.subtags.grandfathered.verifyIsCanonical(subtags.grandfathered)\n : succeed(undefined);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isInPreferredForm.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/isInPreferredForm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAU,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAY,eAAe,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAIrC,YAAmB,IAA8B;QAFjC,aAAQ,GAAgB,OAAO,CAAC;QAG9C,oBAAoB;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC;IAChE,CAAC;IAEM,eAAe,CAAC,OAAiB;QACtC,OAAO,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,GAAG,IAAI,mCAAmC,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\nimport { Result, fail, succeed } from '@fgv/ts-utils';\nimport { ISubtags, subtagsToString } from '../common';\nimport { NormalizeTag } from '../normalization';\nimport { ITagValidator } from './baseValidator';\nimport { TagValidity } from './common';\n\n/**\n * @internal\n */\nexport class IsInPreferredFromValidator implements ITagValidator {\n public readonly iana: Iana.LanguageRegistries;\n public readonly validity: TagValidity = 'valid';\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next */\n this.iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n }\n\n public validateSubtags(subtags: ISubtags): Result<true> {\n return NormalizeTag.toPreferred(subtags).onSuccess((preferred) => {\n const want = subtagsToString(preferred);\n const have = subtagsToString(subtags);\n if (want !== have) {\n return fail(`${have}: does not match preferred form ${want}`);\n }\n return succeed(true);\n });\n }\n}\n"]}
|