├── .editorconfig ├── .eslintrc.json ├── .gitattributes ├── .github └── workflows │ └── build.yml ├── .gitignore ├── LICENSE.txt ├── README.md ├── lib └── xml-name-validator.js ├── package-lock.json ├── package.json ├── scripts └── benchmark.js └── test ├── cases.json └── test.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | charset = utf-8 8 | indent_style = space 9 | indent_size = 2 10 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": "@domenic", 4 | "env": { 5 | "node": true 6 | }, 7 | "rules": { 8 | "max-len": ["error", { "ignoreRegExpLiterals": true }], 9 | "no-misleading-character-class": "off" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | # GitHub sees this file as generated by default. 4 | lib/xml-name-validator.js linguist-generated=false 5 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | pull_request: 4 | branches: [main] 5 | push: 6 | branches: [main] 7 | jobs: 8 | build: 9 | name: Lint and tests 10 | runs-on: ubuntu-latest 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | node-version: 15 | - 18 16 | - 20 17 | - latest 18 | steps: 19 | - uses: actions/checkout@v4 20 | - uses: actions/setup-node@v4 21 | with: 22 | node-version: ${{ matrix.node-version }} 23 | - run: npm ci 24 | - run: npm run lint 25 | - run: npm test 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Validate XML Names and Qualified Names 2 | 3 | This package simply tells you whether or not a string matches the [`Name`](http://www.w3.org/TR/xml/#NT-Name) or [`QName`](http://www.w3.org/TR/xml-names/#NT-QName) productions in the XML Namespaces specification. We use it for implementing the [validate](https://dom.spec.whatwg.org/#validate) algorithm in jsdom, but you can use it for whatever you want. 4 | 5 | ## Usage 6 | 7 | This package's main module exports two functions, `name()` and `qname()`. Both take a string and return a boolean indicating whether or not the string matches the relevant production. 8 | 9 | ```js 10 | "use strict": 11 | const xnv = require("xml-name-validator"); 12 | 13 | // Will return true 14 | xnv.name("x"); 15 | xnv.name(":"); 16 | xnv.name("a:0"); 17 | xnv.name("a:b:c"); 18 | 19 | // Will return false 20 | xnv.name("\\"); 21 | xnv.name("'"); 22 | xnv.name("0"); 23 | xnv.name("a!"); 24 | 25 | // Will return true 26 | xnv.qname("x"); 27 | xnv.qname("a0"); 28 | xnv.qname("a:b"); 29 | 30 | // Will return false 31 | xnv.qname(":a"); 32 | xnv.qname(":b"); 33 | xnv.qname("a:b:c"); 34 | xnv.qname("a:0"); 35 | ``` 36 | -------------------------------------------------------------------------------- /lib/xml-name-validator.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | exports.name = potentialName => { 4 | return /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/u.test(potentialName); 5 | }; 6 | 7 | exports.qname = potentialQname => { 8 | return /(?:^[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}][A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}][A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$)|(?:^[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}][A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$)/u.test(potentialQname); 9 | }; 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xml-name-validator", 3 | "version": "5.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "xml-name-validator", 9 | "version": "5.0.0", 10 | "license": "Apache-2.0", 11 | "devDependencies": { 12 | "@domenic/eslint-config": "^3.0.0", 13 | "benchmark": "^2.1.4", 14 | "eslint": "^8.53.0" 15 | }, 16 | "engines": { 17 | "node": ">=18" 18 | } 19 | }, 20 | "node_modules/@aashutoshrathi/word-wrap": { 21 | "version": "1.2.6", 22 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 23 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 24 | "dev": true, 25 | "engines": { 26 | "node": ">=0.10.0" 27 | } 28 | }, 29 | "node_modules/@domenic/eslint-config": { 30 | "version": "3.0.0", 31 | "resolved": "https://registry.npmjs.org/@domenic/eslint-config/-/eslint-config-3.0.0.tgz", 32 | "integrity": "sha512-XhG03wcob9LIzTfucyl0jhoIueVynfyk/i1HmrZqf7x2iKrLh9TN/+5pbWFuHB3cvyS5Pn3OVyUJ8NHSsOIejQ==", 33 | "dev": true, 34 | "peerDependencies": { 35 | "eslint": "^8.28.0" 36 | } 37 | }, 38 | "node_modules/@eslint-community/eslint-utils": { 39 | "version": "4.4.0", 40 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 41 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 42 | "dev": true, 43 | "dependencies": { 44 | "eslint-visitor-keys": "^3.3.0" 45 | }, 46 | "engines": { 47 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 48 | }, 49 | "peerDependencies": { 50 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 51 | } 52 | }, 53 | "node_modules/@eslint-community/regexpp": { 54 | "version": "4.10.0", 55 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", 56 | "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", 57 | "dev": true, 58 | "engines": { 59 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 60 | } 61 | }, 62 | "node_modules/@eslint/eslintrc": { 63 | "version": "2.1.3", 64 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", 65 | "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", 66 | "dev": true, 67 | "dependencies": { 68 | "ajv": "^6.12.4", 69 | "debug": "^4.3.2", 70 | "espree": "^9.6.0", 71 | "globals": "^13.19.0", 72 | "ignore": "^5.2.0", 73 | "import-fresh": "^3.2.1", 74 | "js-yaml": "^4.1.0", 75 | "minimatch": "^3.1.2", 76 | "strip-json-comments": "^3.1.1" 77 | }, 78 | "engines": { 79 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 80 | }, 81 | "funding": { 82 | "url": "https://opencollective.com/eslint" 83 | } 84 | }, 85 | "node_modules/@eslint/js": { 86 | "version": "8.53.0", 87 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", 88 | "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", 89 | "dev": true, 90 | "engines": { 91 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 92 | } 93 | }, 94 | "node_modules/@humanwhocodes/config-array": { 95 | "version": "0.11.13", 96 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", 97 | "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", 98 | "dev": true, 99 | "dependencies": { 100 | "@humanwhocodes/object-schema": "^2.0.1", 101 | "debug": "^4.1.1", 102 | "minimatch": "^3.0.5" 103 | }, 104 | "engines": { 105 | "node": ">=10.10.0" 106 | } 107 | }, 108 | "node_modules/@humanwhocodes/module-importer": { 109 | "version": "1.0.1", 110 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 111 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 112 | "dev": true, 113 | "engines": { 114 | "node": ">=12.22" 115 | }, 116 | "funding": { 117 | "type": "github", 118 | "url": "https://github.com/sponsors/nzakas" 119 | } 120 | }, 121 | "node_modules/@humanwhocodes/object-schema": { 122 | "version": "2.0.1", 123 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", 124 | "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", 125 | "dev": true 126 | }, 127 | "node_modules/@nodelib/fs.scandir": { 128 | "version": "2.1.5", 129 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 130 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 131 | "dev": true, 132 | "dependencies": { 133 | "@nodelib/fs.stat": "2.0.5", 134 | "run-parallel": "^1.1.9" 135 | }, 136 | "engines": { 137 | "node": ">= 8" 138 | } 139 | }, 140 | "node_modules/@nodelib/fs.stat": { 141 | "version": "2.0.5", 142 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 143 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 144 | "dev": true, 145 | "engines": { 146 | "node": ">= 8" 147 | } 148 | }, 149 | "node_modules/@nodelib/fs.walk": { 150 | "version": "1.2.8", 151 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 152 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 153 | "dev": true, 154 | "dependencies": { 155 | "@nodelib/fs.scandir": "2.1.5", 156 | "fastq": "^1.6.0" 157 | }, 158 | "engines": { 159 | "node": ">= 8" 160 | } 161 | }, 162 | "node_modules/@ungap/structured-clone": { 163 | "version": "1.2.0", 164 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", 165 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", 166 | "dev": true 167 | }, 168 | "node_modules/acorn": { 169 | "version": "8.11.2", 170 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", 171 | "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", 172 | "dev": true, 173 | "bin": { 174 | "acorn": "bin/acorn" 175 | }, 176 | "engines": { 177 | "node": ">=0.4.0" 178 | } 179 | }, 180 | "node_modules/acorn-jsx": { 181 | "version": "5.3.2", 182 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 183 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 184 | "dev": true, 185 | "peerDependencies": { 186 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 187 | } 188 | }, 189 | "node_modules/ajv": { 190 | "version": "6.12.6", 191 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 192 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 193 | "dev": true, 194 | "dependencies": { 195 | "fast-deep-equal": "^3.1.1", 196 | "fast-json-stable-stringify": "^2.0.0", 197 | "json-schema-traverse": "^0.4.1", 198 | "uri-js": "^4.2.2" 199 | }, 200 | "funding": { 201 | "type": "github", 202 | "url": "https://github.com/sponsors/epoberezkin" 203 | } 204 | }, 205 | "node_modules/ansi-regex": { 206 | "version": "5.0.1", 207 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 208 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 209 | "dev": true, 210 | "engines": { 211 | "node": ">=8" 212 | } 213 | }, 214 | "node_modules/ansi-styles": { 215 | "version": "4.3.0", 216 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 217 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 218 | "dev": true, 219 | "dependencies": { 220 | "color-convert": "^2.0.1" 221 | }, 222 | "engines": { 223 | "node": ">=8" 224 | }, 225 | "funding": { 226 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 227 | } 228 | }, 229 | "node_modules/argparse": { 230 | "version": "2.0.1", 231 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 232 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 233 | "dev": true 234 | }, 235 | "node_modules/balanced-match": { 236 | "version": "1.0.2", 237 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 238 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 239 | "dev": true 240 | }, 241 | "node_modules/benchmark": { 242 | "version": "2.1.4", 243 | "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", 244 | "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", 245 | "dev": true, 246 | "dependencies": { 247 | "lodash": "^4.17.4", 248 | "platform": "^1.3.3" 249 | } 250 | }, 251 | "node_modules/brace-expansion": { 252 | "version": "1.1.11", 253 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 254 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 255 | "dev": true, 256 | "dependencies": { 257 | "balanced-match": "^1.0.0", 258 | "concat-map": "0.0.1" 259 | } 260 | }, 261 | "node_modules/callsites": { 262 | "version": "3.1.0", 263 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 264 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 265 | "dev": true, 266 | "engines": { 267 | "node": ">=6" 268 | } 269 | }, 270 | "node_modules/chalk": { 271 | "version": "4.1.2", 272 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 273 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 274 | "dev": true, 275 | "dependencies": { 276 | "ansi-styles": "^4.1.0", 277 | "supports-color": "^7.1.0" 278 | }, 279 | "engines": { 280 | "node": ">=10" 281 | }, 282 | "funding": { 283 | "url": "https://github.com/chalk/chalk?sponsor=1" 284 | } 285 | }, 286 | "node_modules/color-convert": { 287 | "version": "2.0.1", 288 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 289 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 290 | "dev": true, 291 | "dependencies": { 292 | "color-name": "~1.1.4" 293 | }, 294 | "engines": { 295 | "node": ">=7.0.0" 296 | } 297 | }, 298 | "node_modules/color-name": { 299 | "version": "1.1.4", 300 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 301 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 302 | "dev": true 303 | }, 304 | "node_modules/concat-map": { 305 | "version": "0.0.1", 306 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 307 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 308 | "dev": true 309 | }, 310 | "node_modules/cross-spawn": { 311 | "version": "7.0.3", 312 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 313 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 314 | "dev": true, 315 | "dependencies": { 316 | "path-key": "^3.1.0", 317 | "shebang-command": "^2.0.0", 318 | "which": "^2.0.1" 319 | }, 320 | "engines": { 321 | "node": ">= 8" 322 | } 323 | }, 324 | "node_modules/debug": { 325 | "version": "4.3.4", 326 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 327 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 328 | "dev": true, 329 | "dependencies": { 330 | "ms": "2.1.2" 331 | }, 332 | "engines": { 333 | "node": ">=6.0" 334 | }, 335 | "peerDependenciesMeta": { 336 | "supports-color": { 337 | "optional": true 338 | } 339 | } 340 | }, 341 | "node_modules/deep-is": { 342 | "version": "0.1.4", 343 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 344 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 345 | "dev": true 346 | }, 347 | "node_modules/doctrine": { 348 | "version": "3.0.0", 349 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 350 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 351 | "dev": true, 352 | "dependencies": { 353 | "esutils": "^2.0.2" 354 | }, 355 | "engines": { 356 | "node": ">=6.0.0" 357 | } 358 | }, 359 | "node_modules/escape-string-regexp": { 360 | "version": "4.0.0", 361 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 362 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 363 | "dev": true, 364 | "engines": { 365 | "node": ">=10" 366 | }, 367 | "funding": { 368 | "url": "https://github.com/sponsors/sindresorhus" 369 | } 370 | }, 371 | "node_modules/eslint": { 372 | "version": "8.53.0", 373 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", 374 | "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", 375 | "dev": true, 376 | "dependencies": { 377 | "@eslint-community/eslint-utils": "^4.2.0", 378 | "@eslint-community/regexpp": "^4.6.1", 379 | "@eslint/eslintrc": "^2.1.3", 380 | "@eslint/js": "8.53.0", 381 | "@humanwhocodes/config-array": "^0.11.13", 382 | "@humanwhocodes/module-importer": "^1.0.1", 383 | "@nodelib/fs.walk": "^1.2.8", 384 | "@ungap/structured-clone": "^1.2.0", 385 | "ajv": "^6.12.4", 386 | "chalk": "^4.0.0", 387 | "cross-spawn": "^7.0.2", 388 | "debug": "^4.3.2", 389 | "doctrine": "^3.0.0", 390 | "escape-string-regexp": "^4.0.0", 391 | "eslint-scope": "^7.2.2", 392 | "eslint-visitor-keys": "^3.4.3", 393 | "espree": "^9.6.1", 394 | "esquery": "^1.4.2", 395 | "esutils": "^2.0.2", 396 | "fast-deep-equal": "^3.1.3", 397 | "file-entry-cache": "^6.0.1", 398 | "find-up": "^5.0.0", 399 | "glob-parent": "^6.0.2", 400 | "globals": "^13.19.0", 401 | "graphemer": "^1.4.0", 402 | "ignore": "^5.2.0", 403 | "imurmurhash": "^0.1.4", 404 | "is-glob": "^4.0.0", 405 | "is-path-inside": "^3.0.3", 406 | "js-yaml": "^4.1.0", 407 | "json-stable-stringify-without-jsonify": "^1.0.1", 408 | "levn": "^0.4.1", 409 | "lodash.merge": "^4.6.2", 410 | "minimatch": "^3.1.2", 411 | "natural-compare": "^1.4.0", 412 | "optionator": "^0.9.3", 413 | "strip-ansi": "^6.0.1", 414 | "text-table": "^0.2.0" 415 | }, 416 | "bin": { 417 | "eslint": "bin/eslint.js" 418 | }, 419 | "engines": { 420 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 421 | }, 422 | "funding": { 423 | "url": "https://opencollective.com/eslint" 424 | } 425 | }, 426 | "node_modules/eslint-scope": { 427 | "version": "7.2.2", 428 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 429 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 430 | "dev": true, 431 | "dependencies": { 432 | "esrecurse": "^4.3.0", 433 | "estraverse": "^5.2.0" 434 | }, 435 | "engines": { 436 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 437 | }, 438 | "funding": { 439 | "url": "https://opencollective.com/eslint" 440 | } 441 | }, 442 | "node_modules/eslint-visitor-keys": { 443 | "version": "3.4.3", 444 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 445 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 446 | "dev": true, 447 | "engines": { 448 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 449 | }, 450 | "funding": { 451 | "url": "https://opencollective.com/eslint" 452 | } 453 | }, 454 | "node_modules/espree": { 455 | "version": "9.6.1", 456 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 457 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 458 | "dev": true, 459 | "dependencies": { 460 | "acorn": "^8.9.0", 461 | "acorn-jsx": "^5.3.2", 462 | "eslint-visitor-keys": "^3.4.1" 463 | }, 464 | "engines": { 465 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 466 | }, 467 | "funding": { 468 | "url": "https://opencollective.com/eslint" 469 | } 470 | }, 471 | "node_modules/esquery": { 472 | "version": "1.5.0", 473 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 474 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 475 | "dev": true, 476 | "dependencies": { 477 | "estraverse": "^5.1.0" 478 | }, 479 | "engines": { 480 | "node": ">=0.10" 481 | } 482 | }, 483 | "node_modules/esrecurse": { 484 | "version": "4.3.0", 485 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 486 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 487 | "dev": true, 488 | "dependencies": { 489 | "estraverse": "^5.2.0" 490 | }, 491 | "engines": { 492 | "node": ">=4.0" 493 | } 494 | }, 495 | "node_modules/estraverse": { 496 | "version": "5.3.0", 497 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 498 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 499 | "dev": true, 500 | "engines": { 501 | "node": ">=4.0" 502 | } 503 | }, 504 | "node_modules/esutils": { 505 | "version": "2.0.3", 506 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 507 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 508 | "dev": true, 509 | "engines": { 510 | "node": ">=0.10.0" 511 | } 512 | }, 513 | "node_modules/fast-deep-equal": { 514 | "version": "3.1.3", 515 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 516 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 517 | "dev": true 518 | }, 519 | "node_modules/fast-json-stable-stringify": { 520 | "version": "2.1.0", 521 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 522 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 523 | "dev": true 524 | }, 525 | "node_modules/fast-levenshtein": { 526 | "version": "2.0.6", 527 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 528 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 529 | "dev": true 530 | }, 531 | "node_modules/fastq": { 532 | "version": "1.15.0", 533 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 534 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 535 | "dev": true, 536 | "dependencies": { 537 | "reusify": "^1.0.4" 538 | } 539 | }, 540 | "node_modules/file-entry-cache": { 541 | "version": "6.0.1", 542 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 543 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 544 | "dev": true, 545 | "dependencies": { 546 | "flat-cache": "^3.0.4" 547 | }, 548 | "engines": { 549 | "node": "^10.12.0 || >=12.0.0" 550 | } 551 | }, 552 | "node_modules/find-up": { 553 | "version": "5.0.0", 554 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 555 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 556 | "dev": true, 557 | "dependencies": { 558 | "locate-path": "^6.0.0", 559 | "path-exists": "^4.0.0" 560 | }, 561 | "engines": { 562 | "node": ">=10" 563 | }, 564 | "funding": { 565 | "url": "https://github.com/sponsors/sindresorhus" 566 | } 567 | }, 568 | "node_modules/flat-cache": { 569 | "version": "3.1.1", 570 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", 571 | "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", 572 | "dev": true, 573 | "dependencies": { 574 | "flatted": "^3.2.9", 575 | "keyv": "^4.5.3", 576 | "rimraf": "^3.0.2" 577 | }, 578 | "engines": { 579 | "node": ">=12.0.0" 580 | } 581 | }, 582 | "node_modules/flatted": { 583 | "version": "3.2.9", 584 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", 585 | "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", 586 | "dev": true 587 | }, 588 | "node_modules/fs.realpath": { 589 | "version": "1.0.0", 590 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 591 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 592 | "dev": true 593 | }, 594 | "node_modules/glob": { 595 | "version": "7.2.3", 596 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 597 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 598 | "dev": true, 599 | "dependencies": { 600 | "fs.realpath": "^1.0.0", 601 | "inflight": "^1.0.4", 602 | "inherits": "2", 603 | "minimatch": "^3.1.1", 604 | "once": "^1.3.0", 605 | "path-is-absolute": "^1.0.0" 606 | }, 607 | "engines": { 608 | "node": "*" 609 | }, 610 | "funding": { 611 | "url": "https://github.com/sponsors/isaacs" 612 | } 613 | }, 614 | "node_modules/glob-parent": { 615 | "version": "6.0.2", 616 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 617 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 618 | "dev": true, 619 | "dependencies": { 620 | "is-glob": "^4.0.3" 621 | }, 622 | "engines": { 623 | "node": ">=10.13.0" 624 | } 625 | }, 626 | "node_modules/globals": { 627 | "version": "13.23.0", 628 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", 629 | "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", 630 | "dev": true, 631 | "dependencies": { 632 | "type-fest": "^0.20.2" 633 | }, 634 | "engines": { 635 | "node": ">=8" 636 | }, 637 | "funding": { 638 | "url": "https://github.com/sponsors/sindresorhus" 639 | } 640 | }, 641 | "node_modules/graphemer": { 642 | "version": "1.4.0", 643 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 644 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 645 | "dev": true 646 | }, 647 | "node_modules/has-flag": { 648 | "version": "4.0.0", 649 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 650 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 651 | "dev": true, 652 | "engines": { 653 | "node": ">=8" 654 | } 655 | }, 656 | "node_modules/ignore": { 657 | "version": "5.2.4", 658 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 659 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 660 | "dev": true, 661 | "engines": { 662 | "node": ">= 4" 663 | } 664 | }, 665 | "node_modules/import-fresh": { 666 | "version": "3.3.0", 667 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 668 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 669 | "dev": true, 670 | "dependencies": { 671 | "parent-module": "^1.0.0", 672 | "resolve-from": "^4.0.0" 673 | }, 674 | "engines": { 675 | "node": ">=6" 676 | }, 677 | "funding": { 678 | "url": "https://github.com/sponsors/sindresorhus" 679 | } 680 | }, 681 | "node_modules/imurmurhash": { 682 | "version": "0.1.4", 683 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 684 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 685 | "dev": true, 686 | "engines": { 687 | "node": ">=0.8.19" 688 | } 689 | }, 690 | "node_modules/inflight": { 691 | "version": "1.0.6", 692 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 693 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 694 | "dev": true, 695 | "dependencies": { 696 | "once": "^1.3.0", 697 | "wrappy": "1" 698 | } 699 | }, 700 | "node_modules/inherits": { 701 | "version": "2.0.4", 702 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 703 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 704 | "dev": true 705 | }, 706 | "node_modules/is-extglob": { 707 | "version": "2.1.1", 708 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 709 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 710 | "dev": true, 711 | "engines": { 712 | "node": ">=0.10.0" 713 | } 714 | }, 715 | "node_modules/is-glob": { 716 | "version": "4.0.3", 717 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 718 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 719 | "dev": true, 720 | "dependencies": { 721 | "is-extglob": "^2.1.1" 722 | }, 723 | "engines": { 724 | "node": ">=0.10.0" 725 | } 726 | }, 727 | "node_modules/is-path-inside": { 728 | "version": "3.0.3", 729 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 730 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 731 | "dev": true, 732 | "engines": { 733 | "node": ">=8" 734 | } 735 | }, 736 | "node_modules/isexe": { 737 | "version": "2.0.0", 738 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 739 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 740 | "dev": true 741 | }, 742 | "node_modules/js-yaml": { 743 | "version": "4.1.0", 744 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 745 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 746 | "dev": true, 747 | "dependencies": { 748 | "argparse": "^2.0.1" 749 | }, 750 | "bin": { 751 | "js-yaml": "bin/js-yaml.js" 752 | } 753 | }, 754 | "node_modules/json-buffer": { 755 | "version": "3.0.1", 756 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 757 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 758 | "dev": true 759 | }, 760 | "node_modules/json-schema-traverse": { 761 | "version": "0.4.1", 762 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 763 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 764 | "dev": true 765 | }, 766 | "node_modules/json-stable-stringify-without-jsonify": { 767 | "version": "1.0.1", 768 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 769 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 770 | "dev": true 771 | }, 772 | "node_modules/keyv": { 773 | "version": "4.5.4", 774 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 775 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 776 | "dev": true, 777 | "dependencies": { 778 | "json-buffer": "3.0.1" 779 | } 780 | }, 781 | "node_modules/levn": { 782 | "version": "0.4.1", 783 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 784 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 785 | "dev": true, 786 | "dependencies": { 787 | "prelude-ls": "^1.2.1", 788 | "type-check": "~0.4.0" 789 | }, 790 | "engines": { 791 | "node": ">= 0.8.0" 792 | } 793 | }, 794 | "node_modules/locate-path": { 795 | "version": "6.0.0", 796 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 797 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 798 | "dev": true, 799 | "dependencies": { 800 | "p-locate": "^5.0.0" 801 | }, 802 | "engines": { 803 | "node": ">=10" 804 | }, 805 | "funding": { 806 | "url": "https://github.com/sponsors/sindresorhus" 807 | } 808 | }, 809 | "node_modules/lodash": { 810 | "version": "4.17.21", 811 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 812 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 813 | "dev": true 814 | }, 815 | "node_modules/lodash.merge": { 816 | "version": "4.6.2", 817 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 818 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 819 | "dev": true 820 | }, 821 | "node_modules/minimatch": { 822 | "version": "3.1.2", 823 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 824 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 825 | "dev": true, 826 | "dependencies": { 827 | "brace-expansion": "^1.1.7" 828 | }, 829 | "engines": { 830 | "node": "*" 831 | } 832 | }, 833 | "node_modules/ms": { 834 | "version": "2.1.2", 835 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 836 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 837 | "dev": true 838 | }, 839 | "node_modules/natural-compare": { 840 | "version": "1.4.0", 841 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 842 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 843 | "dev": true 844 | }, 845 | "node_modules/once": { 846 | "version": "1.4.0", 847 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 848 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 849 | "dev": true, 850 | "dependencies": { 851 | "wrappy": "1" 852 | } 853 | }, 854 | "node_modules/optionator": { 855 | "version": "0.9.3", 856 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 857 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 858 | "dev": true, 859 | "dependencies": { 860 | "@aashutoshrathi/word-wrap": "^1.2.3", 861 | "deep-is": "^0.1.3", 862 | "fast-levenshtein": "^2.0.6", 863 | "levn": "^0.4.1", 864 | "prelude-ls": "^1.2.1", 865 | "type-check": "^0.4.0" 866 | }, 867 | "engines": { 868 | "node": ">= 0.8.0" 869 | } 870 | }, 871 | "node_modules/p-limit": { 872 | "version": "3.1.0", 873 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 874 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 875 | "dev": true, 876 | "dependencies": { 877 | "yocto-queue": "^0.1.0" 878 | }, 879 | "engines": { 880 | "node": ">=10" 881 | }, 882 | "funding": { 883 | "url": "https://github.com/sponsors/sindresorhus" 884 | } 885 | }, 886 | "node_modules/p-locate": { 887 | "version": "5.0.0", 888 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 889 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 890 | "dev": true, 891 | "dependencies": { 892 | "p-limit": "^3.0.2" 893 | }, 894 | "engines": { 895 | "node": ">=10" 896 | }, 897 | "funding": { 898 | "url": "https://github.com/sponsors/sindresorhus" 899 | } 900 | }, 901 | "node_modules/parent-module": { 902 | "version": "1.0.1", 903 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 904 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 905 | "dev": true, 906 | "dependencies": { 907 | "callsites": "^3.0.0" 908 | }, 909 | "engines": { 910 | "node": ">=6" 911 | } 912 | }, 913 | "node_modules/path-exists": { 914 | "version": "4.0.0", 915 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 916 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 917 | "dev": true, 918 | "engines": { 919 | "node": ">=8" 920 | } 921 | }, 922 | "node_modules/path-is-absolute": { 923 | "version": "1.0.1", 924 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 925 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 926 | "dev": true, 927 | "engines": { 928 | "node": ">=0.10.0" 929 | } 930 | }, 931 | "node_modules/path-key": { 932 | "version": "3.1.1", 933 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 934 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 935 | "dev": true, 936 | "engines": { 937 | "node": ">=8" 938 | } 939 | }, 940 | "node_modules/platform": { 941 | "version": "1.3.6", 942 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 943 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", 944 | "dev": true 945 | }, 946 | "node_modules/prelude-ls": { 947 | "version": "1.2.1", 948 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 949 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 950 | "dev": true, 951 | "engines": { 952 | "node": ">= 0.8.0" 953 | } 954 | }, 955 | "node_modules/punycode": { 956 | "version": "2.3.1", 957 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 958 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 959 | "dev": true, 960 | "engines": { 961 | "node": ">=6" 962 | } 963 | }, 964 | "node_modules/queue-microtask": { 965 | "version": "1.2.3", 966 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 967 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 968 | "dev": true, 969 | "funding": [ 970 | { 971 | "type": "github", 972 | "url": "https://github.com/sponsors/feross" 973 | }, 974 | { 975 | "type": "patreon", 976 | "url": "https://www.patreon.com/feross" 977 | }, 978 | { 979 | "type": "consulting", 980 | "url": "https://feross.org/support" 981 | } 982 | ] 983 | }, 984 | "node_modules/resolve-from": { 985 | "version": "4.0.0", 986 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 987 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 988 | "dev": true, 989 | "engines": { 990 | "node": ">=4" 991 | } 992 | }, 993 | "node_modules/reusify": { 994 | "version": "1.0.4", 995 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 996 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 997 | "dev": true, 998 | "engines": { 999 | "iojs": ">=1.0.0", 1000 | "node": ">=0.10.0" 1001 | } 1002 | }, 1003 | "node_modules/rimraf": { 1004 | "version": "3.0.2", 1005 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1006 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1007 | "dev": true, 1008 | "dependencies": { 1009 | "glob": "^7.1.3" 1010 | }, 1011 | "bin": { 1012 | "rimraf": "bin.js" 1013 | }, 1014 | "funding": { 1015 | "url": "https://github.com/sponsors/isaacs" 1016 | } 1017 | }, 1018 | "node_modules/run-parallel": { 1019 | "version": "1.2.0", 1020 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1021 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1022 | "dev": true, 1023 | "funding": [ 1024 | { 1025 | "type": "github", 1026 | "url": "https://github.com/sponsors/feross" 1027 | }, 1028 | { 1029 | "type": "patreon", 1030 | "url": "https://www.patreon.com/feross" 1031 | }, 1032 | { 1033 | "type": "consulting", 1034 | "url": "https://feross.org/support" 1035 | } 1036 | ], 1037 | "dependencies": { 1038 | "queue-microtask": "^1.2.2" 1039 | } 1040 | }, 1041 | "node_modules/shebang-command": { 1042 | "version": "2.0.0", 1043 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1044 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1045 | "dev": true, 1046 | "dependencies": { 1047 | "shebang-regex": "^3.0.0" 1048 | }, 1049 | "engines": { 1050 | "node": ">=8" 1051 | } 1052 | }, 1053 | "node_modules/shebang-regex": { 1054 | "version": "3.0.0", 1055 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1056 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1057 | "dev": true, 1058 | "engines": { 1059 | "node": ">=8" 1060 | } 1061 | }, 1062 | "node_modules/strip-ansi": { 1063 | "version": "6.0.1", 1064 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1065 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1066 | "dev": true, 1067 | "dependencies": { 1068 | "ansi-regex": "^5.0.1" 1069 | }, 1070 | "engines": { 1071 | "node": ">=8" 1072 | } 1073 | }, 1074 | "node_modules/strip-json-comments": { 1075 | "version": "3.1.1", 1076 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1077 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1078 | "dev": true, 1079 | "engines": { 1080 | "node": ">=8" 1081 | }, 1082 | "funding": { 1083 | "url": "https://github.com/sponsors/sindresorhus" 1084 | } 1085 | }, 1086 | "node_modules/supports-color": { 1087 | "version": "7.2.0", 1088 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1089 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1090 | "dev": true, 1091 | "dependencies": { 1092 | "has-flag": "^4.0.0" 1093 | }, 1094 | "engines": { 1095 | "node": ">=8" 1096 | } 1097 | }, 1098 | "node_modules/text-table": { 1099 | "version": "0.2.0", 1100 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1101 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1102 | "dev": true 1103 | }, 1104 | "node_modules/type-check": { 1105 | "version": "0.4.0", 1106 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1107 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1108 | "dev": true, 1109 | "dependencies": { 1110 | "prelude-ls": "^1.2.1" 1111 | }, 1112 | "engines": { 1113 | "node": ">= 0.8.0" 1114 | } 1115 | }, 1116 | "node_modules/type-fest": { 1117 | "version": "0.20.2", 1118 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1119 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1120 | "dev": true, 1121 | "engines": { 1122 | "node": ">=10" 1123 | }, 1124 | "funding": { 1125 | "url": "https://github.com/sponsors/sindresorhus" 1126 | } 1127 | }, 1128 | "node_modules/uri-js": { 1129 | "version": "4.4.1", 1130 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1131 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1132 | "dev": true, 1133 | "dependencies": { 1134 | "punycode": "^2.1.0" 1135 | } 1136 | }, 1137 | "node_modules/which": { 1138 | "version": "2.0.2", 1139 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1140 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1141 | "dev": true, 1142 | "dependencies": { 1143 | "isexe": "^2.0.0" 1144 | }, 1145 | "bin": { 1146 | "node-which": "bin/node-which" 1147 | }, 1148 | "engines": { 1149 | "node": ">= 8" 1150 | } 1151 | }, 1152 | "node_modules/wrappy": { 1153 | "version": "1.0.2", 1154 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1155 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1156 | "dev": true 1157 | }, 1158 | "node_modules/yocto-queue": { 1159 | "version": "0.1.0", 1160 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1161 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1162 | "dev": true, 1163 | "engines": { 1164 | "node": ">=10" 1165 | }, 1166 | "funding": { 1167 | "url": "https://github.com/sponsors/sindresorhus" 1168 | } 1169 | } 1170 | } 1171 | } 1172 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xml-name-validator", 3 | "description": "Validates whether a string matches the production for an XML name or qualified name", 4 | "keywords": [ 5 | "xml", 6 | "name", 7 | "qname" 8 | ], 9 | "version": "5.0.0", 10 | "author": "Domenic Denicola (https://domenic.me/)", 11 | "license": "Apache-2.0", 12 | "repository": "jsdom/xml-name-validator", 13 | "main": "lib/xml-name-validator.js", 14 | "files": [ 15 | "lib/" 16 | ], 17 | "scripts": { 18 | "test": "node --test", 19 | "benchmark": "node scripts/benchmark.js", 20 | "lint": "eslint ." 21 | }, 22 | "devDependencies": { 23 | "@domenic/eslint-config": "^3.0.0", 24 | "benchmark": "^2.1.4", 25 | "eslint": "^8.53.0" 26 | }, 27 | "engines": { 28 | "node": ">=18" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /scripts/benchmark.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | /* eslint-disable no-console */ 3 | const assert = require("node:assert"); 4 | const Benchmark = require("benchmark"); 5 | const xnv = require(".."); 6 | const cases = require("../test/cases.json"); 7 | 8 | const benchmark = new Benchmark(() => { 9 | for (const input of cases.name.valid) { 10 | assert.strictEqual(xnv.name(input), true); 11 | } 12 | for (const input of cases.name.invalid) { 13 | assert.strictEqual(xnv.name(input), false); 14 | assert.strictEqual(xnv.qname(input), false); 15 | } 16 | for (const input of cases.qname.valid) { 17 | assert.strictEqual(xnv.qname(input), true); 18 | } 19 | for (const input of cases.qname.invalid) { 20 | assert.strictEqual(xnv.qname(input), false); 21 | } 22 | }); 23 | 24 | benchmark.on("cycle", e => console.log(e.target.toString())); 25 | benchmark.run(); 26 | -------------------------------------------------------------------------------- /test/cases.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": { 3 | "valid": ["x", ":", "a:0", "a0", "a:b:c"], 4 | "invalid": ["\\", "'", "\"", "0", "0:a", "a!", ""] 5 | }, 6 | "qname": { 7 | "valid": ["x", "a0", "a:b"], 8 | "invalid": [":a", "b:", "x:y:z", "a:0", "emp:", ":", "_:", ":0a", "_::a", "prefix::local"] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | const { describe, test } = require("node:test"); 3 | const assert = require("node:assert"); 4 | const xnv = require(".."); 5 | const cases = require("./cases.json"); 6 | 7 | describe("Valid names", () => { 8 | for (const validName of cases.name.valid) { 9 | test(`"${validName}" is recognized as a valid name`, () => { 10 | assert.strictEqual(xnv.name(validName), true); 11 | }); 12 | } 13 | }); 14 | 15 | describe("Invalid names/qnames", () => { 16 | for (const invalidName of cases.name.invalid) { 17 | test(`"${invalidName}" is recognized as an invalid name`, () => { 18 | assert.strictEqual(xnv.name(invalidName), false); 19 | }); 20 | 21 | test(`"${invalidName}" is recognized as an invalid qname`, () => { 22 | assert.strictEqual(xnv.qname(invalidName), false); 23 | }); 24 | } 25 | }); 26 | 27 | describe("Valid qualified names", () => { 28 | for (const validQname of cases.qname.valid) { 29 | test(`"${validQname}" is recognized as a valid qname`, () => { 30 | assert.strictEqual(xnv.qname(validQname), true); 31 | }); 32 | } 33 | }); 34 | 35 | describe("Invalid qualified names", () => { 36 | for (const invalidQname of cases.qname.invalid) { 37 | test(`"${invalidQname}" is recognized as an invalid name`, () => { 38 | assert.strictEqual(xnv.qname(invalidQname), false); 39 | }); 40 | } 41 | }); 42 | --------------------------------------------------------------------------------