├── .gitignore ├── .npmignore ├── LICENSE.md ├── README.md ├── index.js ├── lib └── filter-package-deps.js ├── package-lock.json ├── package.json └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | *.log 4 | .DS_Store 5 | bundle.js 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | bower_components 2 | node_modules 3 | *.log 4 | .DS_Store 5 | bundle.js 6 | test 7 | test.js 8 | demo/ 9 | .npmignore 10 | LICENSE.md -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2015 Matt DesLauriers 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 17 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 20 | OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # install-if-needed 2 | 3 | [![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges) 4 | 5 | Installs the given list of modules and saves them into their respective fields in your nearest `package.json`. Dependencies that already exist in your `package.json` will be skipped. 6 | 7 | ```js 8 | var install = require('install-if-needed') 9 | 10 | install({ 11 | dependencies: ['through2'], 12 | devDependencies: ['tape@2.x', 'standard'] 13 | }, function(err) { 14 | if (err) 15 | console.error("There was an error installing.") 16 | }) 17 | ``` 18 | 19 | You can pass `{ stdio: 'inherit' }` to preserve logging and colors, acting like the usual `npm install` command. 20 | 21 | ## Usage 22 | 23 | [![NPM](https://nodei.co/npm/install-if-needed.png)](https://www.npmjs.com/package/install-if-needed) 24 | 25 | #### `install(opt[, cb])` 26 | 27 | Looks at `package` JSON and installs any of the specified dependencies that are not listed in their respective field. 28 | 29 | - `cwd` the directory for the [closest package.json](https://www.npmjs.com/package/closest-package), (default `process.cwd()`) 30 | - `package` optional package data, if not defined will search for closest `package.json` 31 | - `save` whether to `--save`, `--save-dev` and `--save-optional` (default true) 32 | - `dependencies` dependencies to install 33 | - `devDependencies` dev dependencies to install 34 | - `optionalDependencies` optional dependencies to install 35 | - `command` the command to spawn when installing, defaults to `'npm'` 36 | 37 | Other options are passed to [spawn-npm-install](https://www.npmjs.com/package/spawn-npm-install). 38 | 39 | On complete, `cb` is called with `(err)` status. All dependencies also accept a single string instead of an array. 40 | 41 | Alternatively, `opt` can be a string or array, which is the same as listing it in `dependencies`. 42 | 43 | ```js 44 | //e.g. 45 | // npm install tape --save 46 | install('tape', done) 47 | ``` 48 | 49 | ## Motivation 50 | 51 | This helps build CLI tooling that auto-installs modules as needed. For example, a tool which stubs out an empty test file for [tape](https://www.npmjs.com/package/tape): 52 | 53 | ```js 54 | #!/usr/bin/env node 55 | var install = require('install-if-needed') 56 | var fs = require('fs') 57 | var template = fs.readFileSync(__dirname + '/template.js') 58 | 59 | install({ 60 | devDependencies: 'tape' 61 | }, function(err) { 62 | if (err) throw err 63 | fs.writeFile(process.argv[2], template) 64 | }) 65 | ``` 66 | 67 | And the CLI might be as simple as: 68 | 69 | ```sh 70 | quick-tape tests/simple.js 71 | ``` 72 | 73 | ## License 74 | 75 | MIT, see [LICENSE.md](http://github.com/mattdesl/install-if-needed/blob/master/LICENSE.md) for details. 76 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var install = require('spawn-npm-install') 2 | var each = require('run-series') 3 | var assign = require('object-assign') 4 | var filter = require('./lib/filter-package-deps') 5 | var readPackage = require('read-closest-package') 6 | 7 | var saveArg = { 8 | dependencies: 'save', 9 | devDependencies: 'saveDev', 10 | optionalDependencies: 'saveOptional' 11 | } 12 | 13 | module.exports = function (opt, cb) { 14 | if (typeof opt === 'string' || Array.isArray(opt)) 15 | opt = { dependencies: opt } 16 | opt = opt || {} 17 | 18 | if (opt.package) { 19 | process.nextTick(function () { 20 | run(null, opt.package) 21 | }) 22 | } else { 23 | readPackage({ cwd: opt.cwd || process.cwd() }, run) 24 | } 25 | 26 | function run (err, packageData) { 27 | if (err) 28 | return cb(err) 29 | 30 | // if we should --save / --save-dev / --save-optional 31 | var useSave = opt.save !== false 32 | 33 | // get needed dependencies 34 | var needed = filter(packageData, opt) 35 | 36 | // get install tasks 37 | var tasks = Object.keys(needed).map(function (key) { 38 | var installOpts = assign({}, opt) 39 | delete installOpts.save 40 | 41 | var save = saveArg[key] 42 | if (useSave && save) 43 | installOpts[save] = true 44 | 45 | return function (next) { 46 | var deps = needed[key] 47 | install(deps, installOpts, next) 48 | } 49 | }) 50 | 51 | // run each task in series 52 | each(tasks, cb) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /lib/filter-package-deps.js: -------------------------------------------------------------------------------- 1 | var types = [ 2 | 'dependencies', 3 | 'devDependencies', 4 | 'optionalDependencies' 5 | ] 6 | 7 | // Given a package.json and list of deps, 8 | // will filter down to those that haven't yet 9 | // been installed 10 | module.exports = function (package, opt) { 11 | opt = opt || {} 12 | 13 | return types.reduce(function (dict, type) { 14 | var actualDeps = package[type] || {} 15 | var actualNames = Object.keys(actualDeps) 16 | var desired = [].concat(opt[type]).filter(Boolean) 17 | 18 | // only installs packages that aren't in package.json 19 | var needed = desired.filter(function (pkgName) { 20 | // split scoped package names 21 | var parts = pkgName.split(/(.+)@/).filter(Boolean) 22 | var name = parts[0] 23 | var exists = actualNames.indexOf(name) >= 0 24 | return !exists 25 | }) 26 | 27 | if (needed.length) 28 | dict[type] = needed 29 | return dict 30 | }, {}) 31 | } 32 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "install-if-needed", 3 | "version": "1.0.4", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "install-if-needed", 9 | "version": "1.0.4", 10 | "license": "MIT", 11 | "dependencies": { 12 | "closest-package": "^1.0.0", 13 | "object-assign": "^2.0.0", 14 | "read-closest-package": "^1.0.0", 15 | "read-json": "^1.0.3", 16 | "run-series": "^1.1.0", 17 | "spawn-npm-install": "^1.3.0" 18 | }, 19 | "devDependencies": { 20 | "tape": "^4.0.0" 21 | } 22 | }, 23 | "node_modules/@ljharb/resumer": { 24 | "version": "0.0.1", 25 | "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.0.1.tgz", 26 | "integrity": "sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==", 27 | "dev": true, 28 | "dependencies": { 29 | "@ljharb/through": "^2.3.9" 30 | }, 31 | "engines": { 32 | "node": ">= 0.4" 33 | } 34 | }, 35 | "node_modules/@ljharb/through": { 36 | "version": "2.3.13", 37 | "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", 38 | "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", 39 | "dev": true, 40 | "dependencies": { 41 | "call-bind": "^1.0.7" 42 | }, 43 | "engines": { 44 | "node": ">= 0.4" 45 | } 46 | }, 47 | "node_modules/array-buffer-byte-length": { 48 | "version": "1.0.1", 49 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", 50 | "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", 51 | "dev": true, 52 | "dependencies": { 53 | "call-bind": "^1.0.5", 54 | "is-array-buffer": "^3.0.4" 55 | }, 56 | "engines": { 57 | "node": ">= 0.4" 58 | }, 59 | "funding": { 60 | "url": "https://github.com/sponsors/ljharb" 61 | } 62 | }, 63 | "node_modules/arraybuffer.prototype.slice": { 64 | "version": "1.0.3", 65 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", 66 | "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", 67 | "dev": true, 68 | "dependencies": { 69 | "array-buffer-byte-length": "^1.0.1", 70 | "call-bind": "^1.0.5", 71 | "define-properties": "^1.2.1", 72 | "es-abstract": "^1.22.3", 73 | "es-errors": "^1.2.1", 74 | "get-intrinsic": "^1.2.3", 75 | "is-array-buffer": "^3.0.4", 76 | "is-shared-array-buffer": "^1.0.2" 77 | }, 78 | "engines": { 79 | "node": ">= 0.4" 80 | }, 81 | "funding": { 82 | "url": "https://github.com/sponsors/ljharb" 83 | } 84 | }, 85 | "node_modules/available-typed-arrays": { 86 | "version": "1.0.7", 87 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 88 | "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 89 | "dev": true, 90 | "dependencies": { 91 | "possible-typed-array-names": "^1.0.0" 92 | }, 93 | "engines": { 94 | "node": ">= 0.4" 95 | }, 96 | "funding": { 97 | "url": "https://github.com/sponsors/ljharb" 98 | } 99 | }, 100 | "node_modules/balanced-match": { 101 | "version": "1.0.2", 102 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 103 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 104 | "dev": true 105 | }, 106 | "node_modules/brace-expansion": { 107 | "version": "1.1.11", 108 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 109 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 110 | "dev": true, 111 | "dependencies": { 112 | "balanced-match": "^1.0.0", 113 | "concat-map": "0.0.1" 114 | } 115 | }, 116 | "node_modules/call-bind": { 117 | "version": "1.0.7", 118 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 119 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 120 | "dev": true, 121 | "dependencies": { 122 | "es-define-property": "^1.0.0", 123 | "es-errors": "^1.3.0", 124 | "function-bind": "^1.1.2", 125 | "get-intrinsic": "^1.2.4", 126 | "set-function-length": "^1.2.1" 127 | }, 128 | "engines": { 129 | "node": ">= 0.4" 130 | }, 131 | "funding": { 132 | "url": "https://github.com/sponsors/ljharb" 133 | } 134 | }, 135 | "node_modules/closest-package": { 136 | "version": "1.0.0", 137 | "resolved": "https://registry.npmjs.org/closest-package/-/closest-package-1.0.0.tgz", 138 | "integrity": "sha512-hIZe/lw4KwrQOpxFV9KHuY0Hqq9SAfoQr1ZzQnDq5SrA7RWKT2FnKaF9HRmMXjW2hujpHBeASFVSWa5xmwR1RA==" 139 | }, 140 | "node_modules/concat-map": { 141 | "version": "0.0.1", 142 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 143 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 144 | "dev": true 145 | }, 146 | "node_modules/dargs": { 147 | "version": "4.1.0", 148 | "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", 149 | "integrity": "sha512-jyweV/k0rbv2WK4r9KLayuBrSh2Py0tNmV7LBoSMH4hMQyrG8OPyIOWB2VEx4DJKXWmK4lopYMVvORlDt2S8Aw==", 150 | "dependencies": { 151 | "number-is-nan": "^1.0.0" 152 | }, 153 | "engines": { 154 | "node": ">=0.10.0" 155 | } 156 | }, 157 | "node_modules/data-view-buffer": { 158 | "version": "1.0.1", 159 | "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", 160 | "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", 161 | "dev": true, 162 | "dependencies": { 163 | "call-bind": "^1.0.6", 164 | "es-errors": "^1.3.0", 165 | "is-data-view": "^1.0.1" 166 | }, 167 | "engines": { 168 | "node": ">= 0.4" 169 | }, 170 | "funding": { 171 | "url": "https://github.com/sponsors/ljharb" 172 | } 173 | }, 174 | "node_modules/data-view-byte-length": { 175 | "version": "1.0.1", 176 | "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", 177 | "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", 178 | "dev": true, 179 | "dependencies": { 180 | "call-bind": "^1.0.7", 181 | "es-errors": "^1.3.0", 182 | "is-data-view": "^1.0.1" 183 | }, 184 | "engines": { 185 | "node": ">= 0.4" 186 | }, 187 | "funding": { 188 | "url": "https://github.com/sponsors/ljharb" 189 | } 190 | }, 191 | "node_modules/data-view-byte-offset": { 192 | "version": "1.0.0", 193 | "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", 194 | "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", 195 | "dev": true, 196 | "dependencies": { 197 | "call-bind": "^1.0.6", 198 | "es-errors": "^1.3.0", 199 | "is-data-view": "^1.0.1" 200 | }, 201 | "engines": { 202 | "node": ">= 0.4" 203 | }, 204 | "funding": { 205 | "url": "https://github.com/sponsors/ljharb" 206 | } 207 | }, 208 | "node_modules/deep-equal": { 209 | "version": "1.1.2", 210 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", 211 | "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", 212 | "dev": true, 213 | "dependencies": { 214 | "is-arguments": "^1.1.1", 215 | "is-date-object": "^1.0.5", 216 | "is-regex": "^1.1.4", 217 | "object-is": "^1.1.5", 218 | "object-keys": "^1.1.1", 219 | "regexp.prototype.flags": "^1.5.1" 220 | }, 221 | "engines": { 222 | "node": ">= 0.4" 223 | }, 224 | "funding": { 225 | "url": "https://github.com/sponsors/ljharb" 226 | } 227 | }, 228 | "node_modules/define-data-property": { 229 | "version": "1.1.4", 230 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 231 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 232 | "dev": true, 233 | "dependencies": { 234 | "es-define-property": "^1.0.0", 235 | "es-errors": "^1.3.0", 236 | "gopd": "^1.0.1" 237 | }, 238 | "engines": { 239 | "node": ">= 0.4" 240 | }, 241 | "funding": { 242 | "url": "https://github.com/sponsors/ljharb" 243 | } 244 | }, 245 | "node_modules/define-properties": { 246 | "version": "1.2.1", 247 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 248 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 249 | "dev": true, 250 | "dependencies": { 251 | "define-data-property": "^1.0.1", 252 | "has-property-descriptors": "^1.0.0", 253 | "object-keys": "^1.1.1" 254 | }, 255 | "engines": { 256 | "node": ">= 0.4" 257 | }, 258 | "funding": { 259 | "url": "https://github.com/sponsors/ljharb" 260 | } 261 | }, 262 | "node_modules/defined": { 263 | "version": "1.0.1", 264 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 265 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 266 | "dev": true, 267 | "funding": { 268 | "url": "https://github.com/sponsors/ljharb" 269 | } 270 | }, 271 | "node_modules/dotignore": { 272 | "version": "0.1.2", 273 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 274 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 275 | "dev": true, 276 | "dependencies": { 277 | "minimatch": "^3.0.4" 278 | }, 279 | "bin": { 280 | "ignored": "bin/ignored" 281 | } 282 | }, 283 | "node_modules/error-ex": { 284 | "version": "1.3.2", 285 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 286 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 287 | "dependencies": { 288 | "is-arrayish": "^0.2.1" 289 | } 290 | }, 291 | "node_modules/es-abstract": { 292 | "version": "1.23.3", 293 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", 294 | "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", 295 | "dev": true, 296 | "dependencies": { 297 | "array-buffer-byte-length": "^1.0.1", 298 | "arraybuffer.prototype.slice": "^1.0.3", 299 | "available-typed-arrays": "^1.0.7", 300 | "call-bind": "^1.0.7", 301 | "data-view-buffer": "^1.0.1", 302 | "data-view-byte-length": "^1.0.1", 303 | "data-view-byte-offset": "^1.0.0", 304 | "es-define-property": "^1.0.0", 305 | "es-errors": "^1.3.0", 306 | "es-object-atoms": "^1.0.0", 307 | "es-set-tostringtag": "^2.0.3", 308 | "es-to-primitive": "^1.2.1", 309 | "function.prototype.name": "^1.1.6", 310 | "get-intrinsic": "^1.2.4", 311 | "get-symbol-description": "^1.0.2", 312 | "globalthis": "^1.0.3", 313 | "gopd": "^1.0.1", 314 | "has-property-descriptors": "^1.0.2", 315 | "has-proto": "^1.0.3", 316 | "has-symbols": "^1.0.3", 317 | "hasown": "^2.0.2", 318 | "internal-slot": "^1.0.7", 319 | "is-array-buffer": "^3.0.4", 320 | "is-callable": "^1.2.7", 321 | "is-data-view": "^1.0.1", 322 | "is-negative-zero": "^2.0.3", 323 | "is-regex": "^1.1.4", 324 | "is-shared-array-buffer": "^1.0.3", 325 | "is-string": "^1.0.7", 326 | "is-typed-array": "^1.1.13", 327 | "is-weakref": "^1.0.2", 328 | "object-inspect": "^1.13.1", 329 | "object-keys": "^1.1.1", 330 | "object.assign": "^4.1.5", 331 | "regexp.prototype.flags": "^1.5.2", 332 | "safe-array-concat": "^1.1.2", 333 | "safe-regex-test": "^1.0.3", 334 | "string.prototype.trim": "^1.2.9", 335 | "string.prototype.trimend": "^1.0.8", 336 | "string.prototype.trimstart": "^1.0.8", 337 | "typed-array-buffer": "^1.0.2", 338 | "typed-array-byte-length": "^1.0.1", 339 | "typed-array-byte-offset": "^1.0.2", 340 | "typed-array-length": "^1.0.6", 341 | "unbox-primitive": "^1.0.2", 342 | "which-typed-array": "^1.1.15" 343 | }, 344 | "engines": { 345 | "node": ">= 0.4" 346 | }, 347 | "funding": { 348 | "url": "https://github.com/sponsors/ljharb" 349 | } 350 | }, 351 | "node_modules/es-abstract/node_modules/object-inspect": { 352 | "version": "1.13.2", 353 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 354 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 355 | "dev": true, 356 | "engines": { 357 | "node": ">= 0.4" 358 | }, 359 | "funding": { 360 | "url": "https://github.com/sponsors/ljharb" 361 | } 362 | }, 363 | "node_modules/es-define-property": { 364 | "version": "1.0.0", 365 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 366 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 367 | "dev": true, 368 | "dependencies": { 369 | "get-intrinsic": "^1.2.4" 370 | }, 371 | "engines": { 372 | "node": ">= 0.4" 373 | } 374 | }, 375 | "node_modules/es-errors": { 376 | "version": "1.3.0", 377 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 378 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 379 | "dev": true, 380 | "engines": { 381 | "node": ">= 0.4" 382 | } 383 | }, 384 | "node_modules/es-object-atoms": { 385 | "version": "1.0.0", 386 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", 387 | "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", 388 | "dev": true, 389 | "dependencies": { 390 | "es-errors": "^1.3.0" 391 | }, 392 | "engines": { 393 | "node": ">= 0.4" 394 | } 395 | }, 396 | "node_modules/es-set-tostringtag": { 397 | "version": "2.0.3", 398 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", 399 | "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", 400 | "dev": true, 401 | "dependencies": { 402 | "get-intrinsic": "^1.2.4", 403 | "has-tostringtag": "^1.0.2", 404 | "hasown": "^2.0.1" 405 | }, 406 | "engines": { 407 | "node": ">= 0.4" 408 | } 409 | }, 410 | "node_modules/es-to-primitive": { 411 | "version": "1.2.1", 412 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 413 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 414 | "dev": true, 415 | "dependencies": { 416 | "is-callable": "^1.1.4", 417 | "is-date-object": "^1.0.1", 418 | "is-symbol": "^1.0.2" 419 | }, 420 | "engines": { 421 | "node": ">= 0.4" 422 | }, 423 | "funding": { 424 | "url": "https://github.com/sponsors/ljharb" 425 | } 426 | }, 427 | "node_modules/for-each": { 428 | "version": "0.3.3", 429 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 430 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 431 | "dev": true, 432 | "dependencies": { 433 | "is-callable": "^1.1.3" 434 | } 435 | }, 436 | "node_modules/fs.realpath": { 437 | "version": "1.0.0", 438 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 439 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 440 | "dev": true 441 | }, 442 | "node_modules/function-bind": { 443 | "version": "1.1.2", 444 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 445 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 446 | "dev": true, 447 | "funding": { 448 | "url": "https://github.com/sponsors/ljharb" 449 | } 450 | }, 451 | "node_modules/function.prototype.name": { 452 | "version": "1.1.6", 453 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", 454 | "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", 455 | "dev": true, 456 | "dependencies": { 457 | "call-bind": "^1.0.2", 458 | "define-properties": "^1.2.0", 459 | "es-abstract": "^1.22.1", 460 | "functions-have-names": "^1.2.3" 461 | }, 462 | "engines": { 463 | "node": ">= 0.4" 464 | }, 465 | "funding": { 466 | "url": "https://github.com/sponsors/ljharb" 467 | } 468 | }, 469 | "node_modules/functions-have-names": { 470 | "version": "1.2.3", 471 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 472 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 473 | "dev": true, 474 | "funding": { 475 | "url": "https://github.com/sponsors/ljharb" 476 | } 477 | }, 478 | "node_modules/get-intrinsic": { 479 | "version": "1.2.4", 480 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 481 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 482 | "dev": true, 483 | "dependencies": { 484 | "es-errors": "^1.3.0", 485 | "function-bind": "^1.1.2", 486 | "has-proto": "^1.0.1", 487 | "has-symbols": "^1.0.3", 488 | "hasown": "^2.0.0" 489 | }, 490 | "engines": { 491 | "node": ">= 0.4" 492 | }, 493 | "funding": { 494 | "url": "https://github.com/sponsors/ljharb" 495 | } 496 | }, 497 | "node_modules/get-symbol-description": { 498 | "version": "1.0.2", 499 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", 500 | "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", 501 | "dev": true, 502 | "dependencies": { 503 | "call-bind": "^1.0.5", 504 | "es-errors": "^1.3.0", 505 | "get-intrinsic": "^1.2.4" 506 | }, 507 | "engines": { 508 | "node": ">= 0.4" 509 | }, 510 | "funding": { 511 | "url": "https://github.com/sponsors/ljharb" 512 | } 513 | }, 514 | "node_modules/glob": { 515 | "version": "7.2.3", 516 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 517 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 518 | "deprecated": "Glob versions prior to v9 are no longer supported", 519 | "dev": true, 520 | "dependencies": { 521 | "fs.realpath": "^1.0.0", 522 | "inflight": "^1.0.4", 523 | "inherits": "2", 524 | "minimatch": "^3.1.1", 525 | "once": "^1.3.0", 526 | "path-is-absolute": "^1.0.0" 527 | }, 528 | "engines": { 529 | "node": "*" 530 | }, 531 | "funding": { 532 | "url": "https://github.com/sponsors/isaacs" 533 | } 534 | }, 535 | "node_modules/globalthis": { 536 | "version": "1.0.4", 537 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 538 | "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 539 | "dev": true, 540 | "dependencies": { 541 | "define-properties": "^1.2.1", 542 | "gopd": "^1.0.1" 543 | }, 544 | "engines": { 545 | "node": ">= 0.4" 546 | }, 547 | "funding": { 548 | "url": "https://github.com/sponsors/ljharb" 549 | } 550 | }, 551 | "node_modules/gopd": { 552 | "version": "1.0.1", 553 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 554 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 555 | "dev": true, 556 | "dependencies": { 557 | "get-intrinsic": "^1.1.3" 558 | }, 559 | "funding": { 560 | "url": "https://github.com/sponsors/ljharb" 561 | } 562 | }, 563 | "node_modules/graceful-fs": { 564 | "version": "4.2.11", 565 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 566 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 567 | }, 568 | "node_modules/has": { 569 | "version": "1.0.4", 570 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", 571 | "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">= 0.4.0" 575 | } 576 | }, 577 | "node_modules/has-bigints": { 578 | "version": "1.0.2", 579 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 580 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 581 | "dev": true, 582 | "funding": { 583 | "url": "https://github.com/sponsors/ljharb" 584 | } 585 | }, 586 | "node_modules/has-property-descriptors": { 587 | "version": "1.0.2", 588 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 589 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 590 | "dev": true, 591 | "dependencies": { 592 | "es-define-property": "^1.0.0" 593 | }, 594 | "funding": { 595 | "url": "https://github.com/sponsors/ljharb" 596 | } 597 | }, 598 | "node_modules/has-proto": { 599 | "version": "1.0.3", 600 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 601 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 602 | "dev": true, 603 | "engines": { 604 | "node": ">= 0.4" 605 | }, 606 | "funding": { 607 | "url": "https://github.com/sponsors/ljharb" 608 | } 609 | }, 610 | "node_modules/has-symbols": { 611 | "version": "1.0.3", 612 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 613 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 614 | "dev": true, 615 | "engines": { 616 | "node": ">= 0.4" 617 | }, 618 | "funding": { 619 | "url": "https://github.com/sponsors/ljharb" 620 | } 621 | }, 622 | "node_modules/has-tostringtag": { 623 | "version": "1.0.2", 624 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 625 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 626 | "dev": true, 627 | "dependencies": { 628 | "has-symbols": "^1.0.3" 629 | }, 630 | "engines": { 631 | "node": ">= 0.4" 632 | }, 633 | "funding": { 634 | "url": "https://github.com/sponsors/ljharb" 635 | } 636 | }, 637 | "node_modules/hasown": { 638 | "version": "2.0.2", 639 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 640 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 641 | "dev": true, 642 | "dependencies": { 643 | "function-bind": "^1.1.2" 644 | }, 645 | "engines": { 646 | "node": ">= 0.4" 647 | } 648 | }, 649 | "node_modules/inflight": { 650 | "version": "1.0.6", 651 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 652 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 653 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 654 | "dev": true, 655 | "dependencies": { 656 | "once": "^1.3.0", 657 | "wrappy": "1" 658 | } 659 | }, 660 | "node_modules/inherits": { 661 | "version": "2.0.4", 662 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 663 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 664 | "dev": true 665 | }, 666 | "node_modules/internal-slot": { 667 | "version": "1.0.7", 668 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", 669 | "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", 670 | "dev": true, 671 | "dependencies": { 672 | "es-errors": "^1.3.0", 673 | "hasown": "^2.0.0", 674 | "side-channel": "^1.0.4" 675 | }, 676 | "engines": { 677 | "node": ">= 0.4" 678 | } 679 | }, 680 | "node_modules/is-arguments": { 681 | "version": "1.1.1", 682 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 683 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 684 | "dev": true, 685 | "dependencies": { 686 | "call-bind": "^1.0.2", 687 | "has-tostringtag": "^1.0.0" 688 | }, 689 | "engines": { 690 | "node": ">= 0.4" 691 | }, 692 | "funding": { 693 | "url": "https://github.com/sponsors/ljharb" 694 | } 695 | }, 696 | "node_modules/is-array-buffer": { 697 | "version": "3.0.4", 698 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", 699 | "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", 700 | "dev": true, 701 | "dependencies": { 702 | "call-bind": "^1.0.2", 703 | "get-intrinsic": "^1.2.1" 704 | }, 705 | "engines": { 706 | "node": ">= 0.4" 707 | }, 708 | "funding": { 709 | "url": "https://github.com/sponsors/ljharb" 710 | } 711 | }, 712 | "node_modules/is-arrayish": { 713 | "version": "0.2.1", 714 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 715 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" 716 | }, 717 | "node_modules/is-bigint": { 718 | "version": "1.0.4", 719 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 720 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 721 | "dev": true, 722 | "dependencies": { 723 | "has-bigints": "^1.0.1" 724 | }, 725 | "funding": { 726 | "url": "https://github.com/sponsors/ljharb" 727 | } 728 | }, 729 | "node_modules/is-boolean-object": { 730 | "version": "1.1.2", 731 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 732 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 733 | "dev": true, 734 | "dependencies": { 735 | "call-bind": "^1.0.2", 736 | "has-tostringtag": "^1.0.0" 737 | }, 738 | "engines": { 739 | "node": ">= 0.4" 740 | }, 741 | "funding": { 742 | "url": "https://github.com/sponsors/ljharb" 743 | } 744 | }, 745 | "node_modules/is-callable": { 746 | "version": "1.2.7", 747 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 748 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 749 | "dev": true, 750 | "engines": { 751 | "node": ">= 0.4" 752 | }, 753 | "funding": { 754 | "url": "https://github.com/sponsors/ljharb" 755 | } 756 | }, 757 | "node_modules/is-core-module": { 758 | "version": "2.15.1", 759 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 760 | "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 761 | "dev": true, 762 | "dependencies": { 763 | "hasown": "^2.0.2" 764 | }, 765 | "engines": { 766 | "node": ">= 0.4" 767 | }, 768 | "funding": { 769 | "url": "https://github.com/sponsors/ljharb" 770 | } 771 | }, 772 | "node_modules/is-data-view": { 773 | "version": "1.0.1", 774 | "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", 775 | "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", 776 | "dev": true, 777 | "dependencies": { 778 | "is-typed-array": "^1.1.13" 779 | }, 780 | "engines": { 781 | "node": ">= 0.4" 782 | }, 783 | "funding": { 784 | "url": "https://github.com/sponsors/ljharb" 785 | } 786 | }, 787 | "node_modules/is-date-object": { 788 | "version": "1.0.5", 789 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 790 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 791 | "dev": true, 792 | "dependencies": { 793 | "has-tostringtag": "^1.0.0" 794 | }, 795 | "engines": { 796 | "node": ">= 0.4" 797 | }, 798 | "funding": { 799 | "url": "https://github.com/sponsors/ljharb" 800 | } 801 | }, 802 | "node_modules/is-negative-zero": { 803 | "version": "2.0.3", 804 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 805 | "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 806 | "dev": true, 807 | "engines": { 808 | "node": ">= 0.4" 809 | }, 810 | "funding": { 811 | "url": "https://github.com/sponsors/ljharb" 812 | } 813 | }, 814 | "node_modules/is-number-object": { 815 | "version": "1.0.7", 816 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 817 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 818 | "dev": true, 819 | "dependencies": { 820 | "has-tostringtag": "^1.0.0" 821 | }, 822 | "engines": { 823 | "node": ">= 0.4" 824 | }, 825 | "funding": { 826 | "url": "https://github.com/sponsors/ljharb" 827 | } 828 | }, 829 | "node_modules/is-regex": { 830 | "version": "1.1.4", 831 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 832 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 833 | "dev": true, 834 | "dependencies": { 835 | "call-bind": "^1.0.2", 836 | "has-tostringtag": "^1.0.0" 837 | }, 838 | "engines": { 839 | "node": ">= 0.4" 840 | }, 841 | "funding": { 842 | "url": "https://github.com/sponsors/ljharb" 843 | } 844 | }, 845 | "node_modules/is-shared-array-buffer": { 846 | "version": "1.0.3", 847 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", 848 | "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", 849 | "dev": true, 850 | "dependencies": { 851 | "call-bind": "^1.0.7" 852 | }, 853 | "engines": { 854 | "node": ">= 0.4" 855 | }, 856 | "funding": { 857 | "url": "https://github.com/sponsors/ljharb" 858 | } 859 | }, 860 | "node_modules/is-string": { 861 | "version": "1.0.7", 862 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 863 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 864 | "dev": true, 865 | "dependencies": { 866 | "has-tostringtag": "^1.0.0" 867 | }, 868 | "engines": { 869 | "node": ">= 0.4" 870 | }, 871 | "funding": { 872 | "url": "https://github.com/sponsors/ljharb" 873 | } 874 | }, 875 | "node_modules/is-symbol": { 876 | "version": "1.0.4", 877 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 878 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 879 | "dev": true, 880 | "dependencies": { 881 | "has-symbols": "^1.0.2" 882 | }, 883 | "engines": { 884 | "node": ">= 0.4" 885 | }, 886 | "funding": { 887 | "url": "https://github.com/sponsors/ljharb" 888 | } 889 | }, 890 | "node_modules/is-typed-array": { 891 | "version": "1.1.13", 892 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", 893 | "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", 894 | "dev": true, 895 | "dependencies": { 896 | "which-typed-array": "^1.1.14" 897 | }, 898 | "engines": { 899 | "node": ">= 0.4" 900 | }, 901 | "funding": { 902 | "url": "https://github.com/sponsors/ljharb" 903 | } 904 | }, 905 | "node_modules/is-utf8": { 906 | "version": "0.2.1", 907 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 908 | "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" 909 | }, 910 | "node_modules/is-weakref": { 911 | "version": "1.0.2", 912 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 913 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 914 | "dev": true, 915 | "dependencies": { 916 | "call-bind": "^1.0.2" 917 | }, 918 | "funding": { 919 | "url": "https://github.com/sponsors/ljharb" 920 | } 921 | }, 922 | "node_modules/isarray": { 923 | "version": "2.0.5", 924 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 925 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 926 | "dev": true 927 | }, 928 | "node_modules/load-json-file": { 929 | "version": "1.1.0", 930 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 931 | "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", 932 | "dependencies": { 933 | "graceful-fs": "^4.1.2", 934 | "parse-json": "^2.2.0", 935 | "pify": "^2.0.0", 936 | "pinkie-promise": "^2.0.0", 937 | "strip-bom": "^2.0.0" 938 | }, 939 | "engines": { 940 | "node": ">=0.10.0" 941 | } 942 | }, 943 | "node_modules/minimatch": { 944 | "version": "3.1.2", 945 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 946 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 947 | "dev": true, 948 | "dependencies": { 949 | "brace-expansion": "^1.1.7" 950 | }, 951 | "engines": { 952 | "node": "*" 953 | } 954 | }, 955 | "node_modules/minimist": { 956 | "version": "1.2.8", 957 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 958 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 959 | "dev": true, 960 | "funding": { 961 | "url": "https://github.com/sponsors/ljharb" 962 | } 963 | }, 964 | "node_modules/mock-property": { 965 | "version": "1.0.3", 966 | "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", 967 | "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==", 968 | "dev": true, 969 | "dependencies": { 970 | "define-data-property": "^1.1.1", 971 | "functions-have-names": "^1.2.3", 972 | "gopd": "^1.0.1", 973 | "has-property-descriptors": "^1.0.0", 974 | "hasown": "^2.0.0", 975 | "isarray": "^2.0.5" 976 | }, 977 | "engines": { 978 | "node": ">= 0.4" 979 | }, 980 | "funding": { 981 | "url": "https://github.com/sponsors/ljharb" 982 | } 983 | }, 984 | "node_modules/number-is-nan": { 985 | "version": "1.0.1", 986 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 987 | "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", 988 | "engines": { 989 | "node": ">=0.10.0" 990 | } 991 | }, 992 | "node_modules/object-assign": { 993 | "version": "2.1.1", 994 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", 995 | "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", 996 | "engines": { 997 | "node": ">=0.10.0" 998 | } 999 | }, 1000 | "node_modules/object-inspect": { 1001 | "version": "1.12.3", 1002 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1003 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1004 | "dev": true, 1005 | "funding": { 1006 | "url": "https://github.com/sponsors/ljharb" 1007 | } 1008 | }, 1009 | "node_modules/object-is": { 1010 | "version": "1.1.6", 1011 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", 1012 | "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", 1013 | "dev": true, 1014 | "dependencies": { 1015 | "call-bind": "^1.0.7", 1016 | "define-properties": "^1.2.1" 1017 | }, 1018 | "engines": { 1019 | "node": ">= 0.4" 1020 | }, 1021 | "funding": { 1022 | "url": "https://github.com/sponsors/ljharb" 1023 | } 1024 | }, 1025 | "node_modules/object-keys": { 1026 | "version": "1.1.1", 1027 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1028 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1029 | "dev": true, 1030 | "engines": { 1031 | "node": ">= 0.4" 1032 | } 1033 | }, 1034 | "node_modules/object.assign": { 1035 | "version": "4.1.5", 1036 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", 1037 | "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", 1038 | "dev": true, 1039 | "dependencies": { 1040 | "call-bind": "^1.0.5", 1041 | "define-properties": "^1.2.1", 1042 | "has-symbols": "^1.0.3", 1043 | "object-keys": "^1.1.1" 1044 | }, 1045 | "engines": { 1046 | "node": ">= 0.4" 1047 | }, 1048 | "funding": { 1049 | "url": "https://github.com/sponsors/ljharb" 1050 | } 1051 | }, 1052 | "node_modules/once": { 1053 | "version": "1.4.0", 1054 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1055 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1056 | "dev": true, 1057 | "dependencies": { 1058 | "wrappy": "1" 1059 | } 1060 | }, 1061 | "node_modules/parse-json": { 1062 | "version": "2.2.0", 1063 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1064 | "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", 1065 | "dependencies": { 1066 | "error-ex": "^1.2.0" 1067 | }, 1068 | "engines": { 1069 | "node": ">=0.10.0" 1070 | } 1071 | }, 1072 | "node_modules/path-is-absolute": { 1073 | "version": "1.0.1", 1074 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1075 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1076 | "dev": true, 1077 | "engines": { 1078 | "node": ">=0.10.0" 1079 | } 1080 | }, 1081 | "node_modules/path-parse": { 1082 | "version": "1.0.7", 1083 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1084 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1085 | "dev": true 1086 | }, 1087 | "node_modules/pify": { 1088 | "version": "2.3.0", 1089 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1090 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1091 | "engines": { 1092 | "node": ">=0.10.0" 1093 | } 1094 | }, 1095 | "node_modules/pinkie": { 1096 | "version": "2.0.4", 1097 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1098 | "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", 1099 | "engines": { 1100 | "node": ">=0.10.0" 1101 | } 1102 | }, 1103 | "node_modules/pinkie-promise": { 1104 | "version": "2.0.1", 1105 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1106 | "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", 1107 | "dependencies": { 1108 | "pinkie": "^2.0.0" 1109 | }, 1110 | "engines": { 1111 | "node": ">=0.10.0" 1112 | } 1113 | }, 1114 | "node_modules/possible-typed-array-names": { 1115 | "version": "1.0.0", 1116 | "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", 1117 | "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", 1118 | "dev": true, 1119 | "engines": { 1120 | "node": ">= 0.4" 1121 | } 1122 | }, 1123 | "node_modules/read-closest-package": { 1124 | "version": "1.2.0", 1125 | "resolved": "https://registry.npmjs.org/read-closest-package/-/read-closest-package-1.2.0.tgz", 1126 | "integrity": "sha512-w/q+GISc9kaf86W4tTRWuZYitRjPC1EnPFOt+JOjfjl+LpYxL2RIIqz5Lk5wg3Ua2EB13sWo4d3yi/rr9YWTeA==", 1127 | "dependencies": { 1128 | "closest-package": "^1.0.0", 1129 | "load-json-file": "^1.0.0" 1130 | } 1131 | }, 1132 | "node_modules/read-json": { 1133 | "version": "1.0.3", 1134 | "resolved": "https://registry.npmjs.org/read-json/-/read-json-1.0.3.tgz", 1135 | "integrity": "sha512-09YLZk5eSAHKdmVXkrksPckNlosvEMDeaIR1ZSs4CsG0Z0eGIYGNLaD2bhkydmIVwBwnYNUEE9hy0L6w+FKcgg==", 1136 | "dependencies": { 1137 | "try-call": "0.0.2" 1138 | } 1139 | }, 1140 | "node_modules/regexp.prototype.flags": { 1141 | "version": "1.5.2", 1142 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", 1143 | "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", 1144 | "dev": true, 1145 | "dependencies": { 1146 | "call-bind": "^1.0.6", 1147 | "define-properties": "^1.2.1", 1148 | "es-errors": "^1.3.0", 1149 | "set-function-name": "^2.0.1" 1150 | }, 1151 | "engines": { 1152 | "node": ">= 0.4" 1153 | }, 1154 | "funding": { 1155 | "url": "https://github.com/sponsors/ljharb" 1156 | } 1157 | }, 1158 | "node_modules/resolve": { 1159 | "version": "1.22.8", 1160 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1161 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1162 | "dev": true, 1163 | "dependencies": { 1164 | "is-core-module": "^2.13.0", 1165 | "path-parse": "^1.0.7", 1166 | "supports-preserve-symlinks-flag": "^1.0.0" 1167 | }, 1168 | "bin": { 1169 | "resolve": "bin/resolve" 1170 | }, 1171 | "funding": { 1172 | "url": "https://github.com/sponsors/ljharb" 1173 | } 1174 | }, 1175 | "node_modules/run-series": { 1176 | "version": "1.1.9", 1177 | "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", 1178 | "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", 1179 | "funding": [ 1180 | { 1181 | "type": "github", 1182 | "url": "https://github.com/sponsors/feross" 1183 | }, 1184 | { 1185 | "type": "patreon", 1186 | "url": "https://www.patreon.com/feross" 1187 | }, 1188 | { 1189 | "type": "consulting", 1190 | "url": "https://feross.org/support" 1191 | } 1192 | ] 1193 | }, 1194 | "node_modules/safe-array-concat": { 1195 | "version": "1.1.2", 1196 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", 1197 | "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", 1198 | "dev": true, 1199 | "dependencies": { 1200 | "call-bind": "^1.0.7", 1201 | "get-intrinsic": "^1.2.4", 1202 | "has-symbols": "^1.0.3", 1203 | "isarray": "^2.0.5" 1204 | }, 1205 | "engines": { 1206 | "node": ">=0.4" 1207 | }, 1208 | "funding": { 1209 | "url": "https://github.com/sponsors/ljharb" 1210 | } 1211 | }, 1212 | "node_modules/safe-regex-test": { 1213 | "version": "1.0.3", 1214 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", 1215 | "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", 1216 | "dev": true, 1217 | "dependencies": { 1218 | "call-bind": "^1.0.6", 1219 | "es-errors": "^1.3.0", 1220 | "is-regex": "^1.1.4" 1221 | }, 1222 | "engines": { 1223 | "node": ">= 0.4" 1224 | }, 1225 | "funding": { 1226 | "url": "https://github.com/sponsors/ljharb" 1227 | } 1228 | }, 1229 | "node_modules/set-function-length": { 1230 | "version": "1.2.2", 1231 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1232 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1233 | "dev": true, 1234 | "dependencies": { 1235 | "define-data-property": "^1.1.4", 1236 | "es-errors": "^1.3.0", 1237 | "function-bind": "^1.1.2", 1238 | "get-intrinsic": "^1.2.4", 1239 | "gopd": "^1.0.1", 1240 | "has-property-descriptors": "^1.0.2" 1241 | }, 1242 | "engines": { 1243 | "node": ">= 0.4" 1244 | } 1245 | }, 1246 | "node_modules/set-function-name": { 1247 | "version": "2.0.2", 1248 | "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 1249 | "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 1250 | "dev": true, 1251 | "dependencies": { 1252 | "define-data-property": "^1.1.4", 1253 | "es-errors": "^1.3.0", 1254 | "functions-have-names": "^1.2.3", 1255 | "has-property-descriptors": "^1.0.2" 1256 | }, 1257 | "engines": { 1258 | "node": ">= 0.4" 1259 | } 1260 | }, 1261 | "node_modules/side-channel": { 1262 | "version": "1.0.6", 1263 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1264 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1265 | "dev": true, 1266 | "dependencies": { 1267 | "call-bind": "^1.0.7", 1268 | "es-errors": "^1.3.0", 1269 | "get-intrinsic": "^1.2.4", 1270 | "object-inspect": "^1.13.1" 1271 | }, 1272 | "engines": { 1273 | "node": ">= 0.4" 1274 | }, 1275 | "funding": { 1276 | "url": "https://github.com/sponsors/ljharb" 1277 | } 1278 | }, 1279 | "node_modules/side-channel/node_modules/object-inspect": { 1280 | "version": "1.13.2", 1281 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1282 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1283 | "dev": true, 1284 | "engines": { 1285 | "node": ">= 0.4" 1286 | }, 1287 | "funding": { 1288 | "url": "https://github.com/sponsors/ljharb" 1289 | } 1290 | }, 1291 | "node_modules/spawn-npm-install": { 1292 | "version": "1.3.0", 1293 | "resolved": "https://registry.npmjs.org/spawn-npm-install/-/spawn-npm-install-1.3.0.tgz", 1294 | "integrity": "sha512-5iW1s+ez/NImhEfdO5mGJ27Yy+8hkn6oT5RGItw45cWvp2KlJQ1IC+F6PyurH4xv4Qn3UkWRKUXTYHSAsSBqug==", 1295 | "dependencies": { 1296 | "dargs": "^4.0.0" 1297 | } 1298 | }, 1299 | "node_modules/string.prototype.trim": { 1300 | "version": "1.2.9", 1301 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", 1302 | "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", 1303 | "dev": true, 1304 | "dependencies": { 1305 | "call-bind": "^1.0.7", 1306 | "define-properties": "^1.2.1", 1307 | "es-abstract": "^1.23.0", 1308 | "es-object-atoms": "^1.0.0" 1309 | }, 1310 | "engines": { 1311 | "node": ">= 0.4" 1312 | }, 1313 | "funding": { 1314 | "url": "https://github.com/sponsors/ljharb" 1315 | } 1316 | }, 1317 | "node_modules/string.prototype.trimend": { 1318 | "version": "1.0.8", 1319 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", 1320 | "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", 1321 | "dev": true, 1322 | "dependencies": { 1323 | "call-bind": "^1.0.7", 1324 | "define-properties": "^1.2.1", 1325 | "es-object-atoms": "^1.0.0" 1326 | }, 1327 | "funding": { 1328 | "url": "https://github.com/sponsors/ljharb" 1329 | } 1330 | }, 1331 | "node_modules/string.prototype.trimstart": { 1332 | "version": "1.0.8", 1333 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 1334 | "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 1335 | "dev": true, 1336 | "dependencies": { 1337 | "call-bind": "^1.0.7", 1338 | "define-properties": "^1.2.1", 1339 | "es-object-atoms": "^1.0.0" 1340 | }, 1341 | "engines": { 1342 | "node": ">= 0.4" 1343 | }, 1344 | "funding": { 1345 | "url": "https://github.com/sponsors/ljharb" 1346 | } 1347 | }, 1348 | "node_modules/strip-bom": { 1349 | "version": "2.0.0", 1350 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1351 | "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", 1352 | "dependencies": { 1353 | "is-utf8": "^0.2.0" 1354 | }, 1355 | "engines": { 1356 | "node": ">=0.10.0" 1357 | } 1358 | }, 1359 | "node_modules/supports-preserve-symlinks-flag": { 1360 | "version": "1.0.0", 1361 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1362 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1363 | "dev": true, 1364 | "engines": { 1365 | "node": ">= 0.4" 1366 | }, 1367 | "funding": { 1368 | "url": "https://github.com/sponsors/ljharb" 1369 | } 1370 | }, 1371 | "node_modules/tape": { 1372 | "version": "4.17.0", 1373 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.17.0.tgz", 1374 | "integrity": "sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==", 1375 | "dev": true, 1376 | "dependencies": { 1377 | "@ljharb/resumer": "~0.0.1", 1378 | "@ljharb/through": "~2.3.9", 1379 | "call-bind": "~1.0.2", 1380 | "deep-equal": "~1.1.1", 1381 | "defined": "~1.0.1", 1382 | "dotignore": "~0.1.2", 1383 | "for-each": "~0.3.3", 1384 | "glob": "~7.2.3", 1385 | "has": "~1.0.3", 1386 | "inherits": "~2.0.4", 1387 | "is-regex": "~1.1.4", 1388 | "minimist": "~1.2.8", 1389 | "mock-property": "~1.0.0", 1390 | "object-inspect": "~1.12.3", 1391 | "resolve": "~1.22.6", 1392 | "string.prototype.trim": "~1.2.8" 1393 | }, 1394 | "bin": { 1395 | "tape": "bin/tape" 1396 | }, 1397 | "funding": { 1398 | "url": "https://github.com/sponsors/ljharb" 1399 | } 1400 | }, 1401 | "node_modules/try-call": { 1402 | "version": "0.0.2", 1403 | "resolved": "https://registry.npmjs.org/try-call/-/try-call-0.0.2.tgz", 1404 | "integrity": "sha512-WlkC6iO6zEYLR7BhoxTDsCv5Y5FkyEf2a/+pEUgUqqBJHj7nUjrhYnW/0dw2mdduhsewIhiN8DYB00sQabNV0w==" 1405 | }, 1406 | "node_modules/typed-array-buffer": { 1407 | "version": "1.0.2", 1408 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", 1409 | "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", 1410 | "dev": true, 1411 | "dependencies": { 1412 | "call-bind": "^1.0.7", 1413 | "es-errors": "^1.3.0", 1414 | "is-typed-array": "^1.1.13" 1415 | }, 1416 | "engines": { 1417 | "node": ">= 0.4" 1418 | } 1419 | }, 1420 | "node_modules/typed-array-byte-length": { 1421 | "version": "1.0.1", 1422 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", 1423 | "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", 1424 | "dev": true, 1425 | "dependencies": { 1426 | "call-bind": "^1.0.7", 1427 | "for-each": "^0.3.3", 1428 | "gopd": "^1.0.1", 1429 | "has-proto": "^1.0.3", 1430 | "is-typed-array": "^1.1.13" 1431 | }, 1432 | "engines": { 1433 | "node": ">= 0.4" 1434 | }, 1435 | "funding": { 1436 | "url": "https://github.com/sponsors/ljharb" 1437 | } 1438 | }, 1439 | "node_modules/typed-array-byte-offset": { 1440 | "version": "1.0.2", 1441 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", 1442 | "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", 1443 | "dev": true, 1444 | "dependencies": { 1445 | "available-typed-arrays": "^1.0.7", 1446 | "call-bind": "^1.0.7", 1447 | "for-each": "^0.3.3", 1448 | "gopd": "^1.0.1", 1449 | "has-proto": "^1.0.3", 1450 | "is-typed-array": "^1.1.13" 1451 | }, 1452 | "engines": { 1453 | "node": ">= 0.4" 1454 | }, 1455 | "funding": { 1456 | "url": "https://github.com/sponsors/ljharb" 1457 | } 1458 | }, 1459 | "node_modules/typed-array-length": { 1460 | "version": "1.0.6", 1461 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", 1462 | "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", 1463 | "dev": true, 1464 | "dependencies": { 1465 | "call-bind": "^1.0.7", 1466 | "for-each": "^0.3.3", 1467 | "gopd": "^1.0.1", 1468 | "has-proto": "^1.0.3", 1469 | "is-typed-array": "^1.1.13", 1470 | "possible-typed-array-names": "^1.0.0" 1471 | }, 1472 | "engines": { 1473 | "node": ">= 0.4" 1474 | }, 1475 | "funding": { 1476 | "url": "https://github.com/sponsors/ljharb" 1477 | } 1478 | }, 1479 | "node_modules/unbox-primitive": { 1480 | "version": "1.0.2", 1481 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1482 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1483 | "dev": true, 1484 | "dependencies": { 1485 | "call-bind": "^1.0.2", 1486 | "has-bigints": "^1.0.2", 1487 | "has-symbols": "^1.0.3", 1488 | "which-boxed-primitive": "^1.0.2" 1489 | }, 1490 | "funding": { 1491 | "url": "https://github.com/sponsors/ljharb" 1492 | } 1493 | }, 1494 | "node_modules/which-boxed-primitive": { 1495 | "version": "1.0.2", 1496 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1497 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1498 | "dev": true, 1499 | "dependencies": { 1500 | "is-bigint": "^1.0.1", 1501 | "is-boolean-object": "^1.1.0", 1502 | "is-number-object": "^1.0.4", 1503 | "is-string": "^1.0.5", 1504 | "is-symbol": "^1.0.3" 1505 | }, 1506 | "funding": { 1507 | "url": "https://github.com/sponsors/ljharb" 1508 | } 1509 | }, 1510 | "node_modules/which-typed-array": { 1511 | "version": "1.1.15", 1512 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", 1513 | "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", 1514 | "dev": true, 1515 | "dependencies": { 1516 | "available-typed-arrays": "^1.0.7", 1517 | "call-bind": "^1.0.7", 1518 | "for-each": "^0.3.3", 1519 | "gopd": "^1.0.1", 1520 | "has-tostringtag": "^1.0.2" 1521 | }, 1522 | "engines": { 1523 | "node": ">= 0.4" 1524 | }, 1525 | "funding": { 1526 | "url": "https://github.com/sponsors/ljharb" 1527 | } 1528 | }, 1529 | "node_modules/wrappy": { 1530 | "version": "1.0.2", 1531 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1532 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1533 | "dev": true 1534 | } 1535 | } 1536 | } 1537 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "install-if-needed", 3 | "version": "1.0.4", 4 | "description": "installs the given modules if needed", 5 | "main": "index.js", 6 | "license": "MIT", 7 | "author": { 8 | "name": "Matt DesLauriers", 9 | "email": "dave.des@gmail.com", 10 | "url": "https://github.com/mattdesl" 11 | }, 12 | "dependencies": { 13 | "closest-package": "^1.0.0", 14 | "object-assign": "^2.0.0", 15 | "read-closest-package": "^1.0.0", 16 | "read-json": "^1.0.3", 17 | "run-series": "^1.1.0", 18 | "spawn-npm-install": "^1.3.0" 19 | }, 20 | "devDependencies": { 21 | "tape": "^4.0.0" 22 | }, 23 | "scripts": { 24 | "test": "node test.js" 25 | }, 26 | "keywords": [ 27 | "install", 28 | "npm", 29 | "programmatically", 30 | "spawn", 31 | "installation", 32 | "cli", 33 | "command", 34 | "module", 35 | "installs", 36 | "installing", 37 | "save", 38 | "--save", 39 | "--save-dev", 40 | "dep", 41 | "deps", 42 | "dependencies", 43 | "devDependencies" 44 | ], 45 | "repository": { 46 | "type": "git", 47 | "url": "git://github.com/mattdesl/install-if-needed.git" 48 | }, 49 | "homepage": "https://github.com/mattdesl/install-if-needed", 50 | "bugs": { 51 | "url": "https://github.com/mattdesl/install-if-needed/issues" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var install = require('./') 2 | var test = require('tape') 3 | var json = require('read-json') 4 | var uninstall = require('spawn-npm-install').uninstall 5 | var path = require('path') 6 | 7 | test('installs the given modules if needed', function (t) { 8 | t.plan(3) 9 | 10 | install({ 11 | devDependencies: ['tape'], 12 | optionalDependencies: ['through2', 'quote-stream'] 13 | }, function (err) { 14 | if (err) t.fail(err) 15 | includes(t, 'devDependencies', 'tape', true) 16 | includes(t, 'optionalDependencies', 'through2', true) 17 | includes(t, 'optionalDependencies', 'quote-stream', true) 18 | 19 | uninstall(['through2', 'quote-stream'], { saveOptional: true }, function (err) { 20 | if (err) t.fail(err) 21 | }) 22 | }) 23 | }) 24 | 25 | test('allows package data to be specified', function (t) { 26 | t.plan(1) 27 | 28 | install({ 29 | package: { 30 | devDependencies: { 31 | 'quote-stream': '*' 32 | } 33 | }, 34 | devDependencies: ['quote-stream'] 35 | }, function (err) { 36 | if (err) t.fail(err) 37 | includes(t, 'devDependencies', 'quote-stream', false) 38 | }) 39 | }) 40 | 41 | test('does not save deps when save: false', function (t) { 42 | t.plan(2) 43 | 44 | install({ 45 | save: false, 46 | optionalDependencies: ['zalgo'], 47 | devDependencies: ['quote-stream'] 48 | }, function (err) { 49 | if (err) t.fail(err) 50 | includes(t, 'devDependencies', 'quote-stream', false) 51 | includes(t, 'optionalDependencies', 'zalgo', false) 52 | }) 53 | }) 54 | 55 | test('saves to dependencies', function (t) { 56 | t.plan(2) 57 | 58 | install(['zalgo', 'quote-stream'], function (err) { 59 | if (err) t.fail(err) 60 | includes(t, 'dependencies', 'quote-stream', true) 61 | includes(t, 'dependencies', 'zalgo', true) 62 | 63 | uninstall(['zalgo', 'quote-stream'], { save: true }, function (err) { 64 | if (err) t.fail(err) 65 | }) 66 | }) 67 | }) 68 | 69 | function includes (t, key, name, exists) { 70 | json(path.join(__dirname, 'package.json'), function (err, data) { 71 | if (err) t.fail(err) 72 | 73 | var idx = Object.keys(data[key]).indexOf(name) 74 | if (exists) { 75 | t.notEqual(idx, -1, 'has dep') 76 | } else { 77 | t.equal(idx, -1, 'does not have dep') 78 | } 79 | }) 80 | } 81 | --------------------------------------------------------------------------------