Socket
Socket
Sign inDemoInstall

bcp-47-normalize

Package Overview
Dependencies
5
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.0 to 1.1.0

331

lib/defaults.json
[
"aa-et",
"af-za",
"mni-beng-in",
"mni-mtei-in",
"sat-deva-in",
"sat-olck-in",
"shi-latn-ma",
"shi-tfng-ma",
"vai-latn-lr",
"vai-vaii-lr",
"yue-hans-cn",
"yue-hant-hk",
"az-arab-ir",
"az-cyrl-az",
"az-latn-az",
"bm-nkoo-ml",
"bs-cyrl-ba",
"bs-latn-ba",
"en-dsrt-us",
"ff-adlm-gn",
"ff-latn-sn",
"ha-arab-ng",
"hi-latn-in",
"iu-latn-ca",
"ks-arab-in",
"ks-deva-in",
"mn-mong-cn",
"ms-arab-my",
"pa-arab-pk",
"pa-guru-in",
"sd-arab-pk",
"sd-deva-in",
"sr-cyrl-rs",
"sr-latn-rs",
"su-latn-id",
"uz-arab-af",
"uz-cyrl-uz",
"uz-latn-uz",
"zh-hans-cn",
"zh-hant-tw",
"mni-beng",
"sat-olck",
"shi-tfng",
"vai-vaii",
"yue-hant",
"az-latn",
"bs-latn",
"ff-latn",
"jbo-001",
"ks-arab",
"pa-guru",
"prg-001",
"sd-arab",
"sr-cyrl",
"su-latn",
"uz-latn",
"zh-hans",
"agq-cm",
"ak-gh",
"am-et",
"an-es",
"ar-001",
"arn-cl",
"as-in",
"asa-tz",
"ast-es",
"az-arab-ir",
"az-cyrl-az",
"az-latn",
"az-latn-az",
"ba-ru",
"bas-cm",
"be-by",
"bem-zm",
"bez-tz",
"bg-bg",
"bgn-pk",
"blt-vn",
"bm-ml",
"bm-nkoo-ml",
"bn-bd",
"bo-cn",
"br-fr",
"brx-in",
"bs-cyrl-ba",
"bs-latn",
"bs-latn-ba",
"bss-cm",
"byn-er",
"ca-es",
"cad-us",
"cch-ng",
"ccp-bd",
"ce-ru",
"ceb-ph",

@@ -46,2 +78,113 @@ "cgg-ug",

"ckb-iq",
"dav-ke",
"dje-ne",
"doi-in",
"dsb-de",
"dua-cm",
"dyo-sn",
"ebu-ke",
"eo-001",
"ewo-cm",
"fil-ph",
"fur-it",
"gaa-gh",
"gez-et",
"gsw-ch",
"guz-ke",
"haw-us",
"hsb-de",
"ia-001",
"ife-tg",
"io-001",
"jgo-cm",
"jmc-tz",
"kab-dz",
"kaj-ng",
"kam-ke",
"kcg-ng",
"kde-tz",
"kea-cv",
"ken-cm",
"khq-ml",
"kkj-cm",
"kln-ke",
"kok-in",
"kpe-lr",
"ksb-tz",
"ksf-cm",
"ksh-de",
"lag-tz",
"lkt-us",
"lrc-ir",
"luo-ke",
"luy-ke",
"mai-in",
"mas-ke",
"mer-ke",
"mfe-mu",
"mgh-mz",
"mgo-cm",
"moh-ca",
"mua-cm",
"mus-us",
"myv-ru",
"mzn-ir",
"naq-na",
"nds-de",
"nmg-cm",
"nnh-cm",
"nqo-gn",
"nso-za",
"nus-ss",
"nyn-ug",
"osa-us",
"pcm-ng",
"quc-gt",
"rof-tz",
"rwk-tz",
"sah-ru",
"saq-ke",
"sbp-tz",
"scn-it",
"sdh-ir",
"seh-mz",
"ses-ml",
"sid-et",
"sma-se",
"smj-se",
"smn-fi",
"sms-fi",
"ssy-er",
"syr-iq",
"szl-pl",
"teo-ug",
"tig-er",
"trv-tw",
"trw-pk",
"twq-ne",
"tzm-ma",
"vo-001",
"vun-tz",
"wae-ch",
"wal-et",
"wbp-au",
"xog-ug",
"yav-cm",
"yi-001",
"zgh-ma",
"aa-et",
"af-za",
"ak-gh",
"am-et",
"an-es",
"as-in",
"ba-ru",
"be-by",
"bg-bg",
"bm-ml",
"bn-bd",
"bo-cn",
"br-fr",
"ca-es",
"ce-ru",
"co-fr",

@@ -53,112 +196,54 @@ "cs-cz",

"da-dk",
"dav-ke",
"de-de",
"dje-ne",
"dsb-de",
"dua-cm",
"dv-mv",
"dyo-sn",
"dz-bt",
"ebu-ke",
"ee-gh",
"el-gr",
"en-dsrt-us",
"en-us",
"eo-001",
"es-es",
"et-ee",
"eu-es",
"ewo-cm",
"fa-ir",
"ff-adlm-gn",
"ff-latn",
"ff-latn-sn",
"fi-fi",
"fil-ph",
"fo-fo",
"fr-fr",
"fur-it",
"fy-nl",
"ga-ie",
"gaa-gh",
"gd-gb",
"gez-et",
"gl-es",
"gn-py",
"gsw-ch",
"gu-in",
"guz-ke",
"gv-im",
"ha-arab-ng",
"ha-ng",
"haw-us",
"he-il",
"hi-in",
"hi-latn-in",
"hr-hr",
"hsb-de",
"hu-hu",
"hy-am",
"ia-001",
"id-id",
"ife-tg",
"ig-ng",
"ii-cn",
"io-001",
"is-is",
"it-it",
"iu-ca",
"iu-latn-ca",
"ja-jp",
"jbo-001",
"jgo-cm",
"jmc-tz",
"jv-id",
"ka-ge",
"kab-dz",
"kaj-ng",
"kam-ke",
"kcg-ng",
"kde-tz",
"kea-cv",
"ken-cm",
"khq-ml",
"ki-ke",
"kk-kz",
"kkj-cm",
"kl-gl",
"kln-ke",
"km-kh",
"kn-in",
"ko-kr",
"kok-in",
"kpe-lr",
"ks-arab",
"ks-arab-in",
"ks-deva-in",
"ksb-tz",
"ksf-cm",
"ksh-de",
"ku-tr",
"kw-gb",
"ky-kg",
"lag-tz",
"lb-lu",
"lg-ug",
"lkt-us",
"ln-cd",
"lo-la",
"lrc-ir",
"lt-lt",
"lu-cd",
"luo-ke",
"luy-ke",
"lv-lv",
"mai-in",
"mas-ke",
"mer-ke",
"mfe-mu",
"mg-mg",
"mgh-mz",
"mgo-cm",
"mi-nz",

@@ -168,31 +253,14 @@ "mk-mk",

"mn-mn",
"mn-mong-cn",
"mni-beng",
"mni-beng-in",
"mni-mtei-in",
"moh-ca",
"mr-in",
"ms-arab-my",
"ms-my",
"mt-mt",
"mua-cm",
"mus-us",
"my-mm",
"myv-ru",
"mzn-ir",
"naq-na",
"nb-no",
"nd-zw",
"nds-de",
"ne-np",
"nl-nl",
"nmg-cm",
"nn-no",
"nnh-cm",
"nqo-gn",
"nr-za",
"nso-za",
"nus-ss",
"nv-us",
"ny-mw",
"nyn-ug",
"oc-fr",

@@ -202,70 +270,30 @@ "om-et",

"os-ge",
"osa-us",
"pa-arab-pk",
"pa-guru",
"pa-guru-in",
"pcm-ng",
"pl-pl",
"prg-001",
"ps-af",
"pt-br",
"qu-pe",
"quc-gt",
"rm-ch",
"rn-bi",
"ro-ro",
"rof-tz",
"ru-ru",
"rw-rw",
"rwk-tz",
"sa-in",
"sah-ru",
"saq-ke",
"sat-deva-in",
"sat-olck",
"sat-olck-in",
"sbp-tz",
"sc-it",
"scn-it",
"sd-arab",
"sd-arab-pk",
"sd-deva-in",
"sdh-ir",
"se-no",
"seh-mz",
"ses-ml",
"sg-cf",
"shi-latn-ma",
"shi-tfng",
"shi-tfng-ma",
"si-lk",
"sid-et",
"sk-sk",
"sl-si",
"sma-se",
"smj-se",
"smn-fi",
"sms-fi",
"sn-zw",
"so-so",
"sq-al",
"sr-cyrl",
"sr-cyrl-rs",
"sr-latn-rs",
"ss-za",
"ssy-er",
"st-za",
"su-latn",
"su-latn-id",
"sv-se",
"sw-tz",
"syr-iq",
"szl-pl",
"ta-in",
"te-in",
"teo-ug",
"tg-tj",
"th-th",
"ti-et",
"tig-er",
"tk-tm",

@@ -275,39 +303,14 @@ "tn-za",

"tr-tr",
"trv-tw",
"ts-za",
"tt-ru",
"twq-ne",
"tzm-ma",
"ug-cn",
"uk-ua",
"ur-pk",
"uz-arab-af",
"uz-cyrl-uz",
"uz-latn",
"uz-latn-uz",
"vai-latn-lr",
"vai-vaii",
"vai-vaii-lr",
"ve-za",
"vi-vn",
"vo-001",
"vun-tz",
"wa-be",
"wae-ch",
"wal-et",
"wbp-au",
"wo-sn",
"xh-za",
"xog-ug",
"yav-cm",
"yi-001",
"yo-ng",
"yue-hans-cn",
"yue-hant",
"yue-hant-hk",
"zgh-ma",
"zh-hans",
"zh-hans-cn",
"zh-hant-tw",
"zu-za"
]

@@ -13,2 +13,3 @@ 'use strict'

var own = {}.hasOwnProperty
var assign = Object.assign

@@ -20,9 +21,21 @@ var parse = bcp47.parse

var emptyExtraFields = {
variants: [],
extensions: [],
privateuse: [],
irregular: null,
regular: null
}
function normalize(value, options) {
var opts = options || {}
var forgiving = opts.forgiving
var warning = opts.warning
var settings = options || {}
var forgiving = settings.forgiving
var warning = settings.warning
// 1. normalize and lowercase the tag (`sgn-be-fr` -> `sfb`).
var schema = parse(String(value || '').toLowerCase(), {forgiving, warning})
var schema = parse(String(value || '').toLowerCase(), {
forgiving: forgiving,
warning: warning
})
var tag = stringify(schema)
var coreTag
// 2. Do fancy, expensive replaces (`ha-latn-gh` -> `ha-gh`).

@@ -58,3 +71,3 @@ var length = matches.length

// 4. Remove defaults (`nl-nl` -> `nl`).
tag = stringify(schema)
coreTag = stringify(assign({}, schema, emptyExtraFields))
length = defaults.length

@@ -66,17 +79,14 @@ index = -1

if (
d === tag ||
(tag.charAt(d.length) === '-' && tag.slice(0, d.length) === d)
) {
tag = d.slice(0, d.lastIndexOf('-')) + tag.slice(d.length)
if (coreTag === d) {
replace(schema, d, d.split('-').slice(0, -1).join('-'))
coreTag = stringify(assign({}, schema, emptyExtraFields))
}
}
// 5. Add proper casing back.
schema = parse(tag)
tag = stringify(schema)
// 6. Sort extensions on singleton.
// 5. Sort extensions on singleton.
schema.extensions.sort(compareSingleton)
// 7. Warn if fields (currently only regions) should be updated but have
// 6. Warn if fields (currently only regions) should be updated but have
// multiple choices.

@@ -101,2 +111,3 @@ if (warning) {

// 7. Add proper casing back.
// Format script (ISO 15924) as titlecase (example: `Latn`):

@@ -143,3 +154,3 @@ if (schema.script !== null) {

function remove(obj, key, value) {
function remove(object, key, value) {
var removed = false

@@ -150,3 +161,3 @@ var current

var index
var val
var item

@@ -157,3 +168,3 @@ /* istanbul ignore else - this is currently done by wrapping code, so else is

if (value) {
current = obj[key]
current = object[key]
result = current

@@ -165,7 +176,8 @@

index = -1
while (++index < length) {
val = current[index]
item = current[index]
if (value.indexOf(val) === -1) {
result.push(val)
if (value.indexOf(item) === -1) {
result.push(item)
} else {

@@ -180,3 +192,3 @@ removed = true

obj[key] = result
object[key] = result
}

@@ -187,8 +199,8 @@

function add(obj, key, value) {
var current = obj[key]
function add(object, key, value) {
var current = object[key]
var list
var length
var index
var val
var item

@@ -201,12 +213,12 @@ if (array(current)) {

while (++index < length) {
val = list[index]
item = list[index]
/* istanbul ignore else - this currently can’t happen, but guard for the
* future. */
if (current.indexOf(val) === -1) {
current.push(val)
if (current.indexOf(item) === -1) {
current.push(item)
}
}
} else {
obj[key] = value
object[key] = value
}

@@ -213,0 +225,0 @@ }

@@ -343,2 +343,74 @@ [

{
"from": "sgn-br",
"to": "bzs"
},
{
"from": "sgn-co",
"to": "csn"
},
{
"from": "sgn-de",
"to": "gsg"
},
{
"from": "sgn-dk",
"to": "dsl"
},
{
"from": "sgn-fr",
"to": "fsl"
},
{
"from": "sgn-gb",
"to": "bfi"
},
{
"from": "sgn-gr",
"to": "gss"
},
{
"from": "sgn-ie",
"to": "isg"
},
{
"from": "sgn-it",
"to": "ise"
},
{
"from": "sgn-jp",
"to": "jsl"
},
{
"from": "sgn-mx",
"to": "mfs"
},
{
"from": "sgn-ni",
"to": "ncs"
},
{
"from": "sgn-nl",
"to": "dse"
},
{
"from": "sgn-no",
"to": "nsi"
},
{
"from": "sgn-pt",
"to": "psr"
},
{
"from": "sgn-se",
"to": "swl"
},
{
"from": "sgn-us",
"to": "ase"
},
{
"from": "sgn-za",
"to": "sfs"
},
{
"from": "no-bokmal",

@@ -345,0 +417,0 @@ "to": "nb"

{
"name": "bcp-47-normalize",
"version": "1.0.0",
"version": "1.1.0",
"description": "Normalize, canonicalize, and format BCP 47 tags",

@@ -42,12 +42,12 @@ "license": "MIT",

"nyc": "^15.0.0",
"prettier": "^1.0.0",
"remark-cli": "^7.0.0",
"remark-preset-wooorm": "^6.0.0",
"tape": "^4.0.0",
"prettier": "^2.0.0",
"remark-cli": "^8.0.0",
"remark-preset-wooorm": "^7.0.0",
"tape": "^5.0.0",
"unist-util-visit": "^2.0.0",
"xast-util-from-xml": "^1.0.0",
"xo": "^0.26.0"
"xo": "^0.32.0"
},
"scripts": {
"format": "remark . -qfo && prettier --write \"**/*.js\" && xo --fix",
"format": "remark . -qfo && prettier --write . && xo --fix",
"test-api": "node test",

@@ -69,3 +69,5 @@ "test-coverage": "nyc --reporter lcov tape test.js",

"rules": {
"unicorn/prefer-includes": "off"
"unicorn/prefer-includes": "off",
"unicorn/prefer-number-properties": "off",
"unicorn/prefer-set-has": "off"
}

@@ -72,0 +74,0 @@ },

@@ -89,2 +89,4 @@ # bcp-47-normalize

— Match BCP 47 language tags with language ranges per RFC 4647
* [`iso-3166`](https://github.com/wooorm/iso-3166)
— ISO 3166 codes
* [`iso-639-2`](https://github.com/wooorm/iso-639-2)

@@ -91,0 +93,0 @@ — ISO 639-2 codes

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc