├── .circleci └── config.yml ├── .gitignore ├── LICENSE ├── README.md ├── bin └── git-json-merge ├── lib └── git-json-merge.js ├── package-lock.json ├── package.json └── test ├── git-json-merge.spec.js └── mocha.opts /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | workflows: 4 | main: 5 | jobs: 6 | - test: 7 | version: "14.21" 8 | - test: 9 | version: "16.19" 10 | - test: 11 | version: "18.13" 12 | - test: 13 | version: "19.5" 14 | jobs: 15 | test: 16 | parameters: 17 | version: 18 | type: string 19 | docker: 20 | - image: cimg/node:<< parameters.version >> 21 | steps: 22 | - checkout 23 | - run: 24 | name: "NPM Install" 25 | command: npm install 26 | - run: 27 | name: "NPM Test" 28 | command: npm test 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Jonatan Pedersen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # git-json-merge 2 | 3 | A git merge driver that use [xdiff](https://github.com/dominictarr/xdiff) to automatically resolve merge conflicts in json files. It also detects indentation automatically. This project was inspired by [git-po-merge](https://github.com/beck/git-po-merge). 4 | 5 | [![@git-json-merge](https://circleci.com/gh/jonatanpedersen/git-json-merge.svg?style=shield)](https://app.circleci.com/pipelines/github/jonatanpedersen/git-json-merge) 6 | [![NPM Version](https://img.shields.io/npm/v/git-json-merge.svg)](https://www.npmjs.com/package/git-json-merge) 7 | 8 | ## Install 9 | 10 | This can be done one of two ways, globally or per-project/directory: 11 | 12 | ### Globally 13 | 14 | Install: 15 | 16 | ```sh 17 | npm install --global git-json-merge 18 | ``` 19 | 20 | Add to `~/.gitconfig`: 21 | 22 | ```ini 23 | [core] 24 | attributesfile = ~/.gitattributes 25 | [merge "json"] 26 | name = custom merge driver for json files 27 | driver = git-json-merge %A %O %B 28 | ``` 29 | 30 | Create `~/.gitattributes`: 31 | 32 | ```ini 33 | *.json merge=json 34 | ``` 35 | 36 | ### Single project / directory 37 | 38 | Install: 39 | 40 | ```sh 41 | npm install git-json-merge --save-dev 42 | ``` 43 | 44 | Update git config: 45 | 46 | ```sh 47 | git config merge.json.driver "$(npm bin)/git-json-merge %A %O %B" 48 | git config merge.json.name "custom merge driver for json files" 49 | ``` 50 | 51 | Add the same `.gitattributes` where desired and commit. 52 | Note `.gitattributes` is only used after committed. 53 | 54 | Helpful docs: 55 | 56 | - http://git-scm.com/docs/gitattributes#_defining_a_custom_merge_driver 57 | - http://stackoverflow.com/questions/28026767/where-should-i-place-my-global-gitattributes-file 58 | 59 | Thanks: 60 | 61 | - https://gist.github.com/mezis/1605647 62 | - http://stackoverflow.com/questions/16214067/wheres-the-3-way-git-merge-driver-for-po-gettext-files 63 | -------------------------------------------------------------------------------- /bin/git-json-merge: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var gitJsonMerge = require('./../lib/git-json-merge.js'); 3 | 4 | var oursFileName = process.argv[2]; 5 | var baseFileName = process.argv[3]; 6 | var theirsFileName = process.argv[4]; 7 | 8 | gitJsonMerge.mergeJsonFiles(oursFileName, baseFileName, theirsFileName); 9 | -------------------------------------------------------------------------------- /lib/git-json-merge.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var xdiff = require('xdiff'); 3 | var detectIndent = require('detect-indent'); 4 | 5 | var encoding = 'utf-8'; 6 | 7 | function mergeJsonFiles (oursFileName, baseFileName, theirsFileName) { 8 | var oursJson = stripBom(fs.readFileSync(oursFileName, encoding)); 9 | var baseJson = stripBom(fs.readFileSync(baseFileName, encoding)); 10 | var theirsJson = stripBom(fs.readFileSync(theirsFileName, encoding)); 11 | var newOursJson = mergeJson(oursJson, baseJson, theirsJson); 12 | fs.writeFileSync(oursFileName, newOursJson, encoding); 13 | } 14 | 15 | function mergeJson (oursJson, baseJson, theirsJson) { 16 | var oursIndent = detectIndent(oursJson).indent; 17 | var baseIndent = detectIndent(baseJson).indent; 18 | var theirsIndent = detectIndent(theirsJson).indent; 19 | var newOursIndent = selectIndent(oursIndent, baseIndent, theirsIndent); 20 | var ours = JSON.parse(oursJson); 21 | var base = JSON.parse(baseJson); 22 | var theirs = JSON.parse(theirsJson); 23 | var newOurs = merge(ours, base, theirs); 24 | var newOursJson = JSON.stringify(newOurs, null, newOursIndent); 25 | 26 | return newOursJson; 27 | } 28 | 29 | function merge (ours, base, theirs) { 30 | var diff = xdiff.diff3(ours, base, theirs); 31 | 32 | if (diff) { 33 | return xdiff.patch(base, diff); 34 | } 35 | 36 | return base; 37 | } 38 | 39 | function selectIndent (oursIndent, baseIndent, theirsIndent) { 40 | return oursIndent !== baseIndent ? oursIndent : theirsIndent !== baseIndent ? theirsIndent : baseIndent; 41 | } 42 | 43 | function stripBom (str) { 44 | return str[0] === '\uFEFF' ? str.slice(1) : str; 45 | } 46 | 47 | module.exports = { 48 | mergeJsonFiles: mergeJsonFiles, 49 | mergeJson: mergeJson, 50 | merge: merge, 51 | selectIndent: selectIndent, 52 | stripBom: stripBom 53 | } 54 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-json-merge", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "git-json-merge", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "detect-indent": "^6.0.0", 13 | "xdiff": "^0.2.11" 14 | }, 15 | "bin": { 16 | "git-json-merge": "bin/git-json-merge" 17 | }, 18 | "devDependencies": { 19 | "chai": "^4.3.7", 20 | "mocha": "^10.2.0" 21 | }, 22 | "engines": { 23 | "node": ">=6" 24 | } 25 | }, 26 | "node_modules/adiff": { 27 | "version": "0.2.13", 28 | "resolved": "https://registry.npmjs.org/adiff/-/adiff-0.2.13.tgz", 29 | "integrity": "sha1-3D3TL5RNl/J366WM5SmXrf8fdyg=" 30 | }, 31 | "node_modules/ansi-colors": { 32 | "version": "4.1.1", 33 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 34 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 35 | "dev": true, 36 | "engines": { 37 | "node": ">=6" 38 | } 39 | }, 40 | "node_modules/ansi-regex": { 41 | "version": "5.0.1", 42 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 43 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 44 | "dev": true, 45 | "engines": { 46 | "node": ">=8" 47 | } 48 | }, 49 | "node_modules/ansi-styles": { 50 | "version": "4.3.0", 51 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 52 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 53 | "dev": true, 54 | "dependencies": { 55 | "color-convert": "^2.0.1" 56 | }, 57 | "engines": { 58 | "node": ">=8" 59 | }, 60 | "funding": { 61 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 62 | } 63 | }, 64 | "node_modules/anymatch": { 65 | "version": "3.1.3", 66 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 67 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 68 | "dev": true, 69 | "dependencies": { 70 | "normalize-path": "^3.0.0", 71 | "picomatch": "^2.0.4" 72 | }, 73 | "engines": { 74 | "node": ">= 8" 75 | } 76 | }, 77 | "node_modules/argparse": { 78 | "version": "2.0.1", 79 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 80 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 81 | "dev": true 82 | }, 83 | "node_modules/assertion-error": { 84 | "version": "1.1.0", 85 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 86 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 87 | "dev": true, 88 | "engines": { 89 | "node": "*" 90 | } 91 | }, 92 | "node_modules/balanced-match": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 95 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 96 | "dev": true 97 | }, 98 | "node_modules/binary-extensions": { 99 | "version": "2.2.0", 100 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 101 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 102 | "dev": true, 103 | "engines": { 104 | "node": ">=8" 105 | } 106 | }, 107 | "node_modules/brace-expansion": { 108 | "version": "2.0.1", 109 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 110 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 111 | "dev": true, 112 | "dependencies": { 113 | "balanced-match": "^1.0.0" 114 | } 115 | }, 116 | "node_modules/braces": { 117 | "version": "3.0.2", 118 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 119 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 120 | "dev": true, 121 | "dependencies": { 122 | "fill-range": "^7.0.1" 123 | }, 124 | "engines": { 125 | "node": ">=8" 126 | } 127 | }, 128 | "node_modules/browser-stdout": { 129 | "version": "1.3.1", 130 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 131 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 132 | "dev": true 133 | }, 134 | "node_modules/camelcase": { 135 | "version": "6.3.0", 136 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 137 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 138 | "dev": true, 139 | "engines": { 140 | "node": ">=10" 141 | }, 142 | "funding": { 143 | "url": "https://github.com/sponsors/sindresorhus" 144 | } 145 | }, 146 | "node_modules/chai": { 147 | "version": "4.3.7", 148 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", 149 | "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", 150 | "dev": true, 151 | "dependencies": { 152 | "assertion-error": "^1.1.0", 153 | "check-error": "^1.0.2", 154 | "deep-eql": "^4.1.2", 155 | "get-func-name": "^2.0.0", 156 | "loupe": "^2.3.1", 157 | "pathval": "^1.1.1", 158 | "type-detect": "^4.0.5" 159 | }, 160 | "engines": { 161 | "node": ">=4" 162 | } 163 | }, 164 | "node_modules/chalk": { 165 | "version": "4.1.2", 166 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 167 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 168 | "dev": true, 169 | "dependencies": { 170 | "ansi-styles": "^4.1.0", 171 | "supports-color": "^7.1.0" 172 | }, 173 | "engines": { 174 | "node": ">=10" 175 | }, 176 | "funding": { 177 | "url": "https://github.com/chalk/chalk?sponsor=1" 178 | } 179 | }, 180 | "node_modules/chalk/node_modules/supports-color": { 181 | "version": "7.2.0", 182 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 183 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 184 | "dev": true, 185 | "dependencies": { 186 | "has-flag": "^4.0.0" 187 | }, 188 | "engines": { 189 | "node": ">=8" 190 | } 191 | }, 192 | "node_modules/check-error": { 193 | "version": "1.0.2", 194 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 195 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 196 | "dev": true, 197 | "engines": { 198 | "node": "*" 199 | } 200 | }, 201 | "node_modules/chokidar": { 202 | "version": "3.5.3", 203 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 204 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 205 | "dev": true, 206 | "funding": [ 207 | { 208 | "type": "individual", 209 | "url": "https://paulmillr.com/funding/" 210 | } 211 | ], 212 | "dependencies": { 213 | "anymatch": "~3.1.2", 214 | "braces": "~3.0.2", 215 | "glob-parent": "~5.1.2", 216 | "is-binary-path": "~2.1.0", 217 | "is-glob": "~4.0.1", 218 | "normalize-path": "~3.0.0", 219 | "readdirp": "~3.6.0" 220 | }, 221 | "engines": { 222 | "node": ">= 8.10.0" 223 | }, 224 | "optionalDependencies": { 225 | "fsevents": "~2.3.2" 226 | } 227 | }, 228 | "node_modules/cliui": { 229 | "version": "7.0.4", 230 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 231 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 232 | "dev": true, 233 | "dependencies": { 234 | "string-width": "^4.2.0", 235 | "strip-ansi": "^6.0.0", 236 | "wrap-ansi": "^7.0.0" 237 | } 238 | }, 239 | "node_modules/color-convert": { 240 | "version": "2.0.1", 241 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 242 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 243 | "dev": true, 244 | "dependencies": { 245 | "color-name": "~1.1.4" 246 | }, 247 | "engines": { 248 | "node": ">=7.0.0" 249 | } 250 | }, 251 | "node_modules/color-name": { 252 | "version": "1.1.4", 253 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 254 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 255 | "dev": true 256 | }, 257 | "node_modules/concat-map": { 258 | "version": "0.0.1", 259 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 260 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 261 | "dev": true 262 | }, 263 | "node_modules/debug": { 264 | "version": "4.3.4", 265 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 266 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 267 | "dev": true, 268 | "dependencies": { 269 | "ms": "2.1.2" 270 | }, 271 | "engines": { 272 | "node": ">=6.0" 273 | }, 274 | "peerDependenciesMeta": { 275 | "supports-color": { 276 | "optional": true 277 | } 278 | } 279 | }, 280 | "node_modules/debug/node_modules/ms": { 281 | "version": "2.1.2", 282 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 283 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 284 | "dev": true 285 | }, 286 | "node_modules/decamelize": { 287 | "version": "4.0.0", 288 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 289 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 290 | "dev": true, 291 | "engines": { 292 | "node": ">=10" 293 | }, 294 | "funding": { 295 | "url": "https://github.com/sponsors/sindresorhus" 296 | } 297 | }, 298 | "node_modules/deep-eql": { 299 | "version": "4.1.3", 300 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 301 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 302 | "dev": true, 303 | "dependencies": { 304 | "type-detect": "^4.0.0" 305 | }, 306 | "engines": { 307 | "node": ">=6" 308 | } 309 | }, 310 | "node_modules/detect-indent": { 311 | "version": "6.1.0", 312 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 313 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 314 | "engines": { 315 | "node": ">=8" 316 | } 317 | }, 318 | "node_modules/diff": { 319 | "version": "5.0.0", 320 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 321 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 322 | "dev": true, 323 | "engines": { 324 | "node": ">=0.3.1" 325 | } 326 | }, 327 | "node_modules/emoji-regex": { 328 | "version": "8.0.0", 329 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 330 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 331 | "dev": true 332 | }, 333 | "node_modules/escalade": { 334 | "version": "3.1.1", 335 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 336 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 337 | "dev": true, 338 | "engines": { 339 | "node": ">=6" 340 | } 341 | }, 342 | "node_modules/escape-string-regexp": { 343 | "version": "4.0.0", 344 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 345 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 346 | "dev": true, 347 | "engines": { 348 | "node": ">=10" 349 | }, 350 | "funding": { 351 | "url": "https://github.com/sponsors/sindresorhus" 352 | } 353 | }, 354 | "node_modules/fill-range": { 355 | "version": "7.0.1", 356 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 357 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 358 | "dev": true, 359 | "dependencies": { 360 | "to-regex-range": "^5.0.1" 361 | }, 362 | "engines": { 363 | "node": ">=8" 364 | } 365 | }, 366 | "node_modules/find-up": { 367 | "version": "5.0.0", 368 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 369 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 370 | "dev": true, 371 | "dependencies": { 372 | "locate-path": "^6.0.0", 373 | "path-exists": "^4.0.0" 374 | }, 375 | "engines": { 376 | "node": ">=10" 377 | }, 378 | "funding": { 379 | "url": "https://github.com/sponsors/sindresorhus" 380 | } 381 | }, 382 | "node_modules/flat": { 383 | "version": "5.0.2", 384 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 385 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 386 | "dev": true, 387 | "bin": { 388 | "flat": "cli.js" 389 | } 390 | }, 391 | "node_modules/fs.realpath": { 392 | "version": "1.0.0", 393 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 394 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 395 | "dev": true 396 | }, 397 | "node_modules/fsevents": { 398 | "version": "2.3.2", 399 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 400 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 401 | "dev": true, 402 | "hasInstallScript": true, 403 | "optional": true, 404 | "os": [ 405 | "darwin" 406 | ], 407 | "engines": { 408 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 409 | } 410 | }, 411 | "node_modules/get-caller-file": { 412 | "version": "2.0.5", 413 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 414 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 415 | "dev": true, 416 | "engines": { 417 | "node": "6.* || 8.* || >= 10.*" 418 | } 419 | }, 420 | "node_modules/get-func-name": { 421 | "version": "2.0.0", 422 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 423 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 424 | "dev": true, 425 | "engines": { 426 | "node": "*" 427 | } 428 | }, 429 | "node_modules/glob": { 430 | "version": "7.2.0", 431 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 432 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 433 | "dev": true, 434 | "dependencies": { 435 | "fs.realpath": "^1.0.0", 436 | "inflight": "^1.0.4", 437 | "inherits": "2", 438 | "minimatch": "^3.0.4", 439 | "once": "^1.3.0", 440 | "path-is-absolute": "^1.0.0" 441 | }, 442 | "engines": { 443 | "node": "*" 444 | }, 445 | "funding": { 446 | "url": "https://github.com/sponsors/isaacs" 447 | } 448 | }, 449 | "node_modules/glob-parent": { 450 | "version": "5.1.2", 451 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 452 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 453 | "dev": true, 454 | "dependencies": { 455 | "is-glob": "^4.0.1" 456 | }, 457 | "engines": { 458 | "node": ">= 6" 459 | } 460 | }, 461 | "node_modules/glob/node_modules/brace-expansion": { 462 | "version": "1.1.11", 463 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 464 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 465 | "dev": true, 466 | "dependencies": { 467 | "balanced-match": "^1.0.0", 468 | "concat-map": "0.0.1" 469 | } 470 | }, 471 | "node_modules/glob/node_modules/minimatch": { 472 | "version": "3.1.2", 473 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 474 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 475 | "dev": true, 476 | "dependencies": { 477 | "brace-expansion": "^1.1.7" 478 | }, 479 | "engines": { 480 | "node": "*" 481 | } 482 | }, 483 | "node_modules/has-flag": { 484 | "version": "4.0.0", 485 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 486 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 487 | "dev": true, 488 | "engines": { 489 | "node": ">=8" 490 | } 491 | }, 492 | "node_modules/he": { 493 | "version": "1.2.0", 494 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 495 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 496 | "dev": true, 497 | "bin": { 498 | "he": "bin/he" 499 | } 500 | }, 501 | "node_modules/inflight": { 502 | "version": "1.0.6", 503 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 504 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 505 | "dev": true, 506 | "dependencies": { 507 | "once": "^1.3.0", 508 | "wrappy": "1" 509 | } 510 | }, 511 | "node_modules/inherits": { 512 | "version": "2.0.4", 513 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 514 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 515 | "dev": true 516 | }, 517 | "node_modules/is-binary-path": { 518 | "version": "2.1.0", 519 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 520 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 521 | "dev": true, 522 | "dependencies": { 523 | "binary-extensions": "^2.0.0" 524 | }, 525 | "engines": { 526 | "node": ">=8" 527 | } 528 | }, 529 | "node_modules/is-extglob": { 530 | "version": "2.1.1", 531 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 532 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 533 | "dev": true, 534 | "engines": { 535 | "node": ">=0.10.0" 536 | } 537 | }, 538 | "node_modules/is-fullwidth-code-point": { 539 | "version": "3.0.0", 540 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 541 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 542 | "dev": true, 543 | "engines": { 544 | "node": ">=8" 545 | } 546 | }, 547 | "node_modules/is-glob": { 548 | "version": "4.0.3", 549 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 550 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 551 | "dev": true, 552 | "dependencies": { 553 | "is-extglob": "^2.1.1" 554 | }, 555 | "engines": { 556 | "node": ">=0.10.0" 557 | } 558 | }, 559 | "node_modules/is-number": { 560 | "version": "7.0.0", 561 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 562 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 563 | "dev": true, 564 | "engines": { 565 | "node": ">=0.12.0" 566 | } 567 | }, 568 | "node_modules/is-plain-obj": { 569 | "version": "2.1.0", 570 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 571 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">=8" 575 | } 576 | }, 577 | "node_modules/is-unicode-supported": { 578 | "version": "0.1.0", 579 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 580 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 581 | "dev": true, 582 | "engines": { 583 | "node": ">=10" 584 | }, 585 | "funding": { 586 | "url": "https://github.com/sponsors/sindresorhus" 587 | } 588 | }, 589 | "node_modules/js-yaml": { 590 | "version": "4.1.0", 591 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 592 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 593 | "dev": true, 594 | "dependencies": { 595 | "argparse": "^2.0.1" 596 | }, 597 | "bin": { 598 | "js-yaml": "bin/js-yaml.js" 599 | } 600 | }, 601 | "node_modules/locate-path": { 602 | "version": "6.0.0", 603 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 604 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 605 | "dev": true, 606 | "dependencies": { 607 | "p-locate": "^5.0.0" 608 | }, 609 | "engines": { 610 | "node": ">=10" 611 | }, 612 | "funding": { 613 | "url": "https://github.com/sponsors/sindresorhus" 614 | } 615 | }, 616 | "node_modules/log-symbols": { 617 | "version": "4.1.0", 618 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 619 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 620 | "dev": true, 621 | "dependencies": { 622 | "chalk": "^4.1.0", 623 | "is-unicode-supported": "^0.1.0" 624 | }, 625 | "engines": { 626 | "node": ">=10" 627 | }, 628 | "funding": { 629 | "url": "https://github.com/sponsors/sindresorhus" 630 | } 631 | }, 632 | "node_modules/loupe": { 633 | "version": "2.3.6", 634 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", 635 | "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", 636 | "dev": true, 637 | "dependencies": { 638 | "get-func-name": "^2.0.0" 639 | } 640 | }, 641 | "node_modules/minimatch": { 642 | "version": "5.0.1", 643 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 644 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 645 | "dev": true, 646 | "dependencies": { 647 | "brace-expansion": "^2.0.1" 648 | }, 649 | "engines": { 650 | "node": ">=10" 651 | } 652 | }, 653 | "node_modules/mocha": { 654 | "version": "10.2.0", 655 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 656 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 657 | "dev": true, 658 | "dependencies": { 659 | "ansi-colors": "4.1.1", 660 | "browser-stdout": "1.3.1", 661 | "chokidar": "3.5.3", 662 | "debug": "4.3.4", 663 | "diff": "5.0.0", 664 | "escape-string-regexp": "4.0.0", 665 | "find-up": "5.0.0", 666 | "glob": "7.2.0", 667 | "he": "1.2.0", 668 | "js-yaml": "4.1.0", 669 | "log-symbols": "4.1.0", 670 | "minimatch": "5.0.1", 671 | "ms": "2.1.3", 672 | "nanoid": "3.3.3", 673 | "serialize-javascript": "6.0.0", 674 | "strip-json-comments": "3.1.1", 675 | "supports-color": "8.1.1", 676 | "workerpool": "6.2.1", 677 | "yargs": "16.2.0", 678 | "yargs-parser": "20.2.4", 679 | "yargs-unparser": "2.0.0" 680 | }, 681 | "bin": { 682 | "_mocha": "bin/_mocha", 683 | "mocha": "bin/mocha.js" 684 | }, 685 | "engines": { 686 | "node": ">= 14.0.0" 687 | }, 688 | "funding": { 689 | "type": "opencollective", 690 | "url": "https://opencollective.com/mochajs" 691 | } 692 | }, 693 | "node_modules/ms": { 694 | "version": "2.1.3", 695 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 696 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 697 | "dev": true 698 | }, 699 | "node_modules/nanoid": { 700 | "version": "3.3.3", 701 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 702 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 703 | "dev": true, 704 | "bin": { 705 | "nanoid": "bin/nanoid.cjs" 706 | }, 707 | "engines": { 708 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 709 | } 710 | }, 711 | "node_modules/normalize-path": { 712 | "version": "3.0.0", 713 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 714 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 715 | "dev": true, 716 | "engines": { 717 | "node": ">=0.10.0" 718 | } 719 | }, 720 | "node_modules/once": { 721 | "version": "1.4.0", 722 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 723 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 724 | "dev": true, 725 | "dependencies": { 726 | "wrappy": "1" 727 | } 728 | }, 729 | "node_modules/p-limit": { 730 | "version": "3.1.0", 731 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 732 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 733 | "dev": true, 734 | "dependencies": { 735 | "yocto-queue": "^0.1.0" 736 | }, 737 | "engines": { 738 | "node": ">=10" 739 | }, 740 | "funding": { 741 | "url": "https://github.com/sponsors/sindresorhus" 742 | } 743 | }, 744 | "node_modules/p-locate": { 745 | "version": "5.0.0", 746 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 747 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 748 | "dev": true, 749 | "dependencies": { 750 | "p-limit": "^3.0.2" 751 | }, 752 | "engines": { 753 | "node": ">=10" 754 | }, 755 | "funding": { 756 | "url": "https://github.com/sponsors/sindresorhus" 757 | } 758 | }, 759 | "node_modules/path-exists": { 760 | "version": "4.0.0", 761 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 762 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 763 | "dev": true, 764 | "engines": { 765 | "node": ">=8" 766 | } 767 | }, 768 | "node_modules/path-is-absolute": { 769 | "version": "1.0.1", 770 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 771 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 772 | "dev": true, 773 | "engines": { 774 | "node": ">=0.10.0" 775 | } 776 | }, 777 | "node_modules/pathval": { 778 | "version": "1.1.1", 779 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 780 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 781 | "dev": true, 782 | "engines": { 783 | "node": "*" 784 | } 785 | }, 786 | "node_modules/picomatch": { 787 | "version": "2.3.1", 788 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 789 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 790 | "dev": true, 791 | "engines": { 792 | "node": ">=8.6" 793 | }, 794 | "funding": { 795 | "url": "https://github.com/sponsors/jonschlinkert" 796 | } 797 | }, 798 | "node_modules/randombytes": { 799 | "version": "2.1.0", 800 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 801 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 802 | "dev": true, 803 | "dependencies": { 804 | "safe-buffer": "^5.1.0" 805 | } 806 | }, 807 | "node_modules/readdirp": { 808 | "version": "3.6.0", 809 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 810 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 811 | "dev": true, 812 | "dependencies": { 813 | "picomatch": "^2.2.1" 814 | }, 815 | "engines": { 816 | "node": ">=8.10.0" 817 | } 818 | }, 819 | "node_modules/require-directory": { 820 | "version": "2.1.1", 821 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 822 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 823 | "dev": true, 824 | "engines": { 825 | "node": ">=0.10.0" 826 | } 827 | }, 828 | "node_modules/safe-buffer": { 829 | "version": "5.2.1", 830 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 831 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 832 | "dev": true, 833 | "funding": [ 834 | { 835 | "type": "github", 836 | "url": "https://github.com/sponsors/feross" 837 | }, 838 | { 839 | "type": "patreon", 840 | "url": "https://www.patreon.com/feross" 841 | }, 842 | { 843 | "type": "consulting", 844 | "url": "https://feross.org/support" 845 | } 846 | ] 847 | }, 848 | "node_modules/serialize-javascript": { 849 | "version": "6.0.0", 850 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 851 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 852 | "dev": true, 853 | "dependencies": { 854 | "randombytes": "^2.1.0" 855 | } 856 | }, 857 | "node_modules/string-width": { 858 | "version": "4.2.3", 859 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 860 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 861 | "dev": true, 862 | "dependencies": { 863 | "emoji-regex": "^8.0.0", 864 | "is-fullwidth-code-point": "^3.0.0", 865 | "strip-ansi": "^6.0.1" 866 | }, 867 | "engines": { 868 | "node": ">=8" 869 | } 870 | }, 871 | "node_modules/strip-ansi": { 872 | "version": "6.0.1", 873 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 874 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 875 | "dev": true, 876 | "dependencies": { 877 | "ansi-regex": "^5.0.1" 878 | }, 879 | "engines": { 880 | "node": ">=8" 881 | } 882 | }, 883 | "node_modules/strip-json-comments": { 884 | "version": "3.1.1", 885 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 886 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 887 | "dev": true, 888 | "engines": { 889 | "node": ">=8" 890 | }, 891 | "funding": { 892 | "url": "https://github.com/sponsors/sindresorhus" 893 | } 894 | }, 895 | "node_modules/supports-color": { 896 | "version": "8.1.1", 897 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 898 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 899 | "dev": true, 900 | "dependencies": { 901 | "has-flag": "^4.0.0" 902 | }, 903 | "engines": { 904 | "node": ">=10" 905 | }, 906 | "funding": { 907 | "url": "https://github.com/chalk/supports-color?sponsor=1" 908 | } 909 | }, 910 | "node_modules/to-regex-range": { 911 | "version": "5.0.1", 912 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 913 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 914 | "dev": true, 915 | "dependencies": { 916 | "is-number": "^7.0.0" 917 | }, 918 | "engines": { 919 | "node": ">=8.0" 920 | } 921 | }, 922 | "node_modules/type-detect": { 923 | "version": "4.0.8", 924 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 925 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 926 | "dev": true, 927 | "engines": { 928 | "node": ">=4" 929 | } 930 | }, 931 | "node_modules/workerpool": { 932 | "version": "6.2.1", 933 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 934 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 935 | "dev": true 936 | }, 937 | "node_modules/wrap-ansi": { 938 | "version": "7.0.0", 939 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 940 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 941 | "dev": true, 942 | "dependencies": { 943 | "ansi-styles": "^4.0.0", 944 | "string-width": "^4.1.0", 945 | "strip-ansi": "^6.0.0" 946 | }, 947 | "engines": { 948 | "node": ">=10" 949 | }, 950 | "funding": { 951 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 952 | } 953 | }, 954 | "node_modules/wrappy": { 955 | "version": "1.0.2", 956 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 957 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 958 | "dev": true 959 | }, 960 | "node_modules/xdiff": { 961 | "version": "0.2.11", 962 | "resolved": "https://registry.npmjs.org/xdiff/-/xdiff-0.2.11.tgz", 963 | "integrity": "sha1-cj1SPhtvJlojPK/HeGBiLqXS2Mg=", 964 | "dependencies": { 965 | "adiff": "~0.2.4" 966 | }, 967 | "engines": { 968 | "node": "*" 969 | } 970 | }, 971 | "node_modules/y18n": { 972 | "version": "5.0.8", 973 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 974 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 975 | "dev": true, 976 | "engines": { 977 | "node": ">=10" 978 | } 979 | }, 980 | "node_modules/yargs": { 981 | "version": "16.2.0", 982 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 983 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 984 | "dev": true, 985 | "dependencies": { 986 | "cliui": "^7.0.2", 987 | "escalade": "^3.1.1", 988 | "get-caller-file": "^2.0.5", 989 | "require-directory": "^2.1.1", 990 | "string-width": "^4.2.0", 991 | "y18n": "^5.0.5", 992 | "yargs-parser": "^20.2.2" 993 | }, 994 | "engines": { 995 | "node": ">=10" 996 | } 997 | }, 998 | "node_modules/yargs-parser": { 999 | "version": "20.2.4", 1000 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1001 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1002 | "dev": true, 1003 | "engines": { 1004 | "node": ">=10" 1005 | } 1006 | }, 1007 | "node_modules/yargs-unparser": { 1008 | "version": "2.0.0", 1009 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1010 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1011 | "dev": true, 1012 | "dependencies": { 1013 | "camelcase": "^6.0.0", 1014 | "decamelize": "^4.0.0", 1015 | "flat": "^5.0.2", 1016 | "is-plain-obj": "^2.1.0" 1017 | }, 1018 | "engines": { 1019 | "node": ">=10" 1020 | } 1021 | }, 1022 | "node_modules/yocto-queue": { 1023 | "version": "0.1.0", 1024 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1025 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1026 | "dev": true, 1027 | "engines": { 1028 | "node": ">=10" 1029 | }, 1030 | "funding": { 1031 | "url": "https://github.com/sponsors/sindresorhus" 1032 | } 1033 | } 1034 | }, 1035 | "dependencies": { 1036 | "adiff": { 1037 | "version": "0.2.13", 1038 | "resolved": "https://registry.npmjs.org/adiff/-/adiff-0.2.13.tgz", 1039 | "integrity": "sha1-3D3TL5RNl/J366WM5SmXrf8fdyg=" 1040 | }, 1041 | "ansi-colors": { 1042 | "version": "4.1.1", 1043 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1044 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1045 | "dev": true 1046 | }, 1047 | "ansi-regex": { 1048 | "version": "5.0.1", 1049 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1050 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1051 | "dev": true 1052 | }, 1053 | "ansi-styles": { 1054 | "version": "4.3.0", 1055 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1056 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1057 | "dev": true, 1058 | "requires": { 1059 | "color-convert": "^2.0.1" 1060 | } 1061 | }, 1062 | "anymatch": { 1063 | "version": "3.1.3", 1064 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1065 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1066 | "dev": true, 1067 | "requires": { 1068 | "normalize-path": "^3.0.0", 1069 | "picomatch": "^2.0.4" 1070 | } 1071 | }, 1072 | "argparse": { 1073 | "version": "2.0.1", 1074 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1075 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1076 | "dev": true 1077 | }, 1078 | "assertion-error": { 1079 | "version": "1.1.0", 1080 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1081 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1082 | "dev": true 1083 | }, 1084 | "balanced-match": { 1085 | "version": "1.0.2", 1086 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1087 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1088 | "dev": true 1089 | }, 1090 | "binary-extensions": { 1091 | "version": "2.2.0", 1092 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1093 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1094 | "dev": true 1095 | }, 1096 | "brace-expansion": { 1097 | "version": "2.0.1", 1098 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1099 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1100 | "dev": true, 1101 | "requires": { 1102 | "balanced-match": "^1.0.0" 1103 | } 1104 | }, 1105 | "braces": { 1106 | "version": "3.0.2", 1107 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1108 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1109 | "dev": true, 1110 | "requires": { 1111 | "fill-range": "^7.0.1" 1112 | } 1113 | }, 1114 | "browser-stdout": { 1115 | "version": "1.3.1", 1116 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1117 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1118 | "dev": true 1119 | }, 1120 | "camelcase": { 1121 | "version": "6.3.0", 1122 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1123 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1124 | "dev": true 1125 | }, 1126 | "chai": { 1127 | "version": "4.3.7", 1128 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", 1129 | "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", 1130 | "dev": true, 1131 | "requires": { 1132 | "assertion-error": "^1.1.0", 1133 | "check-error": "^1.0.2", 1134 | "deep-eql": "^4.1.2", 1135 | "get-func-name": "^2.0.0", 1136 | "loupe": "^2.3.1", 1137 | "pathval": "^1.1.1", 1138 | "type-detect": "^4.0.5" 1139 | } 1140 | }, 1141 | "chalk": { 1142 | "version": "4.1.2", 1143 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1144 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1145 | "dev": true, 1146 | "requires": { 1147 | "ansi-styles": "^4.1.0", 1148 | "supports-color": "^7.1.0" 1149 | }, 1150 | "dependencies": { 1151 | "supports-color": { 1152 | "version": "7.2.0", 1153 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1154 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1155 | "dev": true, 1156 | "requires": { 1157 | "has-flag": "^4.0.0" 1158 | } 1159 | } 1160 | } 1161 | }, 1162 | "check-error": { 1163 | "version": "1.0.2", 1164 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 1165 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 1166 | "dev": true 1167 | }, 1168 | "chokidar": { 1169 | "version": "3.5.3", 1170 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1171 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1172 | "dev": true, 1173 | "requires": { 1174 | "anymatch": "~3.1.2", 1175 | "braces": "~3.0.2", 1176 | "fsevents": "~2.3.2", 1177 | "glob-parent": "~5.1.2", 1178 | "is-binary-path": "~2.1.0", 1179 | "is-glob": "~4.0.1", 1180 | "normalize-path": "~3.0.0", 1181 | "readdirp": "~3.6.0" 1182 | } 1183 | }, 1184 | "cliui": { 1185 | "version": "7.0.4", 1186 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1187 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1188 | "dev": true, 1189 | "requires": { 1190 | "string-width": "^4.2.0", 1191 | "strip-ansi": "^6.0.0", 1192 | "wrap-ansi": "^7.0.0" 1193 | } 1194 | }, 1195 | "color-convert": { 1196 | "version": "2.0.1", 1197 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1198 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1199 | "dev": true, 1200 | "requires": { 1201 | "color-name": "~1.1.4" 1202 | } 1203 | }, 1204 | "color-name": { 1205 | "version": "1.1.4", 1206 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1207 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1208 | "dev": true 1209 | }, 1210 | "concat-map": { 1211 | "version": "0.0.1", 1212 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1213 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1214 | "dev": true 1215 | }, 1216 | "debug": { 1217 | "version": "4.3.4", 1218 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1219 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1220 | "dev": true, 1221 | "requires": { 1222 | "ms": "2.1.2" 1223 | }, 1224 | "dependencies": { 1225 | "ms": { 1226 | "version": "2.1.2", 1227 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1228 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1229 | "dev": true 1230 | } 1231 | } 1232 | }, 1233 | "decamelize": { 1234 | "version": "4.0.0", 1235 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1236 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1237 | "dev": true 1238 | }, 1239 | "deep-eql": { 1240 | "version": "4.1.3", 1241 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 1242 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 1243 | "dev": true, 1244 | "requires": { 1245 | "type-detect": "^4.0.0" 1246 | } 1247 | }, 1248 | "detect-indent": { 1249 | "version": "6.1.0", 1250 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 1251 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" 1252 | }, 1253 | "diff": { 1254 | "version": "5.0.0", 1255 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 1256 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 1257 | "dev": true 1258 | }, 1259 | "emoji-regex": { 1260 | "version": "8.0.0", 1261 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1262 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1263 | "dev": true 1264 | }, 1265 | "escalade": { 1266 | "version": "3.1.1", 1267 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1268 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1269 | "dev": true 1270 | }, 1271 | "escape-string-regexp": { 1272 | "version": "4.0.0", 1273 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1274 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1275 | "dev": true 1276 | }, 1277 | "fill-range": { 1278 | "version": "7.0.1", 1279 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1280 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1281 | "dev": true, 1282 | "requires": { 1283 | "to-regex-range": "^5.0.1" 1284 | } 1285 | }, 1286 | "find-up": { 1287 | "version": "5.0.0", 1288 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1289 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1290 | "dev": true, 1291 | "requires": { 1292 | "locate-path": "^6.0.0", 1293 | "path-exists": "^4.0.0" 1294 | } 1295 | }, 1296 | "flat": { 1297 | "version": "5.0.2", 1298 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1299 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1300 | "dev": true 1301 | }, 1302 | "fs.realpath": { 1303 | "version": "1.0.0", 1304 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1305 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1306 | "dev": true 1307 | }, 1308 | "fsevents": { 1309 | "version": "2.3.2", 1310 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1311 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1312 | "dev": true, 1313 | "optional": true 1314 | }, 1315 | "get-caller-file": { 1316 | "version": "2.0.5", 1317 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1318 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1319 | "dev": true 1320 | }, 1321 | "get-func-name": { 1322 | "version": "2.0.0", 1323 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 1324 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 1325 | "dev": true 1326 | }, 1327 | "glob": { 1328 | "version": "7.2.0", 1329 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1330 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1331 | "dev": true, 1332 | "requires": { 1333 | "fs.realpath": "^1.0.0", 1334 | "inflight": "^1.0.4", 1335 | "inherits": "2", 1336 | "minimatch": "^3.0.4", 1337 | "once": "^1.3.0", 1338 | "path-is-absolute": "^1.0.0" 1339 | }, 1340 | "dependencies": { 1341 | "brace-expansion": { 1342 | "version": "1.1.11", 1343 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1344 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1345 | "dev": true, 1346 | "requires": { 1347 | "balanced-match": "^1.0.0", 1348 | "concat-map": "0.0.1" 1349 | } 1350 | }, 1351 | "minimatch": { 1352 | "version": "3.1.2", 1353 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1354 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1355 | "dev": true, 1356 | "requires": { 1357 | "brace-expansion": "^1.1.7" 1358 | } 1359 | } 1360 | } 1361 | }, 1362 | "glob-parent": { 1363 | "version": "5.1.2", 1364 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1365 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1366 | "dev": true, 1367 | "requires": { 1368 | "is-glob": "^4.0.1" 1369 | } 1370 | }, 1371 | "has-flag": { 1372 | "version": "4.0.0", 1373 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1374 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1375 | "dev": true 1376 | }, 1377 | "he": { 1378 | "version": "1.2.0", 1379 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1380 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1381 | "dev": true 1382 | }, 1383 | "inflight": { 1384 | "version": "1.0.6", 1385 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1386 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1387 | "dev": true, 1388 | "requires": { 1389 | "once": "^1.3.0", 1390 | "wrappy": "1" 1391 | } 1392 | }, 1393 | "inherits": { 1394 | "version": "2.0.4", 1395 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1396 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1397 | "dev": true 1398 | }, 1399 | "is-binary-path": { 1400 | "version": "2.1.0", 1401 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1402 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1403 | "dev": true, 1404 | "requires": { 1405 | "binary-extensions": "^2.0.0" 1406 | } 1407 | }, 1408 | "is-extglob": { 1409 | "version": "2.1.1", 1410 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1411 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1412 | "dev": true 1413 | }, 1414 | "is-fullwidth-code-point": { 1415 | "version": "3.0.0", 1416 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1417 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1418 | "dev": true 1419 | }, 1420 | "is-glob": { 1421 | "version": "4.0.3", 1422 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1423 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1424 | "dev": true, 1425 | "requires": { 1426 | "is-extglob": "^2.1.1" 1427 | } 1428 | }, 1429 | "is-number": { 1430 | "version": "7.0.0", 1431 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1432 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1433 | "dev": true 1434 | }, 1435 | "is-plain-obj": { 1436 | "version": "2.1.0", 1437 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1438 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1439 | "dev": true 1440 | }, 1441 | "is-unicode-supported": { 1442 | "version": "0.1.0", 1443 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1444 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1445 | "dev": true 1446 | }, 1447 | "js-yaml": { 1448 | "version": "4.1.0", 1449 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1450 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1451 | "dev": true, 1452 | "requires": { 1453 | "argparse": "^2.0.1" 1454 | } 1455 | }, 1456 | "locate-path": { 1457 | "version": "6.0.0", 1458 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1459 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1460 | "dev": true, 1461 | "requires": { 1462 | "p-locate": "^5.0.0" 1463 | } 1464 | }, 1465 | "log-symbols": { 1466 | "version": "4.1.0", 1467 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1468 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1469 | "dev": true, 1470 | "requires": { 1471 | "chalk": "^4.1.0", 1472 | "is-unicode-supported": "^0.1.0" 1473 | } 1474 | }, 1475 | "loupe": { 1476 | "version": "2.3.6", 1477 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", 1478 | "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", 1479 | "dev": true, 1480 | "requires": { 1481 | "get-func-name": "^2.0.0" 1482 | } 1483 | }, 1484 | "minimatch": { 1485 | "version": "5.0.1", 1486 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1487 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1488 | "dev": true, 1489 | "requires": { 1490 | "brace-expansion": "^2.0.1" 1491 | } 1492 | }, 1493 | "mocha": { 1494 | "version": "10.2.0", 1495 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1496 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1497 | "dev": true, 1498 | "requires": { 1499 | "ansi-colors": "4.1.1", 1500 | "browser-stdout": "1.3.1", 1501 | "chokidar": "3.5.3", 1502 | "debug": "4.3.4", 1503 | "diff": "5.0.0", 1504 | "escape-string-regexp": "4.0.0", 1505 | "find-up": "5.0.0", 1506 | "glob": "7.2.0", 1507 | "he": "1.2.0", 1508 | "js-yaml": "4.1.0", 1509 | "log-symbols": "4.1.0", 1510 | "minimatch": "5.0.1", 1511 | "ms": "2.1.3", 1512 | "nanoid": "3.3.3", 1513 | "serialize-javascript": "6.0.0", 1514 | "strip-json-comments": "3.1.1", 1515 | "supports-color": "8.1.1", 1516 | "workerpool": "6.2.1", 1517 | "yargs": "16.2.0", 1518 | "yargs-parser": "20.2.4", 1519 | "yargs-unparser": "2.0.0" 1520 | } 1521 | }, 1522 | "ms": { 1523 | "version": "2.1.3", 1524 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1525 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1526 | "dev": true 1527 | }, 1528 | "nanoid": { 1529 | "version": "3.3.3", 1530 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1531 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1532 | "dev": true 1533 | }, 1534 | "normalize-path": { 1535 | "version": "3.0.0", 1536 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1537 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1538 | "dev": true 1539 | }, 1540 | "once": { 1541 | "version": "1.4.0", 1542 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1543 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1544 | "dev": true, 1545 | "requires": { 1546 | "wrappy": "1" 1547 | } 1548 | }, 1549 | "p-limit": { 1550 | "version": "3.1.0", 1551 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1552 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1553 | "dev": true, 1554 | "requires": { 1555 | "yocto-queue": "^0.1.0" 1556 | } 1557 | }, 1558 | "p-locate": { 1559 | "version": "5.0.0", 1560 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1561 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1562 | "dev": true, 1563 | "requires": { 1564 | "p-limit": "^3.0.2" 1565 | } 1566 | }, 1567 | "path-exists": { 1568 | "version": "4.0.0", 1569 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1570 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1571 | "dev": true 1572 | }, 1573 | "path-is-absolute": { 1574 | "version": "1.0.1", 1575 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1576 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1577 | "dev": true 1578 | }, 1579 | "pathval": { 1580 | "version": "1.1.1", 1581 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1582 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1583 | "dev": true 1584 | }, 1585 | "picomatch": { 1586 | "version": "2.3.1", 1587 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1588 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1589 | "dev": true 1590 | }, 1591 | "randombytes": { 1592 | "version": "2.1.0", 1593 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1594 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1595 | "dev": true, 1596 | "requires": { 1597 | "safe-buffer": "^5.1.0" 1598 | } 1599 | }, 1600 | "readdirp": { 1601 | "version": "3.6.0", 1602 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1603 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1604 | "dev": true, 1605 | "requires": { 1606 | "picomatch": "^2.2.1" 1607 | } 1608 | }, 1609 | "require-directory": { 1610 | "version": "2.1.1", 1611 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1612 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1613 | "dev": true 1614 | }, 1615 | "safe-buffer": { 1616 | "version": "5.2.1", 1617 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1618 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1619 | "dev": true 1620 | }, 1621 | "serialize-javascript": { 1622 | "version": "6.0.0", 1623 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1624 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1625 | "dev": true, 1626 | "requires": { 1627 | "randombytes": "^2.1.0" 1628 | } 1629 | }, 1630 | "string-width": { 1631 | "version": "4.2.3", 1632 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1633 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1634 | "dev": true, 1635 | "requires": { 1636 | "emoji-regex": "^8.0.0", 1637 | "is-fullwidth-code-point": "^3.0.0", 1638 | "strip-ansi": "^6.0.1" 1639 | } 1640 | }, 1641 | "strip-ansi": { 1642 | "version": "6.0.1", 1643 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1644 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1645 | "dev": true, 1646 | "requires": { 1647 | "ansi-regex": "^5.0.1" 1648 | } 1649 | }, 1650 | "strip-json-comments": { 1651 | "version": "3.1.1", 1652 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1653 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1654 | "dev": true 1655 | }, 1656 | "supports-color": { 1657 | "version": "8.1.1", 1658 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1659 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1660 | "dev": true, 1661 | "requires": { 1662 | "has-flag": "^4.0.0" 1663 | } 1664 | }, 1665 | "to-regex-range": { 1666 | "version": "5.0.1", 1667 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1668 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1669 | "dev": true, 1670 | "requires": { 1671 | "is-number": "^7.0.0" 1672 | } 1673 | }, 1674 | "type-detect": { 1675 | "version": "4.0.8", 1676 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1677 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1678 | "dev": true 1679 | }, 1680 | "workerpool": { 1681 | "version": "6.2.1", 1682 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 1683 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 1684 | "dev": true 1685 | }, 1686 | "wrap-ansi": { 1687 | "version": "7.0.0", 1688 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1689 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1690 | "dev": true, 1691 | "requires": { 1692 | "ansi-styles": "^4.0.0", 1693 | "string-width": "^4.1.0", 1694 | "strip-ansi": "^6.0.0" 1695 | } 1696 | }, 1697 | "wrappy": { 1698 | "version": "1.0.2", 1699 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1700 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1701 | "dev": true 1702 | }, 1703 | "xdiff": { 1704 | "version": "0.2.11", 1705 | "resolved": "https://registry.npmjs.org/xdiff/-/xdiff-0.2.11.tgz", 1706 | "integrity": "sha1-cj1SPhtvJlojPK/HeGBiLqXS2Mg=", 1707 | "requires": { 1708 | "adiff": "~0.2.4" 1709 | } 1710 | }, 1711 | "y18n": { 1712 | "version": "5.0.8", 1713 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1714 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1715 | "dev": true 1716 | }, 1717 | "yargs": { 1718 | "version": "16.2.0", 1719 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1720 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1721 | "dev": true, 1722 | "requires": { 1723 | "cliui": "^7.0.2", 1724 | "escalade": "^3.1.1", 1725 | "get-caller-file": "^2.0.5", 1726 | "require-directory": "^2.1.1", 1727 | "string-width": "^4.2.0", 1728 | "y18n": "^5.0.5", 1729 | "yargs-parser": "^20.2.2" 1730 | } 1731 | }, 1732 | "yargs-parser": { 1733 | "version": "20.2.4", 1734 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1735 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1736 | "dev": true 1737 | }, 1738 | "yargs-unparser": { 1739 | "version": "2.0.0", 1740 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1741 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1742 | "dev": true, 1743 | "requires": { 1744 | "camelcase": "^6.0.0", 1745 | "decamelize": "^4.0.0", 1746 | "flat": "^5.0.2", 1747 | "is-plain-obj": "^2.1.0" 1748 | } 1749 | }, 1750 | "yocto-queue": { 1751 | "version": "0.1.0", 1752 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1753 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1754 | "dev": true 1755 | } 1756 | } 1757 | } 1758 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-json-merge", 3 | "version": "1.0.0", 4 | "description": "a git merge driver for json files", 5 | "scripts": { 6 | "postversion": "git push && git push --tags", 7 | "preversion": "npm test", 8 | "test": "mocha" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/jonatanpedersen/git-json-merge.git" 13 | }, 14 | "author": "", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/jonatanpedersen/git-json-merge/issues" 18 | }, 19 | "main": "lib/git-json-merge.js", 20 | "homepage": "https://github.com/jonatanpedersen/git-json-merge#readme", 21 | "bin": { 22 | "git-json-merge": "bin/git-json-merge" 23 | }, 24 | "dependencies": { 25 | "detect-indent": "^6.0.0", 26 | "xdiff": "^0.2.11" 27 | }, 28 | "devDependencies": { 29 | "chai": "^4.3.7", 30 | "mocha": "^10.2.0" 31 | }, 32 | "engines": { 33 | "node": ">=6" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/git-json-merge.spec.js: -------------------------------------------------------------------------------- 1 | var chai = require('chai'); 2 | var expect = chai.expect; 3 | var gitJsonMerge = require('../lib/git-json-merge'); 4 | 5 | describe('gitJsonMerge', function () { 6 | var foo = { foo: 'foo' }; 7 | var bar = { bar: 'bar' }; 8 | var fooBar = { foo: 'foo', bar: 'bar' }; 9 | 10 | describe('mergeJson', function () { 11 | describeMergeJsonTest(foo, foo, foo, foo); 12 | describeMergeJsonTest(foo, foo, bar, bar); 13 | describeMergeJsonTest(fooBar, foo, foo, fooBar); 14 | describeMergeJsonTest(fooBar, foo, bar, bar); 15 | describeMergeJsonTest(bar, fooBar, bar, bar); 16 | describeMergeJsonTest(bar, fooBar, fooBar, bar); 17 | }); 18 | 19 | describe('selectIndent', function () { 20 | describeSelectIndentTest(4, 2, 2, 4); 21 | describeSelectIndentTest(4, 4, 2, 2); 22 | describeSelectIndentTest(4, 4, 4, 4); 23 | describeSelectIndentTest(2, 4, 2, 2); 24 | describeSelectIndentTest(2, 2, 4, 4); 25 | describeSelectIndentTest(2, 4, 4, 2); 26 | }); 27 | 28 | describe('stripBom', function () { 29 | describeStripBomTest('[{"id":1,"field":"Foo"}]', '[{"id":1,"field":"Foo"}]'); 30 | describeStripBomTest('\uFEFF[{"id":1,"field":"Foo"}]', '[{"id":1,"field":"Foo"}]'); 31 | describeStripBomTest('[{"id":1,"field":"Foo"}]\uFEFF', '[{"id":1,"field":"Foo"}]\uFEFF'); 32 | describeStripBomTest('[{"id":1,\uFEFF"field":"Foo"}]', '[{"id":1,\uFEFF"field":"Foo"}]'); 33 | describeStripBomTest('\uFEFF[{"id":1,"field":"Foo"}]\uFEFF', '[{"id":1,"field":"Foo"}]\uFEFF'); 34 | }); 35 | }); 36 | 37 | function toString (object) { 38 | return JSON.stringify(object); 39 | } 40 | 41 | function clone (object) { 42 | return JSON.parse(JSON.stringify(object)); 43 | } 44 | 45 | function repeatCharacter (character, count) { 46 | return new Array(count + 1).join(character); 47 | } 48 | 49 | function describeMergeJsonTest (ours, base, theirs, expected) { 50 | ours = toString(clone(ours)); 51 | base = toString(clone(base)); 52 | theirs = toString(clone(theirs)); 53 | expected = toString(clone(expected)); 54 | 55 | describe('given arguments of ' + toString(ours) + ' as ours, ' + toString(base) + ' as base and ' + toString(theirs) + ' as theirs', function () { 56 | var actual = gitJsonMerge.mergeJson(ours, base, theirs); 57 | 58 | it('should return ' + toString(expected), function () { 59 | expect(actual).to.deep.equal(expected); 60 | }) 61 | }); 62 | } 63 | 64 | function describeSelectIndentTest (ours, base, theirs, expected) { 65 | var character = ' '; 66 | ours = repeatCharacter(character, ours); 67 | base = repeatCharacter(character, base); 68 | theirs = repeatCharacter(character, theirs); 69 | expected = repeatCharacter(character, expected); 70 | 71 | describe('given arguments of ' + ours.length + ' as ours, ' + base.length + ' as base and ' + theirs.length + ' as theirs', function () { 72 | var actual = gitJsonMerge.selectIndent(ours, base, theirs); 73 | it('should return ' + expected.length, function () { 74 | expect(actual).to.equal(expected); 75 | }) 76 | }); 77 | } 78 | 79 | function describeStripBomTest (str, expected) { 80 | describe('given arguments of ' + str.replace('\uFEFF', '') + ' as str', function () { 81 | var actual = gitJsonMerge.stripBom(str); 82 | 83 | it('should return ' + expected.replace('\uFEFF', ''), function () { 84 | expect(actual).to.equal(expected); 85 | }) 86 | }); 87 | } 88 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | test/git-json-merge.spec.js 2 | --------------------------------------------------------------------------------