diff --git a/CHANGELOG.md b/CHANGELOG.md index 244b8693bd..0e99854119 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Fixed + +- Fixes [#4403](https://github.com/microsoft/BotFramework-WebChat/issues/4403). Bump to CLDR v37 and remove adopted `cldr-data` and `cldr-data-downloader` packages, by [@compulim](https://github.com/compulim), in PR [#4874](https://github.com/microsoft/BotFramework-WebChat/issues/pull/4874) + ## [4.16.0] - 2023-11-16 ### Breaking changes diff --git a/packages/api/package-lock.json b/packages/api/package-lock.json index 21fc7cb6f1..32030ec9e1 100644 --- a/packages/api/package-lock.json +++ b/packages/api/package-lock.json @@ -27,11 +27,16 @@ "@types/react": "^18.2.21", "babel-plugin-istanbul": "^6.1.1", "babel-plugin-transform-inline-environment-variables": "^0.4.4", + "cldr-core": "^37.0.0", + "cldr-dates-full": "^37.0.0", + "cldr-numbers-full": "^37.0.0", + "cldr-units-full": "^37.0.0", "concurrently": "^8.2.1", "core-js": "^3.32.1", "globalize-compiler": "^1.1.1", "iana-tz-data": "^2019.1.0", "node-dev": "^8.0.0", + "resolve-pkg": "^2.0.0", "typescript": "^5.2.2" }, "peerDependencies": { @@ -101,12 +106,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" @@ -479,9 +485,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -526,13 +532,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -2038,6 +2044,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "peer": true, + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -2184,6 +2200,16 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2258,6 +2284,85 @@ "fsevents": "~2.3.2" } }, + "node_modules/cldr-core": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-37.0.0.tgz", + "integrity": "sha512-tNH5lbfsE9xzsjjXQjq1tlpMFcmnQYfssDy0zYIZKVtAY18MeQy0+1qlLxB2Z9dwCixGJV8cdhtFjBOub077Gw==", + "dev": true + }, + "node_modules/cldr-data": { + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-36.0.1.tgz", + "integrity": "sha512-74leCbj4QIBno+a8MVwO4Kiqv4J1PXDcFhlgOhh86rnLljppLxxi8odVeMjqFsnEG2xxCu98P4iO9mkNXn5v9Q==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "cldr-data-downloader": "1.0.0-1", + "glob": "5.x.x" + } + }, + "node_modules/cldr-data-downloader": { + "version": "1.0.0-1", + "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-1.0.0-1.tgz", + "integrity": "sha512-jskJncLkJlkBCdqdgzLSV9sOOLyEdeVOtwJOwVwRyliVJ+4822KZWvfaD620c9Lk7el3auwFDg92FXYjGA5BhQ==", + "dev": true, + "peer": true, + "dependencies": { + "axios": "^0.26.0", + "mkdirp": "0.5.5", + "nopt": "3.0.x", + "q": "1.0.1", + "yauzl": "^2.10.0" + }, + "bin": { + "cldr-data-downloader": "bin/download.sh" + } + }, + "node_modules/cldr-data/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "peer": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cldr-dates-full": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-dates-full/-/cldr-dates-full-37.0.0.tgz", + "integrity": "sha512-0zxnbScSl2gTQJZZJ/U97tbf3sUZecNzcUg6noAqN4q6t9NlOI5oBv5gcG0pN+8rawPrkFWDBiPSQy2jAhxvoQ==", + "dev": true, + "peerDependencies": { + "cldr-numbers-full": "37.0.0" + } + }, + "node_modules/cldr-numbers-full": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-numbers-full/-/cldr-numbers-full-37.0.0.tgz", + "integrity": "sha512-XSWKxDq69lZYqEK1dAQWWWhKBGJoO887mSjWl7Bv3Kw/IjOi++LQ4EK/zYXVxQkxZpvHZPv775JOqUFWMUJB7Q==", + "dev": true, + "peerDependencies": { + "cldr-core": "37.0.0" + } + }, + "node_modules/cldr-units-full": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-units-full/-/cldr-units-full-37.0.0.tgz", + "integrity": "sha512-/zq5e8PgCU7FdzNUF+4IaeSwsIEnQr0vc3IZhLVJ8FsACXQcdO6iUR6oGRmpmBGWj6of5wBHnC3lHt5vgCbxrA==", + "dev": true, + "peerDependencies": { + "cldr-core": "37.0.0" + } + }, "node_modules/cldrjs": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.5.tgz", @@ -2686,6 +2791,16 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/filewatcher": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", @@ -2721,6 +2836,27 @@ "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -2971,9 +3107,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3204,6 +3340,19 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3429,6 +3578,13 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "peer": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3467,6 +3623,42 @@ "react-is": "^16.13.1" } }, + "node_modules/q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -3608,12 +3800,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3633,6 +3825,18 @@ "node": ">=8" } }, + "node_modules/resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -3648,6 +3852,15 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -4008,6 +4221,17 @@ "engines": { "node": ">=12" } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } }, "dependencies": { @@ -4054,12 +4278,13 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { @@ -4338,9 +4563,9 @@ "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -4373,13 +4598,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, @@ -5425,6 +5650,16 @@ "sprintf-js": "~1.0.2" } }, + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "peer": true, + "requires": { + "follow-redirects": "^1.14.8" + } + }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -5536,6 +5771,13 @@ "update-browserslist-db": "^1.0.9" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "peer": true + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5586,6 +5828,74 @@ "readdirp": "~3.6.0" } }, + "cldr-core": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-37.0.0.tgz", + "integrity": "sha512-tNH5lbfsE9xzsjjXQjq1tlpMFcmnQYfssDy0zYIZKVtAY18MeQy0+1qlLxB2Z9dwCixGJV8cdhtFjBOub077Gw==", + "dev": true + }, + "cldr-data": { + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-36.0.1.tgz", + "integrity": "sha512-74leCbj4QIBno+a8MVwO4Kiqv4J1PXDcFhlgOhh86rnLljppLxxi8odVeMjqFsnEG2xxCu98P4iO9mkNXn5v9Q==", + "dev": true, + "peer": true, + "requires": { + "cldr-data-downloader": "1.0.0-1", + "glob": "5.x.x" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "peer": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "cldr-data-downloader": { + "version": "1.0.0-1", + "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-1.0.0-1.tgz", + "integrity": "sha512-jskJncLkJlkBCdqdgzLSV9sOOLyEdeVOtwJOwVwRyliVJ+4822KZWvfaD620c9Lk7el3auwFDg92FXYjGA5BhQ==", + "dev": true, + "peer": true, + "requires": { + "axios": "^0.26.0", + "mkdirp": "0.5.5", + "nopt": "3.0.x", + "q": "1.0.1", + "yauzl": "^2.10.0" + } + }, + "cldr-dates-full": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-dates-full/-/cldr-dates-full-37.0.0.tgz", + "integrity": "sha512-0zxnbScSl2gTQJZZJ/U97tbf3sUZecNzcUg6noAqN4q6t9NlOI5oBv5gcG0pN+8rawPrkFWDBiPSQy2jAhxvoQ==", + "dev": true, + "requires": {} + }, + "cldr-numbers-full": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-numbers-full/-/cldr-numbers-full-37.0.0.tgz", + "integrity": "sha512-XSWKxDq69lZYqEK1dAQWWWhKBGJoO887mSjWl7Bv3Kw/IjOi++LQ4EK/zYXVxQkxZpvHZPv775JOqUFWMUJB7Q==", + "dev": true, + "requires": {} + }, + "cldr-units-full": { + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/cldr-units-full/-/cldr-units-full-37.0.0.tgz", + "integrity": "sha512-/zq5e8PgCU7FdzNUF+4IaeSwsIEnQr0vc3IZhLVJ8FsACXQcdO6iUR6oGRmpmBGWj6of5wBHnC3lHt5vgCbxrA==", + "dev": true, + "requires": {} + }, "cldrjs": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.5.tgz", @@ -5901,6 +6211,16 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "peer": true, + "requires": { + "pend": "~1.2.0" + } + }, "filewatcher": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", @@ -5930,6 +6250,13 @@ "path-exists": "^4.0.0" } }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "peer": true + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -6118,9 +6445,9 @@ } }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -6290,6 +6617,16 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.5" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6459,6 +6796,13 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "peer": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -6488,6 +6832,32 @@ "react-is": "^16.13.1" } }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", + "dev": true, + "peer": true + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -6604,12 +6974,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -6620,6 +6990,15 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -6635,6 +7014,15 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -6890,6 +7278,17 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "peer": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } diff --git a/packages/api/package.json b/packages/api/package.json index 5533e62369..8db412b4b0 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -56,12 +56,16 @@ "@types/react": "^18.2.21", "babel-plugin-istanbul": "^6.1.1", "babel-plugin-transform-inline-environment-variables": "^0.4.4", - "cldr-data": "36.0.0-0", + "cldr-core": "^37.0.0", + "cldr-dates-full": "^37.0.0", + "cldr-numbers-full": "^37.0.0", + "cldr-units-full": "^37.0.0", "concurrently": "^8.2.1", "core-js": "^3.32.1", "globalize-compiler": "^1.1.1", "iana-tz-data": "^2019.1.0", "node-dev": "^8.0.0", + "resolve-pkg": "^2.0.0", "typescript": "^5.2.2" }, "dependencies": { @@ -80,9 +84,6 @@ "localPeerDependencies": { "botframework-webchat-core": "0.0.0-0" }, - "localPeerDevDependencies": { - "cldr-data": "36.0.0-0" - }, "pinDependencies": { "@babel/cli": [ "7.18.10", @@ -104,6 +105,22 @@ "7.18.6", "@babel/*@7.21 is causing out-of-memory (OOM) issues" ], + "cldr-core": [ + "37.0.0", + "globalize does not support CLDR v38" + ], + "cldr-dates-full": [ + "37.0.0", + "globalize does not support CLDR v38" + ], + "cldr-numbers-full": [ + "37.0.0", + "globalize does not support CLDR v38" + ], + "cldr-units-full": [ + "37.0.0", + "globalize does not support CLDR v38" + ], "react-redux": [ "7" ] diff --git a/packages/api/scripts/createPrecompiledGlobalize.mjs b/packages/api/scripts/createPrecompiledGlobalize.mjs index ed7e4efe9f..9eb82cc625 100644 --- a/packages/api/scripts/createPrecompiledGlobalize.mjs +++ b/packages/api/scripts/createPrecompiledGlobalize.mjs @@ -2,13 +2,123 @@ import { cwd } from 'process'; import { existsSync } from 'fs'; import { fileURLToPath } from 'url'; import { mkdir, readFile, writeFile } from 'fs/promises'; -import { relative } from 'path'; -import cldrData from 'cldr-data'; +import { relative, resolve } from 'path'; import Globalize from 'globalize'; import globalizeCompiler from 'globalize-compiler'; import Prettier from 'prettier'; +import resolvePkg from 'resolve-pkg'; + +async function importJSON(moduleId, path) { + // eslint-disable-next-line security/detect-non-literal-fs-filename + return JSON.parse(await readFile(resolve(resolvePkg(moduleId), path), 'utf8')); +} + +// There is an issue in the Unicode CLDR database (v36): +// +// - Polish has 4 different plural types: "one", "few", "many", "other" +// - However, some units, say "short/digital-kilobyte", only have "other" defined +// - When we localize 1024 (number) into kilobytes, it use the "one" type +// - Since "short/digital-kilobyte/one" is not defined in the database, `globalize` throw exception +// +// In all of our supported languages, we also observed the same issue in Portuguese as well. +// +// As a hotfix, we are patching the Unicode CLDR database for all `[long/short/narrow]/digital-*` rules to make sure it include all plurals needed for that language. +// +// For a long term fix, we should move forward to a newer version of CLDR database, which is outlined in https://github.com/rxaviers/cldr-data-npm/issues/78. + +let FORBIDDEN_PROPERTY_NAMES; + +function getForbiddenPropertyNames() { + return ( + FORBIDDEN_PROPERTY_NAMES || + (FORBIDDEN_PROPERTY_NAMES = Object.freeze( + Array.from( + new Set([ + // As-of writing, `Object.prototype` includes: + // __defineGetter__ + // __defineSetter__ + // __lookupGetter__ + // __lookupSetter + // __proto__ + // constructor + // hasOwnProperty + // isPrototypeOf + // propertyIsEnumerable + // toLocaleString + // toString + // valueOf + ...Object.getOwnPropertyNames(Object.prototype), + + 'prototype' + ]) + ) + )) + ); +} + +function isForbiddenPropertyName(propertyName) { + return getForbiddenPropertyNames().includes(propertyName); +} + +async function loadPatchedUnits(language) { + if (!/^[\w-]+$/u.test(language) && isForbiddenPropertyName(language)) { + throw new Error(`Invalid language code "${language}".`); + } + + const unitsJSON = await importJSON('cldr-units-full', `main/${language}/units.json`); + + const pluralsJSON = await importJSON('cldr-core', 'supplemental/plurals.json'); + + // eslint-disable-next-line security/detect-object-injection + const pluralsTypeCardinal = pluralsJSON.supplemental['plurals-type-cardinal'][language]; + + if (!pluralsTypeCardinal) { + return unitsJSON; + } + + const plurals = ['other']; + + if (!(`pluralRule-count-other` in pluralsTypeCardinal)) { + throw new Error(`Language ${language} does not have plural type "other".`); + } + + ['zero', 'one', 'two', 'few', 'many'].forEach(pluralType => { + `pluralRule-count-${pluralType}` in pluralsTypeCardinal && plurals.push(pluralType); + }); + + ['long', 'short', 'narrow'].forEach(form => { + // Both "language" and "form" are filtered and free of forbidden values. + // eslint-disable-next-line security/detect-object-injection + Object.entries(unitsJSON.main[language].units[form]).forEach(([unitName, entry]) => { + if (!unitName.startsWith('digital-')) { + return; + } + + if ('unitPattern-count-other' in entry) { + const { 'unitPattern-count-other': other } = entry; + + plurals.forEach(pluralType => { + const name = `unitPattern-count-${pluralType}`; + + if (!(name in entry)) { + // "name" is free of forbidden values. + // eslint-disable-next-line security/detect-object-injection + entry[name] = other; + } + }); + } + }); + }); + + return unitsJSON; +} + +(async function main() { + // eslint-disable-next-line security/detect-non-literal-fs-filename + Globalize.load(await importJSON('cldr-core', 'supplemental/likelySubtags.json')); + Globalize.load(await importJSON('cldr-core', 'supplemental/numberingSystems.json')); + Globalize.load(await importJSON('cldr-core', 'supplemental/plurals.json')); -(async function () { const overridesJSON = JSON.parse( // False-positive: import.meta.url is fixed and should be secure. // eslint-disable-next-line security/detect-non-literal-fs-filename @@ -17,11 +127,23 @@ import Prettier from 'prettier'; const languages = Object.values(overridesJSON).map(({ GLOBALIZE_LANGUAGE }) => GLOBALIZE_LANGUAGE); - Globalize.load(cldrData.entireSupplemental()); + const databases = await Promise.all( + languages.reduce( + (promises, language) => [ + ...promises, + importJSON('cldr-dates-full', `main/${language}/ca-gregorian.json`), + importJSON('cldr-dates-full', `main/${language}/dateFields.json`), + importJSON('cldr-numbers-full', `main/${language}/numbers.json`), + // importJSON('cldr-units-full', `main/${language}/units.json`) + loadPatchedUnits(language) + ], + [] + ) + ); - const formattersAndParsers = languages.reduce((formattersAndParsers, language) => { - Globalize.load(cldrData.entireMainFor(language)); + databases.forEach(database => Globalize.load(database)); + const formattersAndParsers = languages.reduce((formattersAndParsers, language) => { const globalize = new Globalize(language); return [ diff --git a/packages/api/src/external/PrecompileGlobalize.spec.ts b/packages/api/src/external/PrecompileGlobalize.spec.ts new file mode 100644 index 0000000000..1f3fb2ea80 --- /dev/null +++ b/packages/api/src/external/PrecompileGlobalize.spec.ts @@ -0,0 +1,94 @@ +import PrecompiledGlobalize from '../../lib/external/PrecompiledGlobalize'; + +describe.each([ + ['ar-EG'], + ['ar-SA'], + ['bg'], + ['ca'], + ['cs'], + ['da'], + ['de'], + ['el'], + ['en'], + ['es'], + ['et'], + ['eu'], + ['fi'], + ['fr'], + ['gl'], + ['he'], + ['hi'], + ['hr'], + ['hu'], + ['id'], + ['it'], + ['ja'], + ['kk'], + ['ko'], + ['lt'], + ['lv'], + ['ms'], + ['nb'], + ['nl'], + ['pl'], + ['pt'], + ['pt-PT'], + ['ro'], + ['ru'], + ['sk'], + ['sl'], + ['sr-Cyrl'], + ['sr-Latn'], + ['sv'], + ['th'], + ['tr'], + ['uk'], + ['vi'], + ['yue'], + ['zh-Hans'], + ['zh-Hans-SG'], + ['zh-Hant'], + ['zh-Hant-HK'], + ['zh-Hant-MO'] +])('use globalize with locale "%s"', locale => { + const globalize = new PrecompiledGlobalize(locale); + + test('should format date', () => + // eslint-disable-next-line no-restricted-globals + expect(globalize.dateFormatter({ skeleton: 'MMMMdhm' })(new Date('2023-09-22T12:34:56.789Z'))).toMatchSnapshot()); + + // eslint-disable-next-line no-magic-numbers + test('should format plural', () => expect(globalize.pluralGenerator()(12345)).toMatchSnapshot()); + + test('should format positive relative time in hour', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.relativeTimeFormatter('hour')(10)).toMatchSnapshot()); + + test('should format negative relative time in hour', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.relativeTimeFormatter('hour')(-10)).toMatchSnapshot()); + + test('should format positive relative time in minute', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.relativeTimeFormatter('minute')(10)).toMatchSnapshot()); + + test('should format negative relative time in minute', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.relativeTimeFormatter('minute')(-10)).toMatchSnapshot()); + + test('should format number in byte with long format', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.unitFormatter('byte', { form: 'long' })(10)).toMatchSnapshot()); + + test('should format number in kilobyte with short format', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.unitFormatter('kilobyte', { form: 'short' })(10)).toMatchSnapshot()); + + test('should format number in megabyte with short format', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.unitFormatter('megabyte', { form: 'short' })(10)).toMatchSnapshot()); + + test('should format number in gigabyte with short format', () => + // eslint-disable-next-line no-magic-numbers + expect(globalize.unitFormatter('gigabyte', { form: 'short' })(10)).toMatchSnapshot()); +}); diff --git a/packages/api/src/external/__snapshots__/PrecompileGlobalize.spec.ts.snap b/packages/api/src/external/__snapshots__/PrecompileGlobalize.spec.ts.snap new file mode 100644 index 0000000000..7578167e57 --- /dev/null +++ b/packages/api/src/external/__snapshots__/PrecompileGlobalize.spec.ts.snap @@ -0,0 +1,981 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`use globalize with locale "ar-EG" should format date 1`] = `"٢٢ سبتمبر ١٢:٣٤ م"`; + +exports[`use globalize with locale "ar-EG" should format negative relative time in hour 1`] = `"قبل ١٠ ساعات"`; + +exports[`use globalize with locale "ar-EG" should format negative relative time in minute 1`] = `"قبل ١٠ دقائق"`; + +exports[`use globalize with locale "ar-EG" should format number in byte with long format 1`] = `"١٠ بايت"`; + +exports[`use globalize with locale "ar-EG" should format number in gigabyte with short format 1`] = `"١٠ غيغابايت"`; + +exports[`use globalize with locale "ar-EG" should format number in kilobyte with short format 1`] = `"١٠ كيلوبايت"`; + +exports[`use globalize with locale "ar-EG" should format number in megabyte with short format 1`] = `"١٠ ميغابايت"`; + +exports[`use globalize with locale "ar-EG" should format plural 1`] = `"many"`; + +exports[`use globalize with locale "ar-EG" should format positive relative time in hour 1`] = `"خلال ١٠ ساعات"`; + +exports[`use globalize with locale "ar-EG" should format positive relative time in minute 1`] = `"خلال ١٠ دقائق"`; + +exports[`use globalize with locale "ar-SA" should format date 1`] = `"٢٢ سبتمبر ١٢:٣٤ م"`; + +exports[`use globalize with locale "ar-SA" should format negative relative time in hour 1`] = `"قبل ١٠ ساعات"`; + +exports[`use globalize with locale "ar-SA" should format negative relative time in minute 1`] = `"قبل ١٠ دقائق"`; + +exports[`use globalize with locale "ar-SA" should format number in byte with long format 1`] = `"١٠ بايت"`; + +exports[`use globalize with locale "ar-SA" should format number in gigabyte with short format 1`] = `"١٠ غيغابايت"`; + +exports[`use globalize with locale "ar-SA" should format number in kilobyte with short format 1`] = `"١٠ كيلوبايت"`; + +exports[`use globalize with locale "ar-SA" should format number in megabyte with short format 1`] = `"١٠ ميغابايت"`; + +exports[`use globalize with locale "ar-SA" should format plural 1`] = `"many"`; + +exports[`use globalize with locale "ar-SA" should format positive relative time in hour 1`] = `"خلال ١٠ ساعات"`; + +exports[`use globalize with locale "ar-SA" should format positive relative time in minute 1`] = `"خلال ١٠ دقائق"`; + +exports[`use globalize with locale "bg" should format date 1`] = `"22 септември, 12:34 сл.об."`; + +exports[`use globalize with locale "bg" should format negative relative time in hour 1`] = `"преди 10 часа"`; + +exports[`use globalize with locale "bg" should format negative relative time in minute 1`] = `"преди 10 минути"`; + +exports[`use globalize with locale "bg" should format number in byte with long format 1`] = `"10 байта"`; + +exports[`use globalize with locale "bg" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "bg" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "bg" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "bg" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "bg" should format positive relative time in hour 1`] = `"след 10 часа"`; + +exports[`use globalize with locale "bg" should format positive relative time in minute 1`] = `"след 10 минути"`; + +exports[`use globalize with locale "ca" should format date 1`] = `"22 de setembre a les 12:34 p. m."`; + +exports[`use globalize with locale "ca" should format negative relative time in hour 1`] = `"fa 10 hores"`; + +exports[`use globalize with locale "ca" should format negative relative time in minute 1`] = `"fa 10 minuts"`; + +exports[`use globalize with locale "ca" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "ca" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "ca" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "ca" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "ca" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "ca" should format positive relative time in hour 1`] = `"d’aquí a 10 hores"`; + +exports[`use globalize with locale "ca" should format positive relative time in minute 1`] = `"d’aquí a 10 minuts"`; + +exports[`use globalize with locale "cs" should format date 1`] = `"22. září 12:34 odp."`; + +exports[`use globalize with locale "cs" should format negative relative time in hour 1`] = `"před 10 hodinami"`; + +exports[`use globalize with locale "cs" should format negative relative time in minute 1`] = `"před 10 minutami"`; + +exports[`use globalize with locale "cs" should format number in byte with long format 1`] = `"10 bajtů"`; + +exports[`use globalize with locale "cs" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "cs" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "cs" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "cs" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "cs" should format positive relative time in hour 1`] = `"za 10 hodin"`; + +exports[`use globalize with locale "cs" should format positive relative time in minute 1`] = `"za 10 minut"`; + +exports[`use globalize with locale "da" should format date 1`] = `"22. september kl. 12.34 PM"`; + +exports[`use globalize with locale "da" should format negative relative time in hour 1`] = `"for 10 timer siden"`; + +exports[`use globalize with locale "da" should format negative relative time in minute 1`] = `"for 10 minutter siden"`; + +exports[`use globalize with locale "da" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "da" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "da" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "da" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "da" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "da" should format positive relative time in hour 1`] = `"om 10 timer"`; + +exports[`use globalize with locale "da" should format positive relative time in minute 1`] = `"om 10 minutter"`; + +exports[`use globalize with locale "de" should format date 1`] = `"22. September um 12:34 PM"`; + +exports[`use globalize with locale "de" should format negative relative time in hour 1`] = `"vor 10 Stunden"`; + +exports[`use globalize with locale "de" should format negative relative time in minute 1`] = `"vor 10 Minuten"`; + +exports[`use globalize with locale "de" should format number in byte with long format 1`] = `"10 Bytes"`; + +exports[`use globalize with locale "de" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "de" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "de" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "de" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "de" should format positive relative time in hour 1`] = `"in 10 Stunden"`; + +exports[`use globalize with locale "de" should format positive relative time in minute 1`] = `"in 10 Minuten"`; + +exports[`use globalize with locale "el" should format date 1`] = `"22 Σεπτεμβρίου - 12:34 μ.μ."`; + +exports[`use globalize with locale "el" should format negative relative time in hour 1`] = `"πριν από 10 ώρες"`; + +exports[`use globalize with locale "el" should format negative relative time in minute 1`] = `"πριν από 10 λεπτά"`; + +exports[`use globalize with locale "el" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "el" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "el" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "el" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "el" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "el" should format positive relative time in hour 1`] = `"σε 10 ώρες"`; + +exports[`use globalize with locale "el" should format positive relative time in minute 1`] = `"σε 10 λεπτά"`; + +exports[`use globalize with locale "en" should format date 1`] = `"September 22 at 12:34 PM"`; + +exports[`use globalize with locale "en" should format negative relative time in hour 1`] = `"10 hours ago"`; + +exports[`use globalize with locale "en" should format negative relative time in minute 1`] = `"10 minutes ago"`; + +exports[`use globalize with locale "en" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "en" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "en" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "en" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "en" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "en" should format positive relative time in hour 1`] = `"in 10 hours"`; + +exports[`use globalize with locale "en" should format positive relative time in minute 1`] = `"in 10 minutes"`; + +exports[`use globalize with locale "es" should format date 1`] = `"22 de septiembre, 12:34 p. m."`; + +exports[`use globalize with locale "es" should format negative relative time in hour 1`] = `"hace 10 horas"`; + +exports[`use globalize with locale "es" should format negative relative time in minute 1`] = `"hace 10 minutos"`; + +exports[`use globalize with locale "es" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "es" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "es" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "es" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "es" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "es" should format positive relative time in hour 1`] = `"dentro de 10 horas"`; + +exports[`use globalize with locale "es" should format positive relative time in minute 1`] = `"dentro de 10 minutos"`; + +exports[`use globalize with locale "et" should format date 1`] = `"22. september 12:34 PM"`; + +exports[`use globalize with locale "et" should format negative relative time in hour 1`] = `"10 tunni eest"`; + +exports[`use globalize with locale "et" should format negative relative time in minute 1`] = `"10 minuti eest"`; + +exports[`use globalize with locale "et" should format number in byte with long format 1`] = `"10 baiti"`; + +exports[`use globalize with locale "et" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "et" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "et" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "et" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "et" should format positive relative time in hour 1`] = `"10 tunni pärast"`; + +exports[`use globalize with locale "et" should format positive relative time in minute 1`] = `"10 minuti pärast"`; + +exports[`use globalize with locale "eu" should format date 1`] = `"irailak 22 12:34 PM"`; + +exports[`use globalize with locale "eu" should format negative relative time in hour 1`] = `"Duela 10 ordu"`; + +exports[`use globalize with locale "eu" should format negative relative time in minute 1`] = `"Duela 10 minutu"`; + +exports[`use globalize with locale "eu" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "eu" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "eu" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "eu" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "eu" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "eu" should format positive relative time in hour 1`] = `"10 ordu barru"`; + +exports[`use globalize with locale "eu" should format positive relative time in minute 1`] = `"10 minutu barru"`; + +exports[`use globalize with locale "fi" should format date 1`] = `"22. syyskuuta klo 12.34 ip."`; + +exports[`use globalize with locale "fi" should format negative relative time in hour 1`] = `"10 tuntia sitten"`; + +exports[`use globalize with locale "fi" should format negative relative time in minute 1`] = `"10 minuuttia sitten"`; + +exports[`use globalize with locale "fi" should format number in byte with long format 1`] = `"10 tavua"`; + +exports[`use globalize with locale "fi" should format number in gigabyte with short format 1`] = `"10 Gt"`; + +exports[`use globalize with locale "fi" should format number in kilobyte with short format 1`] = `"10 kt"`; + +exports[`use globalize with locale "fi" should format number in megabyte with short format 1`] = `"10 Mt"`; + +exports[`use globalize with locale "fi" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "fi" should format positive relative time in hour 1`] = `"10 tunnin päästä"`; + +exports[`use globalize with locale "fi" should format positive relative time in minute 1`] = `"10 minuutin päästä"`; + +exports[`use globalize with locale "fr" should format date 1`] = `"22 septembre à 12:34 PM"`; + +exports[`use globalize with locale "fr" should format negative relative time in hour 1`] = `"il y a 10 heures"`; + +exports[`use globalize with locale "fr" should format negative relative time in minute 1`] = `"il y a 10 minutes"`; + +exports[`use globalize with locale "fr" should format number in byte with long format 1`] = `"10 octets"`; + +exports[`use globalize with locale "fr" should format number in gigabyte with short format 1`] = `"10 Go"`; + +exports[`use globalize with locale "fr" should format number in kilobyte with short format 1`] = `"10 ko"`; + +exports[`use globalize with locale "fr" should format number in megabyte with short format 1`] = `"10 Mo"`; + +exports[`use globalize with locale "fr" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "fr" should format positive relative time in hour 1`] = `"dans 10 heures"`; + +exports[`use globalize with locale "fr" should format positive relative time in minute 1`] = `"dans 10 minutes"`; + +exports[`use globalize with locale "gl" should format date 1`] = `"12:34 p.m. do 22 de setembro"`; + +exports[`use globalize with locale "gl" should format negative relative time in hour 1`] = `"hai 10 horas"`; + +exports[`use globalize with locale "gl" should format negative relative time in minute 1`] = `"hai 10 minutos"`; + +exports[`use globalize with locale "gl" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "gl" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "gl" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "gl" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "gl" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "gl" should format positive relative time in hour 1`] = `"en 10 horas"`; + +exports[`use globalize with locale "gl" should format positive relative time in minute 1`] = `"en 10 minutos"`; + +exports[`use globalize with locale "he" should format date 1`] = `"22 בספטמבר בשעה 12:34 אחה״צ"`; + +exports[`use globalize with locale "he" should format negative relative time in hour 1`] = `"לפני 10 שעות"`; + +exports[`use globalize with locale "he" should format negative relative time in minute 1`] = `"לפני 10 דקות"`; + +exports[`use globalize with locale "he" should format number in byte with long format 1`] = `"10 בייט"`; + +exports[`use globalize with locale "he" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "he" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "he" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "he" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "he" should format positive relative time in hour 1`] = `"בעוד 10 שעות"`; + +exports[`use globalize with locale "he" should format positive relative time in minute 1`] = `"בעוד 10 דקות"`; + +exports[`use globalize with locale "hi" should format date 1`] = `"22 सितंबर को 12:34 pm"`; + +exports[`use globalize with locale "hi" should format negative relative time in hour 1`] = `"10 घंटे पहले"`; + +exports[`use globalize with locale "hi" should format negative relative time in minute 1`] = `"10 मिनट पहले"`; + +exports[`use globalize with locale "hi" should format number in byte with long format 1`] = `"10 बाइट"`; + +exports[`use globalize with locale "hi" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "hi" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "hi" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "hi" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "hi" should format positive relative time in hour 1`] = `"10 घंटे में"`; + +exports[`use globalize with locale "hi" should format positive relative time in minute 1`] = `"10 मिनट में"`; + +exports[`use globalize with locale "hr" should format date 1`] = `"22. rujna u 12:34 PM"`; + +exports[`use globalize with locale "hr" should format negative relative time in hour 1`] = `"prije 10 sati"`; + +exports[`use globalize with locale "hr" should format negative relative time in minute 1`] = `"prije 10 minuta"`; + +exports[`use globalize with locale "hr" should format number in byte with long format 1`] = `"10 bajtova"`; + +exports[`use globalize with locale "hr" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "hr" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "hr" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "hr" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "hr" should format positive relative time in hour 1`] = `"za 10 sati"`; + +exports[`use globalize with locale "hr" should format positive relative time in minute 1`] = `"za 10 minuta"`; + +exports[`use globalize with locale "hu" should format date 1`] = `"szeptember 22. du. 12:34"`; + +exports[`use globalize with locale "hu" should format negative relative time in hour 1`] = `"10 órával ezelőtt"`; + +exports[`use globalize with locale "hu" should format negative relative time in minute 1`] = `"10 perccel ezelőtt"`; + +exports[`use globalize with locale "hu" should format number in byte with long format 1`] = `"10 bájt"`; + +exports[`use globalize with locale "hu" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "hu" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "hu" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "hu" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "hu" should format positive relative time in hour 1`] = `"10 óra múlva"`; + +exports[`use globalize with locale "hu" should format positive relative time in minute 1`] = `"10 perc múlva"`; + +exports[`use globalize with locale "id" should format date 1`] = `"22 September 12.34 PM"`; + +exports[`use globalize with locale "id" should format negative relative time in hour 1`] = `"10 jam yang lalu"`; + +exports[`use globalize with locale "id" should format negative relative time in minute 1`] = `"10 menit yang lalu"`; + +exports[`use globalize with locale "id" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "id" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "id" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "id" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "id" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "id" should format positive relative time in hour 1`] = `"dalam 10 jam"`; + +exports[`use globalize with locale "id" should format positive relative time in minute 1`] = `"dalam 10 menit"`; + +exports[`use globalize with locale "it" should format date 1`] = `"22 settembre 12:34 PM"`; + +exports[`use globalize with locale "it" should format negative relative time in hour 1`] = `"10 ore fa"`; + +exports[`use globalize with locale "it" should format negative relative time in minute 1`] = `"10 minuti fa"`; + +exports[`use globalize with locale "it" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "it" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "it" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "it" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "it" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "it" should format positive relative time in hour 1`] = `"tra 10 ore"`; + +exports[`use globalize with locale "it" should format positive relative time in minute 1`] = `"tra 10 minuti"`; + +exports[`use globalize with locale "ja" should format date 1`] = `"9月22日 午後0:34"`; + +exports[`use globalize with locale "ja" should format negative relative time in hour 1`] = `"10 時間前"`; + +exports[`use globalize with locale "ja" should format negative relative time in minute 1`] = `"10 分前"`; + +exports[`use globalize with locale "ja" should format number in byte with long format 1`] = `"10 バイト"`; + +exports[`use globalize with locale "ja" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "ja" should format number in kilobyte with short format 1`] = `"10 KB"`; + +exports[`use globalize with locale "ja" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "ja" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "ja" should format positive relative time in hour 1`] = `"10 時間後"`; + +exports[`use globalize with locale "ja" should format positive relative time in minute 1`] = `"10 分後"`; + +exports[`use globalize with locale "kk" should format date 1`] = `"22 қыркүйек, 12:34 PM"`; + +exports[`use globalize with locale "kk" should format negative relative time in hour 1`] = `"10 сағат бұрын"`; + +exports[`use globalize with locale "kk" should format negative relative time in minute 1`] = `"10 минут бұрын"`; + +exports[`use globalize with locale "kk" should format number in byte with long format 1`] = `"10 байт"`; + +exports[`use globalize with locale "kk" should format number in gigabyte with short format 1`] = `"10 ГБ"`; + +exports[`use globalize with locale "kk" should format number in kilobyte with short format 1`] = `"10 кБ"`; + +exports[`use globalize with locale "kk" should format number in megabyte with short format 1`] = `"10 MБ"`; + +exports[`use globalize with locale "kk" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "kk" should format positive relative time in hour 1`] = `"10 сағаттан кейін"`; + +exports[`use globalize with locale "kk" should format positive relative time in minute 1`] = `"10 минуттан кейін"`; + +exports[`use globalize with locale "ko" should format date 1`] = `"9월 22일 오후 12:34"`; + +exports[`use globalize with locale "ko" should format negative relative time in hour 1`] = `"10시간 전"`; + +exports[`use globalize with locale "ko" should format negative relative time in minute 1`] = `"10분 전"`; + +exports[`use globalize with locale "ko" should format number in byte with long format 1`] = `"10바이트"`; + +exports[`use globalize with locale "ko" should format number in gigabyte with short format 1`] = `"10GB"`; + +exports[`use globalize with locale "ko" should format number in kilobyte with short format 1`] = `"10kB"`; + +exports[`use globalize with locale "ko" should format number in megabyte with short format 1`] = `"10MB"`; + +exports[`use globalize with locale "ko" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "ko" should format positive relative time in hour 1`] = `"10시간 후"`; + +exports[`use globalize with locale "ko" should format positive relative time in minute 1`] = `"10분 후"`; + +exports[`use globalize with locale "lt" should format date 1`] = `"rugsėjo 22 d. 12:34 popiet"`; + +exports[`use globalize with locale "lt" should format negative relative time in hour 1`] = `"prieš 10 valandų"`; + +exports[`use globalize with locale "lt" should format negative relative time in minute 1`] = `"prieš 10 minučių"`; + +exports[`use globalize with locale "lt" should format number in byte with long format 1`] = `"10 baitų"`; + +exports[`use globalize with locale "lt" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "lt" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "lt" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "lt" should format plural 1`] = `"few"`; + +exports[`use globalize with locale "lt" should format positive relative time in hour 1`] = `"po 10 valandų"`; + +exports[`use globalize with locale "lt" should format positive relative time in minute 1`] = `"po 10 minučių"`; + +exports[`use globalize with locale "lv" should format date 1`] = `"22. septembris 12:34 pēcpusdienā"`; + +exports[`use globalize with locale "lv" should format negative relative time in hour 1`] = `"pirms 10 stundām"`; + +exports[`use globalize with locale "lv" should format negative relative time in minute 1`] = `"pirms 10 minūtēm"`; + +exports[`use globalize with locale "lv" should format number in byte with long format 1`] = `"10 baitu"`; + +exports[`use globalize with locale "lv" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "lv" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "lv" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "lv" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "lv" should format positive relative time in hour 1`] = `"pēc 10 stundām"`; + +exports[`use globalize with locale "lv" should format positive relative time in minute 1`] = `"pēc 10 minūtēm"`; + +exports[`use globalize with locale "ms" should format date 1`] = `"22 September 12:34 PTG"`; + +exports[`use globalize with locale "ms" should format negative relative time in hour 1`] = `"10 jam lalu"`; + +exports[`use globalize with locale "ms" should format negative relative time in minute 1`] = `"10 minit lalu"`; + +exports[`use globalize with locale "ms" should format number in byte with long format 1`] = `"10 bait"`; + +exports[`use globalize with locale "ms" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "ms" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "ms" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "ms" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "ms" should format positive relative time in hour 1`] = `"dalam 10 jam"`; + +exports[`use globalize with locale "ms" should format positive relative time in minute 1`] = `"dalam 10 minit"`; + +exports[`use globalize with locale "nb" should format date 1`] = `"22. september kl. 12:34 p.m."`; + +exports[`use globalize with locale "nb" should format negative relative time in hour 1`] = `"for 10 timer siden"`; + +exports[`use globalize with locale "nb" should format negative relative time in minute 1`] = `"for 10 minutter siden"`; + +exports[`use globalize with locale "nb" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "nb" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "nb" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "nb" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "nb" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "nb" should format positive relative time in hour 1`] = `"om 10 timer"`; + +exports[`use globalize with locale "nb" should format positive relative time in minute 1`] = `"om 10 minutter"`; + +exports[`use globalize with locale "nl" should format date 1`] = `"22 september om 12:34 p.m."`; + +exports[`use globalize with locale "nl" should format negative relative time in hour 1`] = `"10 uur geleden"`; + +exports[`use globalize with locale "nl" should format negative relative time in minute 1`] = `"10 minuten geleden"`; + +exports[`use globalize with locale "nl" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "nl" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "nl" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "nl" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "nl" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "nl" should format positive relative time in hour 1`] = `"over 10 uur"`; + +exports[`use globalize with locale "nl" should format positive relative time in minute 1`] = `"over 10 minuten"`; + +exports[`use globalize with locale "pl" should format date 1`] = `"22 września 12:34 PM"`; + +exports[`use globalize with locale "pl" should format negative relative time in hour 1`] = `"10 godzin temu"`; + +exports[`use globalize with locale "pl" should format negative relative time in minute 1`] = `"10 minut temu"`; + +exports[`use globalize with locale "pl" should format number in byte with long format 1`] = `"10 bajtów"`; + +exports[`use globalize with locale "pl" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "pl" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "pl" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "pl" should format plural 1`] = `"many"`; + +exports[`use globalize with locale "pl" should format positive relative time in hour 1`] = `"za 10 godzin"`; + +exports[`use globalize with locale "pl" should format positive relative time in minute 1`] = `"za 10 minut"`; + +exports[`use globalize with locale "pt" should format date 1`] = `"22 de setembro 12:34 PM"`; + +exports[`use globalize with locale "pt" should format negative relative time in hour 1`] = `"há 10 horas"`; + +exports[`use globalize with locale "pt" should format negative relative time in minute 1`] = `"há 10 minutos"`; + +exports[`use globalize with locale "pt" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "pt" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "pt" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "pt" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "pt" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "pt" should format positive relative time in hour 1`] = `"em 10 horas"`; + +exports[`use globalize with locale "pt" should format positive relative time in minute 1`] = `"em 10 minutos"`; + +exports[`use globalize with locale "pt-PT" should format date 1`] = `"22 de setembro às 12:34 da tarde"`; + +exports[`use globalize with locale "pt-PT" should format negative relative time in hour 1`] = `"há 10 horas"`; + +exports[`use globalize with locale "pt-PT" should format negative relative time in minute 1`] = `"há 10 minutos"`; + +exports[`use globalize with locale "pt-PT" should format number in byte with long format 1`] = `"10 bytes"`; + +exports[`use globalize with locale "pt-PT" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "pt-PT" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "pt-PT" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "pt-PT" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "pt-PT" should format positive relative time in hour 1`] = `"dentro de 10 horas"`; + +exports[`use globalize with locale "pt-PT" should format positive relative time in minute 1`] = `"dentro de 10 minutos"`; + +exports[`use globalize with locale "ro" should format date 1`] = `"22 septembrie, 12:34 p.m."`; + +exports[`use globalize with locale "ro" should format negative relative time in hour 1`] = `"acum 10 ore"`; + +exports[`use globalize with locale "ro" should format negative relative time in minute 1`] = `"acum 10 minute"`; + +exports[`use globalize with locale "ro" should format number in byte with long format 1`] = `"10 byți"`; + +exports[`use globalize with locale "ro" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "ro" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "ro" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "ro" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "ro" should format positive relative time in hour 1`] = `"peste 10 ore"`; + +exports[`use globalize with locale "ro" should format positive relative time in minute 1`] = `"peste 10 minute"`; + +exports[`use globalize with locale "ru" should format date 1`] = `"22 сентября, 12:34 PM"`; + +exports[`use globalize with locale "ru" should format negative relative time in hour 1`] = `"10 часов назад"`; + +exports[`use globalize with locale "ru" should format negative relative time in minute 1`] = `"10 минут назад"`; + +exports[`use globalize with locale "ru" should format number in byte with long format 1`] = `"10 байт"`; + +exports[`use globalize with locale "ru" should format number in gigabyte with short format 1`] = `"10 ГБ"`; + +exports[`use globalize with locale "ru" should format number in kilobyte with short format 1`] = `"10 кБ"`; + +exports[`use globalize with locale "ru" should format number in megabyte with short format 1`] = `"10 МБ"`; + +exports[`use globalize with locale "ru" should format plural 1`] = `"many"`; + +exports[`use globalize with locale "ru" should format positive relative time in hour 1`] = `"через 10 часов"`; + +exports[`use globalize with locale "ru" should format positive relative time in minute 1`] = `"через 10 минут"`; + +exports[`use globalize with locale "sk" should format date 1`] = `"22. septembra, 12:34 PM"`; + +exports[`use globalize with locale "sk" should format negative relative time in hour 1`] = `"pred 10 hodinami"`; + +exports[`use globalize with locale "sk" should format negative relative time in minute 1`] = `"pred 10 minútami"`; + +exports[`use globalize with locale "sk" should format number in byte with long format 1`] = `"10 bajtov"`; + +exports[`use globalize with locale "sk" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "sk" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "sk" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "sk" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "sk" should format positive relative time in hour 1`] = `"o 10 hodín"`; + +exports[`use globalize with locale "sk" should format positive relative time in minute 1`] = `"o 10 minút"`; + +exports[`use globalize with locale "sl" should format date 1`] = `"22. september 12:34 pop."`; + +exports[`use globalize with locale "sl" should format negative relative time in hour 1`] = `"pred 10 urami"`; + +exports[`use globalize with locale "sl" should format negative relative time in minute 1`] = `"pred 10 minutami"`; + +exports[`use globalize with locale "sl" should format number in byte with long format 1`] = `"10 bajtov"`; + +exports[`use globalize with locale "sl" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "sl" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "sl" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "sl" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "sl" should format positive relative time in hour 1`] = `"čez 10 ur"`; + +exports[`use globalize with locale "sl" should format positive relative time in minute 1`] = `"čez 10 minut"`; + +exports[`use globalize with locale "sr-Cyrl" should format date 1`] = `"22. септембар 12:34 по подне"`; + +exports[`use globalize with locale "sr-Cyrl" should format negative relative time in hour 1`] = `"пре 10 сати"`; + +exports[`use globalize with locale "sr-Cyrl" should format negative relative time in minute 1`] = `"пре 10 минута"`; + +exports[`use globalize with locale "sr-Cyrl" should format number in byte with long format 1`] = `"10 бајтова"`; + +exports[`use globalize with locale "sr-Cyrl" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "sr-Cyrl" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "sr-Cyrl" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "sr-Cyrl" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "sr-Cyrl" should format positive relative time in hour 1`] = `"за 10 сати"`; + +exports[`use globalize with locale "sr-Cyrl" should format positive relative time in minute 1`] = `"за 10 минута"`; + +exports[`use globalize with locale "sr-Latn" should format date 1`] = `"22. septembar 12:34 po podne"`; + +exports[`use globalize with locale "sr-Latn" should format negative relative time in hour 1`] = `"pre 10 sati"`; + +exports[`use globalize with locale "sr-Latn" should format negative relative time in minute 1`] = `"pre 10 minuta"`; + +exports[`use globalize with locale "sr-Latn" should format number in byte with long format 1`] = `"10 bajtova"`; + +exports[`use globalize with locale "sr-Latn" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "sr-Latn" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "sr-Latn" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "sr-Latn" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "sr-Latn" should format positive relative time in hour 1`] = `"za 10 sati"`; + +exports[`use globalize with locale "sr-Latn" should format positive relative time in minute 1`] = `"za 10 minuta"`; + +exports[`use globalize with locale "sv" should format date 1`] = `"22 september 12:34 em"`; + +exports[`use globalize with locale "sv" should format negative relative time in hour 1`] = `"för 10 timmar sedan"`; + +exports[`use globalize with locale "sv" should format negative relative time in minute 1`] = `"för 10 minuter sedan"`; + +exports[`use globalize with locale "sv" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "sv" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "sv" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "sv" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "sv" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "sv" should format positive relative time in hour 1`] = `"om 10 timmar"`; + +exports[`use globalize with locale "sv" should format positive relative time in minute 1`] = `"om 10 minuter"`; + +exports[`use globalize with locale "th" should format date 1`] = `"22 กันยายน 12:34 หลังเที่ยง"`; + +exports[`use globalize with locale "th" should format negative relative time in hour 1`] = `"10 ชั่วโมงที่ผ่านมา"`; + +exports[`use globalize with locale "th" should format negative relative time in minute 1`] = `"10 นาทีที่ผ่านมา"`; + +exports[`use globalize with locale "th" should format number in byte with long format 1`] = `"10 ไบต์"`; + +exports[`use globalize with locale "th" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "th" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "th" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "th" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "th" should format positive relative time in hour 1`] = `"ในอีก 10 ชั่วโมง"`; + +exports[`use globalize with locale "th" should format positive relative time in minute 1`] = `"ในอีก 10 นาที"`; + +exports[`use globalize with locale "tr" should format date 1`] = `"22 Eylül ÖS 12:34"`; + +exports[`use globalize with locale "tr" should format negative relative time in hour 1`] = `"10 saat önce"`; + +exports[`use globalize with locale "tr" should format negative relative time in minute 1`] = `"10 dakika önce"`; + +exports[`use globalize with locale "tr" should format number in byte with long format 1`] = `"10 bayt"`; + +exports[`use globalize with locale "tr" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "tr" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "tr" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "tr" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "tr" should format positive relative time in hour 1`] = `"10 saat sonra"`; + +exports[`use globalize with locale "tr" should format positive relative time in minute 1`] = `"10 dakika sonra"`; + +exports[`use globalize with locale "uk" should format date 1`] = `"22 вересня о 12:34 пп"`; + +exports[`use globalize with locale "uk" should format negative relative time in hour 1`] = `"10 годин тому"`; + +exports[`use globalize with locale "uk" should format negative relative time in minute 1`] = `"10 хвилин тому"`; + +exports[`use globalize with locale "uk" should format number in byte with long format 1`] = `"10 байтів"`; + +exports[`use globalize with locale "uk" should format number in gigabyte with short format 1`] = `"10 ГБ"`; + +exports[`use globalize with locale "uk" should format number in kilobyte with short format 1`] = `"10 кБ"`; + +exports[`use globalize with locale "uk" should format number in megabyte with short format 1`] = `"10 МБ"`; + +exports[`use globalize with locale "uk" should format plural 1`] = `"many"`; + +exports[`use globalize with locale "uk" should format positive relative time in hour 1`] = `"через 10 годин"`; + +exports[`use globalize with locale "uk" should format positive relative time in minute 1`] = `"через 10 хвилин"`; + +exports[`use globalize with locale "vi" should format date 1`] = `"12:34 CH 22 tháng 9"`; + +exports[`use globalize with locale "vi" should format negative relative time in hour 1`] = `"10 giờ trước"`; + +exports[`use globalize with locale "vi" should format negative relative time in minute 1`] = `"10 phút trước"`; + +exports[`use globalize with locale "vi" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "vi" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "vi" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "vi" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "vi" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "vi" should format positive relative time in hour 1`] = `"sau 10 giờ nữa"`; + +exports[`use globalize with locale "vi" should format positive relative time in minute 1`] = `"sau 10 phút nữa"`; + +exports[`use globalize with locale "yue" should format date 1`] = `"9月22日 下午12:34"`; + +exports[`use globalize with locale "yue" should format negative relative time in hour 1`] = `"10 小時前"`; + +exports[`use globalize with locale "yue" should format negative relative time in minute 1`] = `"10 分鐘前"`; + +exports[`use globalize with locale "yue" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "yue" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "yue" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "yue" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "yue" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "yue" should format positive relative time in hour 1`] = `"10 小時後"`; + +exports[`use globalize with locale "yue" should format positive relative time in minute 1`] = `"10 分鐘後"`; + +exports[`use globalize with locale "zh-Hans" should format date 1`] = `"9月22日 下午12:34"`; + +exports[`use globalize with locale "zh-Hans" should format negative relative time in hour 1`] = `"10小时前"`; + +exports[`use globalize with locale "zh-Hans" should format negative relative time in minute 1`] = `"10分钟前"`; + +exports[`use globalize with locale "zh-Hans" should format number in byte with long format 1`] = `"10字节"`; + +exports[`use globalize with locale "zh-Hans" should format number in gigabyte with short format 1`] = `"10吉字节"`; + +exports[`use globalize with locale "zh-Hans" should format number in kilobyte with short format 1`] = `"10千字节"`; + +exports[`use globalize with locale "zh-Hans" should format number in megabyte with short format 1`] = `"10兆字节"`; + +exports[`use globalize with locale "zh-Hans" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "zh-Hans" should format positive relative time in hour 1`] = `"10小时后"`; + +exports[`use globalize with locale "zh-Hans" should format positive relative time in minute 1`] = `"10分钟后"`; + +exports[`use globalize with locale "zh-Hans-SG" should format date 1`] = `"9月22日 下午12:34"`; + +exports[`use globalize with locale "zh-Hans-SG" should format negative relative time in hour 1`] = `"10小时前"`; + +exports[`use globalize with locale "zh-Hans-SG" should format negative relative time in minute 1`] = `"10分钟前"`; + +exports[`use globalize with locale "zh-Hans-SG" should format number in byte with long format 1`] = `"10字节"`; + +exports[`use globalize with locale "zh-Hans-SG" should format number in gigabyte with short format 1`] = `"10吉字节"`; + +exports[`use globalize with locale "zh-Hans-SG" should format number in kilobyte with short format 1`] = `"10千字节"`; + +exports[`use globalize with locale "zh-Hans-SG" should format number in megabyte with short format 1`] = `"10兆字节"`; + +exports[`use globalize with locale "zh-Hans-SG" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "zh-Hans-SG" should format positive relative time in hour 1`] = `"10小时后"`; + +exports[`use globalize with locale "zh-Hans-SG" should format positive relative time in minute 1`] = `"10分钟后"`; + +exports[`use globalize with locale "zh-Hant" should format date 1`] = `"9月22日 下午12:34"`; + +exports[`use globalize with locale "zh-Hant" should format negative relative time in hour 1`] = `"10 小時前"`; + +exports[`use globalize with locale "zh-Hant" should format negative relative time in minute 1`] = `"10 分鐘前"`; + +exports[`use globalize with locale "zh-Hant" should format number in byte with long format 1`] = `"10 byte"`; + +exports[`use globalize with locale "zh-Hant" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "zh-Hant" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "zh-Hant" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "zh-Hant" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "zh-Hant" should format positive relative time in hour 1`] = `"10 小時後"`; + +exports[`use globalize with locale "zh-Hant" should format positive relative time in minute 1`] = `"10 分鐘後"`; + +exports[`use globalize with locale "zh-Hant-HK" should format date 1`] = `"9月22日 下午12:34"`; + +exports[`use globalize with locale "zh-Hant-HK" should format negative relative time in hour 1`] = `"10 小時前"`; + +exports[`use globalize with locale "zh-Hant-HK" should format negative relative time in minute 1`] = `"10 分鐘前"`; + +exports[`use globalize with locale "zh-Hant-HK" should format number in byte with long format 1`] = `"10 位元組"`; + +exports[`use globalize with locale "zh-Hant-HK" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "zh-Hant-HK" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "zh-Hant-HK" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "zh-Hant-HK" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "zh-Hant-HK" should format positive relative time in hour 1`] = `"10 小時後"`; + +exports[`use globalize with locale "zh-Hant-HK" should format positive relative time in minute 1`] = `"10 分鐘後"`; + +exports[`use globalize with locale "zh-Hant-MO" should format date 1`] = `"9月22日 下午12:34"`; + +exports[`use globalize with locale "zh-Hant-MO" should format negative relative time in hour 1`] = `"10 小時前"`; + +exports[`use globalize with locale "zh-Hant-MO" should format negative relative time in minute 1`] = `"10 分鐘前"`; + +exports[`use globalize with locale "zh-Hant-MO" should format number in byte with long format 1`] = `"10 位元組"`; + +exports[`use globalize with locale "zh-Hant-MO" should format number in gigabyte with short format 1`] = `"10 GB"`; + +exports[`use globalize with locale "zh-Hant-MO" should format number in kilobyte with short format 1`] = `"10 kB"`; + +exports[`use globalize with locale "zh-Hant-MO" should format number in megabyte with short format 1`] = `"10 MB"`; + +exports[`use globalize with locale "zh-Hant-MO" should format plural 1`] = `"other"`; + +exports[`use globalize with locale "zh-Hant-MO" should format positive relative time in hour 1`] = `"10 小時後"`; + +exports[`use globalize with locale "zh-Hant-MO" should format positive relative time in minute 1`] = `"10 分鐘後"`; diff --git a/packages/support/cldr-data-downloader/.eslintrc.yml b/packages/support/cldr-data-downloader/.eslintrc.yml deleted file mode 100644 index 7ccefb54af..0000000000 --- a/packages/support/cldr-data-downloader/.eslintrc.yml +++ /dev/null @@ -1,7 +0,0 @@ -# This is a package to run under Node.js as "postinstall" script. -extends: - - '../../../.eslintrc.node.yml' - -parserOptions: - ecmaVersion: 2020 - sourceType: module diff --git a/packages/support/cldr-data-downloader/.gitignore b/packages/support/cldr-data-downloader/.gitignore deleted file mode 100644 index c2658d7d1b..0000000000 --- a/packages/support/cldr-data-downloader/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/packages/support/cldr-data-downloader/LICENSE b/packages/support/cldr-data-downloader/LICENSE deleted file mode 100644 index ce501cb6ae..0000000000 --- a/packages/support/cldr-data-downloader/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2021 Microsoft Corporation -Copyright (c) 2013 Rafael Xavier de Souza http://rafael.xavier.blog.br - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/support/cldr-data-downloader/README.md b/packages/support/cldr-data-downloader/README.md deleted file mode 100644 index 2ae1221491..0000000000 --- a/packages/support/cldr-data-downloader/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# cldr-data-downloader - -A Node.js download tool for [Unicode CLDR JSON][] data. - -[unicode cldr json]: http://cldr.unicode.org/index/cldr-spec/json - -## Usage - - $ npm install cldr-data-downloader - -Using the CLI: - - $ ./node_modules/cldr-data-downloader/bin/download.sh \ - -i http://www.unicode.org/Public/cldr/26/json.zip \ - -o ./cldr - - GET `http://www.unicode.org/Public/cldr/26/json.zip` - [========================================] 100% 0.0s - Received 3425K total. - - Unpacking it into ./cldr - Done - -Windows users can use `node ./bin/download.js ...` instead. - -Using JavaScript: - -```javascript -// my-downloader.js: -cldrDownloader = require('cldr-data-downloader'); -cldrDownloader('http://www.unicode.org/Public/cldr/26/json.zip', './cldr', function (error) { - if (error) { - console.error('Whops', error.message); - exit(1); - } - console.log('Done'); -}); -``` - - $ node < my-download.js - - GET `http://www.unicode.org/Public/cldr/26/json.zip` - [========================================] 100% 0.0s - Received 3425K total. - - Unpacking it into ./cldr - Done - -## License - -MIT © [Rafael Xavier de Souza](http://rafael.xavier.blog.br) diff --git a/packages/support/cldr-data-downloader/bin/download.js b/packages/support/cldr-data-downloader/bin/download.js deleted file mode 100644 index c5f913d887..0000000000 --- a/packages/support/cldr-data-downloader/bin/download.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -const download = require('../index'); -const nopt = require('nopt'); -const path = require('path'); -const pkg = require('../package.json'); - -(function () { - function help() { - const out = [ - 'Usage: download -i srcUrl -o destPath', - '', - 'General options:', - ' -h, --help # Print options and usage.', - ' -v, --version # Print the version number.', - ' -i, --input # Source URL for the Unicode CLDR JSON zip,', - ' # or a JSON config file with a `core` key', - ' # pointing to a URL value. Use --src-url-key', - ' # (or its alias --coverage) to set a different', - ' # key.', - ' -o, --output # Destination path to unpack JSONs at.', - ' -f, --force # Force to re-download and to re-unpack.', - " --filter # Regexp URL mask: '(core|numbers)' etc. Useful", - ' # when input is for external .json config', - '' - ]; - - return out.join('\n'); - } - - const options = {}; - const opts = nopt( - { - help: Boolean, - version: Boolean, - input: String, - 'src-url-key': String, - coverage: String, - filter: String, - output: path, - force: Boolean - }, - { - h: '--help', - v: '--version', - i: '--input', - o: '--output', - f: '--force' - } - ); - - let requiredOpts = true; - - if (opts.version) { - // eslint-disable-next-line no-console - return console.log(pkg.version); - } - - if (!opts.input || !opts.output) { - requiredOpts = false; - } - - if (opts.help || !requiredOpts) { - // eslint-disable-next-line no-console - return console.log(help()); - } - - options.force = opts.force; - options.filterRe = opts.filter; - options.srcUrlKey = opts['src-url-key'] || opts.coverage; - - download(opts.input, opts.output, options, error => { - if (error) { - if (/E_ALREADY_INSTALLED/u.test(error.code)) { - error.message = error.message.replace(/Use `options.*/u, 'Use -f to override.'); - - // eslint-disable-next-line no-console - return console.log(error.message); - } - - console.error('Whops', error.message); - process.exit(1); - } - }); -})(); diff --git a/packages/support/cldr-data-downloader/bin/download.sh b/packages/support/cldr-data-downloader/bin/download.sh deleted file mode 100755 index 39b284cff0..0000000000 --- a/packages/support/cldr-data-downloader/bin/download.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node - -require("./download.js"); diff --git a/packages/support/cldr-data-downloader/package-lock.json b/packages/support/cldr-data-downloader/package-lock.json deleted file mode 100644 index a8d1dfdbb2..0000000000 --- a/packages/support/cldr-data-downloader/package-lock.json +++ /dev/null @@ -1,887 +0,0 @@ -{ - "name": "cldr-data-downloader", - "version": "0.3.5-0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "cldr-data-downloader", - "version": "0.3.5-0", - "dependencies": { - "adm-zip": "^0.5.10", - "nopt": "^7.2.0", - "progress": "^2.0.3", - "q": "^1.5.1", - "request": "^2.88.2", - "request-progress": "^3.0.0" - }, - "bin": { - "cldr-data-downloader": "bin/download.sh" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/adm-zip": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", - "dependencies": { - "mime-db": "1.50.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - }, - "dependencies": { - "abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==" - }, - "adm-zip": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" - }, - "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", - "requires": { - "mime-db": "1.50.0" - } - }, - "nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", - "requires": { - "abbrev": "^2.0.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "requires": { - "throttleit": "^1.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - } - } -} diff --git a/packages/support/cldr-data-downloader/package.json b/packages/support/cldr-data-downloader/package.json deleted file mode 100644 index 10494a0944..0000000000 --- a/packages/support/cldr-data-downloader/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "cldr-data-downloader", - "version": "0.3.5-0", - "engines": { - "node": ">= 12" - }, - "private": true, - "keywords": [ - "unicode", - "CLDR", - "JSON", - "data", - "install", - "download", - "fetch" - ], - "description": "Download tool for Unicode CLDR JSON data", - "licenses": [ - { - "type": "MIT" - } - ], - "author": { - "name": "Rafael Xavier de Souza", - "email": "rxaviers@gmail.com", - "url": "http://rafael.xavier.blog.br" - }, - "contributors": [ - "Microsoft Corporation" - ], - "module": "src/index.js", - "exports": { - ".": { - "import": "./src/index.js" - } - }, - "type": "module", - "bin": { - "cldr-data-downloader": "./bin/download.sh" - }, - "scripts": { - "auditfix": "npm audit fix --legacy-peer-deps || exit 0", - "bump": "npm run bump:dependencies && npm run bump:auditfix", - "bump:auditfix": "npm audit fix --legacy-peer-deps || exit 0", - "bump:dependencies": "if [ `cat package.json | jq -r '((.dependencies // {} | length) + (.devDependencies // {} | length))'` -ne 0 ]; then npm install --legacy-peer-deps $(cat package.json | jq -r '(.pinDependencies // {}) as $p | ((.dependencies // {}), (.devDependencies // {}) | keys) | map(. + \"@\" + ($p[.] // [\"latest\"])[0]) | .[]'); fi", - "eslint": "npm run precommit", - "postauditfix": "npm run postbump", - "postbump": "cat package.json | jq '. + (.dependencies = ((.dependencies + (.localPeerDependencies // {})) | to_entries | sort_by(.key) | from_entries)) | (.devDependencies = ((.devDependencies + (.localPeerDevDependencies // {})) | to_entries | sort_by(.key) | from_entries))' > package-temp.json && mv package-temp.json package.json", - "preauditfix": "npm run prebump", - "prebump": "cat package.json | jq '(((.localPeerDependencies // {}) | keys | map([\"dependencies\", .])) + ((.localPeerDevDependencies // {}) | keys | map([\"devDependencies\", .]))) as $localPeerPaths | delpaths($localPeerPaths)' > package-temp.json && mv package-temp.json package.json", - "precommit": "npm run precommit:eslint -- src", - "precommit:eslint": "node ../../../node_modules/eslint/bin/eslint.js --report-unused-disable-directives --max-warnings 0" - }, - "dependencies": { - "adm-zip": "^0.5.10", - "nopt": "^7.2.0", - "progress": "^2.0.3", - "q": "^1.5.1", - "request": "^2.88.2", - "request-progress": "^3.0.0" - }, - "devDependencies": {} -} diff --git a/packages/support/cldr-data-downloader/src/available_locales.js b/packages/support/cldr-data-downloader/src/available_locales.js deleted file mode 100644 index 42b993f2b3..0000000000 --- a/packages/support/cldr-data-downloader/src/available_locales.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import assert from 'assert'; -import fs from 'fs'; -import path from 'path'; - -function AvailableLocales(destPath) { - assert(!/\.\./u.test(destPath), '"destPath" must not contains ".."'); - - const mainPath = path.join(destPath, 'main'); - - // Mitigated by asserting "destPath" does not contains "..". - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - this.availableLocales = fs.readdirSync(mainPath).filter(filepath => { - // Mitigated by asserting "destPath" does not contains "..". - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - const stats = fs.statSync(path.join(mainPath, filepath)); - - return stats.isDirectory(); - }); - - this.destPath = destPath; -} - -const proto = AvailableLocales.prototype; - -proto.filepath = function () { - return path.join(this.destPath, 'availableLocales.json'); -}; - -proto.toJson = function () { - return { - availableLocales: this.availableLocales - }; -}; - -proto.write = function () { - // eslint-disable-next-line no-magic-numbers - const data = JSON.stringify(this.toJson(), null, 2); - const filepath = this.filepath(); - - assert(!/\.\./u.test(filepath), '"filepath" must not contains ".."'); - - // "filepath" is clean. - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - fs.writeFileSync(filepath, data); -}; - -export default AvailableLocales; diff --git a/packages/support/cldr-data-downloader/src/download.js b/packages/support/cldr-data-downloader/src/download.js deleted file mode 100644 index 7cf129ed94..0000000000 --- a/packages/support/cldr-data-downloader/src/download.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import Q from 'q'; -import requestProgress from 'request-progress'; -import request from 'request'; -import path from 'path'; -import fs from 'fs'; - -const workingDir = process.cwd(); - -function getRequestOptions(options) { - options = Object.assign({}, options, { - // Get response as a buffer - encoding: null, - - // The default download path redirects to a CDN URL. - followRedirect: true, - - // If going through proxy, spoof the User-Agent, since may commerical proxies block blank or unknown agents in headers - headers: { - 'User-Agent': 'curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5' - } - }); - - return options; -} - -function fetchFromFilesystem(src) { - const fsDfd = Q.defer(); - - // We don't need any options here, so we just grab the url - // and make sure it fits the norms for our platform. - const givenFilePath = path.normalize(src.url); - - function notify(state) { - fsDfd.notify(state); - } - - let filePath; - - // Test if the file path is absolute. If not, then prepend the application - // directory beforehand, so it can be treated as relative from the app root. - if (path.isAbsolute(givenFilePath)) { - filePath = givenFilePath; - } else { - filePath = path.join(workingDir, givenFilePath); - } - - // eslint-disable-next-line no-console - console.log('Retrieving `' + filePath + '`'); - - // Getting the errors and size right on the progress bar here is not worth all the setup. - // Just fail silently here if there's a problem and the error will correctly bubble in the - // readFile call below. - let totalSize = 0; - - try { - // TODO: Consider in-memory file system. - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - const stats = fs.statSync(filePath); - - totalSize = stats.size; - - // eslint-disable-next-line no-empty - } catch (e) {} - - // We're gonna go from 0->100 with nothing between for fs.readFile. We could alternatively - // do a readStream, but it seems like overkill for the filesizes. - notify({ total: totalSize, received: 0, percent: 0 }); - - // Async request the file - // TODO: Consider in-memory file system. - // eslint-disable-next-line security/detect-non-literal-fs-filename - fs.readFile(filePath, (error, fileBody) => { - if (error) { - error.message = - 'Error retrieving file from disk.\n' + - error.stack + - '\n\nPlease report this full log at https://github.com/rxaviers/cldr-data-downloader'; - - fsDfd.reject(error); - - throw error; - } - - notify({ total: totalSize, received: fileBody.length, percent: 100 }); - - fsDfd.resolve(fileBody); - }); - - return fsDfd.promise; -} - -function download(src) { - src.url = src.url.trim(); - - // Modify the url to not be a file protocol uri so we can unify handling files. - src.url = src.url.replace(/^file:\/\//iu, ''); - - // Short circuit the download function and grab it from the filesystem if - // we don't have anything that looks like a protocol (e.g. https/http/ftp/etc). - if (!~src.url.indexOf('://')) { - return fetchFromFilesystem(src); - } - - const downloadDfd = Q.defer(); - const options = getRequestOptions(src); - - function notify(state) { - downloadDfd.notify(state); - } - - // eslint-disable-next-line no-console - console.log('GET `' + src.url + '`'); - - requestProgress( - request(options, (error, response, body) => { - if (error) { - error.message = - 'Error making request.\n' + - error.stack + - '\n\nPlease report this full log at https://github.com/rxaviers/cldr-data-downloader'; - - downloadDfd.reject(error); - - throw error; - } else if (!response) { - error = new Error( - 'Something unexpected happened, please report this full log at https://github.com/rxaviers/cldr-data-downloader' - ); - - downloadDfd.reject(error); - - throw error; - // eslint-disable-next-line no-magic-numbers - } else if (response.statusCode !== 200) { - error = new Error( - 'Error requesting archive.\nStatus: ' + - response.statusCode + - '\nRequest options: ' + - // eslint-disable-next-line no-magic-numbers - JSON.stringify(options, null, 2) + - '\nResponse headers: ' + - // eslint-disable-next-line no-magic-numbers - JSON.stringify(response.headers, null, 2) + - '\nMake sure your network and proxy settings are correct.\n\nIf you continue to have issues, please report this full log at https://github.com/rxaviers/cldr-data-downloader' - ); - downloadDfd.reject(error); - - throw error; - } - - notify({ received: body.length, percent: 100 }); - - downloadDfd.resolve(body); - }) - ).on('progress', notify); - - return downloadDfd.promise; -} - -export default download; diff --git a/packages/support/cldr-data-downloader/src/index.js b/packages/support/cldr-data-downloader/src/index.js deleted file mode 100644 index 2771bf450f..0000000000 --- a/packages/support/cldr-data-downloader/src/index.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import { fileURLToPath } from 'url'; -import { mkdirSync } from 'fs'; -import { resolve } from 'path'; -import assert from 'assert'; - -import { isUrl, readJSON } from './util.js'; -import AvailableLocales from './available_locales.js'; -import download from './download.js'; -import progress from './progress.js'; -import Q from 'q'; -import State from './state.js'; -import unpack from './unpack.js'; - -Q.longStackSupport = true; - -function alwaysArray(arrayOrSomething) { - return Array.isArray(arrayOrSomething) ? arrayOrSomething : arrayOrSomething ? [arrayOrSomething] : []; -} - -/** - * fn( srcUrl, destPath [, options], callback ) - */ -export default function (srcUrl, destPath, options, callback) { - let error, state; - - if (callback === undefined && typeof options === 'function') { - callback = options; - options = {}; - } - - assert(typeof srcUrl === 'string', 'must include srcUrl (e.g., "https://www.unicode.org/Public/cldr/26/json.zip")'); - - assert(typeof destPath === 'string', 'must include destPath (e.g., "./cldr")'); - assert(!/\.\./u.test(destPath), '"destPath" must not contains "..".'); - assert(!/^file:/u.test(destPath), '"destPath" must not be URL.'); - - assert(typeof options === 'object', 'invalid options'); - - assert(typeof callback === 'function', 'must include callback function'); - - destPath = resolve(fileURLToPath(import.meta.url), destPath); - - try { - // This is intentional and path is passed from CLI. - // eslint-disable-next-line security/detect-non-literal-fs-filename - mkdirSync(destPath, { recursive: true }); - } catch (err) { - if (err.code !== 'EEXIST') { - throw err; - } - } - - Q.try(() => { - // Is srcUrl a config file? - if (!isUrl(srcUrl) && /.json$/iu.test(srcUrl)) { - // Read its URL. - options.srcUrlKey = options.srcUrlKey || 'core'; - srcUrl = readJSON(srcUrl)[options.srcUrlKey]; - } - - // Is it already installed? - state = new State(srcUrl, destPath); - if (!options.force && state.isInstalled()) { - error = new Error('Already downloaded and unpacked, quitting... Use `options.force = true` to override.'); - error.code = 'E_ALREADY_INSTALLED'; - throw error; - } - - // Download - }) - .then(() => { - let srcUrls = alwaysArray(srcUrl); - - if (options.filterRe) { - let { filterRe } = options; - - if (typeof filterRe === 'string') { - // ReDOS attack should only be carried out by the user themselves. - // eslint-disable-next-line security/detect-non-literal-regexp - filterRe = new RegExp(filterRe, 'u'); - } - - srcUrls = srcUrls.filter(url => filterRe.test(url)); - } - - return Q.all( - srcUrls.map(srcUrl => - download({ - url: srcUrl - }) - ) - ).progress(progress(srcUrls.length)); - - // Unpack - }) - .then( - unpack({ - path: destPath - - // Generate available locales. - }) - ) - .then(() => { - try { - new AvailableLocales(destPath).write(); - } catch (error) { - error.message = 'Error generating available locales. ' + error.message; - - throw error; - } - - // Save installation state. - }) - .then(() => { - try { - state.write(); - } catch (error) { - error.message = 'Error saving installation state. ' + error.message; - - throw error; - } - - // Done - }) - .nodeify(callback); -} diff --git a/packages/support/cldr-data-downloader/src/progress.js b/packages/support/cldr-data-downloader/src/progress.js deleted file mode 100644 index bc017b2572..0000000000 --- a/packages/support/cldr-data-downloader/src/progress.js +++ /dev/null @@ -1,63 +0,0 @@ -import progress from 'progress'; - -let bar, nDownloads; -const states = []; - -function defined(sum, i) { - if (i !== undefined) { - sum.push(i); - } - return sum; -} - -function summation(sum, i) { - return sum + (i || 0); -} - -function consolidatedState() { - const totals = states.map(({ total }) => total).reduce(defined, []); - const received = states.map(({ received }) => received).reduce(summation, 0); - - if (totals.length < nDownloads) { - return { - isCompleted: false, - received, - total: Infinity - }; - } - - return { - // eslint-disable-next-line no-magic-numbers - completed: states.map(({ percent }) => percent).every(state => state === 100), - received, - total: states.map(({ total }) => total).reduce(summation, 0) - }; -} - -function reportProgress(state) { - if (!bar) { - bar = new progress(' [:bar] :current/:total :percent :etas', { - total: state.total, - width: 40 - }); - } - - if (!bar.complete) { - bar.total = state.total; - bar.tick(state.received - bar.curr); - } - - if (state.completed) { - // eslint-disable-next-line no-console, no-magic-numbers - console.log('Received ' + Math.floor(state.received / 1024) + 'K total.'); - } -} - -export default function (_nDownloads) { - nDownloads = _nDownloads; - - return function (notification) { - states[notification.index] = Object.assign({}, states[notification.index], notification.value); - reportProgress(consolidatedState()); - }; -} diff --git a/packages/support/cldr-data-downloader/src/state.js b/packages/support/cldr-data-downloader/src/state.js deleted file mode 100644 index 77566991d0..0000000000 --- a/packages/support/cldr-data-downloader/src/state.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import fs from 'fs'; -import path from 'path'; - -import { deepEqual, readJSON } from './util.js'; - -function State(srcUrl, destPath) { - this.srcUrl = srcUrl; - this.destPath = destPath; - this.installed = this.isInstalled(); -} - -const proto = State.prototype; - -proto.filepath = function () { - return path.join(this.destPath, 'state.json'); -}; - -proto.isInstalled = function () { - return deepEqual(this.read(), this.toJson()); -}; - -proto.read = function () { - const filepath = this.filepath(); - - // TODO: Consider using in-memory file system. - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - if (fs.existsSync(filepath)) { - return readJSON(filepath); - } - - return {}; -}; - -proto.toJson = function () { - return { - url: this.srcUrl - }; -}; - -proto.write = function () { - // eslint-disable-next-line no-magic-numbers - const data = JSON.stringify(this.toJson(), null, 2); - - // TODO: Consider using in-memory file system. - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - fs.writeFileSync(this.filepath(), data); -}; - -export default State; diff --git a/packages/support/cldr-data-downloader/src/unpack.js b/packages/support/cldr-data-downloader/src/unpack.js deleted file mode 100644 index 9982604803..0000000000 --- a/packages/support/cldr-data-downloader/src/unpack.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import { mkdirSync } from 'fs'; -import AdmZip from 'adm-zip'; -import path from 'path'; - -function bowerOrPackageJson(entry) { - return /^(bower|package)\.json/u.test(entry.entryName); -} - -function getLeadingDirectory(entry) { - return entry.entryName.split('/')[0]; -} - -function ignore(entry) { - entry.entryName = '.ignored-' + entry.entryName; -} - -function prettyPath(_path) { - const relativePath = path.relative('.', _path); - - // eslint-disable-next-line no-magic-numbers - return relativePath.length + 2 > _path.length ? _path : './' + relativePath; -} - -function stripLeadingDirectory(entry) { - return (entry.entryName = entry.entryName.split('/').slice(1).join('/')); -} - -function unique(sum, i) { - if (!~sum.indexOf(i)) { - sum.push(i); - } - - return sum; -} - -function unpack(downloads, dest) { - let zip; - - // eslint-disable-next-line no-console - console.log('Unpacking it into `' + prettyPath(dest.path) + '`'); - - try { - // This is intentional and path is passed from CLI. - // eslint-disable-next-line security/detect-non-literal-fs-filename - mkdirSync(dest.path, { recursive: true, mode: '0755' }); - } catch (err) { - if (err.code !== 'EEXIST') { - throw err; - } - } - - downloads.forEach(download => { - let entries; - - try { - zip = new AdmZip(download); - entries = zip.getEntries(); - // Strip the leading directory in case it holds all files. - if (entries.map(getLeadingDirectory).reduce(unique, []).length === 1) { - entries.forEach(stripLeadingDirectory); - } - // Ignore/rename bower.json or package.json files - entries.filter(bowerOrPackageJson).forEach(ignore); - zip.extractAllTo(dest.path, true); - } catch (error) { - // AdmZip throws strings, not errors!! - if (typeof error === 'string') { - throw new Error(error); - } - - throw error; - } - }); -} - -export default function (dest) { - return function (download) { - unpack(download, dest); - }; -} diff --git a/packages/support/cldr-data-downloader/src/util.js b/packages/support/cldr-data-downloader/src/util.js deleted file mode 100644 index 5f1c3602dc..0000000000 --- a/packages/support/cldr-data-downloader/src/util.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Download tool for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import assert from 'assert'; -import fs from 'fs'; - -function deepEqual(a, b) { - try { - assert.deepEqual(a, b); - } catch (error) { - if (error instanceof assert.AssertionError) { - return false; - } - - throw error; - } - - return true; -} - -function isUrl(urlOrPath) { - try { - const url = new URL(urlOrPath); - - return ['file:', 'http:', 'https:'].some(protocol => url.protocol === protocol); - } catch (err) { - return false; - } -} - -function readJSON(filepath) { - // TODO: Consider using in-memory file system. - // TODO: Turn this into async. - // eslint-disable-next-line security/detect-non-literal-fs-filename, node/no-sync - return JSON.parse(fs.readFileSync(filepath)); -} - -export { deepEqual, isUrl, readJSON }; diff --git a/packages/support/cldr-data/.eslintrc.yml b/packages/support/cldr-data/.eslintrc.yml deleted file mode 100644 index 58583d0206..0000000000 --- a/packages/support/cldr-data/.eslintrc.yml +++ /dev/null @@ -1,20 +0,0 @@ -env: - shared-node-browser: true - -parserOptions: - sourceType: module - -overrides: - - files: - # This is loader for Jest to support ESM. - - '*.spec.js' - # This is run during "postinstall", and is for Node.js - - 'src/install.mjs' - extends: - - '../../../.eslintrc.node.yml' - - - files: - # This is loader for Jest to support ESM. - - '*.spec.js' - extends: - - plugin:node/recommended-script diff --git a/packages/support/cldr-data/.gitignore b/packages/support/cldr-data/.gitignore deleted file mode 100644 index 135f415ffd..0000000000 --- a/packages/support/cldr-data/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/node_modules - -# CLDR downloaded files. -/dist diff --git a/packages/support/cldr-data/LICENSE b/packages/support/cldr-data/LICENSE deleted file mode 100644 index ce501cb6ae..0000000000 --- a/packages/support/cldr-data/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2021 Microsoft Corporation -Copyright (c) 2013 Rafael Xavier de Souza http://rafael.xavier.blog.br - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/support/cldr-data/README.md b/packages/support/cldr-data/README.md deleted file mode 100644 index 78b96569e3..0000000000 --- a/packages/support/cldr-data/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# cldr-units-modern - -This repository provides the a portion of the JSON distribution of CLDR locale data -for internationalization. - -Refer to the README at https://github.com/unicode-cldr/cldr-json for complete details. diff --git a/packages/support/cldr-data/package-lock.json b/packages/support/cldr-data/package-lock.json deleted file mode 100644 index f4bb64c09b..0000000000 --- a/packages/support/cldr-data/package-lock.json +++ /dev/null @@ -1,872 +0,0 @@ -{ - "name": "cldr-data", - "version": "36.0.0-0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "cldr-data", - "version": "36.0.0-0", - "dependencies": { - "glob": "^8.1.0", - "read-pkg": "^8.1.0", - "read-pkg-up": "^10.1.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.0.tgz", - "integrity": "sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/locate-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.0.tgz", - "integrity": "sha512-HNx5uOnYeK4SxEoid5qnhRfprlJeGMzFRKPLCf/15N3/B4AiofNwC/yq7VBKdVk9dx7m+PiYCJOGg55JYTAqoQ==", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", - "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", - "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.1.0", - "type-fest": "^4.2.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.3.1.tgz", - "integrity": "sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" - }, - "@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "hosted-git-info": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.0.tgz", - "integrity": "sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==", - "requires": { - "lru-cache": "^10.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "requires": { - "has": "^1.0.3" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==" - }, - "lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==" - }, - "locate-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.0.tgz", - "integrity": "sha512-HNx5uOnYeK4SxEoid5qnhRfprlJeGMzFRKPLCf/15N3/B4AiofNwC/yq7VBKdVk9dx7m+PiYCJOGg55JYTAqoQ==", - "requires": { - "p-locate": "^6.0.0" - } - }, - "lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==" - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "requires": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "requires": { - "p-limit": "^4.0.0" - } - }, - "parse-json": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", - "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", - "requires": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "dependencies": { - "type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" - } - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" - }, - "read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", - "requires": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" - } - }, - "read-pkg-up": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", - "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", - "requires": { - "find-up": "^6.3.0", - "read-pkg": "^8.1.0", - "type-fest": "^4.2.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-fest": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.3.1.tgz", - "integrity": "sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==" - } - } -} diff --git a/packages/support/cldr-data/package.json b/packages/support/cldr-data/package.json deleted file mode 100644 index 42afaf52cb..0000000000 --- a/packages/support/cldr-data/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "cldr-data", - "version": "36.0.0-0", - "engines": { - "node": ">= 12" - }, - "private": true, - "keywords": [ - "unicode", - "CLDR", - "JSON", - "data" - ], - "description": "Npm module for Unicode CLDR JSON data", - "licenses": [ - { - "type": "MIT" - } - ], - "author": { - "name": "Rafael Xavier de Souza", - "email": "rxaviers@gmail.com", - "url": "http://rafael.xavier.blog.br" - }, - "contributors": [ - "Microsoft Corporation" - ], - "module": "./src/index.js", - "exports": { - ".": { - "import": "./src/index.js" - } - }, - "type": "module", - "files": [ - "src/index.js", - "src/install.mjs", - "src/patch.mjs", - "urls.json" - ], - "scripts": { - "auditfix": "npm audit fix --legacy-peer-deps || exit 0", - "bump": "npm run bump:dependencies && npm run bump:auditfix", - "bump:auditfix": "npm audit fix --legacy-peer-deps || exit 0", - "bump:dependencies": "if [ `cat package.json | jq -r '((.dependencies // {} | length) + (.devDependencies // {} | length))'` -ne 0 ]; then npm install --legacy-peer-deps $(cat package.json | jq -r '(.pinDependencies // {}) as $p | ((.dependencies // {}), (.devDependencies // {}) | keys) | map(. + \"@\" + ($p[.] // [\"latest\"])[0]) | .[]'); fi", - "eslint": "npm run precommit", - "install": "node ./src/install.mjs && node ./src/patch.mjs", - "postauditfix": "npm run postbump", - "postbump": "cat package.json | jq '. + (.dependencies = ((.dependencies + (.localPeerDependencies // {})) | to_entries | sort_by(.key) | from_entries)) | (.devDependencies = ((.devDependencies + (.localPeerDevDependencies // {})) | to_entries | sort_by(.key) | from_entries))' > package-temp.json && mv package-temp.json package.json", - "preauditfix": "npm run prebump", - "prebump": "cat package.json | jq '(((.localPeerDependencies // {}) | keys | map([\"dependencies\", .])) + ((.localPeerDevDependencies // {}) | keys | map([\"devDependencies\", .]))) as $localPeerPaths | delpaths($localPeerPaths)' > package-temp.json && mv package-temp.json package.json", - "precommit": "npm run precommit:eslint -- src", - "precommit:eslint": "node ../../../node_modules/eslint/bin/eslint.js --report-unused-disable-directives --max-warnings 0" - }, - "pinDependencies": { - "glob": [ - "8", - "glob@10 updated the entrypoint, need funding to upgrade" - ] - }, - "dependencies": { - "cldr-data-downloader": "0.3.5-0", - "glob": "^8.1.0", - "read-pkg": "^8.1.0", - "read-pkg-up": "^10.1.0" - }, - "localPeerDependencies": { - "cldr-data-downloader": "0.3.5-0" - }, - "devDependencies": {} -} diff --git a/packages/support/cldr-data/src/index.js b/packages/support/cldr-data/src/index.js deleted file mode 100644 index 0656e9f51b..0000000000 --- a/packages/support/cldr-data/src/index.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Npm module for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -import assert from 'assert'; -import _fs from 'fs'; -import _path from 'path'; - -const JSON_EXTENSION = /^(.*)\.json$/u; - -function argsToArray(arg) { - return [].slice.call(arg, 0); -} - -function jsonFiles(dirName) { - assert(!/\.\./u.test(dirName), '"dirname" must not contains ".."'); - - // Mitigated by denying "dirName" to contains "..". - // eslint-disable-next-line security/detect-non-literal-fs-filename - const fileList = _fs.readdirSync(new URL(_path.join('../dist', dirName), import.meta.url)); - - return fileList.reduce((sum, file) => { - if (JSON_EXTENSION.test(file)) { - return sum.concat(file.match(JSON_EXTENSION)[1]); - } - }, []); -} - -function cldrData(...args) { - const [path] = args; - - assert(typeof path === 'string', 'must include path (e.g., "main/en/numbers" or "supplemental/likelySubtags")'); - assert(!/\.\./u.test(path), 'path must not contains ".."'); - - if (args.length > 1) { - return argsToArray(args).reduce((sum, path) => { - sum.push(cldrData(path)); - return sum; - }, []); - } - - // Mitigated by denying "path" to contains "..". - // eslint-disable-next-line security/detect-non-literal-fs-filename - return JSON.parse(_fs.readFileSync(new URL(_path.join('../dist/', path + '.json'), import.meta.url))); -} - -function mainPathsFor(locales) { - return locales.reduce((sum, locale) => { - const mainFiles = jsonFiles(_path.join('main', locale)); - - mainFiles.forEach(mainFile => { - sum.push(_path.join('main', locale, mainFile)); - }); - - return sum; - }, []); -} - -function supplementalPaths() { - const supplementalFiles = jsonFiles('supplemental'); - - return supplementalFiles.map(supplementalFile => _path.join('supplemental', supplementalFile)); -} - -Object.defineProperty(cldrData, 'availableLocales', { - get() { - return cldrData('availableLocales').availableLocales; - } -}); - -cldrData.all = function () { - const paths = supplementalPaths().concat(mainPathsFor(this.availableLocales)); - - return cldrData.apply({}, paths); -}; - -cldrData.entireMainFor = function (...args) { - const [locale] = args; - - assert(typeof locale === 'string', 'must include locale (e.g., "en")'); - - return cldrData.apply({}, mainPathsFor(argsToArray(args))); -}; - -cldrData.entireSupplemental = function () { - return cldrData.apply({}, supplementalPaths()); -}; - -export default cldrData; diff --git a/packages/support/cldr-data/src/index.spec.js b/packages/support/cldr-data/src/index.spec.js deleted file mode 100644 index 8b9d817968..0000000000 --- a/packages/support/cldr-data/src/index.spec.js +++ /dev/null @@ -1,25 +0,0 @@ -// "cldr-data" depends on "read-pkg-up" which must be run in ESM. -// "read-pkg-up" is required because we are using Lerna to run the install script for "cldr-data", instead of running via "npm install". -// -// Although Jest can run ESM experimentally, when enabled, it will run everything in ESM. -// -// Although we can use Babel on-the-fly with Jest to turn ESM into CJS. -// -// However, some variables works in CJS only and some works in ESM only: -// -// - CJS-only: __dirname -// - ESM-only: import.meta.url (an alternative to __dirname as an URL object) -// -// Instead of going the complex route to run Babel on-the-fly and switch variables based on mode, -// we will fork() a child process and run it as native ESM. - -const { join } = require('path'); - -const childProcess = require('child_process'); - -test('should load CLDR data', () => - new Promise((resolve, reject) => - childProcess - .fork(join(__dirname, './index.spec.mjs')) - .on('exit', exitCode => (exitCode ? reject(exitCode) : resolve())) - )); diff --git a/packages/support/cldr-data/src/index.spec.mjs b/packages/support/cldr-data/src/index.spec.mjs deleted file mode 100644 index b14d264aec..0000000000 --- a/packages/support/cldr-data/src/index.spec.mjs +++ /dev/null @@ -1,21 +0,0 @@ -// This file is not processed by Jest, instead, will be run thru a wrapper named "index.spec.js". - -import { expect } from 'expect'; -import fs from 'fs'; - -import cldrData from './index.js'; - -// entireSupplemental() runs without error. -expect(cldrData.entireSupplemental()).toBeTruthy(); - -// This is literal but in URL format, but the rule marked it as false positive. -// eslint-disable-next-line security/detect-non-literal-fs-filename -const locales = fs.readdirSync(new URL('./../dist/main', import.meta.url)); - -// entireMainFor() runs for each locale without error. -locales.forEach(locale => { - expect(cldrData.entireMainFor(locale)).toBeTruthy(); -}); - -// all() runs without error. -expect(cldrData.all()).toBeTruthy(); diff --git a/packages/support/cldr-data/src/install.mjs b/packages/support/cldr-data/src/install.mjs deleted file mode 100644 index f7ae634d06..0000000000 --- a/packages/support/cldr-data/src/install.mjs +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Npm module for Unicode CLDR JSON data - * - * Copyright 2021 Microsoft Corporation - * Copyright 2013 Rafael Xavier de Souza - * - * Released under the MIT license - */ - -'use strict'; - -let coverage, parentPackage, peerPackages, srcUrl; - -import { fileURLToPath } from 'url'; -import { promisify } from 'util'; -import { readPackage } from 'read-pkg'; -import { readPackageUp } from 'read-pkg-up'; -import child_process from 'child_process'; -// False alarm. -// eslint-disable-next-line node/no-missing-import -import cldrDownloader from 'cldr-data-downloader'; -import glob from 'glob'; -import path from 'path'; - -const cldrDownloaderAsync = promisify(cldrDownloader); -const globAsync = promisify(glob); -const options = {}; - -let isNpm3; - -// eslint-disable-next-line complexity -(async function () { - try { - const npmv = (await child_process.exec('npm -v')).toString('utf8'); - isNpm3 = npmv.split('.')[0] === '3'; - } catch (error) { - // child_process.execSync is not available on Node v0.10 - // fortunately, we can use ENV variables set by npm do detect its version - // npm_config_user_agent: 'npm/2.15.1 node/v0.10.46 darwin x64' - // npm_config_user_agent: 'npm/3.10.3 node/v6.3.0 darwin x64' - // Note that users can override the value of this config option, - // therefore it's safer to use this method only as a fall-back option. - if (/^npm\/2\./u.test(process.env.npm_config_user_agent)) { - isNpm3 = false; - } else { - // Better safe than sorry. - isNpm3 = true; - } - } - - const __dirname = fileURLToPath(new URL('.', import.meta.url)); - - try { - parentPackage = (await readPackageUp({ cwd: path.join(__dirname, '../../..') })).packageJson; - } catch (error) { - // Ignore error - } - - try { - const peerPackagePaths = await globAsync('../*/package.json'); - - peerPackages = await Promise.all( - peerPackagePaths.map(async file => { - try { - return await readPackage({ cwd: path.dirname(path.resolve(file)) }); - } catch (error) { - return {}; - } - }) - ); - } catch (error) { - console.error('Warning: Something weird happened checking whether this is a peer dependency.', error.message); - peerPackages = []; - } - - if ( - !isNpm3 && - parentPackage && - !(parentPackage.dependencies && parentPackage.dependencies['cldr-data']) && - !(parentPackage.devDependencies && parentPackage.devDependencies['cldr-data']) && - peerPackages.some(peerPackage => peerPackage.peerDependencies && peerPackage.peerDependencies['cldr-data']) - ) { - throw new Error( - 'Warning: Skipping to download CLDR data, because `cldr-data` is a ' + - "peer dependency. If you want it to be downloaded, make sure it's " + - 'listed under `dependencies` or `devDependencies` of the `package.json`' + - 'of your application.' - ); - } - - if (process.env.CLDR_URL) { - console.warn('CLDR_URL is deprecated, use CLDR_DATA_URLS_JSON instead.'); - srcUrl = srcUrl.replace('https://www.unicode.org/Public/cldr', process.env.CLDR_URL.replace(/\/$/u, '')); - } else { - if (process.env.CLDR_DATA_URLS_JSON) { - srcUrl = process.env.CLDR_DATA_URLS_JSON; - } else if (parentPackage && parentPackage['cldr-data-urls-json']) { - srcUrl = parentPackage['cldr-data-urls-json']; - } else { - srcUrl = path.join(__dirname, '../urls.json'); - } - } - - if (process.env.CLDR_COVERAGE) { - coverage = process.env.CLDR_COVERAGE; - } else if ( - parentPackage && - parentPackage['cldr-data-coverage'] - - // Normally, when running under npm, it will run this install script under the dependents, i.e. /packages/api/. - // Since we are using lerna, lerna run this install script under CWD, i.e. /packages/support/cldr-data/. - // Thus, it cannot find its true dependents (/packages/api). Thus, the "cldr-data-coverage" field cannot be found. - // We will need put it the "cldr-data-coverage" field under root package.json, and relaxing the requirements a bit for lerna. - - // parentPackage['cldr-data-coverage'] && - // ((parentPackage.dependencies && parentPackage.dependencies['cldr-data']) || - // (parentPackage.devDependencies && parentPackage.devDependencies['cldr-data'])) - ) { - coverage = parentPackage['cldr-data-coverage']; - } - - if (process.env.CLDR_DATA_URLS_FILTER) { - options.filterRe = process.env.CLDR_DATA_URLS_FILTER; - } else if (parentPackage && parentPackage['cldr-data-urls-filter']) { - options.filterRe = parentPackage['cldr-data-urls-filter']; - } - - if (coverage) { - options.srcUrlKey = coverage; - } - - try { - await cldrDownloaderAsync(srcUrl, path.join(__dirname, '../dist'), options); - } catch (error) { - if (/E_ALREADY_INSTALLED/u.test(error.code)) { - error.message = error.message.replace(/Use `options.*/u, 'Use -f to override.'); - - // eslint-disable-next-line no-console - return console.log(error.message); - } - - console.error('Whops', error.message); - - throw error; - } -})(); diff --git a/packages/support/cldr-data/src/patch.mjs b/packages/support/cldr-data/src/patch.mjs deleted file mode 100644 index cca470f439..0000000000 --- a/packages/support/cldr-data/src/patch.mjs +++ /dev/null @@ -1,143 +0,0 @@ -import { fileURLToPath } from 'url'; -import { resolve } from 'path'; -import fs from 'fs/promises'; - -// There is an issue in the Unicode CLDR database (v36): -// -// - Polish has 4 different plural types: "one", "few", "many", "other" -// - However, some units, say "short/digital-kilobyte", only have "other" defined -// - When we localize 1024 (number) into kilobytes, it use the "one" type -// - Since "short/digital-kilobyte/one" is not defined in the database, `globalize` throw exception -// -// In all of our supported languages, we also observed the same issue in Portuguese as well. -// -// As a hotfix, we are patching the Unicode CLDR database for all `[long/short/narrow]/digital-*` rules to make sure it include all plurals needed for that language. -// -// For a long term fix, we should move forward to a newer version of CLDR database, which is outlined in https://github.com/rxaviers/cldr-data-npm/issues/78. - -let FORBIDDEN_PROPERTY_NAMES; - -function getForbiddenPropertyNames() { - return ( - FORBIDDEN_PROPERTY_NAMES || - (FORBIDDEN_PROPERTY_NAMES = Object.freeze( - Array.from( - new Set([ - // As-of writing, `Object.prototype` includes: - // __defineGetter__ - // __defineSetter__ - // __lookupGetter__ - // __lookupSetter - // __proto__ - // constructor - // hasOwnProperty - // isPrototypeOf - // propertyIsEnumerable - // toLocaleString - // toString - // valueOf - ...Object.getOwnPropertyNames(Object.prototype), - - 'prototype' - ]) - ) - )) - ); -} - -function isForbiddenPropertyName(propertyName) { - return getForbiddenPropertyNames().includes(propertyName); -} - -function toDist(filename) { - if (filename.includes('..')) { - throw new Error('Filename cannot contains "..".'); - } - - return resolve(fileURLToPath(import.meta.url), '../../dist/', filename); -} - -(async function () { - // The function will make sure access to the path is limited. - // eslint-disable-next-line security/detect-non-literal-fs-filename - const plurals = JSON.parse(await fs.readFile(toDist('supplemental/plurals.json'), 'utf8')); - - const languagePlurals = new Map(); - - Object.entries(plurals.supplemental['plurals-type-cardinal']).forEach(([language, pluralsTypeCardinal]) => { - const plurals = ['other']; - - languagePlurals.set(language, plurals); - - if (!(`pluralRule-count-other` in pluralsTypeCardinal)) { - throw new Error(`Language ${language} does not have plural type "other".`); - } - - ['zero', 'one', 'two', 'few', 'many'].forEach(pluralType => { - `pluralRule-count-${pluralType}` in pluralsTypeCardinal && plurals.push(pluralType); - }); - }); - - const patchedLanguages = []; - - await Promise.all( - Array.from(languagePlurals.entries()).map(async ([language, supportedPluralTypes]) => { - if (!/^[\w-]+$/u.test(language) && isForbiddenPropertyName(language)) { - throw new Error(`Invalid language code "${language}".`); - } - - let units; - - try { - // The function will make sure access to the path is limited. - // eslint-disable-next-line security/detect-non-literal-fs-filename - units = JSON.parse(await fs.readFile(toDist(`main/${language}/units.json`), 'utf8')); - } catch (err) { - if (err.code === 'ENOENT') { - return; - } - - throw err; - } - - let numFound = 0; - - ['long', 'short', 'narrow'].forEach(form => { - // Both "language" and "form" are filtered and free of forbidden values. - // eslint-disable-next-line security/detect-object-injection - Object.entries(units.main[language].units[form]).forEach(([unitName, entry]) => { - if (!unitName.startsWith('digital-')) { - return; - } - - if ('unitPattern-count-other' in entry) { - const { 'unitPattern-count-other': other } = entry; - - supportedPluralTypes.forEach(pluralType => { - const name = `unitPattern-count-${pluralType}`; - - if (!(name in entry)) { - // "name" is free of forbidden values. - // eslint-disable-next-line security/detect-object-injection - entry[name] = other; - numFound++; - } - }); - } - }); - }); - - if (numFound) { - patchedLanguages.push(`${language} (${numFound} issues)`); - - // The function will make sure access to the path is limited. - // eslint-disable-next-line security/detect-non-literal-fs-filename, no-magic-numbers - await fs.writeFile(toDist(`main/${language}/units.json`), JSON.stringify(units, null, 2)); - } - }) - ); - - // We are display output in CLI. - // eslint-disable-next-line no-console - console.log(`Patched ${patchedLanguages.length} languages: ${patchedLanguages.join(', ')}.`); -})(); diff --git a/packages/support/cldr-data/urls.json b/packages/support/cldr-data/urls.json deleted file mode 100644 index d9b2f5eb53..0000000000 --- a/packages/support/cldr-data/urls.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "core": [ - "https://github.com/unicode-cldr/cldr-core/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-dates-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-buddhist-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-chinese-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-coptic-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-dangi-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-ethiopic-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-hebrew-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-indian-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-islamic-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-japanese-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-persian-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-roc-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-localenames-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-misc-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-numbers-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-segments-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-units-modern/archive/36.0.0.zip" - ], - "full": [ - "https://github.com/unicode-cldr/cldr-core/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-segments-modern/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-dates-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-buddhist-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-chinese-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-coptic-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-dangi-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-ethiopic-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-hebrew-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-indian-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-islamic-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-japanese-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-persian-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-cal-roc-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-localenames-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-misc-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-numbers-full/archive/36.0.0.zip", - "https://github.com/unicode-cldr/cldr-units-full/archive/36.0.0.zip" - ] -}