@fgv/ts-bcp47 5.1.0-2 → 5.1.0-21
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/data/bcp/overrides.json +21 -0
- package/dist/data/unsd/m49.json +3723 -0
- package/dist/index.browser.js +30 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/converters.js +32 -0
- package/dist/packlets/bcp47/bcp47Subtags/converters.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/index.js +26 -0
- package/dist/packlets/bcp47/bcp47Subtags/index.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/model.js +23 -0
- package/dist/packlets/bcp47/bcp47Subtags/model.js.map +1 -0
- package/dist/packlets/bcp47/bcp47Subtags/validate.js +48 -0
- package/dist/packlets/bcp47/bcp47Subtags/validate.js.map +1 -0
- package/dist/packlets/bcp47/common.js +53 -0
- package/dist/packlets/bcp47/common.js.map +1 -0
- package/dist/packlets/bcp47/helpers.js +96 -0
- package/dist/packlets/bcp47/helpers.js.map +1 -0
- package/dist/packlets/bcp47/index.js +32 -0
- package/dist/packlets/bcp47/index.js.map +1 -0
- package/dist/packlets/bcp47/languageRegistryData.js +202 -0
- package/dist/packlets/bcp47/languageRegistryData.js.map +1 -0
- package/dist/packlets/bcp47/languageTag.js +363 -0
- package/dist/packlets/bcp47/languageTag.js.map +1 -0
- package/dist/packlets/bcp47/languageTagParser.js +275 -0
- package/dist/packlets/bcp47/languageTagParser.js.map +1 -0
- package/dist/packlets/bcp47/match/chooser.js +88 -0
- package/dist/packlets/bcp47/match/chooser.js.map +1 -0
- package/dist/packlets/bcp47/match/common.js +49 -0
- package/dist/packlets/bcp47/match/common.js.map +1 -0
- package/dist/packlets/bcp47/match/index.js +26 -0
- package/dist/packlets/bcp47/match/index.js.map +1 -0
- package/dist/packlets/bcp47/match/similarity.js +205 -0
- package/dist/packlets/bcp47/match/similarity.js.map +1 -0
- package/dist/packlets/bcp47/normalization/baseNormalizer.js +89 -0
- package/dist/packlets/bcp47/normalization/baseNormalizer.js.map +1 -0
- package/dist/packlets/bcp47/normalization/canonicalNormalizer.js +86 -0
- package/dist/packlets/bcp47/normalization/canonicalNormalizer.js.map +1 -0
- package/dist/packlets/bcp47/normalization/common.js +77 -0
- package/dist/packlets/bcp47/normalization/common.js.map +1 -0
- package/dist/packlets/bcp47/normalization/index.js +27 -0
- package/dist/packlets/bcp47/normalization/index.js.map +1 -0
- package/dist/packlets/bcp47/normalization/normalizeTag.js +101 -0
- package/dist/packlets/bcp47/normalization/normalizeTag.js.map +1 -0
- package/dist/packlets/bcp47/normalization/preferredTagNormalizer.js +177 -0
- package/dist/packlets/bcp47/normalization/preferredTagNormalizer.js.map +1 -0
- package/dist/packlets/bcp47/overrides/converters.js +49 -0
- package/dist/packlets/bcp47/overrides/converters.js.map +1 -0
- package/dist/packlets/bcp47/overrides/defaultRegistries.js +38 -0
- package/dist/packlets/bcp47/overrides/defaultRegistries.js.map +1 -0
- package/dist/packlets/bcp47/overrides/index.js +25 -0
- package/dist/packlets/bcp47/overrides/index.js.map +1 -0
- package/dist/packlets/bcp47/overrides/model.js +23 -0
- package/dist/packlets/bcp47/overrides/model.js.map +1 -0
- package/dist/packlets/bcp47/overrides/overridesRegistry.js +83 -0
- package/dist/packlets/bcp47/overrides/overridesRegistry.js.map +1 -0
- package/dist/packlets/bcp47/validation/baseValidator.js +86 -0
- package/dist/packlets/bcp47/validation/baseValidator.js.map +1 -0
- package/dist/packlets/bcp47/validation/common.js +77 -0
- package/dist/packlets/bcp47/validation/common.js.map +1 -0
- package/dist/packlets/bcp47/validation/index.js +29 -0
- package/dist/packlets/bcp47/validation/index.js.map +1 -0
- package/dist/packlets/bcp47/validation/isCanonical.js +79 -0
- package/dist/packlets/bcp47/validation/isCanonical.js.map +1 -0
- package/dist/packlets/bcp47/validation/isInPreferredForm.js +46 -0
- package/dist/packlets/bcp47/validation/isInPreferredForm.js.map +1 -0
- package/dist/packlets/bcp47/validation/isStrictlyValid.js +94 -0
- package/dist/packlets/bcp47/validation/isStrictlyValid.js.map +1 -0
- package/dist/packlets/bcp47/validation/isValid.js +92 -0
- package/dist/packlets/bcp47/validation/isValid.js.map +1 -0
- package/dist/packlets/bcp47/validation/isWellFormed.js +75 -0
- package/dist/packlets/bcp47/validation/isWellFormed.js.map +1 -0
- package/dist/packlets/bcp47/validation/validateTag.js +153 -0
- package/dist/packlets/bcp47/validation/validateTag.js.map +1 -0
- package/dist/packlets/iana/common/converters.js +58 -0
- package/dist/packlets/iana/common/converters.js.map +1 -0
- package/dist/packlets/iana/common/model.js +23 -0
- package/dist/packlets/iana/common/model.js.map +1 -0
- package/dist/packlets/iana/common/registeredItems.js +120 -0
- package/dist/packlets/iana/common/registeredItems.js.map +1 -0
- package/dist/packlets/iana/common/utils.js +30 -0
- package/dist/packlets/iana/common/utils.js.map +1 -0
- package/dist/packlets/iana/common/validate.js +59 -0
- package/dist/packlets/iana/common/validate.js.map +1 -0
- package/dist/packlets/iana/converters.js +25 -0
- package/dist/packlets/iana/converters.js.map +1 -0
- package/dist/packlets/iana/defaultRegistries.js +38 -0
- package/dist/packlets/iana/defaultRegistries.js.map +1 -0
- package/dist/packlets/iana/iana-data-embedded.js +60 -0
- package/dist/packlets/iana/iana-data-embedded.js.map +1 -0
- package/dist/packlets/iana/index.browser.js +34 -0
- package/dist/packlets/iana/index.browser.js.map +1 -0
- package/dist/packlets/iana/index.js +34 -0
- package/dist/packlets/iana/index.js.map +1 -0
- package/dist/packlets/iana/jar/converters.js +25 -0
- package/dist/packlets/iana/jar/converters.js.map +1 -0
- package/dist/packlets/iana/jar/index.js +26 -0
- package/dist/packlets/iana/jar/index.js.map +1 -0
- package/dist/packlets/iana/jar/jarConverters.js +60 -0
- package/dist/packlets/iana/jar/jarConverters.js.map +1 -0
- package/dist/packlets/iana/jar/jarModel.js +23 -0
- package/dist/packlets/iana/jar/jarModel.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/converters.js +25 -0
- package/dist/packlets/iana/jar/language-subtags/converters.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/index.js +26 -0
- package/dist/packlets/iana/jar/language-subtags/index.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/model.js +25 -0
- package/dist/packlets/iana/jar/language-subtags/model.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/registry/converters.js +180 -0
- package/dist/packlets/iana/jar/language-subtags/registry/converters.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/registry/index.js +26 -0
- package/dist/packlets/iana/jar/language-subtags/registry/index.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/registry/model.js +43 -0
- package/dist/packlets/iana/jar/language-subtags/registry/model.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/converters.js +101 -0
- package/dist/packlets/iana/jar/language-subtags/tags/converters.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/index.js +27 -0
- package/dist/packlets/iana/jar/language-subtags/tags/index.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/model.js +23 -0
- package/dist/packlets/iana/jar/language-subtags/tags/model.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/tagValidation.js +66 -0
- package/dist/packlets/iana/jar/language-subtags/tags/tagValidation.js.map +1 -0
- package/dist/packlets/iana/jar/language-subtags/tags/validate.js +85 -0
- package/dist/packlets/iana/jar/language-subtags/tags/validate.js.map +1 -0
- package/dist/packlets/iana/jar/model.js +25 -0
- package/dist/packlets/iana/jar/model.js.map +1 -0
- package/dist/packlets/iana/language-subtags/common.js +23 -0
- package/dist/packlets/iana/language-subtags/common.js.map +1 -0
- package/dist/packlets/iana/language-subtags/converters.js +182 -0
- package/dist/packlets/iana/language-subtags/converters.js.map +1 -0
- package/dist/packlets/iana/language-subtags/index.browser.js +30 -0
- package/dist/packlets/iana/language-subtags/index.browser.js.map +1 -0
- package/dist/packlets/iana/language-subtags/index.js +29 -0
- package/dist/packlets/iana/language-subtags/index.js.map +1 -0
- package/dist/packlets/iana/language-subtags/jarConverters.js +288 -0
- package/dist/packlets/iana/language-subtags/jarConverters.js.map +1 -0
- package/dist/packlets/iana/language-subtags/model.js +23 -0
- package/dist/packlets/iana/language-subtags/model.js.map +1 -0
- package/dist/packlets/iana/language-subtags/scope.js +169 -0
- package/dist/packlets/iana/language-subtags/scope.js.map +1 -0
- package/dist/packlets/iana/language-subtags/subtagRegistry.js +108 -0
- package/dist/packlets/iana/language-subtags/subtagRegistry.js.map +1 -0
- package/dist/packlets/iana/language-subtags/validate.js +23 -0
- package/dist/packlets/iana/language-subtags/validate.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/converters.js +59 -0
- package/dist/packlets/iana/language-tag-extensions/converters.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/extensionsRegistry.js +64 -0
- package/dist/packlets/iana/language-tag-extensions/extensionsRegistry.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/extensionsScope.js +50 -0
- package/dist/packlets/iana/language-tag-extensions/extensionsScope.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/index.js +28 -0
- package/dist/packlets/iana/language-tag-extensions/index.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/jarConverters.js +143 -0
- package/dist/packlets/iana/language-tag-extensions/jarConverters.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/model.js +24 -0
- package/dist/packlets/iana/language-tag-extensions/model.js.map +1 -0
- package/dist/packlets/iana/language-tag-extensions/validate.js +33 -0
- package/dist/packlets/iana/language-tag-extensions/validate.js.map +1 -0
- package/dist/packlets/iana/languageRegistries.js +80 -0
- package/dist/packlets/iana/languageRegistries.js.map +1 -0
- package/dist/packlets/iana/languageRegistriesFileLoader.js +73 -0
- package/dist/packlets/iana/languageRegistriesFileLoader.js.map +1 -0
- package/dist/packlets/iana/languageRegistriesLoader.js +113 -0
- package/dist/packlets/iana/languageRegistriesLoader.js.map +1 -0
- package/dist/packlets/iana/model.js +25 -0
- package/dist/packlets/iana/model.js.map +1 -0
- package/dist/packlets/iana/validate.js +23 -0
- package/dist/packlets/iana/validate.js.map +1 -0
- package/dist/packlets/unsd/areas.js +92 -0
- package/dist/packlets/unsd/areas.js.map +1 -0
- package/dist/packlets/unsd/common.js +23 -0
- package/dist/packlets/unsd/common.js.map +1 -0
- package/dist/packlets/unsd/csv/converters.js +75 -0
- package/dist/packlets/unsd/csv/converters.js.map +1 -0
- package/dist/packlets/unsd/csv/index.js +25 -0
- package/dist/packlets/unsd/csv/index.js.map +1 -0
- package/dist/packlets/unsd/csv/model.js +23 -0
- package/dist/packlets/unsd/csv/model.js.map +1 -0
- package/dist/packlets/unsd/defaultRegistries.js +38 -0
- package/dist/packlets/unsd/defaultRegistries.js.map +1 -0
- package/dist/packlets/unsd/index.js +27 -0
- package/dist/packlets/unsd/index.js.map +1 -0
- package/dist/packlets/unsd/regionCodes.js +115 -0
- package/dist/packlets/unsd/regionCodes.js.map +1 -0
- package/dist/packlets/unsd/regions.js +71 -0
- package/dist/packlets/unsd/regions.js.map +1 -0
- package/dist/packlets/utils/index.js +24 -0
- package/dist/packlets/utils/index.js.map +1 -0
- package/dist/packlets/utils/jsonHelpers.js +25 -0
- package/dist/packlets/utils/jsonHelpers.js.map +1 -0
- package/dist/packlets/utils/public.js +24 -0
- package/dist/packlets/utils/public.js.map +1 -0
- package/dist/packlets/utils/validationHelpers.js +116 -0
- package/dist/packlets/utils/validationHelpers.js.map +1 -0
- package/dist/ts-bcp47.d.ts +5 -5
- package/dist/tsdoc-metadata.json +1 -1
- 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 +1 -1
- package/lib/packlets/bcp47/languageTag.d.ts.map +1 -0
- package/lib/packlets/bcp47/languageTag.js +1 -1
- 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 +2 -2
- package/lib/packlets/iana/common/converters.d.ts.map +1 -0
- package/lib/packlets/iana/common/converters.js +2 -2
- 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 +2 -2
- package/lib/packlets/iana/jar/jarConverters.d.ts.map +1 -0
- package/lib/packlets/iana/jar/jarConverters.js +2 -2
- 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 +36 -31
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import * as Iana from '../../iana';
|
|
23
|
+
import { allSucceed, fail, succeed } from '@fgv/ts-utils';
|
|
24
|
+
import { subtagsToString } from '../common';
|
|
25
|
+
/**
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export class TagValidatorBase {
|
|
29
|
+
constructor(iana) {
|
|
30
|
+
/* c8 ignore next */
|
|
31
|
+
this.iana = iana !== null && iana !== void 0 ? iana : Iana.DefaultRegistries.languageRegistries;
|
|
32
|
+
}
|
|
33
|
+
validateSubtags(subtags) {
|
|
34
|
+
return allSucceed([
|
|
35
|
+
this._checkLanguage(subtags),
|
|
36
|
+
this._checkExtlangs(subtags),
|
|
37
|
+
this._checkScript(subtags),
|
|
38
|
+
this._checkRegion(subtags),
|
|
39
|
+
this._checkVariants(subtags),
|
|
40
|
+
this._checkExtensions(subtags),
|
|
41
|
+
this._checkPrivateUseTags(subtags),
|
|
42
|
+
this._checkGrandfatheredTags(subtags)
|
|
43
|
+
], true).onSuccess(() => {
|
|
44
|
+
return this._postValidate(subtags).onSuccess(() => succeed(true));
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
_basicPostValidation(subtags) {
|
|
48
|
+
if (subtags.primaryLanguage === undefined &&
|
|
49
|
+
subtags.grandfathered === undefined &&
|
|
50
|
+
subtags.privateUse === undefined) {
|
|
51
|
+
return fail(`${subtagsToString(subtags)}: missing primary language subtag.`);
|
|
52
|
+
}
|
|
53
|
+
if (subtags.extlangs && subtags.extlangs.length > 3) {
|
|
54
|
+
return fail(`${subtagsToString(subtags)}: too many extlang subtags`);
|
|
55
|
+
}
|
|
56
|
+
return succeed(subtags);
|
|
57
|
+
}
|
|
58
|
+
_postValidate(subtags) {
|
|
59
|
+
return this._basicPostValidation(subtags);
|
|
60
|
+
}
|
|
61
|
+
_checkExtensions(subtags) {
|
|
62
|
+
if (subtags.extensions) {
|
|
63
|
+
return allSucceed(subtags.extensions.map((ext) => {
|
|
64
|
+
return this._checkExtensionSingleton(ext.singleton).onSuccess(() => {
|
|
65
|
+
return this._checkExtensionSubtagValue(ext.value);
|
|
66
|
+
});
|
|
67
|
+
}), subtags.extensions);
|
|
68
|
+
}
|
|
69
|
+
return succeed(undefined);
|
|
70
|
+
}
|
|
71
|
+
_verifyUnique(description, items, getKey) {
|
|
72
|
+
if (items) {
|
|
73
|
+
const present = new Set();
|
|
74
|
+
return allSucceed(items.map((i) => {
|
|
75
|
+
const key = getKey(i);
|
|
76
|
+
if (present.has(key)) {
|
|
77
|
+
return fail(`${key}: duplicate ${description}`);
|
|
78
|
+
}
|
|
79
|
+
present.add(key);
|
|
80
|
+
return succeed(key);
|
|
81
|
+
}), items);
|
|
82
|
+
}
|
|
83
|
+
return succeed(items);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=baseValidator.js.map
|
|
@@ -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,77 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Ordered ranking of the degrees of validity, from `unknown` (least
|
|
24
|
+
* validation) to `strictly-valid` (fully validated).
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
const validityRank = {
|
|
28
|
+
/**
|
|
29
|
+
* No validation has been performed.
|
|
30
|
+
*/
|
|
31
|
+
unknown: 0,
|
|
32
|
+
/**
|
|
33
|
+
* Tag is well-formed {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | according to RFC 5646}.
|
|
34
|
+
*/
|
|
35
|
+
'well-formed': 0.5,
|
|
36
|
+
/**
|
|
37
|
+
* Tag is valid {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | according to RFC 5646} -
|
|
38
|
+
* well-formed, and is a registered grandfathered tag or all subtags are registered,
|
|
39
|
+
* with no duplicate extensions or variant subtags.
|
|
40
|
+
*/
|
|
41
|
+
valid: 0.9,
|
|
42
|
+
/**
|
|
43
|
+
* Tag is valid {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-2.2.9 | according to RFC 5646} and meets
|
|
44
|
+
* other constraints described by the RFC - e.g. if present, any extlang or variant subtags have a
|
|
45
|
+
* {@link https://www.rfc-editor.org/rfc/rfc5646.html#section-3.1.8 | valid prefix} as specified by
|
|
46
|
+
* the registry.
|
|
47
|
+
*/
|
|
48
|
+
'strictly-valid': 1.0
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Determines which of two validity ranks is most normalized.
|
|
52
|
+
* @param v1 - The first {@link TagValidity} to be compared.
|
|
53
|
+
* @param v2 - The second {@link TagValidity} to be compared.
|
|
54
|
+
* @returns `1` if `v1` is more normalized, `-1` if `v2` is more
|
|
55
|
+
* normalized, or `0` if they are identical.
|
|
56
|
+
* @public
|
|
57
|
+
*/
|
|
58
|
+
export function compareValidity(v1, v2) {
|
|
59
|
+
if (validityRank[v1] > validityRank[v2]) {
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
else if (validityRank[v1] < validityRank[v2]) {
|
|
63
|
+
return -1;
|
|
64
|
+
}
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Chooses the most valid of two normalization ranks.
|
|
69
|
+
* @param v1 - The first {@link TagValidity} to be compared.
|
|
70
|
+
* @param v2 - The second {@link TagValidity} to be compared.
|
|
71
|
+
* @returns The most validated of `v1` or `v2`.
|
|
72
|
+
* @public
|
|
73
|
+
*/
|
|
74
|
+
export function mostValid(v1, v2) {
|
|
75
|
+
return validityRank[v1] >= validityRank[v2] ? v1 : v2;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -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,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
// istanbul ignore file
|
|
23
|
+
export * from './common';
|
|
24
|
+
export { IsCanonicalValidator } from './isCanonical';
|
|
25
|
+
export { IsStrictlyValidValidator } from './isStrictlyValid';
|
|
26
|
+
export { IsValidValidator } from './isValid';
|
|
27
|
+
export { IsWellFormedValidator } from './isWellFormed';
|
|
28
|
+
export { ValidateTag } from './validateTag';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -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,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import * as Iana from '../../iana';
|
|
23
|
+
import * as Bcp47Subtags from '../bcp47Subtags';
|
|
24
|
+
import { allSucceed, fail, succeed } from '@fgv/ts-utils';
|
|
25
|
+
import { TagValidatorBase } from './baseValidator';
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export class IsCanonicalValidator extends TagValidatorBase {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.validity = 'well-formed';
|
|
33
|
+
}
|
|
34
|
+
_checkLanguage(subtags) {
|
|
35
|
+
if (subtags.primaryLanguage) {
|
|
36
|
+
return this.iana.subtags.languages.verifyIsCanonical(subtags.primaryLanguage);
|
|
37
|
+
}
|
|
38
|
+
return succeed(undefined);
|
|
39
|
+
}
|
|
40
|
+
_checkExtlangs(subtags) {
|
|
41
|
+
if (subtags.extlangs) {
|
|
42
|
+
return allSucceed(subtags.extlangs.map((e) => this.iana.subtags.extlangs.verifyIsCanonical(e)), subtags.extlangs);
|
|
43
|
+
}
|
|
44
|
+
return succeed(undefined);
|
|
45
|
+
}
|
|
46
|
+
_checkScript(subtags) {
|
|
47
|
+
return subtags.script ? this.iana.subtags.scripts.verifyIsCanonical(subtags.script) : succeed(undefined);
|
|
48
|
+
}
|
|
49
|
+
_checkRegion(subtags) {
|
|
50
|
+
return subtags.region ? this.iana.subtags.regions.verifyIsCanonical(subtags.region) : succeed(undefined);
|
|
51
|
+
}
|
|
52
|
+
_checkVariants(subtags) {
|
|
53
|
+
if (subtags.variants) {
|
|
54
|
+
return allSucceed(subtags.variants.map((v) => this.iana.subtags.variants.verifyIsCanonical(v)), subtags.variants);
|
|
55
|
+
}
|
|
56
|
+
return succeed(undefined);
|
|
57
|
+
}
|
|
58
|
+
_checkExtensionSingleton(singleton) {
|
|
59
|
+
return this.iana.extensions.extensions.verifyIsCanonical(singleton);
|
|
60
|
+
}
|
|
61
|
+
_checkExtensionSubtagValue(value) {
|
|
62
|
+
return Bcp47Subtags.Validate.extensionSubtag.verifyIsCanonical(value);
|
|
63
|
+
}
|
|
64
|
+
_checkPrivateUseTags(subtags) {
|
|
65
|
+
if (subtags.privateUse) {
|
|
66
|
+
const result = Iana.LanguageSubtags.Validate.extendedLanguageRange.verifyIsCanonical(subtags.privateUse.join('-'));
|
|
67
|
+
if (result.isFailure()) {
|
|
68
|
+
return fail(result.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return succeed(subtags.privateUse);
|
|
72
|
+
}
|
|
73
|
+
_checkGrandfatheredTags(subtags) {
|
|
74
|
+
return subtags.grandfathered
|
|
75
|
+
? this.iana.subtags.grandfathered.verifyIsCanonical(subtags.grandfathered)
|
|
76
|
+
: succeed(undefined);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=isCanonical.js.map
|
|
@@ -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,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import * as Iana from '../../iana';
|
|
23
|
+
import { fail, succeed } from '@fgv/ts-utils';
|
|
24
|
+
import { subtagsToString } from '../common';
|
|
25
|
+
import { NormalizeTag } from '../normalization';
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export class IsInPreferredFromValidator {
|
|
30
|
+
constructor(iana) {
|
|
31
|
+
this.validity = 'valid';
|
|
32
|
+
/* c8 ignore next */
|
|
33
|
+
this.iana = iana !== null && iana !== void 0 ? iana : Iana.DefaultRegistries.languageRegistries;
|
|
34
|
+
}
|
|
35
|
+
validateSubtags(subtags) {
|
|
36
|
+
return NormalizeTag.toPreferred(subtags).onSuccess((preferred) => {
|
|
37
|
+
const want = subtagsToString(preferred);
|
|
38
|
+
const have = subtagsToString(subtags);
|
|
39
|
+
if (want !== have) {
|
|
40
|
+
return fail(`${have}: does not match preferred form ${want}`);
|
|
41
|
+
}
|
|
42
|
+
return succeed(true);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=isInPreferredForm.js.map
|
|
@@ -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"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import { fail, mapResults, succeed } from '@fgv/ts-utils';
|
|
23
|
+
import { subtagsToString } from '../common';
|
|
24
|
+
import { NormalizeTag } from '../normalization';
|
|
25
|
+
import { IsValidValidator } from './isValid';
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export class IsStrictlyValidValidator extends IsValidValidator {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.validity = 'strictly-valid';
|
|
33
|
+
this.normalization = 'unknown';
|
|
34
|
+
}
|
|
35
|
+
_checkExtlangs(subtags) {
|
|
36
|
+
if (subtags.extlangs) {
|
|
37
|
+
return super._checkExtlangs(subtags).onSuccess(() => this._validateExtlangPrefix(subtags));
|
|
38
|
+
}
|
|
39
|
+
return succeed(undefined);
|
|
40
|
+
}
|
|
41
|
+
_checkVariants(subtags) {
|
|
42
|
+
if (subtags.variants) {
|
|
43
|
+
return super._checkVariants(subtags).onSuccess((v) => this._validateVariantPrefix(subtags, v));
|
|
44
|
+
}
|
|
45
|
+
return succeed(undefined);
|
|
46
|
+
}
|
|
47
|
+
_validateExtlangPrefix(subtags) {
|
|
48
|
+
if (subtags.extlangs) {
|
|
49
|
+
const prefix = this.iana.subtags.languages.toCanonical(subtags.primaryLanguage).orDefault();
|
|
50
|
+
if (!prefix) {
|
|
51
|
+
return fail('missing primary language for extlang prefix validation.');
|
|
52
|
+
}
|
|
53
|
+
return mapResults(subtags.extlangs.map((extlang) => {
|
|
54
|
+
const def = this.iana.subtags.extlangs.tryGet(extlang);
|
|
55
|
+
/* c8 ignore next 3 - should never happen due to guards earlier in conversion */
|
|
56
|
+
if (!def) {
|
|
57
|
+
return fail(`invalid extlang subtag "${extlang}" (not registered).`);
|
|
58
|
+
}
|
|
59
|
+
if (prefix !== def.prefix) {
|
|
60
|
+
return fail(`invalid prefix "${prefix}" for extlang subtag ${extlang} (expected "${def.prefix}").`);
|
|
61
|
+
}
|
|
62
|
+
return succeed(extlang);
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
/* c8 ignore next 2 - should be caught in the caller */
|
|
66
|
+
return succeed(undefined);
|
|
67
|
+
}
|
|
68
|
+
_validateVariantPrefix(subtags, variants) {
|
|
69
|
+
const { primaryLanguage, extlangs, script, region } = subtags;
|
|
70
|
+
const nonCanonical = { primaryLanguage, extlangs, script, region };
|
|
71
|
+
const canonical = NormalizeTag.normalizeSubtags(nonCanonical, 'canonical');
|
|
72
|
+
/* c8 ignore next 3 - should be caught in the first pass */
|
|
73
|
+
if (canonical.isFailure()) {
|
|
74
|
+
return fail(`failed to normalize variant prefix: ${canonical.message}`);
|
|
75
|
+
}
|
|
76
|
+
let prefix = subtagsToString(canonical.value);
|
|
77
|
+
return mapResults(variants.map((variant) => {
|
|
78
|
+
var _a;
|
|
79
|
+
const def = this.iana.subtags.variants.tryGet(variant);
|
|
80
|
+
/* c8 ignore next 3 - should be caught in the first pass */
|
|
81
|
+
if (!def) {
|
|
82
|
+
return fail(`invalid variant subtag "${variant}" (not registered).`);
|
|
83
|
+
}
|
|
84
|
+
// only fail if registration specifies prefixes but none are present
|
|
85
|
+
if (((_a = def.prefix) === null || _a === void 0 ? void 0 : _a.includes(prefix)) === false) {
|
|
86
|
+
return fail(`invalid prefix "${prefix}" for variant subtag ${variant} (expected "(${def.prefix.join(', ')})").`);
|
|
87
|
+
}
|
|
88
|
+
const canonicalVariant = this.iana.subtags.variants.toCanonical(variant).orDefault();
|
|
89
|
+
prefix = `${prefix}-${canonicalVariant}`;
|
|
90
|
+
return succeed(variant);
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=isStrictlyValid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isStrictlyValid.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/isStrictlyValid.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, fail, mapResults, succeed } from '@fgv/ts-utils';\nimport { ISubtags, subtagsToString } from '../common';\nimport { NormalizeTag, TagNormalization } from '../normalization';\n\nimport { TagValidity } from './common';\nimport { IsValidValidator } from './isValid';\n\n/**\n * @internal\n */\nexport class IsStrictlyValidValidator extends IsValidValidator {\n public validity: TagValidity = 'strictly-valid';\n public normalization: TagNormalization = 'unknown';\n\n protected _checkExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return super._checkExtlangs(subtags).onSuccess(() => this._validateExtlangPrefix(subtags));\n }\n return succeed(undefined);\n }\n\n protected _checkVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return super._checkVariants(subtags).onSuccess((v) => this._validateVariantPrefix(subtags, v!));\n }\n return succeed(undefined);\n }\n\n protected _validateExtlangPrefix(\n subtags: Readonly<ISubtags>\n ): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n const prefix = this.iana.subtags.languages.toCanonical(subtags.primaryLanguage).orDefault();\n if (!prefix) {\n return fail('missing primary language for extlang prefix validation.');\n }\n\n return mapResults(\n subtags.extlangs.map((extlang) => {\n const def = this.iana.subtags.extlangs.tryGet(extlang);\n /* c8 ignore next 3 - should never happen due to guards earlier in conversion */\n if (!def) {\n return fail(`invalid extlang subtag \"${extlang}\" (not registered).`);\n }\n if (prefix !== def.prefix) {\n return fail(\n `invalid prefix \"${prefix}\" for extlang subtag ${extlang} (expected \"${def.prefix}\").`\n );\n }\n return succeed(extlang);\n })\n );\n }\n /* c8 ignore next 2 - should be caught in the caller */\n return succeed(undefined);\n }\n\n protected _validateVariantPrefix(\n subtags: Readonly<ISubtags>,\n variants: Iana.LanguageSubtags.VariantSubtag[]\n ): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n const { primaryLanguage, extlangs, script, region } = subtags;\n const nonCanonical = { primaryLanguage, extlangs, script, region };\n const canonical = NormalizeTag.normalizeSubtags(nonCanonical, 'canonical');\n /* c8 ignore next 3 - should be caught in the first pass */\n if (canonical.isFailure()) {\n return fail(`failed to normalize variant prefix: ${canonical.message}`);\n }\n let prefix = subtagsToString(canonical.value);\n\n return mapResults(\n variants.map((variant) => {\n const def = this.iana.subtags.variants.tryGet(variant);\n /* c8 ignore next 3 - should be caught in the first pass */\n if (!def) {\n return fail(`invalid variant subtag \"${variant}\" (not registered).`);\n }\n\n // only fail if registration specifies prefixes but none are present\n if (def.prefix?.includes(prefix as Iana.LanguageSubtags.ExtendedLanguageRange) === false) {\n return fail(\n `invalid prefix \"${prefix}\" for variant subtag ${variant} (expected \"(${def.prefix.join(\n ', '\n )})\").`\n );\n }\n const canonicalVariant = this.iana.subtags.variants.toCanonical(variant).orDefault();\n prefix = `${prefix}-${canonicalVariant}`;\n return succeed(variant);\n })\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022 Erik Fortune
|
|
3
|
+
*
|
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
* furnished to do so, subject to the following conditions:
|
|
10
|
+
*
|
|
11
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
* copies or substantial portions of the Software.
|
|
13
|
+
*
|
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
* SOFTWARE.
|
|
21
|
+
*/
|
|
22
|
+
import * as Iana from '../../iana';
|
|
23
|
+
import * as Bcp47Subtags from '../bcp47Subtags';
|
|
24
|
+
import { allSucceed, fail, mapResults, succeed } from '@fgv/ts-utils';
|
|
25
|
+
import { TagValidatorBase } from './baseValidator';
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export class IsValidValidator extends TagValidatorBase {
|
|
30
|
+
constructor() {
|
|
31
|
+
super(...arguments);
|
|
32
|
+
this.validity = 'valid';
|
|
33
|
+
}
|
|
34
|
+
_checkLanguage(subtags) {
|
|
35
|
+
return subtags.primaryLanguage
|
|
36
|
+
? this.iana.subtags.languages.verifyIsValid(subtags.primaryLanguage)
|
|
37
|
+
: succeed(undefined);
|
|
38
|
+
}
|
|
39
|
+
_checkExtlangs(subtags) {
|
|
40
|
+
if (subtags.extlangs) {
|
|
41
|
+
return allSucceed(subtags.extlangs.map((e) => this.iana.subtags.extlangs.verifyIsValid(e)), subtags.extlangs);
|
|
42
|
+
}
|
|
43
|
+
return succeed(undefined);
|
|
44
|
+
}
|
|
45
|
+
_checkScript(subtags) {
|
|
46
|
+
return subtags.script ? this.iana.subtags.scripts.verifyIsValid(subtags.script) : succeed(undefined);
|
|
47
|
+
}
|
|
48
|
+
_checkRegion(subtags) {
|
|
49
|
+
return subtags.region ? this.iana.subtags.regions.verifyIsValid(subtags.region) : succeed(undefined);
|
|
50
|
+
}
|
|
51
|
+
_checkVariants(subtags) {
|
|
52
|
+
if (subtags.variants) {
|
|
53
|
+
return allSucceed(subtags.variants.map((v) => this.iana.subtags.variants.verifyIsValid(v)), subtags.variants).onSuccess((v) => {
|
|
54
|
+
return mapResults(v.map((vc) => this.iana.subtags.variants.toCanonical(vc))).onSuccess((canonical) => {
|
|
55
|
+
return this._verifyUnique('variant subtag', canonical, (v) => v);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return succeed(undefined);
|
|
60
|
+
}
|
|
61
|
+
_checkExtensionSingleton(singleton) {
|
|
62
|
+
return this.iana.extensions.extensions.verifyIsValid(singleton);
|
|
63
|
+
}
|
|
64
|
+
_checkExtensionSubtagValue(value) {
|
|
65
|
+
return Bcp47Subtags.Validate.extensionSubtag.verifyIsWellFormed(value);
|
|
66
|
+
}
|
|
67
|
+
_checkExtensions(subtags) {
|
|
68
|
+
return super._checkExtensions(subtags).onSuccess((extensions) => {
|
|
69
|
+
return this._verifyUnique('extensions', extensions, (e) => e.singleton.toLowerCase());
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
_checkPrivateUseTags(subtags) {
|
|
73
|
+
if (subtags.privateUse) {
|
|
74
|
+
return allSucceed(subtags.privateUse.map((pu) => Iana.LanguageSubtags.Validate.extendedLanguageRange.verifyIsWellFormed(pu)), subtags.privateUse);
|
|
75
|
+
}
|
|
76
|
+
return succeed(subtags.privateUse);
|
|
77
|
+
}
|
|
78
|
+
_checkGrandfatheredTags(subtags) {
|
|
79
|
+
return subtags.grandfathered
|
|
80
|
+
? this.iana.subtags.grandfathered.verifyIsValid(subtags.grandfathered)
|
|
81
|
+
: succeed(undefined);
|
|
82
|
+
}
|
|
83
|
+
_postValidate(subtags) {
|
|
84
|
+
return this._basicPostValidation(subtags).onSuccess((validated) => {
|
|
85
|
+
if (validated.extlangs && validated.extlangs.length > 1) {
|
|
86
|
+
return fail(`${validated.extlangs.join('-')}: multiple extlang subtags is invalid`);
|
|
87
|
+
}
|
|
88
|
+
return succeed(validated);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=isValid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isValid.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/validation/isValid.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, mapResults, succeed } from '@fgv/ts-utils';\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { IExtensionSubtagValue, ISubtags } from '../common';\nimport { TagValidatorBase } from './baseValidator';\nimport { TagValidity } from './common';\n\n/**\n * @internal\n */\nexport class IsValidValidator extends TagValidatorBase {\n public validity: TagValidity = 'valid';\n\n protected _checkLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n return subtags.primaryLanguage\n ? this.iana.subtags.languages.verifyIsValid(subtags.primaryLanguage)\n : 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.verifyIsValid(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.verifyIsValid(subtags.script) : succeed(undefined);\n }\n\n protected _checkRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n return subtags.region ? this.iana.subtags.regions.verifyIsValid(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.verifyIsValid(v)),\n subtags.variants\n ).onSuccess((v) => {\n return mapResults(v.map((vc) => this.iana.subtags.variants.toCanonical(vc))).onSuccess(\n (canonical) => {\n return this._verifyUnique('variant subtag', canonical, (v) => v);\n }\n );\n });\n }\n return succeed(undefined);\n }\n\n protected _checkExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton> {\n return this.iana.extensions.extensions.verifyIsValid(singleton);\n }\n\n protected _checkExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.verifyIsWellFormed(value);\n }\n\n protected _checkExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n return super._checkExtensions(subtags).onSuccess((extensions) => {\n return this._verifyUnique('extensions', extensions, (e) => e.singleton.toLowerCase());\n });\n }\n\n protected _checkPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n return allSucceed(\n subtags.privateUse.map((pu) =>\n Iana.LanguageSubtags.Validate.extendedLanguageRange.verifyIsWellFormed(pu)\n ),\n subtags.privateUse\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.verifyIsValid(subtags.grandfathered)\n : succeed(undefined);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return this._basicPostValidation(subtags).onSuccess((validated) => {\n if (validated.extlangs && validated.extlangs.length > 1) {\n return fail(`${validated.extlangs.join('-')}: multiple extlang subtags is invalid`);\n }\n return succeed(validated);\n });\n }\n}\n"]}
|