├── .eslintrc.js ├── .github └── FUNDING.yml ├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── index.d.ts ├── index.js ├── package-lock.json ├── package.json └── test.js /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: ['prettier'], 3 | rules: { 4 | 'prettier/prettier': [ 5 | 'error', 6 | { 7 | singleQuote: true, 8 | semi: false, 9 | }, 10 | ] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: typicode 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .travis.yml 2 | test.js 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | - "0.12" 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Please upgrade Node [![](http://img.shields.io/npm/dm/please-upgrade-node.svg?style=flat)](https://www.npmjs.org/package/please-upgrade-node) [![npm](https://img.shields.io/npm/v/please-upgrade-node.svg)](https://www.npmjs.com/package/please-upgrade-node) 2 | 3 | > :information_desk_person: show a message to your users to upgrade Node instead of a stacktrace 4 | 5 | It's common for new Node users to miss or not understand engines warning when installing a CLI. This package displays a beginner-friendly message if their Node version is below the one expected. 6 | 7 | ```sh 8 | $ node -v 9 | 12 10 | 11 | $ modern-cli 12 | modern-cli requires at least version 16 of Node, please upgrade 13 | ``` 14 | 15 | ## Status 16 | 17 | **This project is considered feature complete and stable**. Only maintenance updates will be published. That said since the goal of the project is to check previous versions of Node, code is unlikely to be modified as it needs to work on very old versions. 18 | 19 | ## Usage 20 | 21 | ```sh 22 | npm install please-upgrade-node 23 | ``` 24 | 25 | Add `please-upgrade-node` at the top of your CLI 26 | 27 | ```js 28 | #!/usr/bin/env node 29 | const pkg = require('./package.json') 30 | require('please-upgrade-node')(pkg) // <- Must run BEFORE requiring any other modules 31 | 32 | // ... 33 | ``` 34 | 35 | Set in your `package.json` the required Node version 36 | 37 | ```js 38 | { 39 | "engines": { 40 | "node": ">=6" 41 | } 42 | } 43 | ``` 44 | 45 | __Important__: `>=` is the only operator supported by `please-upgrade-node` (e.g. `>=6`, `>=6.0`, `>=6.0.0`). 46 | 47 | ## Options 48 | 49 | You can set custom `exitCode` and `message` function if needed 50 | 51 | ```js 52 | pleaseUpgradeNode(pkg, { 53 | exitCode: 0, // Default: 1 54 | message: function(requiredVersion) { 55 | return 'Oops this program require Node ' + requiredVersion 56 | } 57 | }) 58 | ``` 59 | 60 | __Important__: to keep `message` function compatible with older versions of Node, avoid using ES6 features like `=>` or string interpolation. 61 | 62 | ## See also 63 | 64 | * [xv](https://github.com/typicode/xv) - ✅ Simple test runner 65 | * [husky](https://github.com/typicode/husky) - 🐕 Git hooks made easy 66 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | interface Options { 2 | exitCode: number; 3 | message: (version: string) => string; 4 | } 5 | 6 | declare function pleaseUpgradeNode( 7 | pkg: Record, 8 | opts?: Partial 9 | ): void; 10 | 11 | export = pleaseUpgradeNode; 12 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var semverCompare = require('semver-compare') 2 | 3 | module.exports = function pleaseUpgradeNode(pkg, opts) { 4 | var opts = opts || {} 5 | var requiredVersion = pkg.engines.node.replace('>=', '') 6 | var currentVersion = process.version.replace('v', '') 7 | if (semverCompare(currentVersion, requiredVersion) === -1) { 8 | if (opts.message) { 9 | console.error(opts.message(requiredVersion)) 10 | } else { 11 | console.error( 12 | pkg.name + 13 | ' requires at least version ' + 14 | requiredVersion + 15 | ' of Node, please upgrade' 16 | ) 17 | } 18 | 19 | if (opts.hasOwnProperty('exitCode')) { 20 | process.exit(opts.exitCode) 21 | } else { 22 | process.exit(1) 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "please-upgrade-node", 3 | "version": "3.2.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "please-upgrade-node", 9 | "version": "3.2.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "semver-compare": "^1.0.0" 13 | }, 14 | "devDependencies": { 15 | "tape": "^5.6.3" 16 | } 17 | }, 18 | "node_modules/array-buffer-byte-length": { 19 | "version": "1.0.0", 20 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", 21 | "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", 22 | "dev": true, 23 | "dependencies": { 24 | "call-bind": "^1.0.2", 25 | "is-array-buffer": "^3.0.1" 26 | }, 27 | "funding": { 28 | "url": "https://github.com/sponsors/ljharb" 29 | } 30 | }, 31 | "node_modules/array.prototype.every": { 32 | "version": "1.1.4", 33 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.4.tgz", 34 | "integrity": "sha512-Aui35iRZk1HHLRAyF7QP0KAnOnduaQ6fo6k1NVWfRc0xTs2AZ70ytlXvOmkC6Di4JmUs2Wv3DYzGtCQFSk5uGg==", 35 | "dev": true, 36 | "dependencies": { 37 | "call-bind": "^1.0.2", 38 | "define-properties": "^1.1.4", 39 | "es-abstract": "^1.20.4", 40 | "is-string": "^1.0.7" 41 | }, 42 | "engines": { 43 | "node": ">= 0.4" 44 | }, 45 | "funding": { 46 | "url": "https://github.com/sponsors/ljharb" 47 | } 48 | }, 49 | "node_modules/available-typed-arrays": { 50 | "version": "1.0.5", 51 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 52 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 53 | "dev": true, 54 | "engines": { 55 | "node": ">= 0.4" 56 | }, 57 | "funding": { 58 | "url": "https://github.com/sponsors/ljharb" 59 | } 60 | }, 61 | "node_modules/balanced-match": { 62 | "version": "1.0.0", 63 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 64 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 65 | "dev": true 66 | }, 67 | "node_modules/brace-expansion": { 68 | "version": "1.1.11", 69 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 70 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 71 | "dev": true, 72 | "dependencies": { 73 | "balanced-match": "^1.0.0", 74 | "concat-map": "0.0.1" 75 | } 76 | }, 77 | "node_modules/call-bind": { 78 | "version": "1.0.2", 79 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 80 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 81 | "dev": true, 82 | "dependencies": { 83 | "function-bind": "^1.1.1", 84 | "get-intrinsic": "^1.0.2" 85 | }, 86 | "funding": { 87 | "url": "https://github.com/sponsors/ljharb" 88 | } 89 | }, 90 | "node_modules/concat-map": { 91 | "version": "0.0.1", 92 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 93 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 94 | "dev": true 95 | }, 96 | "node_modules/deep-equal": { 97 | "version": "2.2.0", 98 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", 99 | "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", 100 | "dev": true, 101 | "dependencies": { 102 | "call-bind": "^1.0.2", 103 | "es-get-iterator": "^1.1.2", 104 | "get-intrinsic": "^1.1.3", 105 | "is-arguments": "^1.1.1", 106 | "is-array-buffer": "^3.0.1", 107 | "is-date-object": "^1.0.5", 108 | "is-regex": "^1.1.4", 109 | "is-shared-array-buffer": "^1.0.2", 110 | "isarray": "^2.0.5", 111 | "object-is": "^1.1.5", 112 | "object-keys": "^1.1.1", 113 | "object.assign": "^4.1.4", 114 | "regexp.prototype.flags": "^1.4.3", 115 | "side-channel": "^1.0.4", 116 | "which-boxed-primitive": "^1.0.2", 117 | "which-collection": "^1.0.1", 118 | "which-typed-array": "^1.1.9" 119 | }, 120 | "funding": { 121 | "url": "https://github.com/sponsors/ljharb" 122 | } 123 | }, 124 | "node_modules/define-properties": { 125 | "version": "1.2.0", 126 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", 127 | "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", 128 | "dev": true, 129 | "dependencies": { 130 | "has-property-descriptors": "^1.0.0", 131 | "object-keys": "^1.1.1" 132 | }, 133 | "engines": { 134 | "node": ">= 0.4" 135 | }, 136 | "funding": { 137 | "url": "https://github.com/sponsors/ljharb" 138 | } 139 | }, 140 | "node_modules/defined": { 141 | "version": "1.0.1", 142 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 143 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 144 | "dev": true, 145 | "funding": { 146 | "url": "https://github.com/sponsors/ljharb" 147 | } 148 | }, 149 | "node_modules/dotignore": { 150 | "version": "0.1.2", 151 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 152 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 153 | "dev": true, 154 | "dependencies": { 155 | "minimatch": "^3.0.4" 156 | }, 157 | "bin": { 158 | "ignored": "bin/ignored" 159 | } 160 | }, 161 | "node_modules/es-abstract": { 162 | "version": "1.21.2", 163 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", 164 | "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", 165 | "dev": true, 166 | "dependencies": { 167 | "array-buffer-byte-length": "^1.0.0", 168 | "available-typed-arrays": "^1.0.5", 169 | "call-bind": "^1.0.2", 170 | "es-set-tostringtag": "^2.0.1", 171 | "es-to-primitive": "^1.2.1", 172 | "function.prototype.name": "^1.1.5", 173 | "get-intrinsic": "^1.2.0", 174 | "get-symbol-description": "^1.0.0", 175 | "globalthis": "^1.0.3", 176 | "gopd": "^1.0.1", 177 | "has": "^1.0.3", 178 | "has-property-descriptors": "^1.0.0", 179 | "has-proto": "^1.0.1", 180 | "has-symbols": "^1.0.3", 181 | "internal-slot": "^1.0.5", 182 | "is-array-buffer": "^3.0.2", 183 | "is-callable": "^1.2.7", 184 | "is-negative-zero": "^2.0.2", 185 | "is-regex": "^1.1.4", 186 | "is-shared-array-buffer": "^1.0.2", 187 | "is-string": "^1.0.7", 188 | "is-typed-array": "^1.1.10", 189 | "is-weakref": "^1.0.2", 190 | "object-inspect": "^1.12.3", 191 | "object-keys": "^1.1.1", 192 | "object.assign": "^4.1.4", 193 | "regexp.prototype.flags": "^1.4.3", 194 | "safe-regex-test": "^1.0.0", 195 | "string.prototype.trim": "^1.2.7", 196 | "string.prototype.trimend": "^1.0.6", 197 | "string.prototype.trimstart": "^1.0.6", 198 | "typed-array-length": "^1.0.4", 199 | "unbox-primitive": "^1.0.2", 200 | "which-typed-array": "^1.1.9" 201 | }, 202 | "engines": { 203 | "node": ">= 0.4" 204 | }, 205 | "funding": { 206 | "url": "https://github.com/sponsors/ljharb" 207 | } 208 | }, 209 | "node_modules/es-get-iterator": { 210 | "version": "1.1.3", 211 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 212 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 213 | "dev": true, 214 | "dependencies": { 215 | "call-bind": "^1.0.2", 216 | "get-intrinsic": "^1.1.3", 217 | "has-symbols": "^1.0.3", 218 | "is-arguments": "^1.1.1", 219 | "is-map": "^2.0.2", 220 | "is-set": "^2.0.2", 221 | "is-string": "^1.0.7", 222 | "isarray": "^2.0.5", 223 | "stop-iteration-iterator": "^1.0.0" 224 | }, 225 | "funding": { 226 | "url": "https://github.com/sponsors/ljharb" 227 | } 228 | }, 229 | "node_modules/es-set-tostringtag": { 230 | "version": "2.0.1", 231 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", 232 | "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", 233 | "dev": true, 234 | "dependencies": { 235 | "get-intrinsic": "^1.1.3", 236 | "has": "^1.0.3", 237 | "has-tostringtag": "^1.0.0" 238 | }, 239 | "engines": { 240 | "node": ">= 0.4" 241 | } 242 | }, 243 | "node_modules/es-to-primitive": { 244 | "version": "1.2.1", 245 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 246 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 247 | "dev": true, 248 | "dependencies": { 249 | "is-callable": "^1.1.4", 250 | "is-date-object": "^1.0.1", 251 | "is-symbol": "^1.0.2" 252 | }, 253 | "engines": { 254 | "node": ">= 0.4" 255 | }, 256 | "funding": { 257 | "url": "https://github.com/sponsors/ljharb" 258 | } 259 | }, 260 | "node_modules/for-each": { 261 | "version": "0.3.3", 262 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 263 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 264 | "dev": true, 265 | "dependencies": { 266 | "is-callable": "^1.1.3" 267 | } 268 | }, 269 | "node_modules/fs.realpath": { 270 | "version": "1.0.0", 271 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 272 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 273 | "dev": true 274 | }, 275 | "node_modules/function-bind": { 276 | "version": "1.1.1", 277 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 278 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 279 | "dev": true 280 | }, 281 | "node_modules/function.prototype.name": { 282 | "version": "1.1.5", 283 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 284 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 285 | "dev": true, 286 | "dependencies": { 287 | "call-bind": "^1.0.2", 288 | "define-properties": "^1.1.3", 289 | "es-abstract": "^1.19.0", 290 | "functions-have-names": "^1.2.2" 291 | }, 292 | "engines": { 293 | "node": ">= 0.4" 294 | }, 295 | "funding": { 296 | "url": "https://github.com/sponsors/ljharb" 297 | } 298 | }, 299 | "node_modules/functions-have-names": { 300 | "version": "1.2.3", 301 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 302 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 303 | "dev": true, 304 | "funding": { 305 | "url": "https://github.com/sponsors/ljharb" 306 | } 307 | }, 308 | "node_modules/get-intrinsic": { 309 | "version": "1.2.0", 310 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 311 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 312 | "dev": true, 313 | "dependencies": { 314 | "function-bind": "^1.1.1", 315 | "has": "^1.0.3", 316 | "has-symbols": "^1.0.3" 317 | }, 318 | "funding": { 319 | "url": "https://github.com/sponsors/ljharb" 320 | } 321 | }, 322 | "node_modules/get-package-type": { 323 | "version": "0.1.0", 324 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 325 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 326 | "dev": true, 327 | "engines": { 328 | "node": ">=8.0.0" 329 | } 330 | }, 331 | "node_modules/get-symbol-description": { 332 | "version": "1.0.0", 333 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 334 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 335 | "dev": true, 336 | "dependencies": { 337 | "call-bind": "^1.0.2", 338 | "get-intrinsic": "^1.1.1" 339 | }, 340 | "engines": { 341 | "node": ">= 0.4" 342 | }, 343 | "funding": { 344 | "url": "https://github.com/sponsors/ljharb" 345 | } 346 | }, 347 | "node_modules/glob": { 348 | "version": "7.2.3", 349 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 350 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 351 | "dev": true, 352 | "dependencies": { 353 | "fs.realpath": "^1.0.0", 354 | "inflight": "^1.0.4", 355 | "inherits": "2", 356 | "minimatch": "^3.1.1", 357 | "once": "^1.3.0", 358 | "path-is-absolute": "^1.0.0" 359 | }, 360 | "engines": { 361 | "node": "*" 362 | }, 363 | "funding": { 364 | "url": "https://github.com/sponsors/isaacs" 365 | } 366 | }, 367 | "node_modules/globalthis": { 368 | "version": "1.0.3", 369 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 370 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 371 | "dev": true, 372 | "dependencies": { 373 | "define-properties": "^1.1.3" 374 | }, 375 | "engines": { 376 | "node": ">= 0.4" 377 | }, 378 | "funding": { 379 | "url": "https://github.com/sponsors/ljharb" 380 | } 381 | }, 382 | "node_modules/gopd": { 383 | "version": "1.0.1", 384 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 385 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 386 | "dev": true, 387 | "dependencies": { 388 | "get-intrinsic": "^1.1.3" 389 | }, 390 | "funding": { 391 | "url": "https://github.com/sponsors/ljharb" 392 | } 393 | }, 394 | "node_modules/has": { 395 | "version": "1.0.3", 396 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 397 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 398 | "dev": true, 399 | "dependencies": { 400 | "function-bind": "^1.1.1" 401 | }, 402 | "engines": { 403 | "node": ">= 0.4.0" 404 | } 405 | }, 406 | "node_modules/has-bigints": { 407 | "version": "1.0.2", 408 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 409 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 410 | "dev": true, 411 | "funding": { 412 | "url": "https://github.com/sponsors/ljharb" 413 | } 414 | }, 415 | "node_modules/has-dynamic-import": { 416 | "version": "2.0.1", 417 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 418 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 419 | "dev": true, 420 | "dependencies": { 421 | "call-bind": "^1.0.2", 422 | "get-intrinsic": "^1.1.1" 423 | }, 424 | "funding": { 425 | "url": "https://github.com/sponsors/ljharb" 426 | } 427 | }, 428 | "node_modules/has-property-descriptors": { 429 | "version": "1.0.0", 430 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 431 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 432 | "dev": true, 433 | "dependencies": { 434 | "get-intrinsic": "^1.1.1" 435 | }, 436 | "funding": { 437 | "url": "https://github.com/sponsors/ljharb" 438 | } 439 | }, 440 | "node_modules/has-proto": { 441 | "version": "1.0.1", 442 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 443 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 444 | "dev": true, 445 | "engines": { 446 | "node": ">= 0.4" 447 | }, 448 | "funding": { 449 | "url": "https://github.com/sponsors/ljharb" 450 | } 451 | }, 452 | "node_modules/has-symbols": { 453 | "version": "1.0.3", 454 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 455 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 456 | "dev": true, 457 | "engines": { 458 | "node": ">= 0.4" 459 | }, 460 | "funding": { 461 | "url": "https://github.com/sponsors/ljharb" 462 | } 463 | }, 464 | "node_modules/has-tostringtag": { 465 | "version": "1.0.0", 466 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 467 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 468 | "dev": true, 469 | "dependencies": { 470 | "has-symbols": "^1.0.2" 471 | }, 472 | "engines": { 473 | "node": ">= 0.4" 474 | }, 475 | "funding": { 476 | "url": "https://github.com/sponsors/ljharb" 477 | } 478 | }, 479 | "node_modules/inflight": { 480 | "version": "1.0.6", 481 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 482 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 483 | "dev": true, 484 | "dependencies": { 485 | "once": "^1.3.0", 486 | "wrappy": "1" 487 | } 488 | }, 489 | "node_modules/inherits": { 490 | "version": "2.0.4", 491 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 492 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 493 | "dev": true 494 | }, 495 | "node_modules/internal-slot": { 496 | "version": "1.0.5", 497 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", 498 | "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", 499 | "dev": true, 500 | "dependencies": { 501 | "get-intrinsic": "^1.2.0", 502 | "has": "^1.0.3", 503 | "side-channel": "^1.0.4" 504 | }, 505 | "engines": { 506 | "node": ">= 0.4" 507 | } 508 | }, 509 | "node_modules/is-arguments": { 510 | "version": "1.1.1", 511 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 512 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 513 | "dev": true, 514 | "dependencies": { 515 | "call-bind": "^1.0.2", 516 | "has-tostringtag": "^1.0.0" 517 | }, 518 | "engines": { 519 | "node": ">= 0.4" 520 | }, 521 | "funding": { 522 | "url": "https://github.com/sponsors/ljharb" 523 | } 524 | }, 525 | "node_modules/is-array-buffer": { 526 | "version": "3.0.2", 527 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", 528 | "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", 529 | "dev": true, 530 | "dependencies": { 531 | "call-bind": "^1.0.2", 532 | "get-intrinsic": "^1.2.0", 533 | "is-typed-array": "^1.1.10" 534 | }, 535 | "funding": { 536 | "url": "https://github.com/sponsors/ljharb" 537 | } 538 | }, 539 | "node_modules/is-bigint": { 540 | "version": "1.0.4", 541 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 542 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 543 | "dev": true, 544 | "dependencies": { 545 | "has-bigints": "^1.0.1" 546 | }, 547 | "funding": { 548 | "url": "https://github.com/sponsors/ljharb" 549 | } 550 | }, 551 | "node_modules/is-boolean-object": { 552 | "version": "1.1.2", 553 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 554 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 555 | "dev": true, 556 | "dependencies": { 557 | "call-bind": "^1.0.2", 558 | "has-tostringtag": "^1.0.0" 559 | }, 560 | "engines": { 561 | "node": ">= 0.4" 562 | }, 563 | "funding": { 564 | "url": "https://github.com/sponsors/ljharb" 565 | } 566 | }, 567 | "node_modules/is-callable": { 568 | "version": "1.2.7", 569 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 570 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 571 | "dev": true, 572 | "engines": { 573 | "node": ">= 0.4" 574 | }, 575 | "funding": { 576 | "url": "https://github.com/sponsors/ljharb" 577 | } 578 | }, 579 | "node_modules/is-core-module": { 580 | "version": "2.12.0", 581 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", 582 | "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", 583 | "dev": true, 584 | "dependencies": { 585 | "has": "^1.0.3" 586 | }, 587 | "funding": { 588 | "url": "https://github.com/sponsors/ljharb" 589 | } 590 | }, 591 | "node_modules/is-date-object": { 592 | "version": "1.0.5", 593 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 594 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 595 | "dev": true, 596 | "dependencies": { 597 | "has-tostringtag": "^1.0.0" 598 | }, 599 | "engines": { 600 | "node": ">= 0.4" 601 | }, 602 | "funding": { 603 | "url": "https://github.com/sponsors/ljharb" 604 | } 605 | }, 606 | "node_modules/is-map": { 607 | "version": "2.0.2", 608 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 609 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 610 | "dev": true, 611 | "funding": { 612 | "url": "https://github.com/sponsors/ljharb" 613 | } 614 | }, 615 | "node_modules/is-negative-zero": { 616 | "version": "2.0.2", 617 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 618 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 619 | "dev": true, 620 | "engines": { 621 | "node": ">= 0.4" 622 | }, 623 | "funding": { 624 | "url": "https://github.com/sponsors/ljharb" 625 | } 626 | }, 627 | "node_modules/is-number-object": { 628 | "version": "1.0.7", 629 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 630 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 631 | "dev": true, 632 | "dependencies": { 633 | "has-tostringtag": "^1.0.0" 634 | }, 635 | "engines": { 636 | "node": ">= 0.4" 637 | }, 638 | "funding": { 639 | "url": "https://github.com/sponsors/ljharb" 640 | } 641 | }, 642 | "node_modules/is-regex": { 643 | "version": "1.1.4", 644 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 645 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 646 | "dev": true, 647 | "dependencies": { 648 | "call-bind": "^1.0.2", 649 | "has-tostringtag": "^1.0.0" 650 | }, 651 | "engines": { 652 | "node": ">= 0.4" 653 | }, 654 | "funding": { 655 | "url": "https://github.com/sponsors/ljharb" 656 | } 657 | }, 658 | "node_modules/is-set": { 659 | "version": "2.0.2", 660 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 661 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 662 | "dev": true, 663 | "funding": { 664 | "url": "https://github.com/sponsors/ljharb" 665 | } 666 | }, 667 | "node_modules/is-shared-array-buffer": { 668 | "version": "1.0.2", 669 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 670 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 671 | "dev": true, 672 | "dependencies": { 673 | "call-bind": "^1.0.2" 674 | }, 675 | "funding": { 676 | "url": "https://github.com/sponsors/ljharb" 677 | } 678 | }, 679 | "node_modules/is-string": { 680 | "version": "1.0.7", 681 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 682 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 683 | "dev": true, 684 | "dependencies": { 685 | "has-tostringtag": "^1.0.0" 686 | }, 687 | "engines": { 688 | "node": ">= 0.4" 689 | }, 690 | "funding": { 691 | "url": "https://github.com/sponsors/ljharb" 692 | } 693 | }, 694 | "node_modules/is-symbol": { 695 | "version": "1.0.4", 696 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 697 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 698 | "dev": true, 699 | "dependencies": { 700 | "has-symbols": "^1.0.2" 701 | }, 702 | "engines": { 703 | "node": ">= 0.4" 704 | }, 705 | "funding": { 706 | "url": "https://github.com/sponsors/ljharb" 707 | } 708 | }, 709 | "node_modules/is-typed-array": { 710 | "version": "1.1.10", 711 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 712 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 713 | "dev": true, 714 | "dependencies": { 715 | "available-typed-arrays": "^1.0.5", 716 | "call-bind": "^1.0.2", 717 | "for-each": "^0.3.3", 718 | "gopd": "^1.0.1", 719 | "has-tostringtag": "^1.0.0" 720 | }, 721 | "engines": { 722 | "node": ">= 0.4" 723 | }, 724 | "funding": { 725 | "url": "https://github.com/sponsors/ljharb" 726 | } 727 | }, 728 | "node_modules/is-weakmap": { 729 | "version": "2.0.1", 730 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 731 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 732 | "dev": true, 733 | "funding": { 734 | "url": "https://github.com/sponsors/ljharb" 735 | } 736 | }, 737 | "node_modules/is-weakref": { 738 | "version": "1.0.2", 739 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 740 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 741 | "dev": true, 742 | "dependencies": { 743 | "call-bind": "^1.0.2" 744 | }, 745 | "funding": { 746 | "url": "https://github.com/sponsors/ljharb" 747 | } 748 | }, 749 | "node_modules/is-weakset": { 750 | "version": "2.0.2", 751 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 752 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 753 | "dev": true, 754 | "dependencies": { 755 | "call-bind": "^1.0.2", 756 | "get-intrinsic": "^1.1.1" 757 | }, 758 | "funding": { 759 | "url": "https://github.com/sponsors/ljharb" 760 | } 761 | }, 762 | "node_modules/isarray": { 763 | "version": "2.0.5", 764 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 765 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 766 | "dev": true 767 | }, 768 | "node_modules/minimatch": { 769 | "version": "3.1.2", 770 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 771 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 772 | "dev": true, 773 | "dependencies": { 774 | "brace-expansion": "^1.1.7" 775 | }, 776 | "engines": { 777 | "node": "*" 778 | } 779 | }, 780 | "node_modules/object-inspect": { 781 | "version": "1.12.3", 782 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 783 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 784 | "dev": true, 785 | "funding": { 786 | "url": "https://github.com/sponsors/ljharb" 787 | } 788 | }, 789 | "node_modules/object-is": { 790 | "version": "1.1.5", 791 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 792 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 793 | "dev": true, 794 | "dependencies": { 795 | "call-bind": "^1.0.2", 796 | "define-properties": "^1.1.3" 797 | }, 798 | "engines": { 799 | "node": ">= 0.4" 800 | }, 801 | "funding": { 802 | "url": "https://github.com/sponsors/ljharb" 803 | } 804 | }, 805 | "node_modules/object-keys": { 806 | "version": "1.1.1", 807 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 808 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 809 | "dev": true, 810 | "engines": { 811 | "node": ">= 0.4" 812 | } 813 | }, 814 | "node_modules/object.assign": { 815 | "version": "4.1.4", 816 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 817 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 818 | "dev": true, 819 | "dependencies": { 820 | "call-bind": "^1.0.2", 821 | "define-properties": "^1.1.4", 822 | "has-symbols": "^1.0.3", 823 | "object-keys": "^1.1.1" 824 | }, 825 | "engines": { 826 | "node": ">= 0.4" 827 | }, 828 | "funding": { 829 | "url": "https://github.com/sponsors/ljharb" 830 | } 831 | }, 832 | "node_modules/once": { 833 | "version": "1.4.0", 834 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 835 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 836 | "dev": true, 837 | "dependencies": { 838 | "wrappy": "1" 839 | } 840 | }, 841 | "node_modules/path-is-absolute": { 842 | "version": "1.0.1", 843 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 844 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 845 | "dev": true, 846 | "engines": { 847 | "node": ">=0.10.0" 848 | } 849 | }, 850 | "node_modules/path-parse": { 851 | "version": "1.0.7", 852 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 853 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 854 | "dev": true 855 | }, 856 | "node_modules/regexp.prototype.flags": { 857 | "version": "1.5.0", 858 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", 859 | "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", 860 | "dev": true, 861 | "dependencies": { 862 | "call-bind": "^1.0.2", 863 | "define-properties": "^1.2.0", 864 | "functions-have-names": "^1.2.3" 865 | }, 866 | "engines": { 867 | "node": ">= 0.4" 868 | }, 869 | "funding": { 870 | "url": "https://github.com/sponsors/ljharb" 871 | } 872 | }, 873 | "node_modules/resumer": { 874 | "version": "0.0.0", 875 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 876 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 877 | "dev": true, 878 | "dependencies": { 879 | "through": "~2.3.4" 880 | } 881 | }, 882 | "node_modules/safe-regex-test": { 883 | "version": "1.0.0", 884 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 885 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 886 | "dev": true, 887 | "dependencies": { 888 | "call-bind": "^1.0.2", 889 | "get-intrinsic": "^1.1.3", 890 | "is-regex": "^1.1.4" 891 | }, 892 | "funding": { 893 | "url": "https://github.com/sponsors/ljharb" 894 | } 895 | }, 896 | "node_modules/semver-compare": { 897 | "version": "1.0.0", 898 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 899 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" 900 | }, 901 | "node_modules/side-channel": { 902 | "version": "1.0.4", 903 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 904 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 905 | "dev": true, 906 | "dependencies": { 907 | "call-bind": "^1.0.0", 908 | "get-intrinsic": "^1.0.2", 909 | "object-inspect": "^1.9.0" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/sponsors/ljharb" 913 | } 914 | }, 915 | "node_modules/stop-iteration-iterator": { 916 | "version": "1.0.0", 917 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 918 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 919 | "dev": true, 920 | "dependencies": { 921 | "internal-slot": "^1.0.4" 922 | }, 923 | "engines": { 924 | "node": ">= 0.4" 925 | } 926 | }, 927 | "node_modules/string.prototype.trim": { 928 | "version": "1.2.7", 929 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", 930 | "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", 931 | "dev": true, 932 | "dependencies": { 933 | "call-bind": "^1.0.2", 934 | "define-properties": "^1.1.4", 935 | "es-abstract": "^1.20.4" 936 | }, 937 | "engines": { 938 | "node": ">= 0.4" 939 | }, 940 | "funding": { 941 | "url": "https://github.com/sponsors/ljharb" 942 | } 943 | }, 944 | "node_modules/string.prototype.trimend": { 945 | "version": "1.0.6", 946 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", 947 | "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", 948 | "dev": true, 949 | "dependencies": { 950 | "call-bind": "^1.0.2", 951 | "define-properties": "^1.1.4", 952 | "es-abstract": "^1.20.4" 953 | }, 954 | "funding": { 955 | "url": "https://github.com/sponsors/ljharb" 956 | } 957 | }, 958 | "node_modules/string.prototype.trimstart": { 959 | "version": "1.0.6", 960 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", 961 | "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", 962 | "dev": true, 963 | "dependencies": { 964 | "call-bind": "^1.0.2", 965 | "define-properties": "^1.1.4", 966 | "es-abstract": "^1.20.4" 967 | }, 968 | "funding": { 969 | "url": "https://github.com/sponsors/ljharb" 970 | } 971 | }, 972 | "node_modules/supports-preserve-symlinks-flag": { 973 | "version": "1.0.0", 974 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 975 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 976 | "dev": true, 977 | "engines": { 978 | "node": ">= 0.4" 979 | }, 980 | "funding": { 981 | "url": "https://github.com/sponsors/ljharb" 982 | } 983 | }, 984 | "node_modules/tape": { 985 | "version": "5.6.3", 986 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.3.tgz", 987 | "integrity": "sha512-cUDDGSbyoSIpdUAqbqLI/r7i/S4BHuCB9M5j7E/LrLs/x/i4zeAJ798aqo+FGo+kr9seBZwr8AkZW6rjceyAMQ==", 988 | "dev": true, 989 | "dependencies": { 990 | "array.prototype.every": "^1.1.4", 991 | "call-bind": "^1.0.2", 992 | "deep-equal": "^2.2.0", 993 | "defined": "^1.0.1", 994 | "dotignore": "^0.1.2", 995 | "for-each": "^0.3.3", 996 | "get-package-type": "^0.1.0", 997 | "glob": "^7.2.3", 998 | "has": "^1.0.3", 999 | "has-dynamic-import": "^2.0.1", 1000 | "inherits": "^2.0.4", 1001 | "is-regex": "^1.1.4", 1002 | "minimist": "^1.2.7", 1003 | "object-inspect": "^1.12.3", 1004 | "object-is": "^1.1.5", 1005 | "object-keys": "^1.1.1", 1006 | "object.assign": "^4.1.4", 1007 | "resolve": "^2.0.0-next.4", 1008 | "resumer": "^0.0.0", 1009 | "string.prototype.trim": "^1.2.7", 1010 | "through": "^2.3.8" 1011 | }, 1012 | "bin": { 1013 | "tape": "bin/tape" 1014 | }, 1015 | "funding": { 1016 | "url": "https://github.com/sponsors/ljharb" 1017 | } 1018 | }, 1019 | "node_modules/tape/node_modules/minimist": { 1020 | "version": "1.2.8", 1021 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1022 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1023 | "dev": true, 1024 | "funding": { 1025 | "url": "https://github.com/sponsors/ljharb" 1026 | } 1027 | }, 1028 | "node_modules/tape/node_modules/resolve": { 1029 | "version": "2.0.0-next.4", 1030 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 1031 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 1032 | "dev": true, 1033 | "dependencies": { 1034 | "is-core-module": "^2.9.0", 1035 | "path-parse": "^1.0.7", 1036 | "supports-preserve-symlinks-flag": "^1.0.0" 1037 | }, 1038 | "bin": { 1039 | "resolve": "bin/resolve" 1040 | }, 1041 | "funding": { 1042 | "url": "https://github.com/sponsors/ljharb" 1043 | } 1044 | }, 1045 | "node_modules/through": { 1046 | "version": "2.3.8", 1047 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1048 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1049 | "dev": true 1050 | }, 1051 | "node_modules/typed-array-length": { 1052 | "version": "1.0.4", 1053 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 1054 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "call-bind": "^1.0.2", 1058 | "for-each": "^0.3.3", 1059 | "is-typed-array": "^1.1.9" 1060 | }, 1061 | "funding": { 1062 | "url": "https://github.com/sponsors/ljharb" 1063 | } 1064 | }, 1065 | "node_modules/unbox-primitive": { 1066 | "version": "1.0.2", 1067 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1068 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1069 | "dev": true, 1070 | "dependencies": { 1071 | "call-bind": "^1.0.2", 1072 | "has-bigints": "^1.0.2", 1073 | "has-symbols": "^1.0.3", 1074 | "which-boxed-primitive": "^1.0.2" 1075 | }, 1076 | "funding": { 1077 | "url": "https://github.com/sponsors/ljharb" 1078 | } 1079 | }, 1080 | "node_modules/which-boxed-primitive": { 1081 | "version": "1.0.2", 1082 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1083 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1084 | "dev": true, 1085 | "dependencies": { 1086 | "is-bigint": "^1.0.1", 1087 | "is-boolean-object": "^1.1.0", 1088 | "is-number-object": "^1.0.4", 1089 | "is-string": "^1.0.5", 1090 | "is-symbol": "^1.0.3" 1091 | }, 1092 | "funding": { 1093 | "url": "https://github.com/sponsors/ljharb" 1094 | } 1095 | }, 1096 | "node_modules/which-collection": { 1097 | "version": "1.0.1", 1098 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1099 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1100 | "dev": true, 1101 | "dependencies": { 1102 | "is-map": "^2.0.1", 1103 | "is-set": "^2.0.1", 1104 | "is-weakmap": "^2.0.1", 1105 | "is-weakset": "^2.0.1" 1106 | }, 1107 | "funding": { 1108 | "url": "https://github.com/sponsors/ljharb" 1109 | } 1110 | }, 1111 | "node_modules/which-typed-array": { 1112 | "version": "1.1.9", 1113 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", 1114 | "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", 1115 | "dev": true, 1116 | "dependencies": { 1117 | "available-typed-arrays": "^1.0.5", 1118 | "call-bind": "^1.0.2", 1119 | "for-each": "^0.3.3", 1120 | "gopd": "^1.0.1", 1121 | "has-tostringtag": "^1.0.0", 1122 | "is-typed-array": "^1.1.10" 1123 | }, 1124 | "engines": { 1125 | "node": ">= 0.4" 1126 | }, 1127 | "funding": { 1128 | "url": "https://github.com/sponsors/ljharb" 1129 | } 1130 | }, 1131 | "node_modules/wrappy": { 1132 | "version": "1.0.2", 1133 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1134 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1135 | "dev": true 1136 | } 1137 | } 1138 | } 1139 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "please-upgrade-node", 3 | "version": "3.2.0", 4 | "description": "Displays a beginner-friendly message telling your user to upgrade their version of Node", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "node test" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/typicode/please-upgrade-node.git" 12 | }, 13 | "keywords": [ 14 | "node", 15 | "engines", 16 | "version", 17 | "check", 18 | "verify", 19 | "upgrade" 20 | ], 21 | "author": "typicode", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/typicode/please-upgrade-node/issues" 25 | }, 26 | "homepage": "https://github.com/typicode/please-upgrade-node#readme", 27 | "devDependencies": { 28 | "tape": "^5.6.3" 29 | }, 30 | "dependencies": { 31 | "semver-compare": "^1.0.0" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var tape = require('tape') 2 | var pleaseUpgrade = require('./') 3 | 4 | // Change process.version value 5 | Object.defineProperty(process, 'version', { value: 'v10.0.0' }) 6 | 7 | // Mock process.exit and console.error 8 | var exitCode = null 9 | process.exit = function(code) { 10 | exitCode = code 11 | } 12 | 13 | var errorMessage = null 14 | consoleError = console.error 15 | console.error = function(msg) { 16 | errorMessage = msg 17 | consoleError(msg) 18 | } 19 | 20 | function test(name, cb) { 21 | // Before each 22 | exitCode = null 23 | errorMessage = null 24 | // Test 25 | tape(name, cb) 26 | } 27 | 28 | // Actual tests 29 | test('>=1.2.0 should not exit', function(t) { 30 | pleaseUpgrade({ 31 | name: 'Lorem Ipsum', 32 | engines: { 33 | node: '>=1.2.0' 34 | } 35 | }) 36 | t.equal(exitCode, null) 37 | t.equal(errorMessage, null) 38 | t.end() 39 | }) 40 | 41 | test('>=4 should not exit', function(t) { 42 | pleaseUpgrade({ 43 | name: 'Lorem Ipsum', 44 | engines: { 45 | node: '>=4' 46 | } 47 | }) 48 | t.equal(exitCode, null) 49 | t.equal(errorMessage, null) 50 | t.end() 51 | }) 52 | 53 | test('>=4.0.0 should not exit', function(t) { 54 | pleaseUpgrade({ 55 | name: 'Lorem Ipsum', 56 | engines: { 57 | node: '>=4.0.0' 58 | } 59 | }) 60 | t.equal(exitCode, null) 61 | t.equal(errorMessage, null) 62 | t.end() 63 | }) 64 | 65 | test('>=10.0.1 (patch) should exit', function(t) { 66 | pleaseUpgrade({ 67 | name: 'Lorem Ipsum', 68 | engines: { 69 | node: '>=10.0.1' 70 | } 71 | }) 72 | t.equal(exitCode, 1) 73 | t.equal( 74 | errorMessage, 75 | 'Lorem Ipsum requires at least version 10.0.1 of Node, please upgrade' 76 | ) 77 | t.end() 78 | }) 79 | 80 | test('>=12 should exit', function(t) { 81 | pleaseUpgrade({ 82 | name: 'Lorem Ipsum', 83 | engines: { 84 | node: '>=12' 85 | } 86 | }) 87 | t.equal(exitCode, 1) 88 | t.equal( 89 | errorMessage, 90 | 'Lorem Ipsum requires at least version 12 of Node, please upgrade' 91 | ) 92 | t.end() 93 | }) 94 | 95 | test('>=12.0.0 should exit', function(t) { 96 | pleaseUpgrade({ 97 | name: 'Lorem Ipsum', 98 | engines: { 99 | node: '>=12.0.0' 100 | } 101 | }) 102 | t.equal(exitCode, 1) 103 | t.equal( 104 | errorMessage, 105 | 'Lorem Ipsum requires at least version 12.0.0 of Node, please upgrade' 106 | ) 107 | t.end() 108 | }) 109 | 110 | test('should exit with custom code 0', function(t) { 111 | pleaseUpgrade( 112 | { 113 | name: 'Lorem Ipsum', 114 | engines: { 115 | node: '>=12.0.0' 116 | } 117 | }, 118 | { 119 | exitCode: 0 120 | } 121 | ) 122 | t.equal(exitCode, 0) 123 | t.equal( 124 | errorMessage, 125 | 'Lorem Ipsum requires at least version 12.0.0 of Node, please upgrade' 126 | ) 127 | t.end() 128 | }) 129 | 130 | test('should exit with custom code 2', function(t) { 131 | pleaseUpgrade( 132 | { 133 | name: 'Lorem Ipsum', 134 | engines: { 135 | node: '>=12.0.0' 136 | } 137 | }, 138 | { 139 | exitCode: 2 140 | } 141 | ) 142 | t.equal(exitCode, 2) 143 | t.equal( 144 | errorMessage, 145 | 'Lorem Ipsum requires at least version 12.0.0 of Node, please upgrade' 146 | ) 147 | t.end() 148 | }) 149 | 150 | test('should display custom message', function(t) { 151 | pleaseUpgrade( 152 | { 153 | name: 'Lorem Ipsum', 154 | engines: { 155 | node: '>=12.0.0' 156 | } 157 | }, 158 | { 159 | message: function(requiredVersion) { 160 | return 'Required version is ' + requiredVersion 161 | } 162 | } 163 | ) 164 | t.equal(exitCode, 1) 165 | t.equal(errorMessage, 'Required version is 12.0.0') 166 | t.end() 167 | }) 168 | --------------------------------------------------------------------------------