From 8f10d67324dcb6feb914487d740f27b3d42c4502 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 24 Dec 2018 06:43:15 -0800 Subject: [PATCH 001/110] add worker as a subsystem --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 92a7771..57f8a63 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -64,6 +64,7 @@ const validSubsystems = [ , 'util' , 'v8' , 'vm' +, 'worker' , 'zlib' ] From d2b2295fafddb374bf32e1d08064f4198358f4d5 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 24 Dec 2018 07:10:39 -0800 Subject: [PATCH 002/110] add minimal subsystem tests --- test/rules/subsystem.js | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/rules/subsystem.js diff --git a/test/rules/subsystem.js b/test/rules/subsystem.js new file mode 100644 index 0000000..a00c408 --- /dev/null +++ b/test/rules/subsystem.js @@ -0,0 +1,65 @@ +'use strict' + +const test = require('tap').test +const Rule = require('../../lib/rules/subsystem') +const Commit = require('gitlint-parser-node') +const Validator = require('../../') + +test('rule: subsystem', (t) => { + t.test('invalid', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' + , author: { + name: 'Evan Lucas' + , email: 'evanlucas@me.com' + , date: '2016-04-12T19:42:23Z' + } + , message: 'fhqwhgads: come on' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'subsystem', 'id') + tt.equal(opts.message, 'Invalid subsystem: "fhqwhgads"', 'message') + tt.equal(opts.string, 'fhqwhgads: come on', 'string') + tt.equal(opts.line, 0, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + tt.end() + } + + Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) + }) + + t.test('valid', (tt) => { + tt.plan(2) + + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' + , author: { + name: 'Evan Lucas' + , email: 'evanlucas@me.com' + , date: '2016-04-12T19:42:23Z' + } + , message: 'worker: come on, fhqwhgads' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.strictSame(opts, { + id: 'subsystem' + , message: 'valid subsystems' + , string: 'worker' + , level: 'pass' + }) + tt.end() + } + + Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) + }) + + t.end() +}) From 9f1be88529680baa48a3bc2d46c0b5ba411bd1df Mon Sep 17 00:00:00 2001 From: Bradley Farias Date: Tue, 15 Jan 2019 21:06:22 -0600 Subject: [PATCH 003/110] add policy subsystem --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 57f8a63..330b81f 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -19,6 +19,7 @@ const validSubsystems = [ , 'node' , 'n-api' , 'perfctr' +, 'policy' , 'src' , 'test' , 'tools' From c0759631d3449efe713ac7408ede726a780f96cb Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Fri, 18 Jan 2019 12:20:11 -0500 Subject: [PATCH 004/110] 3.9.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3fcaf3..8ef95d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.7.0", + "version": "3.9.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 725bdda..64f1694 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.7.0", + "version": "3.9.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From fce90364252ff27077bad8df3fc44a853d21642a Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Wed, 23 Jan 2019 11:32:57 -0500 Subject: [PATCH 005/110] lib: add report subsystem --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 330b81f..522b03e 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -54,6 +54,7 @@ const validSubsystems = [ , 'querystring' , 'readline' , 'repl' +, 'report' , 'stream' , 'string_decoder' , 'sys' From 72b4899e54b4c6ade82667ce0c7e957b49ef2a28 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 29 Jan 2019 13:38:26 -0500 Subject: [PATCH 006/110] 3.10.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ef95d0..09c778e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.9.0", + "version": "3.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 64f1694..95bebcb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.9.0", + "version": "3.10.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From a941be335ea993ea394b5c7850c4ac1cbd7cd8ea Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 7 Feb 2019 22:38:10 -0800 Subject: [PATCH 007/110] update lodash to 4.17.11 in package-lock.json This is get out in front of https://nvd.nist.gov/vuln/detail/CVE-2018-16487. --- package-lock.json | 3832 ++++++++++++++++----------------------------- 1 file changed, 1324 insertions(+), 2508 deletions(-) diff --git a/package-lock.json b/package-lock.json index 09c778e..2c82b24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,20 +4,177 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", + "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.3.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", + "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", + "dev": true + }, + "@babel/template": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" + } + }, + "@babel/traverse": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", + "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.2.3", + "@babel/types": "^7.2.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", + "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, "requires": { "acorn": "^3.0.4" }, @@ -25,7 +182,8 @@ "acorn": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true } } }, @@ -33,6 +191,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -43,12 +202,14 @@ "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true }, "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true }, "ansi-regex": { "version": "2.1.1", @@ -60,38 +221,30 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { - "array-uniq": "^1.0.1" + "safer-buffer": "~2.1.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -111,15 +264,16 @@ "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -129,14 +283,14 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -147,30 +301,33 @@ "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", "dev": true }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-from": { + "browser-process-hrtime": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, "requires": { "callsites": "^0.2.0" } @@ -178,7 +335,14 @@ "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true }, "caseless": { "version": "0.12.0", @@ -201,12 +365,13 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true }, "check-pkg": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/check-pkg/-/check-pkg-2.0.3.tgz", - "integrity": "sha512-1OHNiFTR4vEJn7OVZqmFOuklE55K1h0PnllW/w12atoVEcX1lkqLMp1Fo5y08ZrAEgUr7ZWOIM6y9snYL+SxcQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-pkg/-/check-pkg-2.1.1.tgz", + "integrity": "sha512-qRxuZOQxfMyRuvo8n2nCb2aIWz3Wt0OuuMUWgO1oFAP8t1+vNzJCuD+r16E2PT26l4Ff/ofIGtWMbYpnYTF4hg==", "dev": true, "requires": { "chalk": "~1.1.3", @@ -228,7 +393,8 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true }, "clean-yaml-object": { "version": "0.1.0", @@ -240,6 +406,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -247,25 +414,29 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "color-support": { "version": "1.1.3", @@ -274,9 +445,9 @@ "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -285,12 +456,14 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -301,19 +474,21 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "coveralls": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.1.tgz", - "integrity": "sha512-FAzXwiDOYLGDWH+zgoIA+8GbWv50hlx+kpEJyvzLKOdnIBv9uWoVl4DhqGgyUHpiRjAlF8KYZSipWXYtllWH6Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", + "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", "dev": true, "requires": { - "js-yaml": "^3.6.1", + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", "lcov-parse": "^0.0.10", - "log-driver": "^1.2.5", + "log-driver": "^1.2.7", "minimist": "^1.2.0", - "request": "^2.79.0" + "request": "^2.85.0" }, "dependencies": { "minimist": { @@ -328,6 +503,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -344,22 +520,25 @@ } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "debug-log": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=" + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "defined": { "version": "1.0.0", @@ -368,9 +547,10 @@ "dev": true }, "deglob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", - "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, "requires": { "find-root": "^1.0.0", "glob": "^7.0.5", @@ -380,20 +560,6 @@ "uniq": "^1.0.1" } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -420,24 +586,32 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "requires": { "esutils": "^2.0.2" } }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -451,6 +625,7 @@ "version": "4.19.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, "requires": { "ajv": "^5.3.0", "babel-code-frame": "^6.22.0", @@ -495,20 +670,23 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -519,14 +697,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -534,9 +714,10 @@ } }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -545,26 +726,36 @@ "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "esm": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.4.tgz", + "integrity": "sha512-wOuWtQCkkwD1WKQN/k3RsyGSSN+AmiUzdKftn8vaC+uV9JesYmQlODJxgXaaRz0LaaFIlUxZaUu5NPiUAjKAAA==", + "dev": true }, "espree": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, "requires": { "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, "requires": { "estraverse": "^4.0.0" } @@ -573,6 +764,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, "requires": { "estraverse": "^4.1.0" } @@ -580,12 +772,14 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "events-to-array": { "version": "1.1.2", @@ -594,15 +788,16 @@ "dev": true }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "external-editor": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, "requires": { "chardet": "^0.4.0", "iconv-lite": "^0.4.17", @@ -618,22 +813,26 @@ "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -642,6 +841,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, "requires": { "flat-cache": "^1.2.1", "object-assign": "^4.0.1" @@ -650,16 +850,27 @@ "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, @@ -692,13 +903,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -711,7 +922,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-loop": { "version": "1.0.1", @@ -722,12 +934,14 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true }, "getpass": { "version": "0.1.7", @@ -752,9 +966,10 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -765,27 +980,22 @@ } }, "globals": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", - "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==" - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", + "dev": true }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true }, "har-schema": { "version": "2.0.0", @@ -794,13 +1004,39 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", + "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } } }, "has-ansi": { @@ -814,7 +1050,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "help": { "version": "2.1.3", @@ -833,27 +1070,31 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", - "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -862,12 +1103,14 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -888,20 +1131,23 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -912,14 +1158,16 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -929,43 +1177,26 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "is-typedarray": { "version": "1.0.0", @@ -976,12 +1207,14 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -989,15 +1222,38 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.3", + "semver": "^5.5.0" + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -1007,13 +1263,19 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-schema": { "version": "0.2.3", @@ -1024,12 +1286,14 @@ "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -1059,6 +1323,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -1068,6 +1333,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/lintit/-/lintit-6.0.1.tgz", "integrity": "sha512-fEcq1oVVf6PbfZNk63wiEjubROU3ZRV+0IsTC/l2KcnZj/jVoUQegZP+h5gNg/fU6VxGJbnDAy1eZ5obMNdJMg==", + "dev": true, "requires": { "eslint": "^4.6.1", "help": "~2.1.2", @@ -1075,26 +1341,33 @@ "standard-engine": "^7.1.0" } }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, "log-driver": { "version": "1.2.7", @@ -1103,38 +1376,47 @@ "dev": true }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1142,12 +1424,13 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "minipass": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", - "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -1155,9 +1438,9 @@ }, "dependencies": { "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true } } @@ -1166,24 +1449,28 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "nopt": { "version": "3.0.6", @@ -1194,2476 +1481,917 @@ } }, "nyc": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.8.0.tgz", - "integrity": "sha512-PUFq1PSsx5OinSk5g5aaZygcDdI3QQT5XUlbR9QRMihtMS6w0Gm8xj4BxmKeeAlpQXC5M2DIhH16Y+KejceivQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.2.0.tgz", + "integrity": "sha512-gQBlOqvfpYt9b2PZ7qElrHWt8x4y8ApNfbMBoDPdl3sY4/4RJwCxDGTSqhA9RnaguZjS5nW7taW8oToe86JLgQ==", "dev": true, "requires": { "archy": "^1.0.0", "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^2.1.0", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.1.2", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^1.10.0", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.3", - "istanbul-reports": "^1.4.0", - "md5-hex": "^1.2.0", + "caching-transform": "^3.0.1", + "convert-source-map": "^1.6.0", + "find-cache-dir": "^2.0.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.3", + "istanbul-lib-hook": "^2.0.3", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.2", + "istanbul-reports": "^2.1.0", + "make-dir": "^1.3.0", "merge-source-map": "^1.1.0", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.1", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.0", - "yargs": "11.1.0", - "yargs-parser": "^8.0.0" + "test-exclude": "^5.1.0", + "uuid": "^3.3.2", + "yargs": "^12.0.5", + "yargs-parser": "^11.1.1" }, "dependencies": { - "align-text": { - "version": "0.1.4", + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "default-require-extensions": "^2.0.0" } }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", + "archy": { + "version": "1.0.0", "bundled": true, "dev": true }, - "ansi-styles": { - "version": "2.2.1", + "arrify": { + "version": "1.0.1", "bundled": true, "dev": true }, - "append-transform": { - "version": "0.4.0", + "async": { + "version": "2.6.1", "bundled": true, "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "lodash": "^4.17.10" } }, - "archy": { + "balanced-match": { "version": "1.0.0", "bundled": true, "dev": true }, - "arr-diff": { - "version": "4.0.0", + "brace-expansion": { + "version": "1.1.11", "bundled": true, - "dev": true + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "arr-flatten": { - "version": "1.1.0", + "builtin-modules": { + "version": "1.1.1", "bundled": true, "dev": true }, - "arr-union": { - "version": "3.1.0", + "caching-transform": { + "version": "3.0.1", "bundled": true, - "dev": true + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^1.3.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.3.0" + } }, - "array-unique": { - "version": "0.3.2", + "camelcase": { + "version": "5.0.0", "bundled": true, "dev": true }, - "arrify": { - "version": "1.0.1", + "cliui": { + "version": "4.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } }, - "assign-symbols": { - "version": "1.0.0", + "code-point-at": { + "version": "1.1.0", "bundled": true, "dev": true }, - "async": { - "version": "1.5.2", + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", "bundled": true, "dev": true }, - "atob": { - "version": "2.1.1", + "concat-map": { + "version": "0.0.1", "bundled": true, "dev": true }, - "babel-code-frame": { - "version": "6.26.0", + "convert-source-map": { + "version": "1.6.0", "bundled": true, "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "safe-buffer": "~5.1.1" } }, - "babel-generator": { - "version": "6.26.1", + "cross-spawn": { + "version": "4.0.2", "bundled": true, "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, - "babel-messages": { - "version": "6.23.0", + "debug": { + "version": "4.1.1", "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "ms": "^2.1.1" } }, - "babel-runtime": { - "version": "6.26.0", + "decamelize": { + "version": "1.2.0", "bundled": true, - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "dev": true }, - "babel-template": { - "version": "6.26.0", + "default-require-extensions": { + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "strip-bom": "^3.0.0" } }, - "babel-traverse": { - "version": "6.26.0", + "end-of-stream": { + "version": "1.4.1", "bundled": true, "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "once": "^1.4.0" } }, - "babel-types": { - "version": "6.26.0", + "error-ex": { + "version": "1.3.2", "bundled": true, "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "is-arrayish": "^0.2.1" } }, - "babylon": { - "version": "6.18.0", + "es6-error": { + "version": "4.1.1", "bundled": true, "dev": true }, - "balanced-match": { + "execa": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "base": { - "version": "0.11.2", - "bundled": true, "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", + "cross-spawn": { + "version": "6.0.5", "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true } } }, - "brace-expansion": { - "version": "1.1.11", + "find-cache-dir": { + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" } }, - "braces": { - "version": "2.3.2", + "find-up": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "locate-path": "^3.0.0" } }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "cache-base": { - "version": "1.0.1", + "foreground-child": { + "version": "1.5.6", "bundled": true, "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "cross-spawn": "^4", + "signal-exit": "^3.0.0" } }, - "caching-transform": { - "version": "1.0.1", + "fs.realpath": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" - } + "dev": true }, - "camelcase": { - "version": "1.2.1", + "get-caller-file": { + "version": "1.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, - "center-align": { - "version": "0.1.3", + "get-stream": { + "version": "4.1.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "pump": "^3.0.0" } }, - "chalk": { - "version": "1.1.3", + "glob": { + "version": "7.1.3", "bundled": true, "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "class-utils": { - "version": "0.3.6", + "graceful-fs": { + "version": "4.1.15", "bundled": true, - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } + "dev": true }, - "cliui": { - "version": "2.1.0", + "handlebars": { + "version": "4.0.12", "bundled": true, "dev": true, - "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", + "source-map": { + "version": "0.6.1", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, - "code-point-at": { - "version": "1.1.0", + "has-flag": { + "version": "3.0.0", "bundled": true, "dev": true }, - "collection-visit": { - "version": "1.0.0", + "hasha": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "is-stream": "^1.0.1" } }, - "commondir": { - "version": "1.0.1", + "hosted-git-info": { + "version": "2.7.1", "bundled": true, "dev": true }, - "component-emitter": { - "version": "1.2.1", + "imurmurhash": { + "version": "0.1.4", "bundled": true, "dev": true }, - "concat-map": { - "version": "0.0.1", + "inflight": { + "version": "1.0.6", "bundled": true, - "dev": true + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, - "convert-source-map": { - "version": "1.5.1", + "inherits": { + "version": "2.0.3", "bundled": true, "dev": true }, - "copy-descriptor": { - "version": "0.1.1", + "invert-kv": { + "version": "2.0.0", "bundled": true, "dev": true }, - "core-js": { - "version": "2.5.6", + "is-arrayish": { + "version": "0.2.1", "bundled": true, "dev": true }, - "cross-spawn": { - "version": "4.0.2", + "is-builtin-module": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "builtin-modules": "^1.0.0" } }, - "debug": { - "version": "2.6.9", + "is-fullwidth-code-point": { + "version": "2.0.0", "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } + "dev": true }, - "debug-log": { - "version": "1.0.1", + "is-stream": { + "version": "1.1.0", "bundled": true, "dev": true }, - "decamelize": { - "version": "1.2.0", + "isexe": { + "version": "2.0.0", "bundled": true, "dev": true }, - "decode-uri-component": { - "version": "0.2.0", + "istanbul-lib-coverage": { + "version": "2.0.3", "bundled": true, "dev": true }, - "default-require-extensions": { - "version": "1.0.0", + "istanbul-lib-hook": { + "version": "2.0.3", "bundled": true, "dev": true, "requires": { - "strip-bom": "^2.0.0" + "append-transform": "^1.0.0" } }, - "define-property": { - "version": "2.0.2", + "istanbul-lib-report": { + "version": "2.0.4", "bundled": true, "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "supports-color": "^6.0.0" }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", + "supports-color": { + "version": "6.1.0", "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "has-flag": "^3.0.0" } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", "bundled": true, "dev": true } } }, - "detect-indent": { + "istanbul-reports": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { "version": "4.0.0", "bundled": true, "dev": true, "requires": { - "repeating": "^2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, - "error-ex": { - "version": "1.3.1", + "locate-path": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", + "lodash": { + "version": "4.17.11", "bundled": true, "dev": true }, - "esutils": { - "version": "2.0.2", + "lodash.flattendeep": { + "version": "4.4.0", "bundled": true, "dev": true }, - "execa": { - "version": "0.7.0", + "lru-cache": { + "version": "4.1.5", "bundled": true, "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "expand-brackets": { - "version": "2.1.4", + "make-dir": { + "version": "1.3.0", "bundled": true, "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "pify": "^3.0.0" } }, - "extend-shallow": { - "version": "3.0.2", + "map-age-cleaner": { + "version": "0.1.3", "bundled": true, "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "p-defer": "^1.0.0" } }, - "extglob": { - "version": "2.0.4", + "mem": { + "version": "4.0.0", "bundled": true, "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" } }, - "fill-range": { - "version": "4.0.0", + "merge-source-map": { + "version": "1.1.0", "bundled": true, "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "source-map": "^0.6.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", + "source-map": { + "version": "0.6.1", "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "dev": true } } }, - "find-cache-dir": { - "version": "0.1.1", + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "brace-expansion": "^1.1.7" } }, - "find-up": { - "version": "2.1.0", + "minimist": { + "version": "0.0.10", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", "bundled": true, "dev": true, "requires": { - "locate-path": "^2.0.0" + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } } }, - "for-in": { - "version": "1.0.2", + "ms": { + "version": "2.1.1", "bundled": true, "dev": true }, - "foreground-child": { - "version": "1.5.6", + "nice-try": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", "bundled": true, "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "fragment-cache": { - "version": "0.2.1", + "npm-run-path": { + "version": "2.0.2", "bundled": true, "dev": true, "requires": { - "map-cache": "^0.2.2" + "path-key": "^2.0.0" } }, - "fs.realpath": { - "version": "1.0.0", + "number-is-nan": { + "version": "1.0.1", "bundled": true, "dev": true }, - "get-caller-file": { - "version": "1.0.2", + "once": { + "version": "1.4.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "wrappy": "1" + } }, - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "get-value": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "glob": { - "version": "7.1.2", + "optimist": { + "version": "0.6.1", "bundled": true, "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, - "globals": { - "version": "9.18.0", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", + "os-homedir": { + "version": "1.0.2", "bundled": true, "dev": true }, - "handlebars": { - "version": "4.0.11", + "os-locale": { + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "has-ansi": { - "version": "2.0.0", + "p-defer": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "dev": true }, - "has-flag": { + "p-finally": { "version": "1.0.0", "bundled": true, "dev": true }, - "has-value": { - "version": "1.0.0", + "p-is-promise": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", "bundled": true, "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "p-try": "^2.0.0" } }, - "has-values": { - "version": "1.0.0", + "p-locate": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "p-limit": "^2.0.0" } }, - "hosted-git-info": { - "version": "2.6.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", + "p-try": { + "version": "2.0.0", "bundled": true, "dev": true }, - "inflight": { - "version": "1.0.6", + "package-hash": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invariant": { - "version": "2.2.4", + "parse-json": { + "version": "4.0.0", "bundled": true, "dev": true, "requires": { - "loose-envify": "^1.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "invert-kv": { - "version": "1.0.0", + "path-exists": { + "version": "3.0.0", "bundled": true, "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", + "path-is-absolute": { + "version": "1.0.1", "bundled": true, "dev": true }, - "is-buffer": { - "version": "1.1.6", + "path-key": { + "version": "2.0.1", "bundled": true, "dev": true }, - "is-builtin-module": { - "version": "1.0.0", + "path-type": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "pify": "^3.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", + "pify": { + "version": "3.0.0", "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } + "dev": true }, - "is-descriptor": { - "version": "0.1.6", + "pkg-dir": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } + "find-up": "^3.0.0" } }, - "is-extendable": { - "version": "0.1.1", + "pseudomap": { + "version": "1.0.2", "bundled": true, "dev": true }, - "is-finite": { - "version": "1.0.2", + "pump": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-number": { + "read-pkg": { "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "kind-of": "^3.0.2" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "is-odd": { - "version": "2.0.0", + "read-pkg-up": { + "version": "4.0.0", "bundled": true, "dev": true, "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "bundled": true, - "dev": true - } + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" } }, - "is-plain-object": { - "version": "2.0.4", + "release-zalgo": { + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "es6-error": "^4.0.1" } }, - "is-stream": { - "version": "1.1.0", + "require-directory": { + "version": "2.1.1", "bundled": true, "dev": true }, - "is-utf8": { - "version": "0.2.1", + "require-main-filename": { + "version": "1.0.1", "bundled": true, "dev": true }, - "is-windows": { - "version": "1.0.2", + "resolve-from": { + "version": "4.0.0", "bundled": true, "dev": true }, - "isarray": { - "version": "1.0.0", + "rimraf": { + "version": "2.6.3", "bundled": true, - "dev": true + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, - "isexe": { - "version": "2.0.0", + "safe-buffer": { + "version": "5.1.2", "bundled": true, "dev": true }, - "isobject": { - "version": "3.0.1", + "semver": { + "version": "5.6.0", "bundled": true, "dev": true }, - "istanbul-lib-coverage": { - "version": "1.2.0", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true }, - "istanbul-lib-hook": { - "version": "1.1.0", + "shebang-command": { + "version": "1.2.0", "bundled": true, "dev": true, "requires": { - "append-transform": "^0.4.0" + "shebang-regex": "^1.0.0" } }, - "istanbul-lib-instrument": { - "version": "1.10.1", + "shebang-regex": { + "version": "1.0.0", "bundled": true, - "dev": true, - "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" - } + "dev": true }, - "istanbul-lib-report": { - "version": "1.1.3", + "signal-exit": { + "version": "3.0.2", "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } + "dev": true }, - "istanbul-lib-source-maps": { - "version": "1.2.3", + "spawn-wrap": { + "version": "1.4.2", "bundled": true, "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" } }, - "istanbul-reports": { - "version": "1.4.0", + "spdx-correct": { + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "handlebars": "^4.0.3" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "js-tokens": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "1.3.0", + "spdx-exceptions": { + "version": "2.2.0", "bundled": true, "dev": true }, - "kind-of": { - "version": "3.2.2", + "spdx-expression-parse": { + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "is-buffer": "^1.1.5" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "lazy-cache": { - "version": "1.0.4", + "spdx-license-ids": { + "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, - "lcid": { - "version": "1.0.0", + "string-width": { + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "invert-kv": "^1.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, - "load-json-file": { - "version": "1.1.0", + "strip-ansi": { + "version": "4.0.0", "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - } - } - }, - "lodash": { - "version": "4.17.10", - "bundled": true, - "dev": true - }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "js-tokens": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "map-cache": { - "version": "0.2.2", - "bundled": true, - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "object.pick": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "bundled": true, - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "repeating": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "ret": { - "version": "0.1.15", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-regex": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "set-value": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "split-string": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "static-extend": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "braces": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "to-fast-properties": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "union-value": { - "version": "1.0.0", + "version": "3.0.0", "bundled": true, - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } + "dev": true }, - "unset-value": { + "strip-eof": { "version": "1.0.0", "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "5.1.0", + "bundled": true, "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "bundled": true, - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" } }, - "urix": { - "version": "0.1.0", - "bundled": true, - "dev": true - }, - "use": { - "version": "3.1.0", + "uglify-js": { + "version": "3.4.9", "bundled": true, "dev": true, + "optional": true, "requires": { - "kind-of": "^6.0.2" + "commander": "~2.17.1", + "source-map": "~0.6.1" }, "dependencies": { - "kind-of": { - "version": "6.0.2", + "source-map": { + "version": "0.6.1", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, "validate-npm-package-license": { - "version": "3.0.3", + "version": "3.0.4", "bundled": true, "dev": true, "requires": { @@ -3672,7 +2400,7 @@ } }, "which": { - "version": "1.3.0", + "version": "1.3.1", "bundled": true, "dev": true, "requires": { @@ -3684,12 +2412,6 @@ "bundled": true, "dev": true }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, "wordwrap": { "version": "0.0.3", "bundled": true, @@ -3704,6 +2426,11 @@ "strip-ansi": "^3.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, @@ -3721,6 +2448,14 @@ "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } } } }, @@ -3730,17 +2465,17 @@ "dev": true }, "write-file-atomic": { - "version": "1.3.4", + "version": "2.4.2", "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "signal-exit": "^3.0.2" } }, "y18n": { - "version": "3.2.1", + "version": "4.0.0", "bundled": true, "dev": true }, @@ -3750,94 +2485,52 @@ "dev": true }, "yargs": { - "version": "11.1.0", + "version": "12.0.5", "bundled": true, "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { - "version": "8.1.0", + "version": "11.1.1", "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -3846,20 +2539,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { "mimic-fn": "^1.0.0" } }, "opener": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", - "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -3878,7 +2573,8 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "own-or": { "version": "1.0.0", @@ -3896,9 +2592,10 @@ } }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, "requires": { "p-try": "^1.0.0" } @@ -3907,6 +2604,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -3914,17 +2612,36 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "performance-now": { "version": "2.1.0", @@ -3933,71 +2650,26 @@ "dev": true }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", + "dev": true, "requires": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "pkg-config": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, "requires": { "debug-log": "^1.0.0", "find-root": "^1.0.0", @@ -4007,32 +2679,43 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { @@ -4045,6 +2728,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4069,40 +2753,42 @@ "regexpp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, "requires": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" @@ -4111,7 +2797,8 @@ "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true } } }, @@ -4125,23 +2812,26 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, "requires": { "is-promise": "^2.1.0" } @@ -4149,17 +2839,20 @@ "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, "requires": { "rx-lite": "*" } @@ -4167,22 +2860,26 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -4190,46 +2887,58 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0" } }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -4239,19 +2948,21 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, "standard-engine": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.2.0.tgz", "integrity": "sha512-4MTVXRZQjEWeD7tNt8lK1Yh7VLXbmZ/hj34uF9tpSdtYNNPosms2TLCnw/7MUl/rW1Uhx80s7CL8LtBdUtgrtw==", + "dev": true, "requires": { "deglob": "^2.1.0", "get-stdin": "^5.0.1", @@ -4262,7 +2973,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -4270,6 +2982,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -4278,12 +2991,14 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -4294,6 +3009,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -4309,12 +3025,14 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "2.0.0", @@ -4325,6 +3043,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, "requires": { "ajv": "^5.2.3", "ajv-keywords": "^2.1.0", @@ -4338,14 +3057,16 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4353,9 +3074,10 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -4363,39 +3085,44 @@ } }, "tap": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.0.1.tgz", - "integrity": "sha512-iEJytWaZy8risvfRjuV4+ST+Lrrui/MW2ZCWn01ZaMn0NKFej4+PpBy6bXGOg9+cEGNmI7d3Sdka/zTUZUGidA==", + "version": "12.5.2", + "resolved": "https://registry.npmjs.org/tap/-/tap-12.5.2.tgz", + "integrity": "sha512-r1uXuQ39+EnnR4hqWDTKw854+2ZSGR6QUEZwVRfabqcnhoNmkPQfiJCaVyhw+DILuMcJyT2/VRTVzn6puxkJ6w==", "dev": true, "requires": { "bind-obj-methods": "^2.0.0", - "bluebird": "^3.5.1", + "browser-process-hrtime": "^1.0.0", + "capture-stack-trace": "^1.0.0", "clean-yaml-object": "^0.1.0", "color-support": "^1.1.0", - "coveralls": "^3.0.1", + "coveralls": "^3.0.2", + "domain-browser": "^1.2.0", + "esm": "^3.2.3", "foreground-child": "^1.3.3", "fs-exists-cached": "^1.0.0", "function-loop": "^1.0.1", - "glob": "^7.0.0", + "glob": "^7.1.3", "isexe": "^2.0.0", - "js-yaml": "^3.11.0", - "minipass": "^2.3.0", + "js-yaml": "^3.12.1", + "minipass": "^2.3.5", "mkdirp": "^0.5.1", - "nyc": "^11.8.0", - "opener": "^1.4.1", + "nyc": "^13.2.0", + "opener": "^1.5.1", "os-homedir": "^1.0.2", "own-or": "^1.0.0", "own-or-env": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "signal-exit": "^3.0.0", - "source-map-support": "^0.5.6", - "stack-utils": "^1.0.0", + "source-map-support": "^0.5.10", + "stack-utils": "^1.0.2", "tap-mocha-reporter": "^3.0.7", "tap-parser": "^7.0.0", "tmatch": "^4.0.0", "trivial-deferred": "^1.0.1", - "tsame": "^2.0.0", - "write-file-atomic": "^2.3.0", + "ts-node": "^8.0.2", + "tsame": "^2.0.1", + "typescript": "^3.3.3", + "write-file-atomic": "^2.4.2", "yapool": "^1.0.0" } }, @@ -4425,6 +3152,12 @@ "ms": "2.0.0" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "tap-parser": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", @@ -4452,12 +3185,14 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "tmatch": { "version": "4.0.0", @@ -4469,29 +3204,72 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "trivial-deferred": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", "dev": true }, + "ts-node": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", + "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + } + } + }, "tsame": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.0.tgz", - "integrity": "sha512-dAuzcnOPdqZYojylFQzEes95UDjve3HqKrlTCeLZKSDPMTsn3smzHZqsJj/sWD8wOUkg0RD++B11evyLn2+bIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", + "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", "dev": true }, "tunnel-agent": { @@ -4507,13 +3285,13 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -4521,7 +3299,14 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", + "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", + "dev": true }, "unicode-length": { "version": "1.0.3", @@ -4531,22 +3316,41 @@ "requires": { "punycode": "^1.3.2", "strip-ansi": "^3.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "verror": { @@ -4564,6 +3368,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -4571,25 +3376,28 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, "requires": { "mkdirp": "^0.5.1" } }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -4600,18 +3408,26 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yapool": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", "dev": true + }, + "yn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", + "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", + "dev": true } } } From c254d28982bce80591eabb5b5eba7b4b9bf4bf42 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 26 Feb 2019 19:11:49 -0500 Subject: [PATCH 008/110] rules: only check case of first word after subsystem The first colon denotes the subsystem(s). Any further colons are part of the title and should not be subject to the rule that the following word be in lowercase. --- lib/rules/title-format.js | 2 +- test/rules/title-format.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/rules/title-format.js b/lib/rules/title-format.js index 79b8ffd..9a8753c 100644 --- a/lib/rules/title-format.js +++ b/lib/rules/title-format.js @@ -52,7 +52,7 @@ module.exports = { } } - const result = /^(.+?): [A-Z]/.exec(context.title) + const result = /^([^:]+?): [A-Z]/.exec(context.title) if (result) { context.report({ id: id diff --git a/test/rules/title-format.js b/test/rules/title-format.js index 2cbe31b..dcbe3d0 100644 --- a/test/rules/title-format.js +++ b/test/rules/title-format.js @@ -77,5 +77,43 @@ test('rule: title-format', (t) => { tt.end() }) + t.test('first word after subsystem should be in lowercase', (tt) => { + tt.plan(2) + const context = makeCommit('test: Some message') + + context.report = (opts) => { + tt.pass('called report') + tt.strictSame(opts, { + id: 'title-format' + , message: 'First word after subsystem(s) in title should be lowercase.' + , string: 'test: Some message' + , line: 0 + , column: 7 + , level: 'fail' + }) + } + + Rule.validate(context) + tt.end() + }) + + t.test('colon in message followed by uppercase word', (tt) => { + tt.plan(2) + const context = makeCommit('test: some message: Message') + + context.report = (opts) => { + tt.pass('called report') + tt.strictSame(opts, { + id: 'title-format' + , message: 'Title is formatted correctly.' + , string: '' + , level: 'pass' + }) + } + + Rule.validate(context) + tt.end() + }) + t.end() }) From 570775ce85a2564958e5788a890cd99c9914626b Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 28 Feb 2019 12:19:03 -0500 Subject: [PATCH 009/110] 3.10.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c82b24..66128ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.10.0", + "version": "3.10.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 95bebcb..b69832b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.10.0", + "version": "3.10.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From bc874ad044bdfad5880e6b940e0b83bc64b0f98f Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 7 Mar 2019 17:58:17 +0000 Subject: [PATCH 010/110] Fix `npm audit` warning for handlebars (#49) --- package-lock.json | 94 +++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66128ec..0829272 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,14 @@ } }, "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", + "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", "dev": true, "requires": { - "@babel/types": "^7.3.2", + "@babel/types": "^7.3.4", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" } @@ -104,9 +104,9 @@ } }, "@babel/parser": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", - "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", + "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", "dev": true }, "@babel/template": { @@ -121,20 +121,20 @@ } }, "@babel/traverse": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", - "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", + "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", + "@babel/generator": "^7.3.4", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.2.3", - "@babel/types": "^7.2.2", + "@babel/parser": "^7.3.4", + "@babel/types": "^7.3.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" + "lodash": "^4.17.11" }, "dependencies": { "debug": { @@ -149,13 +149,13 @@ } }, "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", + "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" } }, @@ -1481,9 +1481,9 @@ } }, "nyc": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.2.0.tgz", - "integrity": "sha512-gQBlOqvfpYt9b2PZ7qElrHWt8x4y8ApNfbMBoDPdl3sY4/4RJwCxDGTSqhA9RnaguZjS5nW7taW8oToe86JLgQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", + "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", "dev": true, "requires": { "archy": "^1.0.0", @@ -1496,10 +1496,10 @@ "glob": "^7.1.3", "istanbul-lib-coverage": "^2.0.3", "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-instrument": "^3.1.0", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.0", + "istanbul-reports": "^2.1.1", "make-dir": "^1.3.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", @@ -1536,11 +1536,11 @@ "dev": true }, "async": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "balanced-match": { @@ -1557,11 +1557,6 @@ "concat-map": "0.0.1" } }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, "caching-transform": { "version": "3.0.1", "bundled": true, @@ -1760,7 +1755,7 @@ "dev": true }, "handlebars": { - "version": "4.0.12", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { @@ -1824,14 +1819,6 @@ "bundled": true, "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, @@ -1900,11 +1887,11 @@ } }, "istanbul-reports": { - "version": "2.1.0", + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "handlebars": "^4.0.11" + "handlebars": "^4.1.0" } }, "json-parse-better-errors": { @@ -1976,13 +1963,13 @@ } }, "mem": { - "version": "4.0.0", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "p-is-promise": "^2.0.0" } }, "merge-source-map": { @@ -2044,12 +2031,12 @@ "dev": true }, "normalize-package-data": { - "version": "2.4.0", + "version": "2.5.0", "bundled": true, "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -2110,7 +2097,7 @@ "dev": true }, "p-is-promise": { - "version": "1.1.0", + "version": "2.0.0", "bundled": true, "dev": true }, @@ -2170,6 +2157,11 @@ "bundled": true, "dev": true }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, "path-type": { "version": "3.0.0", "bundled": true, @@ -2242,6 +2234,14 @@ "bundled": true, "dev": true }, + "resolve": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "resolve-from": { "version": "4.0.0", "bundled": true, From fccec73d5899b16bdc07ef76fc2827426c273b03 Mon Sep 17 00:00:00 2001 From: Reece Dunham Date: Sat, 23 Mar 2019 22:30:16 -0400 Subject: [PATCH 011/110] Build: Remove deprecated option and enable caching (#51) Makes future master branch builds faster --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8ebd5be..38dfcbd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,4 +3,4 @@ node_js: - "8" - "10" - "11" -sudo: false +cache: npm From 137a4e8a3a68a8b1309c3790a742b9a581565946 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sun, 24 Mar 2019 02:30:41 +0000 Subject: [PATCH 012/110] test: add tests for release commits (#53) --- test/rules/reviewers.js | 28 ++++++++++++++++++++++++++++ test/rules/subsystem.js | 29 ++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/test/rules/reviewers.js b/test/rules/reviewers.js index e0d4457..eed8bfc 100644 --- a/test/rules/reviewers.js +++ b/test/rules/reviewers.js @@ -35,5 +35,33 @@ This is a test` Rule.validate(context) }) + t.test('skip for release commit', (tt) => { + tt.plan(2) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' + , author: { + name: 'Evan Lucas' + , email: 'evanlucas@me.com' + , date: '2016-04-12T19:42:23Z' + } + , message: `2016-04-12, Version x.y.z + +This is a test` + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.strictSame(opts, { + id: 'reviewers' + , message: 'skipping reviewers for release commit' + , string: '' + , level: 'skip' + }) + } + + Rule.validate(context) + }) + t.end() }) diff --git a/test/rules/subsystem.js b/test/rules/subsystem.js index a00c408..5e32ebe 100644 --- a/test/rules/subsystem.js +++ b/test/rules/subsystem.js @@ -33,6 +33,34 @@ test('rule: subsystem', (t) => { Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) }) + t.test('skip for release commit', (tt) => { + tt.plan(2) + + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' + , author: { + name: 'Evan Lucas' + , email: 'evanlucas@me.com' + , date: '2016-04-12T19:42:23Z' + } + , message: '2016-04-12, Version x.y.z' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.strictSame(opts, { + id: 'subsystem' + , message: 'Release commits do not have subsystems' + , string: '' + , level: 'skip' + }) + tt.end() + } + + Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) + }) + t.test('valid', (tt) => { tt.plan(2) @@ -60,6 +88,5 @@ test('rule: subsystem', (t) => { Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) }) - t.end() }) From ad3ad7236d14a32f7de730ce7ecf5bc067deaab0 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sun, 24 Mar 2019 02:30:50 +0000 Subject: [PATCH 013/110] doc: update README.md badges (#52) Update Travis CI badge to correct URL. Remove Coveralls, which hasn't worked since this module was moved into the Node.js organization. --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b7ac253..88c3e93 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # core-validate-commit -[![Build Status](https://travis-ci.org/nodejs/core-validate-commit.svg)](https://travis-ci.org/nodejs/core-validate-commit) -[![Coverage Status](https://coveralls.io/repos/evanlucas/core-validate-commit/badge.svg?branch=master&service=github)](https://coveralls.io/github/evanlucas/core-validate-commit?branch=master) +[![Build Status](https://travis-ci.com/nodejs/core-validate-commit.svg?branch=master)](https://travis-ci.com/nodejs/core-validate-commit) Validate the commit message for a particular commit in node core From a82ac92b929b70a812ecc721f02226c68334d924 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 15 Mar 2019 10:57:40 +0100 Subject: [PATCH 014/110] rules: add quic subsystem --- lib/rules/subsystem.js | 1 + test/rules/subsystem.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 522b03e..f6d9c07 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -52,6 +52,7 @@ const validSubsystems = [ , 'process' , 'punycode' , 'querystring' +, 'quic' , 'readline' , 'repl' , 'report' diff --git a/test/rules/subsystem.js b/test/rules/subsystem.js index 5e32ebe..4c3d096 100644 --- a/test/rules/subsystem.js +++ b/test/rules/subsystem.js @@ -72,7 +72,7 @@ test('rule: subsystem', (t) => { , email: 'evanlucas@me.com' , date: '2016-04-12T19:42:23Z' } - , message: 'worker: come on, fhqwhgads' + , message: 'quic: come on, fhqwhgads' }, v) context.report = (opts) => { @@ -80,7 +80,7 @@ test('rule: subsystem', (t) => { tt.strictSame(opts, { id: 'subsystem' , message: 'valid subsystems' - , string: 'worker' + , string: 'quic' , level: 'pass' }) tt.end() From 2523fb9960ba07b1c8dd1d9c54c33ceef49bef0f Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sat, 30 Mar 2019 21:12:33 -0400 Subject: [PATCH 015/110] rules: stricter `Fixes:` URL check Only allow GitHub issue URLs, or comments or discussions from pull request URLs. --- lib/rules/fixes-url.js | 34 ++++++++- test/rules/fixes-url.js | 159 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 177 insertions(+), 16 deletions(-) diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index 953c9bb..48963be 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -1,6 +1,9 @@ 'use strict' const id = 'fixes-url' +const github = new RegExp('^https://github\.com/\\w+\/\\w+/' + + '(issues|pull)/\\d+(#issuecomment-\\d+|#discussion_r\\d+)?$' +) module.exports = { id: id @@ -21,28 +24,53 @@ module.exports = { }) return } + // Allow GitHub issues with optional comment. + // GitHub pull requests must reference a comment or discussion. for (const url of parsed.fixes) { + const match = github.exec(url) if (url[0] === '#') { // See nodejs/node#2aa376914b621018c5784104b82c13e78ee51307 // for an example const { line, column } = findLineAndColumn(context.body, url) context.report({ id: id - , message: 'Fixes must be a url, not an issue number.' + , message: 'Fixes must be a URL, not an issue number.' , string: url , line: line , column: column , level: 'fail' }) + } else if (match) { + if (match[1] === 'pull' && match[2] === undefined) { + const { line, column } = findLineAndColumn(context.body, url) + context.report({ + id: id + , message: 'Pull request URL must reference a comment or discussion.' + , string: url + , line: line + , column: column + , level: 'fail' + }) + } else { + const { line, column } = findLineAndColumn(context.body, url) + context.report({ + id: id + , message: 'Valid fixes URL.' + , string: url + , line: line + , column: column + , level: 'pass' + }) + } } else { const { line, column } = findLineAndColumn(context.body, url) context.report({ id: id - , message: 'Valid fixes url' + , message: 'Fixes must be a GitHub URL.' , string: url , line: line , column: column - , level: 'pass' + , level: 'fail' }) } } diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index 0d8a801..8456b15 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -4,28 +4,36 @@ const test = require('tap').test const Rule = require('../../lib/rules/fixes-url') const Commit = require('gitlint-parser-node') const Validator = require('../../') -const INVALID_FIXES_URL = 'Fixes must be a url, not an issue number.' + +const INVALID_PRURL = 'Pull request URL must reference a comment or discussion.' +const NOT_AN_ISSUE_NUMBER = 'Fixes must be a URL, not an issue number.' +const NOT_A_GITHUB_URL = 'Fixes must be a GitHub URL.' +const VALID_FIXES_URL = 'Valid fixes URL.' + +const makeCommit = (msg) => { + return new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' + , author: { + name: 'Evan Lucas' + , email: 'evanlucas@me.com' + , date: '2016-04-12T19:42:23Z' + } + , message: msg + }, new Validator()) +} test('rule: fixes-url', (t) => { - t.test('invalid', (tt) => { + t.test('issue number', (tt) => { tt.plan(7) - const v = new Validator() - const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `test: fix something + const context = makeCommit(`test: fix something Fixes: #1234` - }, v) + ) context.report = (opts) => { tt.pass('called report') tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, INVALID_FIXES_URL, 'message') + tt.equal(opts.message, NOT_AN_ISSUE_NUMBER, 'message') tt.equal(opts.string, '#1234', 'string') tt.equal(opts.line, 1, 'line') tt.equal(opts.column, 7, 'column') @@ -35,5 +43,130 @@ Fixes: #1234` Rule.validate(context) }) + t.test('GitHub issue URL', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/issues/1234' + const context = makeCommit(`test: fix something + +Fixes: ${url}` + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, VALID_FIXES_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('GitHub issue URL with comment', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/issues/1234#issuecomment-1234' + const context = makeCommit(`test: fix something + +Fixes: ${url}` + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, VALID_FIXES_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('GitHub PR URL', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/pull/1234' + const context = makeCommit(`test: fix something + +Fixes: ${url}` + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, INVALID_PRURL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('GitHub PR URL with comment', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/pull/1234#issuecomment-1234' + const context = makeCommit(`test: fix something + +Fixes: ${url}` + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, VALID_FIXES_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('GitHub PR URL with discussion comment', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/pull/1234#discussion_r1234' + const context = makeCommit(`test: fix something + +Fixes: ${url}` + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, VALID_FIXES_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('non-GitHub URL', (tt) => { + tt.plan(7) + const context = makeCommit(`test: fix something + +Fixes: https://nodejs.org` + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, NOT_A_GITHUB_URL, 'message') + tt.equal(opts.string, 'https://nodejs.org', 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + t.end() }) From de1e8aa6e3bd52bc28bd8fac8228fe0be19e49e7 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sat, 30 Mar 2019 21:40:41 -0400 Subject: [PATCH 016/110] rules: stricter `PR-URL:` check Only allow GitHub pull request URLs. --- lib/rules/pr-url.js | 54 +++++++++++++++++++++++++------------------ test/rules/pr-url.js | 55 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 84 insertions(+), 25 deletions(-) diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index 88562a3..83e4665 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -1,6 +1,7 @@ 'use strict' const id = 'pr-url' +const prUrl = /^https:\/\/github\.com\/\w+\/\w+\/pull\/\d+$/ module.exports = { id: id @@ -22,33 +23,42 @@ module.exports = { }) return } - if (context.prUrl) { - if (context.prUrl[0] === '#') { - // see nodejs/node#7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 - // for an example - var line = -1 - var column = -1 - for (var i = 0; i < context.body.length; i++) { - const l = context.body[i] - if (~l.indexOf('PR-URL') && ~l.indexOf(context.prUrl)) { - line = i - column = l.indexOf(context.prUrl) - } - } - context.report({ - id: id - , message: 'PR-URL must be a url, not a pr number.' - , string: context.prUrl - , line: line - , column: column - , level: 'fail' - }) + var line = -1 + var column = -1 + for (var i = 0; i < context.body.length; i++) { + const l = context.body[i] + if (~l.indexOf('PR-URL') && ~l.indexOf(context.prUrl)) { + line = i + column = l.indexOf(context.prUrl) } + } + if (context.prUrl[0] === '#') { + // see nodejs/node#7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 + // for an example + context.report({ + id: id + , message: 'PR-URL must be a URL, not a pull request number.' + , string: context.prUrl + , line: line + , column: column + , level: 'fail' + }) + } else if (!prUrl.test(context.prUrl)) { + context.report({ + id: id + , message: 'PR-URL must be a GitHub pull request URL.' + , string: context.prUrl + , line: line + , column: column + , level: 'fail' + }) } else { context.report({ id: id - , message: 'PR-URL is valid' + , message: 'PR-URL is valid.' , string: context.prUrl + , line: line + , column: column , level: 'pass' }) } diff --git a/test/rules/pr-url.js b/test/rules/pr-url.js index 3537e98..ba913a2 100644 --- a/test/rules/pr-url.js +++ b/test/rules/pr-url.js @@ -3,7 +3,9 @@ const test = require('tap').test const Rule = require('../../lib/rules/pr-url') const MISSING_PR_URL = 'Commit must have a PR-URL.' -const INVALID_PR_URL = 'PR-URL must be a url, not a pr number.' +const INVALID_PR_URL = 'PR-URL must be a GitHub pull request URL.' +const NUMERIC_PR_URL = 'PR-URL must be a URL, not a pull request number.' +const VALID_PR_URL = 'PR-URL is valid.' test('rule: pr-url', (t) => { t.test('missing', (tt) => { @@ -24,7 +26,8 @@ test('rule: pr-url', (t) => { Rule.validate(context) }) - t.test('invalid', (tt) => { + + t.test('invalid numeric', (tt) => { tt.plan(7) const context = { prUrl: '#1234' @@ -35,7 +38,7 @@ test('rule: pr-url', (t) => { , report: (opts) => { tt.pass('called report') tt.equal(opts.id, 'pr-url', 'id') - tt.equal(opts.message, INVALID_PR_URL, 'message') + tt.equal(opts.message, NUMERIC_PR_URL, 'message') tt.equal(opts.string, '#1234', 'string') tt.equal(opts.line, 1, 'line') tt.equal(opts.column, 8, 'column') @@ -46,5 +49,51 @@ test('rule: pr-url', (t) => { Rule.validate(context) }) + t.test('invalid', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/issues/1234' + const context = { + prUrl: url + , body: [ + '' + , `PR-URL: ${url}` + ] + , report: (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'pr-url', 'id') + tt.equal(opts.message, INVALID_PR_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 8, 'column') + tt.equal(opts.level, 'fail', 'level') + } + } + + Rule.validate(context) + }) + + t.test('valid', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node/pull/1234' + const context = { + prUrl: url + , body: [ + '' + , `PR-URL: ${url}` + ] + , report: (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'pr-url', 'id') + tt.equal(opts.message, VALID_PR_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 8, 'column') + tt.equal(opts.level, 'pass', 'level') + } + } + + Rule.validate(context) + }) + t.end() }) From 38d97b9912edeb6a0c6bc3a95bd5bd0bd3a01b4e Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sun, 31 Mar 2019 14:05:36 -0400 Subject: [PATCH 017/110] 3.11.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0829272..a227a81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.10.1", + "version": "3.11.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b69832b..7d76109 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.10.1", + "version": "3.11.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 50b72fc9b3125874cf6e6ef2a41ce1dea87bebd7 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 16 Apr 2019 11:32:12 +0100 Subject: [PATCH 018/110] npm audit update (#56) Update dependencies via `npm audit fix`. --- package-lock.json | 142 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index a227a81..d7d248d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ } }, "@babel/generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", - "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", "dev": true, "requires": { - "@babel/types": "^7.3.4", + "@babel/types": "^7.4.0", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", @@ -47,12 +47,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.0" } }, "@babel/highlight": { @@ -104,34 +104,34 @@ } }, "@babel/parser": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", - "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", + "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", "dev": true }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" } }, "@babel/traverse": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", - "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", + "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", + "@babel/generator": "^7.4.0", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/types": "^7.4.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" @@ -149,9 +149,9 @@ } }, "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -478,9 +478,9 @@ "dev": true }, "coveralls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", - "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", + "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", "dev": true, "requires": { "growl": "~> 1.10.0", @@ -488,7 +488,7 @@ "lcov-parse": "^0.0.10", "log-driver": "^1.2.7", "minimist": "^1.2.0", - "request": "^2.85.0" + "request": "^2.86.0" }, "dependencies": { "minimist": { @@ -730,9 +730,9 @@ "dev": true }, "esm": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.4.tgz", - "integrity": "sha512-wOuWtQCkkwD1WKQN/k3RsyGSSN+AmiUzdKftn8vaC+uV9JesYmQlODJxgXaaRz0LaaFIlUxZaUu5NPiUAjKAAA==", + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.22.tgz", + "integrity": "sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA==", "dev": true }, "espree": { @@ -926,9 +926,9 @@ "dev": true }, "function-loop": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", - "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", + "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", "dev": true }, "functional-red-black-tree": { @@ -1014,9 +1014,9 @@ }, "dependencies": { "ajv": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", - "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1250,9 +1250,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1392,18 +1392,18 @@ "dev": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "~1.38.0" } }, "mimic-fn": { @@ -2912,9 +2912,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -3085,9 +3085,9 @@ } }, "tap": { - "version": "12.5.2", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.5.2.tgz", - "integrity": "sha512-r1uXuQ39+EnnR4hqWDTKw854+2ZSGR6QUEZwVRfabqcnhoNmkPQfiJCaVyhw+DILuMcJyT2/VRTVzn6puxkJ6w==", + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/tap/-/tap-12.6.1.tgz", + "integrity": "sha512-av4rQscF4IspCJ16BM+/G6LKcKwkB6HBtixf0x0PTZQCW3KlicBy9F4SwkazbMSGMrecVWvFQFeabiy5YPhAhw==", "dev": true, "requires": { "bind-obj-methods": "^2.0.0", @@ -3097,16 +3097,16 @@ "color-support": "^1.1.0", "coveralls": "^3.0.2", "domain-browser": "^1.2.0", - "esm": "^3.2.3", + "esm": "^3.2.5", "foreground-child": "^1.3.3", "fs-exists-cached": "^1.0.0", "function-loop": "^1.0.1", "glob": "^7.1.3", "isexe": "^2.0.0", - "js-yaml": "^3.12.1", + "js-yaml": "^3.13.0", "minipass": "^2.3.5", "mkdirp": "^0.5.1", - "nyc": "^13.2.0", + "nyc": "^13.3.0", "opener": "^1.5.1", "os-homedir": "^1.0.2", "own-or": "^1.0.0", @@ -3115,7 +3115,7 @@ "signal-exit": "^3.0.0", "source-map-support": "^0.5.10", "stack-utils": "^1.0.2", - "tap-mocha-reporter": "^3.0.7", + "tap-mocha-reporter": "^3.0.9", "tap-parser": "^7.0.0", "tmatch": "^4.0.0", "trivial-deferred": "^1.0.1", @@ -3127,9 +3127,9 @@ } }, "tap-mocha-reporter": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.7.tgz", - "integrity": "sha512-GHVXJ38C3oPRpM3YUc43JlGdpVZYiKeT1fmAd3HH2+J+ZWwsNAUFvRRdoGsXLw9+gU9o+zXpBqhS/oXyRQYwlA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", + "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", "dev": true, "requires": { "color-support": "^1.1.0", @@ -3246,9 +3246,9 @@ "dev": true }, "ts-node": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", - "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", + "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", "dev": true, "requires": { "arg": "^4.1.0", @@ -3303,9 +3303,9 @@ "dev": true }, "typescript": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", - "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", + "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", "dev": true }, "unicode-length": { @@ -3424,9 +3424,9 @@ "dev": true }, "yn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", - "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", + "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", "dev": true } } diff --git a/package.json b/package.json index 7d76109..6438670 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "devDependencies": { "check-pkg": "^2.0.2", "lintit": "^6.0.1", - "tap": "^12.0.1" + "tap": "^12.6.1" }, "license": "MIT", "bin": { From 633493d492d8de6c1f902079d19a96cf69359298 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Wed, 17 Apr 2019 05:22:08 +0100 Subject: [PATCH 019/110] enable Codecov (#59) * enable Codecov * add Codecov badge to README.md --- .travis.yml | 2 ++ README.md | 1 + package.json | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 38dfcbd..bb17c48 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,3 +4,5 @@ node_js: - "10" - "11" cache: npm +script: 'npm run test-ci' +after_script: 'bash <(curl -s https://codecov.io/bash)' diff --git a/README.md b/README.md index 88c3e93..d71325b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # core-validate-commit [![Build Status](https://travis-ci.com/nodejs/core-validate-commit.svg?branch=master)](https://travis-ci.com/nodejs/core-validate-commit) +[![codecov](https://img.shields.io/codecov/c/github/nodejs/core-validate-commit.svg?style=flat-square)](https://codecov.io/gh/nodejs/core-validate-commit) Validate the commit message for a particular commit in node core diff --git a/package.json b/package.json index 6438670..a778a26 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "pretest": "lintit && check-pkg", "test": "tap -j4 --cov test/**/*.js test/*.js", - "posttest": "tap --coverage-report=text-summary" + "posttest": "tap --coverage-report=text-summary", + "test-ci": "npm run test -- --coverage-report=lcov" }, "dependencies": { "chalk": "~1.1.1", From 8e70c12903218ebdb3fdc06b460ec1be71cd7d5b Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sun, 31 Mar 2019 20:26:58 -0400 Subject: [PATCH 020/110] test: refactor test/rules/fixes-url.js Extract common code for tests that are expected to pass and tests that are expected to fail to make it easier to add future test cases. --- test/rules/fixes-url.js | 200 ++++++++++++---------------------------- 1 file changed, 60 insertions(+), 140 deletions(-) diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index 8456b15..d867e24 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -23,150 +23,70 @@ const makeCommit = (msg) => { } test('rule: fixes-url', (t) => { - t.test('issue number', (tt) => { - tt.plan(7) - const context = makeCommit(`test: fix something - -Fixes: #1234` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, NOT_AN_ISSUE_NUMBER, 'message') - tt.equal(opts.string, '#1234', 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'fail', 'level') - } - - Rule.validate(context) - }) - - t.test('GitHub issue URL', (tt) => { - tt.plan(7) - const url = 'https://github.com/nodejs/node/issues/1234' - const context = makeCommit(`test: fix something - -Fixes: ${url}` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, VALID_FIXES_URL, 'message') - tt.equal(opts.string, url, 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'pass', 'level') - } - - Rule.validate(context) - }) - - t.test('GitHub issue URL with comment', (tt) => { - tt.plan(7) - const url = 'https://github.com/nodejs/node/issues/1234#issuecomment-1234' - const context = makeCommit(`test: fix something + const valid = [ + [ 'GitHub issue URL' + , 'https://github.com/nodejs/node/issues/1234' ] + , [ 'GitHub issue URL with comment' + , 'https://github.com/nodejs/node/issues/1234#issuecomment-1234' ] + , [ 'GitHub PR URL with comment' + , 'https://github.com/nodejs/node/pull/1234#issuecomment-1234' ] + , [ 'GitHub PR URL with discussion comment' + , 'https://github.com/nodejs/node/pull/1234#discussion_r1234' ] + ] + + for (const [name, url] of valid) { + t.test(name, (tt) => { + tt.plan(7) + const context = makeCommit(`test: fix something Fixes: ${url}` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, VALID_FIXES_URL, 'message') - tt.equal(opts.string, url, 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'pass', 'level') - } - - Rule.validate(context) - }) - - t.test('GitHub PR URL', (tt) => { - tt.plan(7) - const url = 'https://github.com/nodejs/node/pull/1234' - const context = makeCommit(`test: fix something + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, VALID_FIXES_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + } + + const invalid = [ + [ 'issue number', NOT_AN_ISSUE_NUMBER + , '#1234' ] + , [ 'GitHub PR URL', INVALID_PRURL + , 'https://github.com/nodejs/node/pull/1234' ] + , [ 'non-GitHub URL', NOT_A_GITHUB_URL + , 'https://nodejs.org' ] + , [ 'not a URL or issue number', NOT_A_GITHUB_URL + , 'fhqwhgads' ] + ] + for (const [name, expected, url] of invalid) { + t.test(name, (tt) => { + tt.plan(7) + const context = makeCommit(`test: fix something Fixes: ${url}` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, INVALID_PRURL, 'message') - tt.equal(opts.string, url, 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'fail', 'level') - } - - Rule.validate(context) - }) - - t.test('GitHub PR URL with comment', (tt) => { - tt.plan(7) - const url = 'https://github.com/nodejs/node/pull/1234#issuecomment-1234' - const context = makeCommit(`test: fix something - -Fixes: ${url}` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, VALID_FIXES_URL, 'message') - tt.equal(opts.string, url, 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'pass', 'level') - } - - Rule.validate(context) - }) - - t.test('GitHub PR URL with discussion comment', (tt) => { - tt.plan(7) - const url = 'https://github.com/nodejs/node/pull/1234#discussion_r1234' - const context = makeCommit(`test: fix something - -Fixes: ${url}` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, VALID_FIXES_URL, 'message') - tt.equal(opts.string, url, 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'pass', 'level') - } - - Rule.validate(context) - }) - - t.test('non-GitHub URL', (tt) => { - tt.plan(7) - const context = makeCommit(`test: fix something - -Fixes: https://nodejs.org` - ) - - context.report = (opts) => { - tt.pass('called report') - tt.equal(opts.id, 'fixes-url', 'id') - tt.equal(opts.message, NOT_A_GITHUB_URL, 'message') - tt.equal(opts.string, 'https://nodejs.org', 'string') - tt.equal(opts.line, 1, 'line') - tt.equal(opts.column, 7, 'column') - tt.equal(opts.level, 'fail', 'level') - } - - Rule.validate(context) - }) + ) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'fixes-url', 'id') + tt.equal(opts.message, expected, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 7, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + } t.end() }) From 1d25802043eb2c299b888f34bbc3c7cebf1d7996 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Sun, 31 Mar 2019 20:51:51 -0400 Subject: [PATCH 021/110] rules: allow GitHub URLs containing hyphens GitHub user and organization names and repository names can contain hyphen characters which are not included in the `\w` regular expression character class. --- lib/rules/fixes-url.js | 2 +- lib/rules/pr-url.js | 2 +- test/rules/fixes-url.js | 10 ++++++++++ test/rules/pr-url.js | 23 +++++++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index 48963be..0c815b4 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -1,7 +1,7 @@ 'use strict' const id = 'fixes-url' -const github = new RegExp('^https://github\.com/\\w+\/\\w+/' + +const github = new RegExp('^https://github\.com/[\\w-]+\/[\\w-]+/' + '(issues|pull)/\\d+(#issuecomment-\\d+|#discussion_r\\d+)?$' ) diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index 83e4665..2c5e38b 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -1,7 +1,7 @@ 'use strict' const id = 'pr-url' -const prUrl = /^https:\/\/github\.com\/\w+\/\w+\/pull\/\d+$/ +const prUrl = /^https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+$/ module.exports = { id: id diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index d867e24..f3bcbba 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -26,8 +26,16 @@ test('rule: fixes-url', (t) => { const valid = [ [ 'GitHub issue URL' , 'https://github.com/nodejs/node/issues/1234' ] + , [ 'GitHub issue URL containing hyphen' + , 'https://github.com/nodejs/node-report/issues/1234' ] + , [ 'GitHub issue URL containing hyphen with comment' + , 'https://github.com/nodejs/node-report/issues/1234#issuecomment-1234' ] , [ 'GitHub issue URL with comment' , 'https://github.com/nodejs/node/issues/1234#issuecomment-1234' ] + , [ 'GitHub PR URL containing hyphen with comment' + , 'https://github.com/nodejs/node-report/pull/1234#issuecomment-1234' ] + , [ 'GitHub PR URL containing hyphen with discussion comment' + , 'https://github.com/nodejs/node-report/pull/1234#discussion_r1234' ] , [ 'GitHub PR URL with comment' , 'https://github.com/nodejs/node/pull/1234#issuecomment-1234' ] , [ 'GitHub PR URL with discussion comment' @@ -61,6 +69,8 @@ Fixes: ${url}` , '#1234' ] , [ 'GitHub PR URL', INVALID_PRURL , 'https://github.com/nodejs/node/pull/1234' ] + , [ 'GitHub PR URL containing hyphen', INVALID_PRURL + , 'https://github.com/nodejs/node-report/pull/1234' ] , [ 'non-GitHub URL', NOT_A_GITHUB_URL , 'https://nodejs.org' ] , [ 'not a URL or issue number', NOT_A_GITHUB_URL diff --git a/test/rules/pr-url.js b/test/rules/pr-url.js index ba913a2..8893649 100644 --- a/test/rules/pr-url.js +++ b/test/rules/pr-url.js @@ -95,5 +95,28 @@ test('rule: pr-url', (t) => { Rule.validate(context) }) + t.test('valid URL containing hyphen', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node-report/pull/1234' + const context = { + prUrl: url + , body: [ + '' + , `PR-URL: ${url}` + ] + , report: (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'pr-url', 'id') + tt.equal(opts.message, VALID_PR_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 8, 'column') + tt.equal(opts.level, 'pass', 'level') + } + } + + Rule.validate(context) + }) + t.end() }) From 6b866cd37b031bb81b017c581aa05dc04f5b68ba Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 20 May 2019 08:40:02 -0400 Subject: [PATCH 022/110] 3.11.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7d248d..b38d6ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.11.0", + "version": "3.11.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a778a26..e99c323 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.11.0", + "version": "3.11.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 2a2de85421fc28abdd6fcfc27931dbb5850329f5 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 12 Jun 2019 02:45:24 +0800 Subject: [PATCH 023/110] rules: don't check cases for `deps: V8` commits (#62) --- lib/rules/title-format.js | 25 ++++++++++++++----------- test/rules/title-format.js | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/rules/title-format.js b/lib/rules/title-format.js index 9a8753c..c070311 100644 --- a/lib/rules/title-format.js +++ b/lib/rules/title-format.js @@ -52,17 +52,20 @@ module.exports = { } } - const result = /^([^:]+?): [A-Z]/.exec(context.title) - if (result) { - context.report({ - id: id - , message: 'First word after subsystem(s) in title should be lowercase.' - , string: context.title - , line: 0 - , column: result[1].length + 3 - , level: 'fail' - }) - pass = false + const isV8 = context.title.startsWith('deps: V8:') + if (!isV8) { + const result = /^([^:]+?): [A-Z]/.exec(context.title) + if (result) { + context.report({ + id: id + , message: 'First word after subsystem(s) in title should be lowercase.' + , string: context.title + , line: 0 + , column: result[1].length + 3 + , level: 'fail' + }) + pass = false + } } if (pass) { diff --git a/test/rules/title-format.js b/test/rules/title-format.js index dcbe3d0..cc745cf 100644 --- a/test/rules/title-format.js +++ b/test/rules/title-format.js @@ -115,5 +115,23 @@ test('rule: title-format', (t) => { tt.end() }) + t.test('Skip case checks for V8 updates ', (tt) => { + tt.plan(2) + const context = makeCommit('deps: V8: cherry-pick e0a109c') + + context.report = (opts) => { + tt.pass('called report') + tt.strictSame(opts, { + id: 'title-format' + , message: 'Title is formatted correctly.' + , string: '' + , level: 'pass' + }) + } + + Rule.validate(context) + tt.end() + }) + t.end() }) From b74d527e5b53ffaabf3900d3bdd27d4e6114a568 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 12 Jun 2019 02:46:40 +0800 Subject: [PATCH 024/110] 3.11.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b38d6ea..c317682 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.11.1", + "version": "3.11.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e99c323..7c30c6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.11.1", + "version": "3.11.2", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From e076f0be0a8e60975a9030f4589f1e64ec8f3222 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 12 Jun 2019 03:08:03 +0800 Subject: [PATCH 025/110] package.json: only pack necessary files (#64) Do not pack tests into the npm package. --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 7c30c6d..0dc0561 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,11 @@ "lintit": "^6.0.1", "tap": "^12.6.1" }, + "files": [ + "lib/", + "bin/", + "index.js" + ], "license": "MIT", "bin": { "core-validate-commit": "./bin/cmd.js" From a3a5b2bd41c64b3fca3951c3822d6fd710c4c905 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 12 Jun 2019 03:23:11 +0800 Subject: [PATCH 026/110] gitignore: ignore package-lock.json (#63) This is typically used as a CLI so locking down and version-controlling the dependencies isn't really useful. --- .npmrc | 1 + package-lock.json | 3433 --------------------------------------------- 2 files changed, 1 insertion(+), 3433 deletions(-) create mode 100644 .npmrc delete mode 100644 package-lock.json diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c317682..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3433 +0,0 @@ -{ - "name": "core-validate-commit", - "version": "3.11.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", - "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", - "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", - "dev": true, - "requires": { - "@babel/types": "^7.4.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz", - "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==", - "dev": true - }, - "@babel/template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", - "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.0", - "@babel/types": "^7.4.0" - } - }, - "@babel/traverse": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz", - "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/types": "^7.4.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", - "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bind-obj-methods": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", - "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-pkg": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-pkg/-/check-pkg-2.1.1.tgz", - "integrity": "sha512-qRxuZOQxfMyRuvo8n2nCb2aIWz3Wt0OuuMUWgO1oFAP8t1+vNzJCuD+r16E2PT26l4Ff/ofIGtWMbYpnYTF4hg==", - "dev": true, - "requires": { - "chalk": "~1.1.3", - "detective": "^4.5.0", - "help": "~3.0.1", - "nopt": "~3.0.6", - "readdirp": "~2.0.0", - "resolve-from": "~2.0.0" - }, - "dependencies": { - "help": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/help/-/help-3.0.2.tgz", - "integrity": "sha1-luGQ1KCkU7icLLSwWrOOOo+f2t0=", - "dev": true - } - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "coveralls": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", - "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", - "dev": true, - "requires": { - "growl": "~> 1.10.0", - "js-yaml": "^3.11.0", - "lcov-parse": "^0.0.10", - "log-driver": "^1.2.7", - "minimist": "^1.2.0", - "request": "^2.86.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "deglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", - "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", - "dev": true, - "requires": { - "find-root": "^1.0.0", - "glob": "^7.0.5", - "ignore": "^3.0.9", - "pkg-config": "^1.1.0", - "run-parallel": "^1.1.2", - "uniq": "^1.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "esm": { - "version": "3.2.22", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.22.tgz", - "integrity": "sha512-z8YG7U44L82j1XrdEJcqZOLUnjxco8pO453gKOlaMD1/md1n/5QrscAmYG+oKUspsmDLuBFZrpbxI6aQ67yRxA==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-loop": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", - "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "gitlint-parser-base": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gitlint-parser-base/-/gitlint-parser-base-2.0.0.tgz", - "integrity": "sha1-KrFb/RxYUnMhk5BYThvlFIlZBqI=" - }, - "gitlint-parser-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gitlint-parser-node/-/gitlint-parser-node-1.1.0.tgz", - "integrity": "sha1-6cOIfowyk2LjzWrMCfLNwgsNQBM=", - "requires": { - "gitlint-parser-base": "^2.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "help": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/help/-/help-2.1.3.tgz", - "integrity": "sha1-Ff6YM4+NrdnYxy/AZ4qPcmyKFWA=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", - "dev": true, - "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lintit": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/lintit/-/lintit-6.0.1.tgz", - "integrity": "sha512-fEcq1oVVf6PbfZNk63wiEjubROU3ZRV+0IsTC/l2KcnZj/jVoUQegZP+h5gNg/fU6VxGJbnDAy1eZ5obMNdJMg==", - "dev": true, - "requires": { - "eslint": "^4.6.1", - "help": "~2.1.2", - "nopt": "~3.0.6", - "standard-engine": "^7.1.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "dev": true, - "requires": { - "mime-db": "~1.38.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", - "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", - "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "camelcase": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commander": { - "version": "2.17.1", - "bundled": true, - "dev": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "bundled": true, - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "12.0.5", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", - "dev": true - }, - "own-or-env": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", - "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", - "dev": true, - "requires": { - "own-or": "^1.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - } - }, - "pkg-config": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", - "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", - "dev": true, - "requires": { - "debug-log": "^1.0.0", - "find-root": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.1.tgz", - "integrity": "sha1-ZyqgxQE+eUKZa786OSv2mu+J1aU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "standard-engine": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.2.0.tgz", - "integrity": "sha512-4MTVXRZQjEWeD7tNt8lK1Yh7VLXbmZ/hj34uF9tpSdtYNNPosms2TLCnw/7MUl/rW1Uhx80s7CL8LtBdUtgrtw==", - "dev": true, - "requires": { - "deglob": "^2.1.0", - "get-stdin": "^5.0.1", - "minimist": "^1.1.0", - "pkg-conf": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "tap": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.6.1.tgz", - "integrity": "sha512-av4rQscF4IspCJ16BM+/G6LKcKwkB6HBtixf0x0PTZQCW3KlicBy9F4SwkazbMSGMrecVWvFQFeabiy5YPhAhw==", - "dev": true, - "requires": { - "bind-obj-methods": "^2.0.0", - "browser-process-hrtime": "^1.0.0", - "capture-stack-trace": "^1.0.0", - "clean-yaml-object": "^0.1.0", - "color-support": "^1.1.0", - "coveralls": "^3.0.2", - "domain-browser": "^1.2.0", - "esm": "^3.2.5", - "foreground-child": "^1.3.3", - "fs-exists-cached": "^1.0.0", - "function-loop": "^1.0.1", - "glob": "^7.1.3", - "isexe": "^2.0.0", - "js-yaml": "^3.13.0", - "minipass": "^2.3.5", - "mkdirp": "^0.5.1", - "nyc": "^13.3.0", - "opener": "^1.5.1", - "os-homedir": "^1.0.2", - "own-or": "^1.0.0", - "own-or-env": "^1.0.1", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.0", - "source-map-support": "^0.5.10", - "stack-utils": "^1.0.2", - "tap-mocha-reporter": "^3.0.9", - "tap-parser": "^7.0.0", - "tmatch": "^4.0.0", - "trivial-deferred": "^1.0.1", - "ts-node": "^8.0.2", - "tsame": "^2.0.1", - "typescript": "^3.3.3", - "write-file-atomic": "^2.4.2", - "yapool": "^1.0.0" - } - }, - "tap-mocha-reporter": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", - "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", - "dev": true, - "requires": { - "color-support": "^1.1.0", - "debug": "^2.1.3", - "diff": "^1.3.2", - "escape-string-regexp": "^1.0.3", - "glob": "^7.0.5", - "js-yaml": "^3.3.1", - "readable-stream": "^2.1.5", - "tap-parser": "^5.1.0", - "unicode-length": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "tap-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", - "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" - } - } - } - }, - "tap-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", - "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "minipass": "^2.2.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", - "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "trivial-deferred": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", - "dev": true - }, - "ts-node": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", - "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - }, - "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - } - } - }, - "tsame": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", - "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.3.tgz", - "integrity": "sha512-FFgHdPt4T/duxx6Ndf7hwgMZZjZpB+U0nMNGVCYPq0rEzWKjEDobm4J6yb3CS7naZ0yURFqdw9Gwc7UOh/P9oQ==", - "dev": true - }, - "unicode-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", - "dev": true, - "requires": { - "punycode": "^1.3.2", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yapool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", - "dev": true - }, - "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", - "dev": true - } - } -} From 5740678ce16bebadb2bcd3740e8f0fb566e65228 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Mon, 8 Jul 2019 11:25:32 -0700 Subject: [PATCH 027/110] subsystem: allow `gyp` as a subsystem (#65) `gyp:` has been used as subsystem tag 30 times for tools/gyp --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index f6d9c07..546efbd 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -11,6 +11,7 @@ const validSubsystems = [ , 'errors' , 'etw' , 'esm' +, 'gyp' , 'inspector' , 'lib' , 'loader' From 671125eaed9a06c24fb75bd2413c83f1d45ea6bf Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 11 Jul 2019 12:30:00 -0400 Subject: [PATCH 028/110] 3.11.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0dc0561..f908b64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.11.2", + "version": "3.11.3", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 30145f90b3aee13db506f0a66c14a6accb423419 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Mon, 15 Jul 2019 13:11:51 -0400 Subject: [PATCH 029/110] bin: add a flag to list the subsystems (#67) Adds the flag --list-subsystems to list all the subsystems that are available for use. Fixes: https://github.com/nodejs/core-validate-commit/issues/66 --- bin/cmd.js | 8 ++++++++ bin/usage.txt | 1 + lib/utils.js | 12 ++++++++++++ test/cli-test.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 test/cli-test.js diff --git a/bin/cmd.js b/bin/cmd.js index be5660e..e0fd1b1 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -14,12 +14,14 @@ const formatTap = require('../lib/format-tap') const Validator = require('../lib') const Tap = require('../lib/tap') const utils = require('../lib/utils') +const subsystem = require('../lib/rules/subsystem') const knownOpts = { help: Boolean , version: Boolean , 'validate-metadata': Boolean , tap: Boolean , out: path , list: Boolean +, 'list-subsystems': Boolean } const shortHand = { h: ['--help'] , v: ['--version'] @@ -27,6 +29,7 @@ const shortHand = { h: ['--help'] , t: ['--tap'] , o: ['--out'] , l: ['--list'] +, ls: ['--list-subsystems'] } const parsed = nopt(knownOpts, shortHand) @@ -84,6 +87,11 @@ function loadPatch(uri, cb) { const v = new Validator(parsed) +if (parsed['list-subsystems']) { + utils.describeSubsystem(subsystem.defaults.subsystems.sort()) + return +} + if (parsed.list) { const ruleNames = Array.from(v.rules.keys()) const max = ruleNames.reduce((m, item) => { diff --git a/bin/usage.txt b/bin/usage.txt index 9e68603..02ec77b 100644 --- a/bin/usage.txt +++ b/bin/usage.txt @@ -8,6 +8,7 @@ core-validate-commit - Validate the commit message for a particular commit in no -V, --validate-metadata validate PR-URL and reviewers (on by default) -t, --tap output in tap format -l, --list list rules and their descriptions + -ls --list-subsystems list the available subsystems examples: Validate a single sha: diff --git a/lib/utils.js b/lib/utils.js index 8f32e0c..49dd75d 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -45,3 +45,15 @@ exports.describeRule = function describeRule(rule, max = 20) { console.log(' %s %s', chalk.red(title), chalk.dim(desc)) } } + +exports.describeSubsystem = function describeSubsystem(subsystems, max = 20) { + if (subsystems) { + for (let sub = 0; sub < subsystems.length; sub = sub + 3) { + console.log('%s %s %s', + chalk.green(exports.leftPad(subsystems[sub] || '', max)), + chalk.green(exports.leftPad(subsystems[sub + 1] || '', max)), + chalk.green(exports.leftPad(subsystems[sub + 2] || '', max)) + ) + } + } +} diff --git a/test/cli-test.js b/test/cli-test.js new file mode 100644 index 0000000..d3baca8 --- /dev/null +++ b/test/cli-test.js @@ -0,0 +1,44 @@ +'use strict' + +const { test } = require('tap') +const { spawn } = require('child_process') +const subsystems = require('../lib/rules/subsystem') + +test('Test cli flags', (t) => { + t.test('test list-subsystems', (tt) => { + const ls = spawn('./bin/cmd.js', ['--list-subsystems']) + let compiledData = '' + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + tt.fail('This should not happen') + }) + + ls.on('close', (code) => { + // Get the list of subsytems as an Array. + // Need to match words that also have the "-" in them + const subsystemsFromOutput = compiledData.match(/[\w'-]+/g) + const defaultSubsystems = subsystems.defaults.subsystems + + tt.equal(subsystemsFromOutput.length, + defaultSubsystems.length, + 'Should have the same length') + + // Loop through the output list and compare with the real list + // to make sure they are all there + const missing = [] + subsystemsFromOutput.forEach((sub) => { + if (!defaultSubsystems.find((x) => {return x === sub})) { + missing.push(sub) + } + }) + + tt.equal(missing.length, 0, 'Should have no missing subsystems') + tt.end() + }) + }) + + t.end() +}) From 80555f47229294dfa283ff364cb905dd5e7c1fce Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 15 Jul 2019 13:13:21 -0400 Subject: [PATCH 030/110] 3.12.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f908b64..f888be8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.11.3", + "version": "3.12.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 86b9053e958823e68a08fff33b7fad20a3e14cf8 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 17 Jul 2019 14:06:59 -0400 Subject: [PATCH 031/110] docs: Update Readme with the --list-subsystem flag (#68) --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d71325b..8785a0b 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,13 @@ $ core-validate-commit --list title-format enforce commit title format title-length enforce max length of commit title ``` -Valid subsystems are defined in [lib/rules/subsystem.js](./lib/rules/subsystem.js). + +To see a list of valid subsystems: +```bash +$ core-validate-commit --list-subsystem +``` + +Valid subsystems are also defined in [lib/rules/subsystem.js](./lib/rules/subsystem.js). ## Test From 479fe81e2f7e0367051e15b35c12a2225a1af96c Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 23 Jul 2019 14:15:27 -0400 Subject: [PATCH 032/110] src: Replace var with let (#72) This replaces the usage of var with let to make the code more consistent --- bin/cmd.js | 8 ++++---- lib/format-pretty.js | 2 +- lib/rules/fixes-url.js | 2 +- lib/rules/line-length.js | 2 +- lib/rules/metadata-end.js | 2 +- lib/rules/pr-url.js | 6 +++--- lib/rules/subsystem.js | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bin/cmd.js b/bin/cmd.js index e0fd1b1..9d81059 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -61,7 +61,7 @@ function load(sha, cb) { } function loadPatch(uri, cb) { - var h = http + let h = http if (~uri.protocol.indexOf('https')) { h = https } @@ -69,7 +69,7 @@ function loadPatch(uri, cb) { 'user-agent': 'core-validate-commit' } h.get(uri, (res) => { - var buf = '' + let buf = '' res.on('data', (chunk) => { buf += chunk }) @@ -109,8 +109,8 @@ if (parsed.tap) { const tap = new Tap() tap.pipe(process.stdout) if (parsed.out) tap.pipe(fs.createWriteStream(parsed.out)) - var count = 0 - var total = args.length + let count = 0 + let total = args.length v.on('commit', (c) => { count++ diff --git a/lib/format-pretty.js b/lib/format-pretty.js index 1f351cd..72b18e5 100644 --- a/lib/format-pretty.js +++ b/lib/format-pretty.js @@ -62,7 +62,7 @@ function formatLength(msg, opts) { const str = msg.string const l = str.length if (!opts.detailed) return out - var col = msg.column || 0 + const col = msg.column || 0 const diff = str.slice(0, col) + chalk.red(str.slice(col, l)) return `${out} ${diff}` diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index 0c815b4..307c419 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -78,7 +78,7 @@ module.exports = { } function findLineAndColumn(body, str) { - for (var i = 0; i < body.length; i++) { + for (let i = 0; i < body.length; i++) { const l = body[i] if (~l.indexOf('Fixes')) { const idx = l.indexOf(str) diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index 2e19857..a59ea2a 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -28,7 +28,7 @@ module.exports = { }) return } - var failed = false + let failed = false for (let i = 0; i < parsed.body.length; i++) { const line = parsed.body[i] // Skip quoted lines, e.g. for original commit messages of V8 backports. diff --git a/lib/rules/metadata-end.js b/lib/rules/metadata-end.js index 063038b..bfe3a1a 100644 --- a/lib/rules/metadata-end.js +++ b/lib/rules/metadata-end.js @@ -17,7 +17,7 @@ module.exports = { if (end < body.length) { const extra = body.slice(end + 1) let lineNum = end + 1 - for (var i = 0; i < extra.length; i++) { + for (let i = 0; i < extra.length; i++) { if (extra[i]) { lineNum += i break diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index 2c5e38b..b42607f 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -23,9 +23,9 @@ module.exports = { }) return } - var line = -1 - var column = -1 - for (var i = 0; i < context.body.length; i++) { + let line = -1 + let column = -1 + for (let i = 0; i < context.body.length; i++) { const l = context.body[i] if (~l.indexOf('PR-URL') && ~l.indexOf(context.prUrl)) { line = i diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 546efbd..f44a5c6 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -108,7 +108,7 @@ module.exports = { }) } } else { - var failed = false + let failed = false for (const sub of parsed.subsystems) { if (!~subs.indexOf(sub)) { failed = true From 64a7a65287aaad60ffe847b85735a317eb57df7e Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 6 Aug 2019 13:49:46 -0400 Subject: [PATCH 033/110] test: add tests for padding util functions (#75) * This adds tests for both the rightPad and leftPad utility function. --- test/utils-test.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 test/utils-test.js diff --git a/test/utils-test.js b/test/utils-test.js new file mode 100644 index 0000000..9226aac --- /dev/null +++ b/test/utils-test.js @@ -0,0 +1,40 @@ +'use strict' + +const { test } = require('tap') +const utils = require('../lib/utils') + +test('test utility functions', (t) => { + t.test('test rightPad function - with padding', (tt) => { + const padded = utils.rightPad('string', 10) + tt.equal(padded.length, 11, 'should have extra padding') + tt.equal(padded, 'string ', 'should have padding on the right') + + tt.end() + }) + + t.test('test rightPad function - withou padding', (tt) => { + const padded = utils.rightPad('string', 5) + tt.equal(padded.length, 6, 'should have the same length') + tt.equal(padded, 'string', 'should have no padding on the right') + + tt.end() + }) + + t.test('test leftPad function - with padding', (tt) => { + const padded = utils.leftPad('string', 10) + tt.equal(padded.length, 11, 'should have extra padding') + tt.equal(padded, ' string', 'should have padding on the left') + + tt.end() + }) + + t.test('test leftPad function - withou padding', (tt) => { + const padded = utils.leftPad('string', 5) + tt.equal(padded.length, 6, 'should have the same length') + tt.equal(padded, 'string', 'should have no padding on the left') + + tt.end() + }) + + t.end() +}) From 3854d0748d4c3ee31270b54983c611e798b2234c Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 7 Aug 2019 13:43:17 -0400 Subject: [PATCH 034/110] test: add tests for header util functions (#76) * This adds a test for the header utility function. --- test/utils-test.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/utils-test.js b/test/utils-test.js index 9226aac..75fc869 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -3,6 +3,10 @@ const { test } = require('tap') const utils = require('../lib/utils') +// We aren't testing the chalk library, so strip off the colors/styles it adds +const stripAnsiRegex = +/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g + test('test utility functions', (t) => { t.test('test rightPad function - with padding', (tt) => { const padded = utils.rightPad('string', 10) @@ -36,5 +40,37 @@ test('test utility functions', (t) => { tt.end() }) + t.test('test headers function - skip', (tt) => { + const header = utils.header('abc123', 'skip') + tt.equal(header.replace(stripAnsiRegex, ''), + '✔ abc123 # SKIPPED', + 'should be equal') + tt.end() + }) + + t.test('test headers function - pass', (tt) => { + const header = utils.header('abc123', 'pass') + tt.equal(header.replace(stripAnsiRegex, ''), + '✔ abc123', + 'should be equal') + tt.end() + }) + + t.test('test headers function - pass', (tt) => { + const header = utils.header('abc123', 'pass') + tt.equal(header.replace(stripAnsiRegex, ''), + '✔ abc123', + 'should be equal') + tt.end() + }) + + t.test('test headers function - fail', (tt) => { + const header = utils.header('abc123', 'fail') + tt.equal(header.replace(stripAnsiRegex, ''), + '✖ abc123', + 'should be equal') + tt.end() + }) + t.end() }) From ac0737b3f8557cd8905f9965082152962f8b99de Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Tue, 13 Aug 2019 16:35:24 -0400 Subject: [PATCH 035/110] Add tests for the describeRule and describeSubsystem utility functions (#77) * test: add describeRule test * test: add describeSystem test --- test/utils-test.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/test/utils-test.js b/test/utils-test.js index 75fc869..e652c69 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -7,6 +7,8 @@ const utils = require('../lib/utils') const stripAnsiRegex = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g +const originalConsoleLog = console.log + test('test utility functions', (t) => { t.test('test rightPad function - with padding', (tt) => { const padded = utils.rightPad('string', 10) @@ -72,5 +74,51 @@ test('test utility functions', (t) => { tt.end() }) + t.test('test describeRule function', (tt) => { + function logger() { + const args = [...arguments] + tt.equal(args[1].replace(stripAnsiRegex, ''), + ' rule-id', 'has a title with padding') + tt.equal(args[2].replace(stripAnsiRegex, ''), + 'a description', 'has a description') + } + + // overrite the console.log + console.log = logger + utils.describeRule({id: 'rule-id', meta: {description: 'a description'}}) + // put it back + console.log = originalConsoleLog + tt.end() + }) + + t.test('test describeRule function - no meta data description', (tt) => { + function logger() { + tt.fails('should not reach here') + } + + // overrite the console.log + console.log = logger + utils.describeRule({id: 'rule-id', meta: {}}) + tt.pass('no return value') + + // put it back + console.log = originalConsoleLog + tt.end() + }) + + t.test('test describeSubsystem function - no subsystems', (tt) => { + function logger() { + tt.fails('should not reach here') + } + + // overrite the console.log + console.log = logger + utils.describeSubsystem() + tt.pass('no return value') + // put it back + console.log = originalConsoleLog + tt.end() + }) + t.end() }) From a9f7439bd54df231eeae6a57898872161cf8f693 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Thu, 15 Aug 2019 10:23:54 -0400 Subject: [PATCH 036/110] test: Add test for Rule class. (#74) This adds two tests for the Rules class testing the error conditions for when a rule does not have an id parameter or a validate function. --- test/rule-test.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 test/rule-test.js diff --git a/test/rule-test.js b/test/rule-test.js new file mode 100644 index 0000000..f6da50e --- /dev/null +++ b/test/rule-test.js @@ -0,0 +1,24 @@ +'use strict' + +const test = require('tap').test +const BaseRule = require('../lib/rule') + +test('Base Rule Test', (t) => { + t.test('No id param', (tt) => { + tt.throws(() => { + new BaseRule() + }, 'Rule must have an id') + + tt.end() + }) + + t.test('No validate function', (tt) => { + tt.throws(() => { + new BaseRule({id: 'test-rule'}) + }, 'Rule must have validate function') + + tt.end() + }) + + t.end() +}) From 940907b180682ac0f122a91a054bdb95bb70706e Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Thu, 24 Oct 2019 14:57:04 +0100 Subject: [PATCH 037/110] travis: update for Node.js 12 and 13 (#80) Add latest current and LTS. Drop Node.js 11. --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bb17c48..91e55ad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,8 @@ language: node_js node_js: - "8" - "10" - - "11" + - "12" + - "13" cache: npm script: 'npm run test-ci' after_script: 'bash <(curl -s https://codecov.io/bash)' From 1fc0d9ca1da7eba22c2fed4d4dcefb6d2d97f6f7 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 30 Oct 2019 13:56:35 -0700 Subject: [PATCH 038/110] lib: add cli to valid subsystems (#79) * lib: add cli to valid subsystems * fixup! lib: add cli to valid subsystems --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index f44a5c6..121fe1c 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -6,6 +6,7 @@ const validSubsystems = [ 'benchmark' , 'build' , 'bootstrap' +, 'cli' , 'deps' , 'doc' , 'errors' From 2f62ad9791f590ef958e678bd21f157ab72b8679 Mon Sep 17 00:00:00 2001 From: Lucas Holmquist Date: Wed, 30 Oct 2019 23:44:16 -0400 Subject: [PATCH 039/110] test: add a test for the version command (#78) --- test/cli-test.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/cli-test.js b/test/cli-test.js index d3baca8..3bda737 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -40,5 +40,24 @@ test('Test cli flags', (t) => { }) }) + t.test('test version flag', (tt) => { + const ls = spawn('./bin/cmd.js', ['--version']) + let compiledData = '' + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + tt.fail('This should not happen') + }) + + ls.on('close', (code) => { + tt.equal(compiledData.trim(), + `core-validate-commit v${require('../package.json').version}`, + 'output is equal') + tt.end() + }) + }) + t.end() }) From 02c2f59e282580f0f585074774f90a75c0b1952b Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Wed, 30 Oct 2019 23:47:40 -0400 Subject: [PATCH 040/110] 3.12.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f888be8..81884fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.12.0", + "version": "3.12.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 311ccb591a17cc3e9347918c5c991b65602e367d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Thu, 31 Oct 2019 17:22:59 +0100 Subject: [PATCH 041/110] chore: update dependencies (#81) --- bin/cmd.js | 6 ++++-- lib/rules/fixes-url.js | 8 ++++---- package.json | 12 ++++++------ test/cli-test.js | 8 +++++--- test/utils-test.js | 2 +- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/bin/cmd.js b/bin/cmd.js index 9d81059..fc20481 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -15,7 +15,8 @@ const Validator = require('../lib') const Tap = require('../lib/tap') const utils = require('../lib/utils') const subsystem = require('../lib/rules/subsystem') -const knownOpts = { help: Boolean +const knownOpts = { + help: Boolean , version: Boolean , 'validate-metadata': Boolean , tap: Boolean @@ -23,7 +24,8 @@ const knownOpts = { help: Boolean , list: Boolean , 'list-subsystems': Boolean } -const shortHand = { h: ['--help'] +const shortHand = { + h: ['--help'] , v: ['--version'] , V: ['--validate-metadata'] , t: ['--tap'] diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index 307c419..3b32ea7 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -31,7 +31,7 @@ module.exports = { if (url[0] === '#') { // See nodejs/node#2aa376914b621018c5784104b82c13e78ee51307 // for an example - const { line, column } = findLineAndColumn(context.body, url) + const {line, column} = findLineAndColumn(context.body, url) context.report({ id: id , message: 'Fixes must be a URL, not an issue number.' @@ -42,7 +42,7 @@ module.exports = { }) } else if (match) { if (match[1] === 'pull' && match[2] === undefined) { - const { line, column } = findLineAndColumn(context.body, url) + const {line, column} = findLineAndColumn(context.body, url) context.report({ id: id , message: 'Pull request URL must reference a comment or discussion.' @@ -52,7 +52,7 @@ module.exports = { , level: 'fail' }) } else { - const { line, column } = findLineAndColumn(context.body, url) + const {line, column} = findLineAndColumn(context.body, url) context.report({ id: id , message: 'Valid fixes URL.' @@ -63,7 +63,7 @@ module.exports = { }) } } else { - const { line, column } = findLineAndColumn(context.body, url) + const {line, column} = findLineAndColumn(context.body, url) context.report({ id: id , message: 'Fixes must be a GitHub URL.' diff --git a/package.json b/package.json index 81884fa..7ea84c7 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,15 @@ "test-ci": "npm run test -- --coverage-report=lcov" }, "dependencies": { - "chalk": "~1.1.1", + "chalk": "^2.4.2", "gitlint-parser-node": "^1.1.0", - "help": "^2.1.3", - "nopt": "^3.0.6" + "help": "^3.0.2", + "nopt": "^4.0.1" }, "devDependencies": { - "check-pkg": "^2.0.2", - "lintit": "^6.0.1", - "tap": "^12.6.1" + "check-pkg": "^2.1.1", + "lintit": "^7.2.1", + "tap": "^14.9.1" }, "files": [ "lib/", diff --git a/test/cli-test.js b/test/cli-test.js index 3bda737..e1ba08e 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -1,12 +1,14 @@ 'use strict' -const { test } = require('tap') -const { spawn } = require('child_process') +const {test} = require('tap') +const {spawn} = require('child_process') const subsystems = require('../lib/rules/subsystem') test('Test cli flags', (t) => { t.test('test list-subsystems', (tt) => { - const ls = spawn('./bin/cmd.js', ['--list-subsystems']) + const ls = spawn('./bin/cmd.js', ['--list-subsystems'], { + env: {FORCE_COLOR: 0} + }) let compiledData = '' ls.stdout.on('data', (data) => { compiledData += data diff --git a/test/utils-test.js b/test/utils-test.js index e652c69..6caf50f 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -1,6 +1,6 @@ 'use strict' -const { test } = require('tap') +const {test} = require('tap') const utils = require('../lib/utils') // We aren't testing the chalk library, so strip off the colors/styles it adds From ffaaf43ccad10f09edafbc0bbf57c5fe559ea59e Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Tue, 5 Nov 2019 18:56:24 -0500 Subject: [PATCH 042/110] lib: add wasi and wasm subsystems (#82) --- lib/rules/subsystem.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 121fe1c..4b6264c 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -25,6 +25,7 @@ const validSubsystems = [ , 'src' , 'test' , 'tools' +, 'wasm' , 'win' // core libs @@ -69,6 +70,7 @@ const validSubsystems = [ , 'util' , 'v8' , 'vm' +, 'wasi' , 'worker' , 'zlib' ] From 2b36c1f8f773a330b46283d2796054ffd4822a55 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 5 Nov 2019 18:58:43 -0500 Subject: [PATCH 043/110] 3.13.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ea84c7..093db99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.12.1", + "version": "3.13.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From d5bd393e7bfa5baaad6757437bd981774cf162eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Sun, 1 Dec 2019 11:31:10 +0100 Subject: [PATCH 044/110] chore: update dependencies (#83) Chalk is semver-major because it dropped support for Node.js 6. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 093db99..ed4b4b0 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "test-ci": "npm run test -- --coverage-report=lcov" }, "dependencies": { - "chalk": "^2.4.2", + "chalk": "^3.0.0", "gitlint-parser-node": "^1.1.0", "help": "^3.0.2", "nopt": "^4.0.1" @@ -18,7 +18,7 @@ "devDependencies": { "check-pkg": "^2.1.1", "lintit": "^7.2.1", - "tap": "^14.9.1" + "tap": "^14.10.2" }, "files": [ "lib/", From 2ddbb6d6bc0efddaeb018b9063fa691c98f22e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Tue, 10 Dec 2019 09:11:25 +0100 Subject: [PATCH 045/110] 3.13.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ed4b4b0..03a275a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.13.0", + "version": "3.13.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From d0f3d51ec52a52ec2800c572cd888262017df4f6 Mon Sep 17 00:00:00 2001 From: Tierney Cyren Date: Mon, 27 Jul 2020 12:24:16 -0400 Subject: [PATCH 046/110] chore: switch from lintit to standard style (#84) --- bin/cmd.js | 101 ++++++++--------- lib/format-pretty.js | 8 +- lib/format-tap.js | 59 +++++----- lib/index.js | 17 ++- lib/rule.js | 10 +- lib/rules/fixes-url.js | 92 +++++++-------- lib/rules/line-after-title.js | 36 +++--- lib/rules/line-length.js | 56 +++++---- lib/rules/metadata-end.js | 36 +++--- lib/rules/pr-url.js | 64 +++++------ lib/rules/reviewers.js | 44 ++++---- lib/rules/subsystem.js | 200 ++++++++++++++++----------------- lib/rules/title-format.js | 70 ++++++------ lib/rules/title-length.js | 64 +++++------ lib/tap.js | 30 ++--- lib/utils.js | 21 ++-- package.json | 4 +- test/cli-test.js | 16 +-- test/rule-test.js | 6 +- test/rules/fixes-url.js | 66 +++++------ test/rules/line-after-title.js | 42 +++---- test/rules/line-length.js | 56 ++++----- test/rules/pr-url.js | 53 +++++---- test/rules/reviewers.js | 36 +++--- test/rules/subsystem.js | 64 +++++------ test/rules/title-format.js | 76 ++++++------- test/utils-test.js | 34 +++--- test/validator.js | 8 +- 28 files changed, 681 insertions(+), 688 deletions(-) diff --git a/bin/cmd.js b/bin/cmd.js index fc20481..81eccd3 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -6,7 +6,6 @@ const exec = require('child_process').exec const fs = require('fs') const http = require('http') const https = require('https') -const url = require('url') const nopt = require('nopt') const path = require('path') const pretty = require('../lib/format-pretty') @@ -16,42 +15,42 @@ const Tap = require('../lib/tap') const utils = require('../lib/utils') const subsystem = require('../lib/rules/subsystem') const knownOpts = { - help: Boolean -, version: Boolean -, 'validate-metadata': Boolean -, tap: Boolean -, out: path -, list: Boolean -, 'list-subsystems': Boolean + help: Boolean, + version: Boolean, + 'validate-metadata': Boolean, + tap: Boolean, + out: path, + list: Boolean, + 'list-subsystems': Boolean } const shortHand = { - h: ['--help'] -, v: ['--version'] -, V: ['--validate-metadata'] -, t: ['--tap'] -, o: ['--out'] -, l: ['--list'] -, ls: ['--list-subsystems'] + h: ['--help'], + v: ['--version'], + V: ['--validate-metadata'], + t: ['--tap'], + o: ['--out'], + l: ['--list'], + ls: ['--list-subsystems'] } const parsed = nopt(knownOpts, shortHand) const usage = require('help')() if (parsed.help) { - return usage() + usage() + process.exit(0) } if (parsed.version) { console.log('core-validate-commit', 'v' + require('../package').version) - return + process.exit(0) } const args = parsed.argv.remain -if (!args.length) - args.push('HEAD') +if (!args.length) { args.push('HEAD') } -function load(sha, cb) { - const parsed = url.parse(sha) +function load (sha, cb) { + const parsed = new URL(sha) if (parsed.protocol) { return loadPatch(parsed, cb) } @@ -62,7 +61,7 @@ function load(sha, cb) { }) } -function loadPatch(uri, cb) { +function loadPatch (uri, cb) { let h = http if (~uri.protocol.indexOf('https')) { h = https @@ -91,7 +90,7 @@ const v = new Validator(parsed) if (parsed['list-subsystems']) { utils.describeSubsystem(subsystem.defaults.subsystems.sort()) - return + process.exit(0) } if (parsed.list) { @@ -104,7 +103,7 @@ if (parsed.list) { for (const rule of v.rules.values()) { utils.describeRule(rule, max) } - return + process.exit(0) } if (parsed.tap) { @@ -112,7 +111,7 @@ if (parsed.tap) { tap.pipe(process.stdout) if (parsed.out) tap.pipe(fs.createWriteStream(parsed.out)) let count = 0 - let total = args.length + const total = args.length v.on('commit', (c) => { count++ @@ -121,41 +120,39 @@ if (parsed.tap) { if (count === total) { setImmediate(() => { tap.end() - if (tap.status === 'fail') - process.exitCode = 1 + if (tap.status === 'fail') { process.exitCode = 1 } }) } }) - function run() { - if (!args.length) return - const sha = args.shift() - load(sha, (err, data) => { - if (err) throw err - v.lint(data) - run() - }) - } - - run() - + tapRun() } else { v.on('commit', (c) => { pretty(c.commit, c.messages, v) - run() + commitRun() }) - function run() { - if (!args.length) { - process.exitCode = v.errors - return - } - const sha = args.shift() - load(sha, (err, data) => { - if (err) throw err - v.lint(data) - }) - } + commitRun() +} + +function tapRun () { + if (!args.length) return + const sha = args.shift() + load(sha, (err, data) => { + if (err) throw err + v.lint(data) + tapRun() + }) +} - run() +function commitRun () { + if (!args.length) { + process.exitCode = v.errors + return + } + const sha = args.shift() + load(sha, (err, data) => { + if (err) throw err + v.lint(data) + }) } diff --git a/lib/format-pretty.js b/lib/format-pretty.js index 72b18e5..2d1dc35 100644 --- a/lib/format-pretty.js +++ b/lib/format-pretty.js @@ -5,7 +5,7 @@ const utils = require('./utils') const MAX_LINE_COL_LEN = 6 -module.exports = function formatPretty(context, msgs, validator, opts) { +module.exports = function formatPretty (context, msgs, validator, opts) { opts = Object.assign({ detailed: false }, opts) @@ -57,7 +57,7 @@ module.exports = function formatPretty(context, msgs, validator, opts) { } } -function formatLength(msg, opts) { +function formatLength (msg, opts) { const out = formatMessage(msg) const str = msg.string const l = str.length @@ -68,7 +68,7 @@ function formatLength(msg, opts) { ${diff}` } -function formatMessage(msg) { +function formatMessage (msg) { const l = msg.line || 0 const col = msg.column || 0 const pad = utils.rightPad(`${l}:${col}`, MAX_LINE_COL_LEN) @@ -83,6 +83,6 @@ function formatMessage(msg) { return ` ${icon} ${line} ${utils.rightPad(m, 40)} ${id}` } -function formatId(id) { +function formatId (id) { return chalk.red(id) } diff --git a/lib/format-tap.js b/lib/format-tap.js index f6ab300..1a6ba3d 100644 --- a/lib/format-tap.js +++ b/lib/format-tap.js @@ -1,14 +1,13 @@ 'use strict' -module.exports = function formatTap(t, context, msgs, validator) { +module.exports = function formatTap (t, context, msgs, validator) { for (const m of msgs) { switch (m.level) { - case 'pass': - const a = m.string - ? ` [${m.string}]` - : '' + case 'pass': { + const a = m.string ? ` [${m.string}]` : '' t.pass(`${m.id}: ${m.message}${a}`) break + } case 'skip': t.skip(`${m.id}: ${m.message}`) break @@ -19,7 +18,7 @@ module.exports = function formatTap(t, context, msgs, validator) { } } -function onFail(context, m, validator, t) { +function onFail (context, m, validator, t) { switch (m.id) { case 'line-length': case 'title-length': @@ -34,44 +33,44 @@ function onFail(context, m, validator, t) { } } -function lengthFail(context, m, validator, t) { +function lengthFail (context, m, validator, t) { const body = m.id === 'title-length' ? context.title : context.body t.fail(`${m.id}: ${m.message}`, { - found: m.string.length - , compare: '<=' - , wanted: m.maxLength - , at: { - line: m.line || 0 - , column: m.column || 0 - , body: body + found: m.string.length, + compare: '<=', + wanted: m.maxLength, + at: { + line: m.line || 0, + column: m.column || 0, + body: body } }) } -function subsystemFail(context, m, validator, t) { +function subsystemFail (context, m, validator, t) { t.fail(`${m.id}: ${m.message} (${m.string})`, { - found: m.string - , compare: 'indexOf() !== -1' - , wanted: m.wanted || '' - , at: { - line: m.line || 0 - , column: m.column || 0 - , body: m.title + found: m.string, + compare: 'indexOf() !== -1', + wanted: m.wanted || '', + at: { + line: m.line || 0, + column: m.column || 0, + body: m.title } }) } -function defaultFail(context, m, validator, t) { +function defaultFail (context, m, validator, t) { t.fail(`${m.id}: ${m.message} (${m.string})`, { - found: m.string - , compare: Array.isArray(m.wanted) ? 'indexOf() !== -1' : '===' - , wanted: m.wanted || '' - , at: { - line: m.line || 0 - , column: m.column || 0 - , body: context.body + found: m.string, + compare: Array.isArray(m.wanted) ? 'indexOf() !== -1' : '===', + wanted: m.wanted || '', + at: { + line: m.line || 0, + column: m.column || 0, + body: context.body } }) } diff --git a/lib/index.js b/lib/index.js index c9327f2..1ce0b03 100644 --- a/lib/index.js +++ b/lib/index.js @@ -6,7 +6,7 @@ const BaseRule = require('./rule') const RULES = require('./rules') module.exports = class ValidateCommit extends EE { - constructor(options) { + constructor (options) { super() this.opts = Object.assign({ @@ -20,7 +20,7 @@ module.exports = class ValidateCommit extends EE { this.loadBaseRules() } - loadBaseRules() { + loadBaseRules () { const keys = Object.keys(RULES) for (const key of keys) { this.rules.set(key, new BaseRule(RULES[key])) @@ -32,7 +32,7 @@ module.exports = class ValidateCommit extends EE { } } - disableRule(id) { + disableRule (id) { if (!this.rules.has(id)) { throw new TypeError(`Invalid rule: "${id}"`) } @@ -40,7 +40,7 @@ module.exports = class ValidateCommit extends EE { this.rules.get(id).disabled = true } - lint(str) { + lint (str) { if (Array.isArray(str)) { for (const item of str) { this.lint(item) @@ -54,22 +54,21 @@ module.exports = class ValidateCommit extends EE { setImmediate(() => { this.emit('commit', { - commit: commit - , messages: this.messages.get(commit.sha) || [] + commit: commit, + messages: this.messages.get(commit.sha) || [] }) }) } } - report(opts) { + report (opts) { const commit = opts.commit const sha = commit.sha if (!sha) { throw new Error('Invalid report. Missing commit sha') } - if (opts.data.level === 'fail') - this.errors++ + if (opts.data.level === 'fail') { this.errors++ } const ar = this.messages.get(sha) || [] ar.push(opts.data) this.messages.set(sha, ar) diff --git a/lib/rule.js b/lib/rule.js index aece7ed..f6e2d95 100644 --- a/lib/rule.js +++ b/lib/rule.js @@ -1,11 +1,11 @@ 'use strict' module.exports = class Rule { - constructor(opts) { + constructor (opts) { opts = Object.assign({ - options: {} - , defaults: {} - , meta: {} + options: {}, + defaults: {}, + meta: {} }, opts) if (!opts.id) { @@ -24,7 +24,7 @@ module.exports = class Rule { this._validate = opts.validate } - validate(commit) { + validate (commit) { this._validate(commit, this) } } diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index 3b32ea7..cf9129b 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -1,26 +1,26 @@ 'use strict' const id = 'fixes-url' -const github = new RegExp('^https://github\.com/[\\w-]+\/[\\w-]+/' + +const github = new RegExp('^https://github\\.com/[\\w-]+/[\\w-]+/' + '(issues|pull)/\\d+(#issuecomment-\\d+|#discussion_r\\d+)?$' ) module.exports = { - id: id -, meta: { - description: 'enforce format of Fixes URLs' - , recommended: true - } -, defaults: {} -, options: {} -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce format of Fixes URLs', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { const parsed = context.toJSON() if (!Array.isArray(parsed.fixes) || !parsed.fixes.length) { context.report({ - id: id - , message: 'skipping fixes-url' - , string: '' - , level: 'skip' + id: id, + message: 'skipping fixes-url', + string: '', + level: 'skip' }) return } @@ -31,68 +31,68 @@ module.exports = { if (url[0] === '#') { // See nodejs/node#2aa376914b621018c5784104b82c13e78ee51307 // for an example - const {line, column} = findLineAndColumn(context.body, url) + const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id - , message: 'Fixes must be a URL, not an issue number.' - , string: url - , line: line - , column: column - , level: 'fail' + id: id, + message: 'Fixes must be a URL, not an issue number.', + string: url, + line: line, + column: column, + level: 'fail' }) } else if (match) { if (match[1] === 'pull' && match[2] === undefined) { - const {line, column} = findLineAndColumn(context.body, url) + const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id - , message: 'Pull request URL must reference a comment or discussion.' - , string: url - , line: line - , column: column - , level: 'fail' + id: id, + message: 'Pull request URL must reference a comment or discussion.', + string: url, + line: line, + column: column, + level: 'fail' }) } else { - const {line, column} = findLineAndColumn(context.body, url) + const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id - , message: 'Valid fixes URL.' - , string: url - , line: line - , column: column - , level: 'pass' + id: id, + message: 'Valid fixes URL.', + string: url, + line: line, + column: column, + level: 'pass' }) } } else { - const {line, column} = findLineAndColumn(context.body, url) + const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id - , message: 'Fixes must be a GitHub URL.' - , string: url - , line: line - , column: column - , level: 'fail' + id: id, + message: 'Fixes must be a GitHub URL.', + string: url, + line: line, + column: column, + level: 'fail' }) } } } } -function findLineAndColumn(body, str) { +function findLineAndColumn (body, str) { for (let i = 0; i < body.length; i++) { const l = body[i] if (~l.indexOf('Fixes')) { const idx = l.indexOf(str) if (idx !== -1) { return { - line: i - , column: idx + line: i, + column: idx } } } } return { - line: -1 - , column: -1 + line: -1, + column: -1 } } diff --git a/lib/rules/line-after-title.js b/lib/rules/line-after-title.js index d976479..9c64f02 100644 --- a/lib/rules/line-after-title.js +++ b/lib/rules/line-after-title.js @@ -3,32 +3,32 @@ const id = 'line-after-title' module.exports = { - id: id -, meta: { - description: 'enforce a blank newline after the commit title' - , recommended: true - } -, defaults: {} -, options: {} -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce a blank newline after the commit title', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { // all commits should have a body and a blank line after the title if (context.body[0]) { context.report({ - id: id - , message: 'blank line expected after title' - , string: context.body.length ? context.body[0] : '' - , line: 1 - , column: 0 - , level: 'fail' + id: id, + message: 'blank line expected after title', + string: context.body.length ? context.body[0] : '', + line: 1, + column: 0, + level: 'fail' }) return } context.report({ - id: id - , message: 'blank line after title' - , string: '' - , level: 'pass' + id: id, + message: 'blank line after title', + string: '', + level: 'pass' }) } } diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index a59ea2a..b335d72 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -3,28 +3,28 @@ const id = 'line-length' module.exports = { - id: id -, meta: { - description: 'enforce max length of lines in commit body' - , recommended: true - } -, defaults: { + id: id, + meta: { + description: 'enforce max length of lines in commit body', + recommended: true + }, + defaults: { length: 72 - } -, options: { + }, + options: { length: 72 - } -, validate: (context, rule) => { + }, + validate: (context, rule) => { const len = rule.options.length const parsed = context.toJSON() // release commits include the notable changes from the changelog // in the commit message if (parsed.release) { context.report({ - id: id - , message: 'skipping line-length for release commit' - , string: '' - , level: 'skip' + id: id, + message: 'skipping line-length for release commit', + string: '', + level: 'skip' }) return } @@ -32,31 +32,29 @@ module.exports = { for (let i = 0; i < parsed.body.length; i++) { const line = parsed.body[i] // Skip quoted lines, e.g. for original commit messages of V8 backports. - if (line.startsWith(' ')) - continue + if (line.startsWith(' ')) { continue } // Skip lines with URLs. - if (/https?:\/\//.test(line)) - continue + if (/https?:\/\//.test(line)) { continue } if (line.length > len) { failed = true context.report({ - id: id - , message: `Line should be <= ${len} columns.` - , string: line - , maxLength: len - , line: i - , column: len - , level: 'fail' + id: id, + message: `Line should be <= ${len} columns.`, + string: line, + maxLength: len, + line: i, + column: len, + level: 'fail' }) } } if (!failed) { context.report({ - id: id - , message: 'line-lengths are valid' - , string: '' - , level: 'pass' + id: id, + message: 'line-lengths are valid', + string: '', + level: 'pass' }) } } diff --git a/lib/rules/metadata-end.js b/lib/rules/metadata-end.js index bfe3a1a..f4c9bb3 100644 --- a/lib/rules/metadata-end.js +++ b/lib/rules/metadata-end.js @@ -3,14 +3,14 @@ const id = 'metadata-end' module.exports = { - id: id -, meta: { - description: 'enforce that metadata is at the end of commit messages' - , recommended: true - } -, defaults: {} -, options: {} -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce that metadata is at the end of commit messages', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { const parsed = context.toJSON() const body = parsed.body const end = parsed.metadata.end @@ -26,22 +26,22 @@ module.exports = { if (lineNum !== end + 1) { context.report({ - id: id - , message: 'commit metadata at end of message' - , string: body[lineNum] - , line: lineNum - , column: 0 - , level: 'fail' + id: id, + message: 'commit metadata at end of message', + string: body[lineNum], + line: lineNum, + column: 0, + level: 'fail' }) return } } context.report({ - id: id - , message: 'metadata is at end of message' - , string: '' - , level: 'pass' + id: id, + message: 'metadata is at end of message', + string: '', + level: 'pass' }) } } diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index b42607f..75d2cc3 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -4,22 +4,22 @@ const id = 'pr-url' const prUrl = /^https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+$/ module.exports = { - id: id -, meta: { - description: 'enforce PR-URL' - , recommended: true - } -, defaults: {} -, options: {} -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce PR-URL', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { if (!context.prUrl) { context.report({ - id: id - , message: 'Commit must have a PR-URL.' - , string: context.prUrl - , line: 0 - , column: 0 - , level: 'fail' + id: id, + message: 'Commit must have a PR-URL.', + string: context.prUrl, + line: 0, + column: 0, + level: 'fail' }) return } @@ -36,30 +36,30 @@ module.exports = { // see nodejs/node#7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 // for an example context.report({ - id: id - , message: 'PR-URL must be a URL, not a pull request number.' - , string: context.prUrl - , line: line - , column: column - , level: 'fail' + id: id, + message: 'PR-URL must be a URL, not a pull request number.', + string: context.prUrl, + line: line, + column: column, + level: 'fail' }) } else if (!prUrl.test(context.prUrl)) { context.report({ - id: id - , message: 'PR-URL must be a GitHub pull request URL.' - , string: context.prUrl - , line: line - , column: column - , level: 'fail' + id: id, + message: 'PR-URL must be a GitHub pull request URL.', + string: context.prUrl, + line: line, + column: column, + level: 'fail' }) } else { context.report({ - id: id - , message: 'PR-URL is valid.' - , string: context.prUrl - , line: line - , column: column - , level: 'pass' + id: id, + message: 'PR-URL is valid.', + string: context.prUrl, + line: line, + column: column, + level: 'pass' }) } } diff --git a/lib/rules/reviewers.js b/lib/rules/reviewers.js index 7450210..e00cf9d 100644 --- a/lib/rules/reviewers.js +++ b/lib/rules/reviewers.js @@ -3,22 +3,22 @@ const id = 'reviewers' module.exports = { - id: id -, meta: { - description: 'enforce having reviewers' - , recommended: true - } -, defaults: {} -, options: {} -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce having reviewers', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { const parsed = context.toJSON() // release commits generally won't have any reviewers if (parsed.release) { context.report({ - id: id - , message: 'skipping reviewers for release commit' - , string: '' - , level: 'skip' + id: id, + message: 'skipping reviewers for release commit', + string: '', + level: 'skip' }) return } @@ -27,12 +27,12 @@ module.exports = { // See nodejs/node#5aac4c42da104c30d8f701f1042d61c2f06b7e6c // for an example return context.report({ - id: id - , message: 'Commit must have at least 1 reviewer.' - , string: null - , line: 0 - , column: 0 - , level: 'fail' + id: id, + message: 'Commit must have at least 1 reviewer.', + string: null, + line: 0, + column: 0, + level: 'fail' }) } @@ -42,10 +42,10 @@ module.exports = { // of strings context.report({ - id: id - , message: 'reviewers are valid' - , string: '' - , level: 'pass' + id: id, + message: 'reviewers are valid', + string: '', + level: 'pass' }) } } diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 4b6264c..2ac53aa 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -3,111 +3,111 @@ const id = 'subsystem' const validSubsystems = [ - 'benchmark' -, 'build' -, 'bootstrap' -, 'cli' -, 'deps' -, 'doc' -, 'errors' -, 'etw' -, 'esm' -, 'gyp' -, 'inspector' -, 'lib' -, 'loader' -, 'meta' -, 'msi' -, 'node' -, 'n-api' -, 'perfctr' -, 'policy' -, 'src' -, 'test' -, 'tools' -, 'wasm' -, 'win' + 'benchmark', + 'build', + 'bootstrap', + 'cli', + 'deps', + 'doc', + 'errors', + 'etw', + 'esm', + 'gyp', + 'inspector', + 'lib', + 'loader', + 'meta', + 'msi', + 'node', + 'n-api', + 'perfctr', + 'policy', + 'src', + 'test', + 'tools', + 'wasm', + 'win', // core libs -, 'assert' -, 'async_hooks' -, 'buffer' -, 'child_process' -, 'cluster' -, 'console' -, 'constants' -, 'crypto' -, 'debugger' -, 'dgram' -, 'dns' -, 'domain' -, 'events' -, 'fs' -, 'http' -, 'http2' -, 'https' -, 'inspector' -, 'module' -, 'net' -, 'os' -, 'path' -, 'perf_hooks' -, 'process' -, 'punycode' -, 'querystring' -, 'quic' -, 'readline' -, 'repl' -, 'report' -, 'stream' -, 'string_decoder' -, 'sys' -, 'timers' -, 'tls' -, 'trace_events' -, 'tty' -, 'url' -, 'util' -, 'v8' -, 'vm' -, 'wasi' -, 'worker' -, 'zlib' + 'assert', + 'async_hooks', + 'buffer', + 'child_process', + 'cluster', + 'console', + 'constants', + 'crypto', + 'debugger', + 'dgram', + 'dns', + 'domain', + 'events', + 'fs', + 'http', + 'http2', + 'https', + 'inspector', + 'module', + 'net', + 'os', + 'path', + 'perf_hooks', + 'process', + 'punycode', + 'querystring', + 'quic', + 'readline', + 'repl', + 'report', + 'stream', + 'string_decoder', + 'sys', + 'timers', + 'tls', + 'trace_events', + 'tty', + 'url', + 'util', + 'v8', + 'vm', + 'wasi', + 'worker', + 'zlib' ] module.exports = { - id: id -, meta: { - description: 'enforce subsystem validity' - , recommended: true - } -, defaults: { + id: id, + meta: { + description: 'enforce subsystem validity', + recommended: true + }, + defaults: { subsystems: validSubsystems - } -, options: { + }, + options: { subsystems: validSubsystems - } -, validate: (context, rule) => { + }, + validate: (context, rule) => { const subs = rule.options.subsystems const parsed = context.toJSON() if (!parsed.subsystems.length) { if (!parsed.release && !parsed.working) { // Missing subsystem context.report({ - id: id - , message: 'Missing subsystem.' - , string: parsed.title - , line: 0 - , column: 0 - , level: 'fail' - , wanted: subs + id: id, + message: 'Missing subsystem.', + string: parsed.title, + line: 0, + column: 0, + level: 'fail', + wanted: subs }) } else { context.report({ - id: id - , message: 'Release commits do not have subsystems' - , string: '' - , level: 'skip' + id: id, + message: 'Release commits do not have subsystems', + string: '', + level: 'skip' }) } } else { @@ -118,23 +118,23 @@ module.exports = { // invalid subsystem const column = parsed.title.indexOf(sub) context.report({ - id: id - , message: `Invalid subsystem: "${sub}"` - , string: parsed.title - , line: 0 - , column: column - , level: 'fail' - , wanted: subs + id: id, + message: `Invalid subsystem: "${sub}"`, + string: parsed.title, + line: 0, + column: column, + level: 'fail', + wanted: subs }) } } if (!failed) { context.report({ - id: id - , message: 'valid subsystems' - , string: parsed.subsystems.join(',') - , level: 'pass' + id: id, + message: 'valid subsystems', + string: parsed.subsystems.join(','), + level: 'pass' }) } } diff --git a/lib/rules/title-format.js b/lib/rules/title-format.js index c070311..da4518e 100644 --- a/lib/rules/title-format.js +++ b/lib/rules/title-format.js @@ -3,21 +3,21 @@ const id = 'title-format' module.exports = { - id: id -, meta: { - description: 'enforce commit title format' - , recommended: true - } -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce commit title format', + recommended: true + }, + validate: (context, rule) => { let pass = true - if (/[\.\?\!]$/.test(context.title)) { + if (/[.?!]$/.test(context.title)) { context.report({ - id: id - , message: 'Do not use punctuation at end of title.' - , string: context.title - , line: 0 - , column: context.title.length - , level: 'fail' + id: id, + message: 'Do not use punctuation at end of title.', + string: context.title, + line: 0, + column: context.title.length, + level: 'fail' }) pass = false } @@ -26,12 +26,12 @@ module.exports = { const result = /^([^:]+:)[^ ]/.exec(context.title) if (result) { context.report({ - id: id - , message: 'Add a space after subsystem(s).' - , string: context.title - , line: 0 - , column: result[1].length - , level: 'fail' + id: id, + message: 'Add a space after subsystem(s).', + string: context.title, + line: 0, + column: result[1].length, + level: 'fail' }) pass = false } @@ -41,12 +41,12 @@ module.exports = { const result = /\s\s/.exec(context.title) if (result) { context.report({ - id: id - , message: 'Do not use consecutive spaces in title.' - , string: context.title - , line: 0 - , column: result.index + 1 - , level: 'fail' + id: id, + message: 'Do not use consecutive spaces in title.', + string: context.title, + line: 0, + column: result.index + 1, + level: 'fail' }) pass = false } @@ -57,12 +57,12 @@ module.exports = { const result = /^([^:]+?): [A-Z]/.exec(context.title) if (result) { context.report({ - id: id - , message: 'First word after subsystem(s) in title should be lowercase.' - , string: context.title - , line: 0 - , column: result[1].length + 3 - , level: 'fail' + id: id, + message: 'First word after subsystem(s) in title should be lowercase.', + string: context.title, + line: 0, + column: result[1].length + 3, + level: 'fail' }) pass = false } @@ -70,10 +70,10 @@ module.exports = { if (pass) { context.report({ - id: id - , message: 'Title is formatted correctly.' - , string: '' - , level: 'pass' + id: id, + message: 'Title is formatted correctly.', + string: '', + level: 'pass' }) } } diff --git a/lib/rules/title-length.js b/lib/rules/title-length.js index 330105e..8b8229e 100644 --- a/lib/rules/title-length.js +++ b/lib/rules/title-length.js @@ -3,30 +3,30 @@ const id = 'title-length' module.exports = { - id: id -, meta: { - description: 'enforce max length of commit title' - , recommended: true - } -, defaults: { - length: 50 - , max_length: 72 - } -, options: { - length: 50 - , max_length: 72 - } -, validate: (context, rule) => { + id: id, + meta: { + description: 'enforce max length of commit title', + recommended: true + }, + defaults: { + length: 50, + max_length: 72 + }, + options: { + length: 50, + max_length: 72 + }, + validate: (context, rule) => { const max = rule.options.max_length if (context.title.length > max) { context.report({ - id: id - , message: `Title must be <= ${max} columns.` - , string: context.title - , maxLength: max - , line: 0 - , column: max - , level: 'fail' + id: id, + message: `Title must be <= ${max} columns.`, + string: context.title, + maxLength: max, + line: 0, + column: max, + level: 'fail' }) return } @@ -34,22 +34,22 @@ module.exports = { const len = rule.options.length if (context.title.length > len) { context.report({ - id: id - , message: `Title should be <= ${len} columns.` - , string: context.title - , maxLength: len - , line: 0 - , column: len - , level: 'warn' + id: id, + message: `Title should be <= ${len} columns.`, + string: context.title, + maxLength: len, + line: 0, + column: len, + level: 'warn' }) return } context.report({ - id: id - , message: `Title is <= ${len} columns.` - , string: '' - , level: 'pass' + id: id, + message: `Title is <= ${len} columns.`, + string: '', + level: 'pass' }) } } diff --git a/lib/tap.js b/lib/tap.js index bdfc200..aec27d5 100644 --- a/lib/tap.js +++ b/lib/tap.js @@ -3,7 +3,7 @@ const util = require('util') class Test { - constructor(tap, name) { + constructor (tap, name) { this.tap = tap this.name = name this._count = 0 @@ -13,13 +13,13 @@ class Test { this.begin() } - pass(msg) { + pass (msg) { this.tap.write(`ok ${++this._count} ${msg}`) this._passes++ this.tap.pass() } - fail(msg, extra) { + fail (msg, extra) { this.tap.write(`not ok ${++this._count} ${msg}`) if (extra) { this.tap.write(' ---') @@ -38,13 +38,13 @@ class Test { this.tap.fail() } - skip(msg) { + skip (msg) { this.tap.write(`ok ${++this._count} ${msg} # SKIP`) this._skips++ this.tap.skip() } - begin() { + begin () { this.tap.write(`# ${this.name}`) } } @@ -52,7 +52,7 @@ class Test { const Readable = require('stream').Readable module.exports = class Tap extends Readable { - constructor() { + constructor () { super() this._wroteVersion = false this._count = 0 @@ -61,7 +61,7 @@ module.exports = class Tap extends Readable { this._skips = 0 } - get status() { + get status () { if (this._failures) { return 'fail' } @@ -69,40 +69,40 @@ module.exports = class Tap extends Readable { return 'pass' } - writeVersion() { + writeVersion () { if (!this._wroteVersion) { this.write('TAP version 13') this._wroteVersion = true } } - pass() { + pass () { this._passes++ this._count++ } - fail() { + fail () { this._failures++ this._count++ } - skip() { + skip () { this._skips++ this._count++ } - write(str = '') { + write (str = '') { this.push(`${str}\n`) } - test(name) { + test (name) { const t = new Test(this, name) return t } - _read() {} + _read () {} - end() { + end () { this.write() this.write(`0..${this._count}`) this.write(`# tests ${this._count}`) diff --git a/lib/utils.js b/lib/utils.js index 49dd75d..b4ae3d8 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -9,7 +9,7 @@ exports.CHECK = CHECK exports.X = X exports.WARN = WARN -exports.rightPad = function rightPad(str, max) { +exports.rightPad = function rightPad (str, max) { const diff = max - str.length + 1 if (diff > 0) { return `${str}${' '.repeat(diff)}` @@ -17,7 +17,7 @@ exports.rightPad = function rightPad(str, max) { return str } -exports.leftPad = function leftPad(str, max) { +exports.leftPad = function leftPad (str, max) { const diff = max - str.length + 1 if (diff > 0) { return `${' '.repeat(diff)}${str}` @@ -28,17 +28,16 @@ exports.leftPad = function leftPad(str, max) { exports.header = (sha, status) => { switch (status) { case 'skip': - case 'pass': - const suffix = status === 'skip' - ? ' # SKIPPED' - : '' + case 'pass': { + const suffix = status === 'skip' ? ' # SKIPPED' : '' return `${CHECK} ${chalk.underline(sha)}${suffix}` + } case 'fail': return `${X} ${chalk.underline(sha)}` } } -exports.describeRule = function describeRule(rule, max = 20) { +exports.describeRule = function describeRule (rule, max = 20) { if (rule.meta && rule.meta.description) { const desc = rule.meta.description const title = exports.leftPad(rule.id, max) @@ -46,13 +45,13 @@ exports.describeRule = function describeRule(rule, max = 20) { } } -exports.describeSubsystem = function describeSubsystem(subsystems, max = 20) { +exports.describeSubsystem = function describeSubsystem (subsystems, max = 20) { if (subsystems) { for (let sub = 0; sub < subsystems.length; sub = sub + 3) { console.log('%s %s %s', - chalk.green(exports.leftPad(subsystems[sub] || '', max)), - chalk.green(exports.leftPad(subsystems[sub + 1] || '', max)), - chalk.green(exports.leftPad(subsystems[sub + 2] || '', max)) + chalk.green(exports.leftPad(subsystems[sub] || '', max)), + chalk.green(exports.leftPad(subsystems[sub + 1] || '', max)), + chalk.green(exports.leftPad(subsystems[sub + 2] || '', max)) ) } } diff --git a/package.json b/package.json index 03a275a..58d63b6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { - "pretest": "lintit && check-pkg", + "pretest": "standard && check-pkg", "test": "tap -j4 --cov test/**/*.js test/*.js", "posttest": "tap --coverage-report=text-summary", "test-ci": "npm run test -- --coverage-report=lcov" @@ -17,7 +17,7 @@ }, "devDependencies": { "check-pkg": "^2.1.1", - "lintit": "^7.2.1", + "standard": "^14.3.4", "tap": "^14.10.2" }, "files": [ diff --git a/test/cli-test.js b/test/cli-test.js index e1ba08e..04fc0bf 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -1,13 +1,13 @@ 'use strict' -const {test} = require('tap') -const {spawn} = require('child_process') +const { test } = require('tap') +const { spawn } = require('child_process') const subsystems = require('../lib/rules/subsystem') test('Test cli flags', (t) => { t.test('test list-subsystems', (tt) => { const ls = spawn('./bin/cmd.js', ['--list-subsystems'], { - env: {FORCE_COLOR: 0} + env: { FORCE_COLOR: 0 } }) let compiledData = '' ls.stdout.on('data', (data) => { @@ -25,14 +25,14 @@ test('Test cli flags', (t) => { const defaultSubsystems = subsystems.defaults.subsystems tt.equal(subsystemsFromOutput.length, - defaultSubsystems.length, - 'Should have the same length') + defaultSubsystems.length, + 'Should have the same length') // Loop through the output list and compare with the real list // to make sure they are all there const missing = [] subsystemsFromOutput.forEach((sub) => { - if (!defaultSubsystems.find((x) => {return x === sub})) { + if (!defaultSubsystems.find((x) => { return x === sub })) { missing.push(sub) } }) @@ -55,8 +55,8 @@ test('Test cli flags', (t) => { ls.on('close', (code) => { tt.equal(compiledData.trim(), - `core-validate-commit v${require('../package.json').version}`, - 'output is equal') + `core-validate-commit v${require('../package.json').version}`, + 'output is equal') tt.end() }) }) diff --git a/test/rule-test.js b/test/rule-test.js index f6da50e..c721676 100644 --- a/test/rule-test.js +++ b/test/rule-test.js @@ -6,7 +6,8 @@ const BaseRule = require('../lib/rule') test('Base Rule Test', (t) => { t.test('No id param', (tt) => { tt.throws(() => { - new BaseRule() + const Rule = new BaseRule() + Rule() }, 'Rule must have an id') tt.end() @@ -14,7 +15,8 @@ test('Base Rule Test', (t) => { t.test('No validate function', (tt) => { tt.throws(() => { - new BaseRule({id: 'test-rule'}) + const Rule = new BaseRule({ id: 'test-rule' }) + Rule() }, 'Rule must have validate function') tt.end() diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index f3bcbba..fe15f53 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -12,34 +12,34 @@ const VALID_FIXES_URL = 'Valid fixes URL.' const makeCommit = (msg) => { return new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: msg + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: msg }, new Validator()) } test('rule: fixes-url', (t) => { const valid = [ - [ 'GitHub issue URL' - , 'https://github.com/nodejs/node/issues/1234' ] - , [ 'GitHub issue URL containing hyphen' - , 'https://github.com/nodejs/node-report/issues/1234' ] - , [ 'GitHub issue URL containing hyphen with comment' - , 'https://github.com/nodejs/node-report/issues/1234#issuecomment-1234' ] - , [ 'GitHub issue URL with comment' - , 'https://github.com/nodejs/node/issues/1234#issuecomment-1234' ] - , [ 'GitHub PR URL containing hyphen with comment' - , 'https://github.com/nodejs/node-report/pull/1234#issuecomment-1234' ] - , [ 'GitHub PR URL containing hyphen with discussion comment' - , 'https://github.com/nodejs/node-report/pull/1234#discussion_r1234' ] - , [ 'GitHub PR URL with comment' - , 'https://github.com/nodejs/node/pull/1234#issuecomment-1234' ] - , [ 'GitHub PR URL with discussion comment' - , 'https://github.com/nodejs/node/pull/1234#discussion_r1234' ] + ['GitHub issue URL', + 'https://github.com/nodejs/node/issues/1234'], + ['GitHub issue URL containing hyphen', + 'https://github.com/nodejs/node-report/issues/1234'], + ['GitHub issue URL containing hyphen with comment', + 'https://github.com/nodejs/node-report/issues/1234#issuecomment-1234'], + ['GitHub issue URL with comment', + 'https://github.com/nodejs/node/issues/1234#issuecomment-1234'], + ['GitHub PR URL containing hyphen with comment', + 'https://github.com/nodejs/node-report/pull/1234#issuecomment-1234'], + ['GitHub PR URL containing hyphen with discussion comment', + 'https://github.com/nodejs/node-report/pull/1234#discussion_r1234'], + ['GitHub PR URL with comment', + 'https://github.com/nodejs/node/pull/1234#issuecomment-1234'], + ['GitHub PR URL with discussion comment', + 'https://github.com/nodejs/node/pull/1234#discussion_r1234'] ] for (const [name, url] of valid) { @@ -65,16 +65,16 @@ Fixes: ${url}` } const invalid = [ - [ 'issue number', NOT_AN_ISSUE_NUMBER - , '#1234' ] - , [ 'GitHub PR URL', INVALID_PRURL - , 'https://github.com/nodejs/node/pull/1234' ] - , [ 'GitHub PR URL containing hyphen', INVALID_PRURL - , 'https://github.com/nodejs/node-report/pull/1234' ] - , [ 'non-GitHub URL', NOT_A_GITHUB_URL - , 'https://nodejs.org' ] - , [ 'not a URL or issue number', NOT_A_GITHUB_URL - , 'fhqwhgads' ] + ['issue number', NOT_AN_ISSUE_NUMBER, + '#1234'], + ['GitHub PR URL', INVALID_PRURL, + 'https://github.com/nodejs/node/pull/1234'], + ['GitHub PR URL containing hyphen', INVALID_PRURL, + 'https://github.com/nodejs/node-report/pull/1234'], + ['non-GitHub URL', NOT_A_GITHUB_URL, + 'https://nodejs.org'], + ['not a URL or issue number', NOT_A_GITHUB_URL, + 'fhqwhgads'] ] for (const [name, expected, url] of invalid) { t.test(name, (tt) => { diff --git a/test/rules/line-after-title.js b/test/rules/line-after-title.js index 4b99afd..acc8008 100644 --- a/test/rules/line-after-title.js +++ b/test/rules/line-after-title.js @@ -10,13 +10,13 @@ test('rule: line-after-title', (t) => { tt.plan(7) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: 'test: fix something\nfhqwhgads' + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\nfhqwhgads' }, v) context.report = (opts) => { @@ -36,13 +36,13 @@ test('rule: line-after-title', (t) => { tt.plan(4) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: 'test: fix something\n\nfhqwhgads' + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n\nfhqwhgads' }, v) context.report = (opts) => { @@ -59,13 +59,13 @@ test('rule: line-after-title', (t) => { tt.plan(4) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: 'test: fix something' + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something' }, v) context.report = (opts) => { diff --git a/test/rules/line-length.js b/test/rules/line-length.js index 9c5fac0..50e65cb 100644 --- a/test/rules/line-length.js +++ b/test/rules/line-length.js @@ -10,13 +10,13 @@ test('rule: line-length', (t) => { tt.plan(7) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `test: fix something + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: `test: fix something ${'aaa'.repeat(30)}` }, v) @@ -41,13 +41,13 @@ ${'aaa'.repeat(30)}` t.test('release commit', (tt) => { const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `2016-01-01, Version 1.0.0 + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: `2016-01-01, Version 1.0.0 ${'aaa'.repeat(30)}` }, v) @@ -70,13 +70,13 @@ ${'aaa'.repeat(30)}` t.test('quoted lines', (tt) => { const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `src: make foo mor foo-ey + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: `src: make foo mor foo-ey Here’s the original code: @@ -104,13 +104,13 @@ That was the original code. t.test('URLs', (tt) => { const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `src: make foo mor foo-ey + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: `src: make foo mor foo-ey https://${'very-'.repeat(80)}-long-url.org/ ` diff --git a/test/rules/pr-url.js b/test/rules/pr-url.js index 8893649..3c34770 100644 --- a/test/rules/pr-url.js +++ b/test/rules/pr-url.js @@ -11,8 +11,8 @@ test('rule: pr-url', (t) => { t.test('missing', (tt) => { tt.plan(7) const context = { - prUrl: null - , report: (opts) => { + prUrl: null, + report: (opts) => { tt.pass('called report') tt.equal(opts.id, 'pr-url', 'id') tt.equal(opts.message, MISSING_PR_URL, 'message') @@ -26,16 +26,15 @@ test('rule: pr-url', (t) => { Rule.validate(context) }) - t.test('invalid numeric', (tt) => { tt.plan(7) const context = { - prUrl: '#1234' - , body: [ - '' - , 'PR-URL: #1234' - ] - , report: (opts) => { + prUrl: '#1234', + body: [ + '', + 'PR-URL: #1234' + ], + report: (opts) => { tt.pass('called report') tt.equal(opts.id, 'pr-url', 'id') tt.equal(opts.message, NUMERIC_PR_URL, 'message') @@ -53,12 +52,12 @@ test('rule: pr-url', (t) => { tt.plan(7) const url = 'https://github.com/nodejs/node/issues/1234' const context = { - prUrl: url - , body: [ - '' - , `PR-URL: ${url}` - ] - , report: (opts) => { + prUrl: url, + body: [ + '', + `PR-URL: ${url}` + ], + report: (opts) => { tt.pass('called report') tt.equal(opts.id, 'pr-url', 'id') tt.equal(opts.message, INVALID_PR_URL, 'message') @@ -76,12 +75,12 @@ test('rule: pr-url', (t) => { tt.plan(7) const url = 'https://github.com/nodejs/node/pull/1234' const context = { - prUrl: url - , body: [ - '' - , `PR-URL: ${url}` - ] - , report: (opts) => { + prUrl: url, + body: [ + '', + `PR-URL: ${url}` + ], + report: (opts) => { tt.pass('called report') tt.equal(opts.id, 'pr-url', 'id') tt.equal(opts.message, VALID_PR_URL, 'message') @@ -99,12 +98,12 @@ test('rule: pr-url', (t) => { tt.plan(7) const url = 'https://github.com/nodejs/node-report/pull/1234' const context = { - prUrl: url - , body: [ - '' - , `PR-URL: ${url}` - ] - , report: (opts) => { + prUrl: url, + body: [ + '', + `PR-URL: ${url}` + ], + report: (opts) => { tt.pass('called report') tt.equal(opts.id, 'pr-url', 'id') tt.equal(opts.message, VALID_PR_URL, 'message') diff --git a/test/rules/reviewers.js b/test/rules/reviewers.js index eed8bfc..3ad7a4c 100644 --- a/test/rules/reviewers.js +++ b/test/rules/reviewers.js @@ -11,13 +11,13 @@ test('rule: reviewers', (t) => { tt.plan(7) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `test: fix something + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: `test: fix something This is a test` }, v) @@ -39,13 +39,13 @@ This is a test` tt.plan(2) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: `2016-04-12, Version x.y.z + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: `2016-04-12, Version x.y.z This is a test` }, v) @@ -53,10 +53,10 @@ This is a test` context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'reviewers' - , message: 'skipping reviewers for release commit' - , string: '' - , level: 'skip' + id: 'reviewers', + message: 'skipping reviewers for release commit', + string: '', + level: 'skip' }) } diff --git a/test/rules/subsystem.js b/test/rules/subsystem.js index 4c3d096..9b9bef9 100644 --- a/test/rules/subsystem.js +++ b/test/rules/subsystem.js @@ -10,13 +10,13 @@ test('rule: subsystem', (t) => { tt.plan(7) const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: 'fhqwhgads: come on' + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'fhqwhgads: come on' }, v) context.report = (opts) => { @@ -30,7 +30,7 @@ test('rule: subsystem', (t) => { tt.end() } - Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) + Rule.validate(context, { options: { subsystems: Rule.defaults.subsystems } }) }) t.test('skip for release commit', (tt) => { @@ -38,27 +38,27 @@ test('rule: subsystem', (t) => { const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: '2016-04-12, Version x.y.z' + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: '2016-04-12, Version x.y.z' }, v) context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'subsystem' - , message: 'Release commits do not have subsystems' - , string: '' - , level: 'skip' + id: 'subsystem', + message: 'Release commits do not have subsystems', + string: '', + level: 'skip' }) tt.end() } - Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) + Rule.validate(context, { options: { subsystems: Rule.defaults.subsystems } }) }) t.test('valid', (tt) => { @@ -66,27 +66,27 @@ test('rule: subsystem', (t) => { const v = new Validator() const context = new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: 'quic: come on, fhqwhgads' + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'quic: come on, fhqwhgads' }, v) context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'subsystem' - , message: 'valid subsystems' - , string: 'quic' - , level: 'pass' + id: 'subsystem', + message: 'valid subsystems', + string: 'quic', + level: 'pass' }) tt.end() } - Rule.validate(context, {options: {subsystems: Rule.defaults.subsystems}}) + Rule.validate(context, { options: { subsystems: Rule.defaults.subsystems } }) }) t.end() }) diff --git a/test/rules/title-format.js b/test/rules/title-format.js index cc745cf..ab12101 100644 --- a/test/rules/title-format.js +++ b/test/rules/title-format.js @@ -5,16 +5,16 @@ const Rule = require('../../lib/rules/title-format') const Commit = require('gitlint-parser-node') const Validator = require('../../') -function makeCommit(title) { +function makeCommit (title) { const v = new Validator() return new Commit({ - sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea' - , author: { - name: 'Evan Lucas' - , email: 'evanlucas@me.com' - , date: '2016-04-12T19:42:23Z' - } - , message: title + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Evan Lucas', + email: 'evanlucas@me.com', + date: '2016-04-12T19:42:23Z' + }, + message: title }, v) } @@ -26,12 +26,12 @@ test('rule: title-format', (t) => { context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'title-format' - , message: 'Add a space after subsystem(s).' - , string: 'test:missing space' - , line: 0 - , column: 5 - , level: 'fail' + id: 'title-format', + message: 'Add a space after subsystem(s).', + string: 'test:missing space', + line: 0, + column: 5, + level: 'fail' }) } @@ -46,10 +46,10 @@ test('rule: title-format', (t) => { context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'title-format' - , message: 'Title is formatted correctly.' - , string: '' - , level: 'pass' + id: 'title-format', + message: 'Title is formatted correctly.', + string: '', + level: 'pass' }) } @@ -64,12 +64,12 @@ test('rule: title-format', (t) => { context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'title-format' - , message: 'Do not use consecutive spaces in title.' - , string: 'test: with two spaces' - , line: 0 - , column: 11 - , level: 'fail' + id: 'title-format', + message: 'Do not use consecutive spaces in title.', + string: 'test: with two spaces', + line: 0, + column: 11, + level: 'fail' }) } @@ -84,12 +84,12 @@ test('rule: title-format', (t) => { context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'title-format' - , message: 'First word after subsystem(s) in title should be lowercase.' - , string: 'test: Some message' - , line: 0 - , column: 7 - , level: 'fail' + id: 'title-format', + message: 'First word after subsystem(s) in title should be lowercase.', + string: 'test: Some message', + line: 0, + column: 7, + level: 'fail' }) } @@ -104,10 +104,10 @@ test('rule: title-format', (t) => { context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'title-format' - , message: 'Title is formatted correctly.' - , string: '' - , level: 'pass' + id: 'title-format', + message: 'Title is formatted correctly.', + string: '', + level: 'pass' }) } @@ -122,10 +122,10 @@ test('rule: title-format', (t) => { context.report = (opts) => { tt.pass('called report') tt.strictSame(opts, { - id: 'title-format' - , message: 'Title is formatted correctly.' - , string: '' - , level: 'pass' + id: 'title-format', + message: 'Title is formatted correctly.', + string: '', + level: 'pass' }) } diff --git a/test/utils-test.js b/test/utils-test.js index 6caf50f..0f57f98 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -1,11 +1,11 @@ 'use strict' -const {test} = require('tap') +const { test } = require('tap') const utils = require('../lib/utils') // We aren't testing the chalk library, so strip off the colors/styles it adds const stripAnsiRegex = -/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g +/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g // eslint-disable-line no-control-regex const originalConsoleLog = console.log @@ -45,60 +45,60 @@ test('test utility functions', (t) => { t.test('test headers function - skip', (tt) => { const header = utils.header('abc123', 'skip') tt.equal(header.replace(stripAnsiRegex, ''), - '✔ abc123 # SKIPPED', - 'should be equal') + '✔ abc123 # SKIPPED', + 'should be equal') tt.end() }) t.test('test headers function - pass', (tt) => { const header = utils.header('abc123', 'pass') tt.equal(header.replace(stripAnsiRegex, ''), - '✔ abc123', - 'should be equal') + '✔ abc123', + 'should be equal') tt.end() }) t.test('test headers function - pass', (tt) => { const header = utils.header('abc123', 'pass') tt.equal(header.replace(stripAnsiRegex, ''), - '✔ abc123', - 'should be equal') + '✔ abc123', + 'should be equal') tt.end() }) t.test('test headers function - fail', (tt) => { const header = utils.header('abc123', 'fail') tt.equal(header.replace(stripAnsiRegex, ''), - '✖ abc123', - 'should be equal') + '✖ abc123', + 'should be equal') tt.end() }) t.test('test describeRule function', (tt) => { - function logger() { + function logger () { const args = [...arguments] tt.equal(args[1].replace(stripAnsiRegex, ''), - ' rule-id', 'has a title with padding') + ' rule-id', 'has a title with padding') tt.equal(args[2].replace(stripAnsiRegex, ''), - 'a description', 'has a description') + 'a description', 'has a description') } // overrite the console.log console.log = logger - utils.describeRule({id: 'rule-id', meta: {description: 'a description'}}) + utils.describeRule({ id: 'rule-id', meta: { description: 'a description' } }) // put it back console.log = originalConsoleLog tt.end() }) t.test('test describeRule function - no meta data description', (tt) => { - function logger() { + function logger () { tt.fails('should not reach here') } // overrite the console.log console.log = logger - utils.describeRule({id: 'rule-id', meta: {}}) + utils.describeRule({ id: 'rule-id', meta: {} }) tt.pass('no return value') // put it back @@ -107,7 +107,7 @@ test('test utility functions', (t) => { }) t.test('test describeSubsystem function - no subsystems', (tt) => { - function logger() { + function logger () { tt.fails('should not reach here') } diff --git a/test/validator.js b/test/validator.js index b126bd9..fdf9b10 100644 --- a/test/validator.js +++ b/test/validator.js @@ -304,8 +304,8 @@ test('Validator - real commits', (t) => { }) tt.equal(filtered.length, 1, 'messages.length') tt.equal(filtered[0].message, - 'Do not use punctuation at end of title.', - 'message') + 'Do not use punctuation at end of title.', + 'message') tt.end() }) }) @@ -322,8 +322,8 @@ test('Validator - real commits', (t) => { }) tt.equal(filtered.length, 1, 'messages.length') tt.equal(filtered[0].message, - 'First word after subsystem(s) in title should be lowercase.', - 'message') + 'First word after subsystem(s) in title should be lowercase.', + 'message') tt.equal(filtered[0].column, 7, 'column') tt.end() }) From 2b98d02b52a0abe98054eccb351e1e5c71c81bb0 Mon Sep 17 00:00:00 2001 From: Gabriel Schulhof Date: Mon, 8 Feb 2021 04:55:03 -0800 Subject: [PATCH 047/110] lib: rename n-api to node-api (#87) `n-api` shall no longer be accepted as a subsystem. Instead, the accepted name for it shall be `node-api`. Refs: https://github.com/nodejs/abi-stable-node/issues/420 --- lib/rules/subsystem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 2ac53aa..cabf159 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -19,7 +19,7 @@ const validSubsystems = [ 'meta', 'msi', 'node', - 'n-api', + 'node-api', 'perfctr', 'policy', 'src', From c80fb55f3da23a0ec565a70b73091fabcf9bddf0 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 8 Feb 2021 12:55:57 +0000 Subject: [PATCH 048/110] 3.13.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 58d63b6..c035f0f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.13.1", + "version": "3.13.2", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From e57575c24b84329ed24bdc73510d29fa8b546eec Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 9 Feb 2021 05:55:08 -0800 Subject: [PATCH 049/110] chore: move from Travis to GitHub Actions (#89) Travis isn't running because we're out of credits. Move to GitHub Actions. --- .github/workflows/node.js.yml | 32 ++++++++++++++++++++++++++++++++ .travis.yml | 9 --------- 2 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/node.js.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..8279e10 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,32 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 15.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm run build --if-present + - run: npm run test-ci + env: + CI: true + - run: bash <(curl -s https://codecov.io/bash) diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 91e55ad..0000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: node_js -node_js: - - "8" - - "10" - - "12" - - "13" -cache: npm -script: 'npm run test-ci' -after_script: 'bash <(curl -s https://codecov.io/bash)' From 3dff15baed4f4922bf38702dee3a3ee5f73bb095 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 9 Feb 2021 12:03:06 +0000 Subject: [PATCH 050/110] bin: fix URL parsing `new URL()` throws an exception when failing to parse a URL. --- .github/workflows/node.js.yml | 3 +++ bin/cmd.js | 18 ++++++++--------- test/cli-test.js | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 8279e10..7cf0619 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -20,6 +20,9 @@ jobs: steps: - uses: actions/checkout@v2 + with: + # Need commit history test for cli-tests + fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: diff --git a/bin/cmd.js b/bin/cmd.js index 81eccd3..1f3f701 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -50,15 +50,15 @@ const args = parsed.argv.remain if (!args.length) { args.push('HEAD') } function load (sha, cb) { - const parsed = new URL(sha) - if (parsed.protocol) { + try { + const parsed = new URL(sha) return loadPatch(parsed, cb) + } catch (_) { + exec(`git show --quiet --format=medium ${sha}`, (err, stdout, stderr) => { + if (err) return cb(err) + cb(null, stdout.trim()) + }) } - - exec(`git show --quiet --format=medium ${sha}`, (err, stdout, stderr) => { - if (err) return cb(err) - cb(null, stdout.trim()) - }) } function loadPatch (uri, cb) { @@ -66,10 +66,10 @@ function loadPatch (uri, cb) { if (~uri.protocol.indexOf('https')) { h = https } - uri.headers = { + const headers = { 'user-agent': 'core-validate-commit' } - h.get(uri, (res) => { + h.get(uri, { headers }, (res) => { let buf = '' res.on('data', (chunk) => { buf += chunk diff --git a/test/cli-test.js b/test/cli-test.js index 04fc0bf..2a5f625 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -42,6 +42,44 @@ test('Test cli flags', (t) => { }) }) + t.test('test sha', (tt) => { + const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', '2b98d02b52']) + let compiledData = '' + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + tt.fail('This should not happen') + }) + + ls.on('close', (code) => { + tt.match(compiledData.trim(), + /2b98d02b52/, + 'output is as expected') + tt.end() + }) + }) + + t.test('test url', (tt) => { + const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', 'https://api.github.com/repos/nodejs/core-validate-commit/commits/2b98d02b52']) + let compiledData = '' + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + tt.fail('This should not happen') + }) + + ls.on('close', (code) => { + tt.match(compiledData.trim(), + /2b98d02b52/, + 'output is as expected') + tt.end() + }) + }) + t.test('test version flag', (tt) => { const ls = spawn('./bin/cmd.js', ['--version']) let compiledData = '' From e9fe70e23015436fd47de321085556cc1894ac6e Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 9 Feb 2021 12:44:14 +0000 Subject: [PATCH 051/110] bin: wait for help output The `help` module asynchronously pipes output to streams. Do not explicitly `process.exit` to allow the asynchronous operation to complete. --- bin/cmd.js | 3 +-- test/cli-test.js | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/bin/cmd.js b/bin/cmd.js index 1f3f701..de832e8 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -38,7 +38,6 @@ const usage = require('help')() if (parsed.help) { usage() - process.exit(0) } if (parsed.version) { @@ -47,7 +46,7 @@ if (parsed.version) { } const args = parsed.argv.remain -if (!args.length) { args.push('HEAD') } +if (!parsed.help && !args.length) { args.push('HEAD') } function load (sha, cb) { try { diff --git a/test/cli-test.js b/test/cli-test.js index 2a5f625..8729078 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -1,13 +1,14 @@ 'use strict' const { test } = require('tap') +const { readFileSync } = require('fs') const { spawn } = require('child_process') const subsystems = require('../lib/rules/subsystem') test('Test cli flags', (t) => { t.test('test list-subsystems', (tt) => { const ls = spawn('./bin/cmd.js', ['--list-subsystems'], { - env: { FORCE_COLOR: 0 } + env: { ...process.env, FORCE_COLOR: 0 } }) let compiledData = '' ls.stdout.on('data', (data) => { @@ -42,6 +43,26 @@ test('Test cli flags', (t) => { }) }) + t.test('test help output', (tt) => { + const usage = readFileSync('bin/usage.txt', { encoding: 'utf8' }) + const ls = spawn('./bin/cmd.js', ['--help']) + let compiledData = '' + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + tt.fail('This should not happen') + }) + + ls.on('close', (code) => { + tt.equal(compiledData.trim(), + usage.trim(), + '--help output is as expected') + tt.end() + }) + }) + t.test('test sha', (tt) => { const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', '2b98d02b52']) let compiledData = '' From 2572f49e0275637b3db72d761f0226eefb09e1b8 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 9 Feb 2021 16:43:07 +0000 Subject: [PATCH 052/110] 3.13.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c035f0f..06ea761 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.13.2", + "version": "3.13.3", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From ac8d141263fce44019bb3f46e3543d568ae8ca4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Mon, 5 Apr 2021 08:17:51 +0200 Subject: [PATCH 053/110] chore: update branch references to "main" (#91) --- .github/workflows/node.js.yml | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 7cf0619..b9fc8a3 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -5,9 +5,9 @@ name: Node.js CI on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] jobs: build: diff --git a/README.md b/README.md index 8785a0b..bd4acd7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # core-validate-commit -[![Build Status](https://travis-ci.com/nodejs/core-validate-commit.svg?branch=master)](https://travis-ci.com/nodejs/core-validate-commit) +[![Build Status](https://github.com/nodejs/core-validate-commit/actions/workflows/node.js.yml/badge.svg)](https://github.com/nodejs/core-validate-commit/actions/workflows/node.js.yml) [![codecov](https://img.shields.io/codecov/c/github/nodejs/core-validate-commit.svg?style=flat-square)](https://codecov.io/gh/nodejs/core-validate-commit) Validate the commit message for a particular commit in node core From 7b97be31b9036613ac17780ced62a2b1f8171a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Tue, 13 Apr 2021 07:59:57 +0200 Subject: [PATCH 054/110] rules: add "typings" subsystem (#92) Refs: https://github.com/nodejs/node/pull/38198 --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index cabf159..9c82c26 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -25,6 +25,7 @@ const validSubsystems = [ 'src', 'test', 'tools', + 'typings', 'wasm', 'win', From 1eca2be960d3e1e4d9247d1971977a822e5b2c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Tue, 13 Apr 2021 08:01:43 +0200 Subject: [PATCH 055/110] 3.13.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 06ea761..5573efa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.13.3", + "version": "3.13.4", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From f991bbcaca001490d475479ac2b208556c510e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Sun, 16 Jan 2022 21:25:53 +0100 Subject: [PATCH 056/110] rules: add co-authored-by-is-trailer (#93) This rule ensures that Co-authored-by is a trailer and does not appear at the beginning of any non-trailer lines. --- lib/rules/co-authored-by-is-trailer.js | 51 ++++++++ test/rules/co-authored-by-is-trailer.js | 157 ++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 lib/rules/co-authored-by-is-trailer.js create mode 100644 test/rules/co-authored-by-is-trailer.js diff --git a/lib/rules/co-authored-by-is-trailer.js b/lib/rules/co-authored-by-is-trailer.js new file mode 100644 index 0000000..cf31af8 --- /dev/null +++ b/lib/rules/co-authored-by-is-trailer.js @@ -0,0 +1,51 @@ +'use strict' + +const id = 'co-authored-by-is-trailer' + +module.exports = { + id: id, + meta: { + description: 'enforce that "Co-authored-by:" lines are trailers', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { + const parsed = context.toJSON() + const lines = parsed.body.map((line, i) => [line, i]) + const re = /^\s*Co-authored-by:/gi + const coauthors = lines.filter(([line]) => re.test(line)) + if (coauthors.length !== 0) { + const firstCoauthor = coauthors[0] + const emptyLines = lines.filter(([text]) => text.trim().length === 0) + // There must be at least one empty line, and the last empty line must be + // above the first Co-authored-by line. + const isTrailer = (emptyLines.length !== 0) && + emptyLines.pop()[1] < firstCoauthor[1] + if (isTrailer) { + context.report({ + id: id, + message: 'Co-authored-by is a trailer', + string: '', + level: 'pass' + }) + } else { + context.report({ + id: id, + message: 'Co-authored-by must be a trailer', + string: firstCoauthor[0], + line: firstCoauthor[1], + column: 0, + level: 'fail' + }) + } + } else { + context.report({ + id: id, + message: 'no Co-authored-by metadata', + string: '', + level: 'pass' + }) + } + } +} diff --git a/test/rules/co-authored-by-is-trailer.js b/test/rules/co-authored-by-is-trailer.js new file mode 100644 index 0000000..21b3986 --- /dev/null +++ b/test/rules/co-authored-by-is-trailer.js @@ -0,0 +1,157 @@ +'use strict' + +const test = require('tap').test +const Rule = require('../../lib/rules/co-authored-by-is-trailer') +const Commit = require('gitlint-parser-node') +const Validator = require('../../') + +test('rule: co-authored-by-is-trailer', (t) => { + t.test('no co-authors', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'fhqwhgads' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'co-authored-by-is-trailer', 'id') + tt.equal(opts.message, 'no Co-authored-by metadata', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('no empty lines above', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + 'Co-authored-by: Someone ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'co-authored-by-is-trailer', 'id') + tt.equal(opts.message, 'Co-authored-by must be a trailer', 'message') + tt.equal(opts.string, 'Co-authored-by: Someone ', 'string') + tt.equal(opts.line, 0, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('not trailer', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Co-authored-by: Someone \n' + + '\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'co-authored-by-is-trailer', 'id') + tt.equal(opts.message, 'Co-authored-by must be a trailer', 'message') + tt.equal(opts.string, 'Co-authored-by: Someone ', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('not all are trailers', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Co-authored-by: Someone \n' + + '\n' + + 'Co-authored-by: Someone Else \n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'co-authored-by-is-trailer', 'id') + tt.equal(opts.message, 'Co-authored-by must be a trailer', 'message') + tt.equal(opts.string, 'Co-authored-by: Someone ', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('is trailer', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'More description.\n' + + '\n' + + 'Co-authored-by: Someone \n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'co-authored-by-is-trailer', 'id') + tt.equal(opts.message, 'Co-authored-by is a trailer', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.end() +}) From 76384ba4cd31a0688a95e347bd38d07b8938237e Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 17 Jan 2022 19:29:44 +0000 Subject: [PATCH 057/110] 3.14.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5573efa..5fc976d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.13.4", + "version": "3.14.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 69435db261650dfc74ede6dca89acbe97ba30081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Tue, 18 Jan 2022 20:09:41 +0100 Subject: [PATCH 058/110] chore: update tested node release lines (#94) --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index b9fc8a3..9d67dd6 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 15.x] + node-version: [12.x, 14.x, 16.x, 17.x] steps: - uses: actions/checkout@v2 From 0e137d0e88e941afd6fecfc2350931416dafd854 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 1 Mar 2022 12:13:56 +0000 Subject: [PATCH 059/110] feat: point to guidelines on failure in TAP output (#95) If commit linting fails, include the URL to the commit message guidelines in the TAP output. Refs: https://github.com/nodejs/node/issues/41697 --- lib/tap.js | 2 ++ test/cli-test.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/tap.js b/lib/tap.js index aec27d5..5e847ec 100644 --- a/lib/tap.js +++ b/lib/tap.js @@ -112,6 +112,8 @@ module.exports = class Tap extends Readable { if (this._failures) { this.write(`# fail ${this._failures}`) + this.write('# Please review the commit message guidelines:') + this.write('# https://github.com/nodejs/node/blob/HEAD/doc/contributing/pull-requests.md#commit-message-guidelines') } this.push(null) diff --git a/test/cli-test.js b/test/cli-test.js index 8729078..03beaf4 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -82,6 +82,37 @@ test('Test cli flags', (t) => { }) }) + t.test('test tap output', (tt) => { + // Use a commit from this repository that does not follow the guidelines. + const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', '--tap', '69435db261']) + let compiledData = '' + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + tt.fail(`Unexpected stderr output ${data.toString()}`) + }) + + ls.on('close', (code) => { + const output = compiledData.trim() + tt.match(output, + /# 69435db261/, + 'TAP output contains the sha of the commit being linted') + tt.match(output, + /not ok \d+ subsystem: Invalid subsystem: "chore" \(chore: update tested node release lines \(#94\)\)/, + 'TAP output contains failure for subsystem') + tt.match(output, + /# fail\s+\d+/, + 'TAP output contains total failures') + tt.match(output, + /# Please review the commit message guidelines:\s# https:\/\/github.com\/nodejs\/node\/blob\/HEAD\/doc\/contributing\/pull-requests.md#commit-message-guidelines/, + 'TAP output contains pointer to commit message guidelines') + tt.equal(code, 1, 'CLI exits with non-zero code on failure') + tt.end() + }) + }) + t.test('test url', (tt) => { const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', 'https://api.github.com/repos/nodejs/core-validate-commit/commits/2b98d02b52']) let compiledData = '' From 4b63657939d7459d58a8f22d5d5040a90f7ef13b Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 1 Mar 2022 12:15:15 +0000 Subject: [PATCH 060/110] 3.15.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5fc976d..dc6b277 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.14.0", + "version": "3.15.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From e5dd8038b2f986390f628eb659110e4b7926ce31 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Tue, 15 Mar 2022 12:55:54 +0100 Subject: [PATCH 061/110] rules: add `test_runner` subsystem (#96) Refs: https://github.com/nodejs/node/pull/42325 --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 9c82c26..e90ffb3 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -63,6 +63,7 @@ const validSubsystems = [ 'stream', 'string_decoder', 'sys', + 'test_runner', 'timers', 'tls', 'trace_events', From 63c3f7574097bc12626d4d38c4e4426d3cd3fc11 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Tue, 15 Mar 2022 11:56:16 +0000 Subject: [PATCH 062/110] 3.16.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dc6b277..d31d2ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.15.0", + "version": "3.16.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From abc044eab0b0d35648be863c2f79f8ad3141ecbe Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Sun, 3 Jul 2022 13:36:08 +0530 Subject: [PATCH 063/110] rules: accept revert commit titles that were elongated by git (#99) This change ensures that the commit message linter doesn't reject revert commits that originally had commit titles with an acceptable length but were elongated during the revert process by running `git revert`. Fixes: https://github.com/nodejs/core-validate-commit/issues/97 Signed-off-by: Darshan Sen --- lib/rules/title-length.js | 5 ++- test/validator.js | 81 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/lib/rules/title-length.js b/lib/rules/title-length.js index 8b8229e..576a76b 100644 --- a/lib/rules/title-length.js +++ b/lib/rules/title-length.js @@ -17,7 +17,8 @@ module.exports = { max_length: 72 }, validate: (context, rule) => { - const max = rule.options.max_length + const isRevertCommit = /^Revert ".*"$/.test(context.title) + const max = rule.options.max_length + (isRevertCommit ? 'Revert ""'.length : 0) if (context.title.length > max) { context.report({ id: id, @@ -31,7 +32,7 @@ module.exports = { return } - const len = rule.options.length + const len = rule.options.length + (isRevertCommit ? 'Revert ""'.length : 0) if (context.title.length > len) { context.report({ id: id, diff --git a/test/validator.js b/test/validator.js index fdf9b10..991b561 100644 --- a/test/validator.js +++ b/test/validator.js @@ -25,7 +25,7 @@ const str2 = `commit b6475b9a9d0da0971eec7eb5559dff4d18a0e721 Author: Evan Lucas Date: Tue Mar 29 08:09:37 2016 -0500 - Revert "tty: don't read from console stream upon creation" + Revert "tty: do not read from the console stream upon creation" This reverts commit 461138929498f31bd35bea61aa4375a2f56cceb7. @@ -127,6 +127,42 @@ Date: Thu Mar 3 10:10:46 2016 -0600 test: Check memoryUsage properties. ` +const str10 = `commit b04fe688d5859f707cf1a5e0206967268118bf7a +Author: Darshan Sen +Date: Sun May 1 21:10:21 2022 +0530 + + Revert "bootstrap: delay the instantiation of maps in per-context scripts" + + The linked issue, https://bugs.chromium.org/p/v8/issues/detail?id=6593, + is marked as "Fixed", so I think we can revert this now. + + This reverts commit 08a9c4a996964aca909cd75fa8ecafd652c54885. + + Signed-off-by: Darshan Sen + PR-URL: https://github.com/nodejs/node/pull/42934 + Refs: https://bugs.chromium.org/p/v8/issues/detail?id=9187 + Reviewed-By: Joyee Cheung + Reviewed-By: Antoine du Hamel +` + +const str11 = `commit b04fe688d5859f707cf1a5e0206967268118bf7a +Author: Darshan Sen +Date: Sun May 1 21:10:21 2022 +0530 + + Revert "bootstrap: delay the instantiation of all maps in the per-context scripts" + + The linked issue, https://bugs.chromium.org/p/v8/issues/detail?id=6593, + is marked as "Fixed", so I think we can revert this now. + + This reverts commit 08a9c4a996964aca909cd75fa8ecafd652c54885. + + Signed-off-by: Darshan Sen + PR-URL: https://github.com/nodejs/node/pull/42934 + Refs: https://bugs.chromium.org/p/v8/issues/detail?id=9187 + Reviewed-By: Joyee Cheung + Reviewed-By: Antoine du Hamel +` + test('Validator - misc', (t) => { const v = new Validator() @@ -215,6 +251,49 @@ test('Validator - real commits', (t) => { }) }) + t.test('accept revert commit titles that are elongated by git', (tt) => { + const v = new Validator() + v.lint(str10) + v.on('commit', (data) => { + const c = data.commit.toJSON() + tt.equal(c.sha, 'b04fe688d5859f707cf1a5e0206967268118bf7a', 'sha') + tt.equal(c.date, 'Sun May 1 21:10:21 2022 +0530', 'date') + tt.deepEqual(c.subsystems, ['bootstrap'], 'subsystems') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/42934', 'pr') + tt.equal(c.revert, true, 'revert') + const msgs = data.messages + const filtered = msgs.filter((item) => { + return item.level === 'fail' + }) + tt.equal(filtered.length, 0, 'messages.length') + tt.end() + }) + }) + + t.test('reject revert commit titles whose original titles are really long', (tt) => { + const v = new Validator() + v.lint(str11) + v.on('commit', (data) => { + const c = data.commit.toJSON() + tt.equal(c.sha, 'b04fe688d5859f707cf1a5e0206967268118bf7a', 'sha') + tt.equal(c.date, 'Sun May 1 21:10:21 2022 +0530', 'date') + tt.deepEqual(c.subsystems, ['bootstrap'], 'subsystems') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/42934', 'pr') + tt.equal(c.revert, true, 'revert') + const msgs = data.messages + const filtered = msgs.filter((item) => { + return item.level === 'fail' + }) + tt.equal(filtered.length, 1, 'messages.length') + const ids = filtered.map((item) => { + return item.id + }) + const exp = ['title-length'] + tt.deepEqual(ids.sort(), exp.sort(), 'message ids') + tt.end() + }) + }) + t.test('invalid pr-url, missing subsystem', (tt) => { const v = new Validator() v.lint(str4) From 1bd5dc07b20aabfa675b3a12aa294c57d4c5be88 Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Sun, 3 Jul 2022 13:39:20 +0530 Subject: [PATCH 064/110] 3.16.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d31d2ad..de48b2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.16.0", + "version": "3.16.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From a3cb753bc1a2d57457959ffd28578c2b44aa93a4 Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Mon, 10 Oct 2022 01:55:01 -0700 Subject: [PATCH 065/110] rules: add diagnostics_channel to subsystem list (#101) --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index e90ffb3..503563d 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -40,6 +40,7 @@ const validSubsystems = [ 'crypto', 'debugger', 'dgram', + 'diagnostics_channel', 'dns', 'domain', 'events', From 758f3d7b23484f402df632dd9baf1f0bfd87115c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Mon, 10 Oct 2022 10:55:27 +0200 Subject: [PATCH 066/110] 3.17.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index de48b2c..12a6610 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.16.1", + "version": "3.17.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 7739b3204a217d0e55f46f32c56a4c2dc64c27b2 Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Tue, 25 Oct 2022 11:14:07 +0530 Subject: [PATCH 067/110] rules: accept "deps: V8" as the subsystem for revert commits (#102) The commit, https://github.com/nodejs/node/pull/45119/commits/cbb404503c9df13aaeb3dd8b345cb3f34c8c07e4, was being flagged as invalid by core-validate-commit because of this error: ```txt Error: not ok 6 title-format: First word after subsystem(s) in title should be lowercase. (Revert "deps: V8: forward declaration of `Rtl*FunctionTable`") ``` This is incorrect because "deps: V8" is a valid subsystem. This change makes sure that revert commits with such a subsystem is accepted. Signed-off-by: Darshan Sen Signed-off-by: Darshan Sen --- lib/rules/title-format.js | 15 ++++++++++----- test/validator.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/rules/title-format.js b/lib/rules/title-format.js index da4518e..b4f2a0d 100644 --- a/lib/rules/title-format.js +++ b/lib/rules/title-format.js @@ -9,8 +9,13 @@ module.exports = { recommended: true }, validate: (context, rule) => { + const isRevertCommit = /^Revert ".*"$/.test(context.title) + const revertPrefixLength = 'Revert "'.length + const titleWithoutRevertPrefix = isRevertCommit + ? context.title.substr(revertPrefixLength, + context.title.length - revertPrefixLength - 1) : context.title let pass = true - if (/[.?!]$/.test(context.title)) { + if (/[.?!]$/.test(titleWithoutRevertPrefix)) { context.report({ id: id, message: 'Do not use punctuation at end of title.', @@ -23,7 +28,7 @@ module.exports = { } { - const result = /^([^:]+:)[^ ]/.exec(context.title) + const result = /^([^:]+:)[^ ]/.exec(titleWithoutRevertPrefix) if (result) { context.report({ id: id, @@ -38,7 +43,7 @@ module.exports = { } { - const result = /\s\s/.exec(context.title) + const result = /\s\s/.exec(titleWithoutRevertPrefix) if (result) { context.report({ id: id, @@ -52,9 +57,9 @@ module.exports = { } } - const isV8 = context.title.startsWith('deps: V8:') + const isV8 = titleWithoutRevertPrefix.startsWith('deps: V8:') if (!isV8) { - const result = /^([^:]+?): [A-Z]/.exec(context.title) + const result = /^([^:]+?): [A-Z]/.exec(titleWithoutRevertPrefix) if (result) { context.report({ id: id, diff --git a/test/validator.js b/test/validator.js index 991b561..b569efb 100644 --- a/test/validator.js +++ b/test/validator.js @@ -163,6 +163,15 @@ Date: Sun May 1 21:10:21 2022 +0530 Reviewed-By: Antoine du Hamel ` +const str12 = `commit cbb404503c9df13aaeb3dd8b345cb3f34c8c07e4 +Author: Michaël Zasso +Date: Sat Oct 22 10:22:43 2022 +0200 + + Revert "deps: V8: forward declaration of \`Rtl*FunctionTable\`" + + This reverts commit 01bc8e6fd81314e76c7fb0d09e5310f609e48bee. +` + test('Validator - misc', (t) => { const v = new Validator() @@ -294,6 +303,26 @@ test('Validator - real commits', (t) => { }) }) + t.test('accept deps: V8 as the subsystem for revert commits', (tt) => { + const v = new Validator({ + 'validate-metadata': false + }) + v.lint(str12) + v.on('commit', (data) => { + const c = data.commit.toJSON() + tt.equal(c.sha, 'cbb404503c9df13aaeb3dd8b345cb3f34c8c07e4', 'sha') + tt.equal(c.date, 'Sat Oct 22 10:22:43 2022 +0200', 'date') + tt.deepEqual(c.subsystems, ['deps'], 'subsystems') + tt.equal(c.revert, true, 'revert') + const msgs = data.messages + const filtered = msgs.filter((item) => { + return item.level === 'fail' + }) + tt.equal(filtered.length, 0, 'messages.length') + tt.end() + }) + }) + t.test('invalid pr-url, missing subsystem', (tt) => { const v = new Validator() v.lint(str4) From fa47c55c46e2f9d39ebd740b31e0f27a369617ee Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Tue, 25 Oct 2022 11:15:05 +0530 Subject: [PATCH 068/110] 3.17.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 12a6610..6c89047 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.17.0", + "version": "3.17.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From bfadfb00d1cc2ac4e65d318473960c447b26d36d Mon Sep 17 00:00:00 2001 From: Moshe Atlow Date: Mon, 7 Nov 2022 03:17:28 +0200 Subject: [PATCH 069/110] rules: add `watch` subsystem (#103) --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 503563d..a910baf 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -27,6 +27,7 @@ const validSubsystems = [ 'tools', 'typings', 'wasm', + 'watch', 'win', // core libs From 9a1f726a1f9a9ccfa66c53b8aa36f7c5c3de309c Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sun, 6 Nov 2022 17:31:14 -0800 Subject: [PATCH 070/110] 3.18.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6c89047..7225e4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.17.1", + "version": "3.18.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 38b491045235616280832c31d18bed6ddea0a8c5 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 14 Nov 2022 10:53:11 -0800 Subject: [PATCH 071/110] chore: update tap@14 to tap@15 (#104) --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7225e4e..a422373 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "main": "index.js", "scripts": { "pretest": "standard && check-pkg", - "test": "tap -j4 --cov test/**/*.js test/*.js", - "posttest": "tap --coverage-report=text-summary", - "test-ci": "npm run test -- --coverage-report=lcov" + "test": "tap -j4 --no-check-coverage --cov test/**/*.js test/*.js", + "posttest": "tap --no-check-coverage --coverage-report=text-summary", + "test-ci": "npm run test -- --no-check-coverage --coverage-report=lcov" }, "dependencies": { "chalk": "^3.0.0", @@ -18,7 +18,7 @@ "devDependencies": { "check-pkg": "^2.1.1", "standard": "^14.3.4", - "tap": "^14.10.2" + "tap": "^15.2.3" }, "files": [ "lib/", From af79aa3f1555d46b404d3287a0a29172834b4e37 Mon Sep 17 00:00:00 2001 From: Rafael Gonzaga Date: Mon, 6 Mar 2023 15:44:52 -0300 Subject: [PATCH 072/110] rules: add `permission` subsystem (#105) --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index a910baf..05c221f 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -21,6 +21,7 @@ const validSubsystems = [ 'node', 'node-api', 'perfctr', + 'permission', 'policy', 'src', 'test', From d54f34fbec256fc2db795c99ccaf9869d59a76e8 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 10:50:35 -0800 Subject: [PATCH 073/110] 3.19.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a422373..d7654ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.18.0", + "version": "3.19.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From e1c0c186e7388e17e30807286f8b7058602ee5f1 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 10:55:57 -0800 Subject: [PATCH 074/110] chore: bump standard from 14.x to 17.0.0 (#106) * chore: adjust code for update to linter * chore: bump standard from 14.x to 17.0.0 --- lib/format-tap.js | 2 +- lib/index.js | 2 +- lib/rules/co-authored-by-is-trailer.js | 8 ++++---- lib/rules/fixes-url.js | 28 +++++++++++++------------- lib/rules/line-after-title.js | 6 +++--- lib/rules/line-length.js | 8 ++++---- lib/rules/metadata-end.js | 6 +++--- lib/rules/pr-url.js | 22 ++++++++++---------- lib/rules/reviewers.js | 8 ++++---- lib/rules/subsystem.js | 12 +++++------ lib/rules/title-format.js | 15 +++++++------- lib/rules/title-length.js | 8 ++++---- package.json | 2 +- 13 files changed, 64 insertions(+), 63 deletions(-) diff --git a/lib/format-tap.js b/lib/format-tap.js index 1a6ba3d..d93ce01 100644 --- a/lib/format-tap.js +++ b/lib/format-tap.js @@ -44,7 +44,7 @@ function lengthFail (context, m, validator, t) { at: { line: m.line || 0, column: m.column || 0, - body: body + body } }) } diff --git a/lib/index.js b/lib/index.js index 1ce0b03..6afc938 100644 --- a/lib/index.js +++ b/lib/index.js @@ -54,7 +54,7 @@ module.exports = class ValidateCommit extends EE { setImmediate(() => { this.emit('commit', { - commit: commit, + commit, messages: this.messages.get(commit.sha) || [] }) }) diff --git a/lib/rules/co-authored-by-is-trailer.js b/lib/rules/co-authored-by-is-trailer.js index cf31af8..8bbeb2e 100644 --- a/lib/rules/co-authored-by-is-trailer.js +++ b/lib/rules/co-authored-by-is-trailer.js @@ -3,7 +3,7 @@ const id = 'co-authored-by-is-trailer' module.exports = { - id: id, + id, meta: { description: 'enforce that "Co-authored-by:" lines are trailers', recommended: true @@ -24,14 +24,14 @@ module.exports = { emptyLines.pop()[1] < firstCoauthor[1] if (isTrailer) { context.report({ - id: id, + id, message: 'Co-authored-by is a trailer', string: '', level: 'pass' }) } else { context.report({ - id: id, + id, message: 'Co-authored-by must be a trailer', string: firstCoauthor[0], line: firstCoauthor[1], @@ -41,7 +41,7 @@ module.exports = { } } else { context.report({ - id: id, + id, message: 'no Co-authored-by metadata', string: '', level: 'pass' diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index cf9129b..dceda7c 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -6,7 +6,7 @@ const github = new RegExp('^https://github\\.com/[\\w-]+/[\\w-]+/' + ) module.exports = { - id: id, + id, meta: { description: 'enforce format of Fixes URLs', recommended: true @@ -17,7 +17,7 @@ module.exports = { const parsed = context.toJSON() if (!Array.isArray(parsed.fixes) || !parsed.fixes.length) { context.report({ - id: id, + id, message: 'skipping fixes-url', string: '', level: 'skip' @@ -33,43 +33,43 @@ module.exports = { // for an example const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id, + id, message: 'Fixes must be a URL, not an issue number.', string: url, - line: line, - column: column, + line, + column, level: 'fail' }) } else if (match) { if (match[1] === 'pull' && match[2] === undefined) { const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id, + id, message: 'Pull request URL must reference a comment or discussion.', string: url, - line: line, - column: column, + line, + column, level: 'fail' }) } else { const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id, + id, message: 'Valid fixes URL.', string: url, - line: line, - column: column, + line, + column, level: 'pass' }) } } else { const { line, column } = findLineAndColumn(context.body, url) context.report({ - id: id, + id, message: 'Fixes must be a GitHub URL.', string: url, - line: line, - column: column, + line, + column, level: 'fail' }) } diff --git a/lib/rules/line-after-title.js b/lib/rules/line-after-title.js index 9c64f02..6b710eb 100644 --- a/lib/rules/line-after-title.js +++ b/lib/rules/line-after-title.js @@ -3,7 +3,7 @@ const id = 'line-after-title' module.exports = { - id: id, + id, meta: { description: 'enforce a blank newline after the commit title', recommended: true @@ -14,7 +14,7 @@ module.exports = { // all commits should have a body and a blank line after the title if (context.body[0]) { context.report({ - id: id, + id, message: 'blank line expected after title', string: context.body.length ? context.body[0] : '', line: 1, @@ -25,7 +25,7 @@ module.exports = { } context.report({ - id: id, + id, message: 'blank line after title', string: '', level: 'pass' diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index b335d72..44cbcbb 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -3,7 +3,7 @@ const id = 'line-length' module.exports = { - id: id, + id, meta: { description: 'enforce max length of lines in commit body', recommended: true @@ -21,7 +21,7 @@ module.exports = { // in the commit message if (parsed.release) { context.report({ - id: id, + id, message: 'skipping line-length for release commit', string: '', level: 'skip' @@ -38,7 +38,7 @@ module.exports = { if (line.length > len) { failed = true context.report({ - id: id, + id, message: `Line should be <= ${len} columns.`, string: line, maxLength: len, @@ -51,7 +51,7 @@ module.exports = { if (!failed) { context.report({ - id: id, + id, message: 'line-lengths are valid', string: '', level: 'pass' diff --git a/lib/rules/metadata-end.js b/lib/rules/metadata-end.js index f4c9bb3..240e468 100644 --- a/lib/rules/metadata-end.js +++ b/lib/rules/metadata-end.js @@ -3,7 +3,7 @@ const id = 'metadata-end' module.exports = { - id: id, + id, meta: { description: 'enforce that metadata is at the end of commit messages', recommended: true @@ -26,7 +26,7 @@ module.exports = { if (lineNum !== end + 1) { context.report({ - id: id, + id, message: 'commit metadata at end of message', string: body[lineNum], line: lineNum, @@ -38,7 +38,7 @@ module.exports = { } context.report({ - id: id, + id, message: 'metadata is at end of message', string: '', level: 'pass' diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index 75d2cc3..d4855a2 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -4,7 +4,7 @@ const id = 'pr-url' const prUrl = /^https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+$/ module.exports = { - id: id, + id, meta: { description: 'enforce PR-URL', recommended: true @@ -14,7 +14,7 @@ module.exports = { validate: (context, rule) => { if (!context.prUrl) { context.report({ - id: id, + id, message: 'Commit must have a PR-URL.', string: context.prUrl, line: 0, @@ -36,29 +36,29 @@ module.exports = { // see nodejs/node#7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 // for an example context.report({ - id: id, + id, message: 'PR-URL must be a URL, not a pull request number.', string: context.prUrl, - line: line, - column: column, + line, + column, level: 'fail' }) } else if (!prUrl.test(context.prUrl)) { context.report({ - id: id, + id, message: 'PR-URL must be a GitHub pull request URL.', string: context.prUrl, - line: line, - column: column, + line, + column, level: 'fail' }) } else { context.report({ - id: id, + id, message: 'PR-URL is valid.', string: context.prUrl, - line: line, - column: column, + line, + column, level: 'pass' }) } diff --git a/lib/rules/reviewers.js b/lib/rules/reviewers.js index e00cf9d..8ba5519 100644 --- a/lib/rules/reviewers.js +++ b/lib/rules/reviewers.js @@ -3,7 +3,7 @@ const id = 'reviewers' module.exports = { - id: id, + id, meta: { description: 'enforce having reviewers', recommended: true @@ -15,7 +15,7 @@ module.exports = { // release commits generally won't have any reviewers if (parsed.release) { context.report({ - id: id, + id, message: 'skipping reviewers for release commit', string: '', level: 'skip' @@ -27,7 +27,7 @@ module.exports = { // See nodejs/node#5aac4c42da104c30d8f701f1042d61c2f06b7e6c // for an example return context.report({ - id: id, + id, message: 'Commit must have at least 1 reviewer.', string: null, line: 0, @@ -42,7 +42,7 @@ module.exports = { // of strings context.report({ - id: id, + id, message: 'reviewers are valid', string: '', level: 'pass' diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 05c221f..498422b 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -81,7 +81,7 @@ const validSubsystems = [ ] module.exports = { - id: id, + id, meta: { description: 'enforce subsystem validity', recommended: true @@ -99,7 +99,7 @@ module.exports = { if (!parsed.release && !parsed.working) { // Missing subsystem context.report({ - id: id, + id, message: 'Missing subsystem.', string: parsed.title, line: 0, @@ -109,7 +109,7 @@ module.exports = { }) } else { context.report({ - id: id, + id, message: 'Release commits do not have subsystems', string: '', level: 'skip' @@ -123,11 +123,11 @@ module.exports = { // invalid subsystem const column = parsed.title.indexOf(sub) context.report({ - id: id, + id, message: `Invalid subsystem: "${sub}"`, string: parsed.title, line: 0, - column: column, + column, level: 'fail', wanted: subs }) @@ -136,7 +136,7 @@ module.exports = { if (!failed) { context.report({ - id: id, + id, message: 'valid subsystems', string: parsed.subsystems.join(','), level: 'pass' diff --git a/lib/rules/title-format.js b/lib/rules/title-format.js index b4f2a0d..096a48e 100644 --- a/lib/rules/title-format.js +++ b/lib/rules/title-format.js @@ -3,7 +3,7 @@ const id = 'title-format' module.exports = { - id: id, + id, meta: { description: 'enforce commit title format', recommended: true @@ -13,11 +13,12 @@ module.exports = { const revertPrefixLength = 'Revert "'.length const titleWithoutRevertPrefix = isRevertCommit ? context.title.substr(revertPrefixLength, - context.title.length - revertPrefixLength - 1) : context.title + context.title.length - revertPrefixLength - 1) + : context.title let pass = true if (/[.?!]$/.test(titleWithoutRevertPrefix)) { context.report({ - id: id, + id, message: 'Do not use punctuation at end of title.', string: context.title, line: 0, @@ -31,7 +32,7 @@ module.exports = { const result = /^([^:]+:)[^ ]/.exec(titleWithoutRevertPrefix) if (result) { context.report({ - id: id, + id, message: 'Add a space after subsystem(s).', string: context.title, line: 0, @@ -46,7 +47,7 @@ module.exports = { const result = /\s\s/.exec(titleWithoutRevertPrefix) if (result) { context.report({ - id: id, + id, message: 'Do not use consecutive spaces in title.', string: context.title, line: 0, @@ -62,7 +63,7 @@ module.exports = { const result = /^([^:]+?): [A-Z]/.exec(titleWithoutRevertPrefix) if (result) { context.report({ - id: id, + id, message: 'First word after subsystem(s) in title should be lowercase.', string: context.title, line: 0, @@ -75,7 +76,7 @@ module.exports = { if (pass) { context.report({ - id: id, + id, message: 'Title is formatted correctly.', string: '', level: 'pass' diff --git a/lib/rules/title-length.js b/lib/rules/title-length.js index 576a76b..2ca7523 100644 --- a/lib/rules/title-length.js +++ b/lib/rules/title-length.js @@ -3,7 +3,7 @@ const id = 'title-length' module.exports = { - id: id, + id, meta: { description: 'enforce max length of commit title', recommended: true @@ -21,7 +21,7 @@ module.exports = { const max = rule.options.max_length + (isRevertCommit ? 'Revert ""'.length : 0) if (context.title.length > max) { context.report({ - id: id, + id, message: `Title must be <= ${max} columns.`, string: context.title, maxLength: max, @@ -35,7 +35,7 @@ module.exports = { const len = rule.options.length + (isRevertCommit ? 'Revert ""'.length : 0) if (context.title.length > len) { context.report({ - id: id, + id, message: `Title should be <= ${len} columns.`, string: context.title, maxLength: len, @@ -47,7 +47,7 @@ module.exports = { } context.report({ - id: id, + id, message: `Title is <= ${len} columns.`, string: '', level: 'pass' diff --git a/package.json b/package.json index d7654ce..63b39c5 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "devDependencies": { "check-pkg": "^2.1.1", - "standard": "^14.3.4", + "standard": "^17.0.0", "tap": "^15.2.3" }, "files": [ From af841efaa3f3797a14406c4ef6000bee493ecfcf Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 13:59:53 -0800 Subject: [PATCH 075/110] chore: add Node.js 18.x and 19.x to test matrix (#107) --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 9d67dd6..999e5e0 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 16.x, 17.x] + node-version: [12.x, 14.x, 16.x, 17.x, 18.x, 19.x] steps: - uses: actions/checkout@v2 From f7039a1418da4bc9dc0bb5d126be1b9e74a49ea5 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 14:07:27 -0800 Subject: [PATCH 076/110] chore: update tap 15.x to 16.x (#108) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63b39c5..fb4daa9 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "devDependencies": { "check-pkg": "^2.1.1", "standard": "^17.0.0", - "tap": "^15.2.3" + "tap": "^16.3.4" }, "files": [ "lib/", From 39d08ff2505280a74ea51a29df32401f29ac2460 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 14:14:11 -0800 Subject: [PATCH 077/110] chore: update v2 actions to v3 (#110) --- .github/workflows/node.js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 999e5e0..0850438 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -19,12 +19,12 @@ jobs: node-version: [12.x, 14.x, 16.x, 17.x, 18.x, 19.x] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: # Need commit history test for cli-tests fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm install From 1828946b4b49d1470c54d2ddddc3964fbb865ed1 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 14:15:14 -0800 Subject: [PATCH 078/110] chore: replace deprecated tap deepEqual() with same() (#109) --- test/validator.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/validator.js b/test/validator.js index b569efb..03ac1a6 100644 --- a/test/validator.js +++ b/test/validator.js @@ -199,7 +199,7 @@ test('Validator - real commits', (t) => { v.on('commit', (data) => { const c = data.commit tt.equal(c.sha, 'e7c077c610afa371430180fbd447bfef60ebc5ea', 'sha') - tt.deepEqual(c.subsystems, ['stream'], 'subsystems') + tt.same(c.subsystems, ['stream'], 'subsystems') tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/6170', 'pr') const msgs = data.messages const failed = msgs.filter((item) => { @@ -222,7 +222,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, 'b6475b9a9d0da0971eec7eb5559dff4d18a0e721', 'sha') tt.equal(c.date, 'Tue Mar 29 08:09:37 2016 -0500', 'date') - tt.deepEqual(c.subsystems, ['tty'], 'subsystems') + tt.same(c.subsystems, ['tty'], 'subsystems') tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/5947', 'pr') tt.equal(c.revert, true, 'revert') const msgs = data.messages @@ -243,7 +243,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, '75487f0db80e70a3e27fabfe323a33258dfbbea8', 'sha') tt.equal(c.date, 'Fri Apr 15 13:32:36 2016 +0200', 'date') - tt.deepEqual(c.subsystems, ['module'], 'subsystems') + tt.same(c.subsystems, ['module'], 'subsystems') tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/6215', 'pr') tt.equal(c.revert, false, 'revert') const msgs = data.messages @@ -255,7 +255,7 @@ test('Validator - real commits', (t) => { return item.id }) const exp = ['line-length', 'title-length'] - tt.deepEqual(ids.sort(), exp.sort(), 'message ids') + tt.same(ids.sort(), exp.sort(), 'message ids') tt.end() }) }) @@ -267,7 +267,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, 'b04fe688d5859f707cf1a5e0206967268118bf7a', 'sha') tt.equal(c.date, 'Sun May 1 21:10:21 2022 +0530', 'date') - tt.deepEqual(c.subsystems, ['bootstrap'], 'subsystems') + tt.same(c.subsystems, ['bootstrap'], 'subsystems') tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/42934', 'pr') tt.equal(c.revert, true, 'revert') const msgs = data.messages @@ -286,7 +286,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, 'b04fe688d5859f707cf1a5e0206967268118bf7a', 'sha') tt.equal(c.date, 'Sun May 1 21:10:21 2022 +0530', 'date') - tt.deepEqual(c.subsystems, ['bootstrap'], 'subsystems') + tt.same(c.subsystems, ['bootstrap'], 'subsystems') tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/42934', 'pr') tt.equal(c.revert, true, 'revert') const msgs = data.messages @@ -298,7 +298,7 @@ test('Validator - real commits', (t) => { return item.id }) const exp = ['title-length'] - tt.deepEqual(ids.sort(), exp.sort(), 'message ids') + tt.same(ids.sort(), exp.sort(), 'message ids') tt.end() }) }) @@ -312,7 +312,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, 'cbb404503c9df13aaeb3dd8b345cb3f34c8c07e4', 'sha') tt.equal(c.date, 'Sat Oct 22 10:22:43 2022 +0200', 'date') - tt.deepEqual(c.subsystems, ['deps'], 'subsystems') + tt.same(c.subsystems, ['deps'], 'subsystems') tt.equal(c.revert, true, 'revert') const msgs = data.messages const filtered = msgs.filter((item) => { @@ -330,7 +330,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, '7d3a7ea0d7df9b6f11df723dec370f49f4f87e99', 'sha') tt.equal(c.date, 'Thu Mar 3 10:10:46 2016 -0600', 'date') - tt.deepEqual(c.subsystems, [], 'subsystems') + tt.same(c.subsystems, [], 'subsystems') tt.equal(c.prUrl, '#5546', 'pr') tt.equal(c.revert, false, 'revert') const msgs = data.messages @@ -364,7 +364,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, '7d3a7ea0d7df9b6f11df723dec370f49f4f87e99', 'sha') tt.equal(c.date, 'Thu Mar 3 10:10:46 2016 -0600', 'date') - tt.deepEqual(c.subsystems, ['test'], 'subsystems') + tt.same(c.subsystems, ['test'], 'subsystems') tt.equal(c.prUrl, null, 'pr') tt.equal(c.revert, false, 'revert') const msgs = data.messages @@ -383,7 +383,7 @@ test('Validator - real commits', (t) => { const c = data.commit.toJSON() tt.equal(c.sha, 'c5545f2c63fe30b0cfcdafab18c26df8286881d0', 'sha') tt.equal(c.date, '2016-09-13T10:57:49Z', 'date') - tt.deepEqual(c.subsystems, ['fs'], 'subsystems') + tt.same(c.subsystems, ['fs'], 'subsystems') tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/8515', 'pr') tt.equal(c.revert, false, 'revert') const msgs = data.messages From d44a27e842075855851872a880eccf4045dda833 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 14:21:36 -0800 Subject: [PATCH 079/110] chore: update nopt 4.x to 6.x (#111) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb4daa9..5e53d67 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "chalk": "^3.0.0", "gitlint-parser-node": "^1.1.0", "help": "^3.0.2", - "nopt": "^4.0.1" + "nopt": "^6.0.0" }, "devDependencies": { "check-pkg": "^2.1.1", From ca9722e013202b5b6a7f26794a1d4d8c7be8ef4e Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Mon, 6 Mar 2023 14:29:56 -0800 Subject: [PATCH 080/110] chore: update chalk 3.x to 4.x (#112) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e53d67..5d7b0d2 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "test-ci": "npm run test -- --no-check-coverage --coverage-report=lcov" }, "dependencies": { - "chalk": "^3.0.0", + "chalk": "^4.1.2", "gitlint-parser-node": "^1.1.0", "help": "^3.0.2", "nopt": "^6.0.0" From 9fbe1c17e910688a85e34a280985a452f9ef1ec2 Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Wed, 15 Mar 2023 18:23:01 +0530 Subject: [PATCH 081/110] rules: add sea to subsystem Signed-off-by: Darshan Sen --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 498422b..0f1cd68 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -23,6 +23,7 @@ const validSubsystems = [ 'perfctr', 'permission', 'policy', + 'sea', 'src', 'test', 'tools', From e172a825968225308a5fdd644a8cd217f27e11ba Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Mon, 20 Mar 2023 12:24:56 +0530 Subject: [PATCH 082/110] 3.20.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5d7b0d2..8b50ac8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.19.0", + "version": "3.20.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "scripts": { From 8cf9e8602ff7894cad92e5a16a16961aad4e071d Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 30 Mar 2023 08:53:00 -0700 Subject: [PATCH 083/110] chore: move to ESM, update all dependencies (#113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update nopt from 6.x to 7.0.0 nopt@7 drops support for Node.js 12.x so we'll drop support too. BREAKING CHANGE: drop support for Node.js 12.x * chore: switch to ESM in preparation for chalk update * chore: update chalk 4.x to 5.2.0 * Update .github/workflows/node.js.yml Co-authored-by: Michaël Zasso * Update bin/cmd.mjs Co-authored-by: Michaël Zasso * Update lib/tap.mjs Co-authored-by: Michaël Zasso * Update lib/utils.mjs Co-authored-by: Michaël Zasso * Update lib/utils.mjs Co-authored-by: Michaël Zasso * Update lib/utils.mjs Co-authored-by: Michaël Zasso * Update lib/utils.mjs Co-authored-by: Michaël Zasso * Update lib/utils.mjs Co-authored-by: Michaël Zasso * Update bin/cmd.mjs Co-authored-by: Michaël Zasso * Update lib/format-pretty.mjs Co-authored-by: Michaël Zasso * Update lib/utils.mjs Co-authored-by: Michaël Zasso * Update test/utils-test.mjs Co-authored-by: Michaël Zasso * Update lib/validator.mjs Co-authored-by: Michaël Zasso * Update test/cli-test.mjs Co-authored-by: Michaël Zasso * Update test/validator.mjs Co-authored-by: Michaël Zasso * Update test/cli-test.mjs Co-authored-by: Michaël Zasso * Update test/cli-test.mjs Co-authored-by: Michaël Zasso * fixup! Update test/cli-test.mjs * Update test/validator.mjs Co-authored-by: Michaël Zasso * fixup! Update test/validator.mjs * fixup: use package.json type field rather than .mjs file extension --------- Co-authored-by: Michaël Zasso --- .github/workflows/node.js.yml | 2 +- bin/cmd.js | 38 ++++++++++++++----------- index.js | 4 +-- lib/format-pretty.js | 8 ++---- lib/format-tap.js | 4 +-- lib/rule.js | 4 +-- lib/rules/co-authored-by-is-trailer.js | 4 +-- lib/rules/fixes-url.js | 4 +-- lib/rules/index.js | 12 -------- lib/rules/line-after-title.js | 4 +-- lib/rules/line-length.js | 4 +-- lib/rules/metadata-end.js | 4 +-- lib/rules/pr-url.js | 4 +-- lib/rules/reviewers.js | 4 +-- lib/rules/subsystem.js | 4 +-- lib/rules/title-format.js | 4 +-- lib/rules/title-length.js | 4 +-- lib/tap.js | 9 ++---- lib/utils.js | 31 +++++++++----------- lib/{index.js => validator.js} | 34 ++++++++++++++++++---- package.json | 6 ++-- test/cli-test.js | 17 +++++------ test/rule-test.js | 6 ++-- test/rules/co-authored-by-is-trailer.js | 10 +++---- test/rules/fixes-url.js | 10 +++---- test/rules/line-after-title.js | 10 +++---- test/rules/line-length.js | 10 +++---- test/rules/pr-url.js | 6 ++-- test/rules/reviewers.js | 10 +++---- test/rules/subsystem.js | 10 +++---- test/rules/title-format.js | 10 +++---- test/utils-test.js | 6 ++-- test/validator.js | 13 +++++---- 33 files changed, 136 insertions(+), 174 deletions(-) delete mode 100644 lib/rules/index.js rename lib/{index.js => validator.js} (61%) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 0850438..caa1d7a 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 16.x, 17.x, 18.x, 19.x] + node-version: [14.x, 16.x, 18.x, 19.x] steps: - uses: actions/checkout@v3 diff --git a/bin/cmd.js b/bin/cmd.js index de832e8..bb0d394 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -1,19 +1,18 @@ #!/usr/bin/env node -'use strict' - -const exec = require('child_process').exec -const fs = require('fs') -const http = require('http') -const https = require('https') -const nopt = require('nopt') -const path = require('path') -const pretty = require('../lib/format-pretty') -const formatTap = require('../lib/format-tap') -const Validator = require('../lib') -const Tap = require('../lib/tap') -const utils = require('../lib/utils') -const subsystem = require('../lib/rules/subsystem') +import { exec } from 'node:child_process' +import fs from 'node:fs' +import http from 'node:http' +import https from 'node:https' +import path from 'node:path' +import nopt from 'nopt' +import pretty from '../lib/format-pretty.js' +import formatTap from '../lib/format-tap.js' +import Validator from '../lib/validator.js' +import Tap from '../lib/tap.js' +import * as utils from '../lib/utils.js' +import subsystem from '../lib/rules/subsystem.js' + const knownOpts = { help: Boolean, version: Boolean, @@ -34,14 +33,19 @@ const shortHand = { } const parsed = nopt(knownOpts, shortHand) -const usage = require('help')() if (parsed.help) { - usage() + const usagePath = path.join(new URL(import.meta.url).pathname, '../usage.txt') + const help = await fs.promises.readFile(usagePath, 'utf8') + console.log(help) + process.exit(0) } if (parsed.version) { - console.log('core-validate-commit', 'v' + require('../package').version) + const pkgJsonPath = path.join(new URL(import.meta.url).pathname, '../../package.json') + const pkgJson = await fs.promises.readFile(pkgJsonPath, 'utf8') + const { version } = JSON.parse(pkgJson) + console.log(`core-validate-commit v${version}`) process.exit(0) } diff --git a/index.js b/index.js index 3541ac5..5f8cf45 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,3 @@ -'use strict' +import Validator from './lib/validator.js' -module.exports = require('./lib') +export default Validator diff --git a/lib/format-pretty.js b/lib/format-pretty.js index 2d1dc35..f26d02c 100644 --- a/lib/format-pretty.js +++ b/lib/format-pretty.js @@ -1,11 +1,9 @@ -'use strict' - -const chalk = require('chalk') -const utils = require('./utils') +import chalk from 'chalk' +import * as utils from './utils.js' const MAX_LINE_COL_LEN = 6 -module.exports = function formatPretty (context, msgs, validator, opts) { +export default function formatPretty (context, msgs, validator, opts) { opts = Object.assign({ detailed: false }, opts) diff --git a/lib/format-tap.js b/lib/format-tap.js index d93ce01..2412bc0 100644 --- a/lib/format-tap.js +++ b/lib/format-tap.js @@ -1,6 +1,4 @@ -'use strict' - -module.exports = function formatTap (t, context, msgs, validator) { +export default function formatTap (t, context, msgs, validator) { for (const m of msgs) { switch (m.level) { case 'pass': { diff --git a/lib/rule.js b/lib/rule.js index f6e2d95..e6cec6f 100644 --- a/lib/rule.js +++ b/lib/rule.js @@ -1,6 +1,4 @@ -'use strict' - -module.exports = class Rule { +export default class Rule { constructor (opts) { opts = Object.assign({ options: {}, diff --git a/lib/rules/co-authored-by-is-trailer.js b/lib/rules/co-authored-by-is-trailer.js index 8bbeb2e..20a34a4 100644 --- a/lib/rules/co-authored-by-is-trailer.js +++ b/lib/rules/co-authored-by-is-trailer.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'co-authored-by-is-trailer' -module.exports = { +export default { id, meta: { description: 'enforce that "Co-authored-by:" lines are trailers', diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index dceda7c..2343481 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -1,11 +1,9 @@ -'use strict' - const id = 'fixes-url' const github = new RegExp('^https://github\\.com/[\\w-]+/[\\w-]+/' + '(issues|pull)/\\d+(#issuecomment-\\d+|#discussion_r\\d+)?$' ) -module.exports = { +export default { id, meta: { description: 'enforce format of Fixes URLs', diff --git a/lib/rules/index.js b/lib/rules/index.js deleted file mode 100644 index 05ec7ac..0000000 --- a/lib/rules/index.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -const fs = require('fs') -const path = require('path') - -fs.readdirSync(__dirname).forEach((item) => { - const fp = path.join(__dirname, item) - if (path.extname(fp) !== '.js') return - if (fp === __filename) return - const rule = require(fp) - exports[rule.id] = rule -}) diff --git a/lib/rules/line-after-title.js b/lib/rules/line-after-title.js index 6b710eb..127fa55 100644 --- a/lib/rules/line-after-title.js +++ b/lib/rules/line-after-title.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'line-after-title' -module.exports = { +export default { id, meta: { description: 'enforce a blank newline after the commit title', diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index 44cbcbb..2d5b60c 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'line-length' -module.exports = { +export default { id, meta: { description: 'enforce max length of lines in commit body', diff --git a/lib/rules/metadata-end.js b/lib/rules/metadata-end.js index 240e468..3660d00 100644 --- a/lib/rules/metadata-end.js +++ b/lib/rules/metadata-end.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'metadata-end' -module.exports = { +export default { id, meta: { description: 'enforce that metadata is at the end of commit messages', diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index d4855a2..823e644 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -1,9 +1,7 @@ -'use strict' - const id = 'pr-url' const prUrl = /^https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+$/ -module.exports = { +export default { id, meta: { description: 'enforce PR-URL', diff --git a/lib/rules/reviewers.js b/lib/rules/reviewers.js index 8ba5519..091a702 100644 --- a/lib/rules/reviewers.js +++ b/lib/rules/reviewers.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'reviewers' -module.exports = { +export default { id, meta: { description: 'enforce having reviewers', diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 0f1cd68..963df24 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -1,5 +1,3 @@ -'use strict' - const id = 'subsystem' const validSubsystems = [ @@ -81,7 +79,7 @@ const validSubsystems = [ 'zlib' ] -module.exports = { +export default { id, meta: { description: 'enforce subsystem validity', diff --git a/lib/rules/title-format.js b/lib/rules/title-format.js index 096a48e..afd4d04 100644 --- a/lib/rules/title-format.js +++ b/lib/rules/title-format.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'title-format' -module.exports = { +export default { id, meta: { description: 'enforce commit title format', diff --git a/lib/rules/title-length.js b/lib/rules/title-length.js index 2ca7523..d32cdc8 100644 --- a/lib/rules/title-length.js +++ b/lib/rules/title-length.js @@ -1,8 +1,6 @@ -'use strict' - const id = 'title-length' -module.exports = { +export default { id, meta: { description: 'enforce max length of commit title', diff --git a/lib/tap.js b/lib/tap.js index 5e847ec..bf916c9 100644 --- a/lib/tap.js +++ b/lib/tap.js @@ -1,6 +1,5 @@ -'use strict' - -const util = require('util') +import util from 'node:util' +import { Readable } from 'node:stream' class Test { constructor (tap, name) { @@ -49,9 +48,7 @@ class Test { } } -const Readable = require('stream').Readable - -module.exports = class Tap extends Readable { +export default class Tap extends Readable { constructor () { super() this._wroteVersion = false diff --git a/lib/utils.js b/lib/utils.js index b4ae3d8..ac8346b 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,15 +1,10 @@ -'use strict' +import chalk from 'chalk' -const chalk = require('chalk') -const CHECK = chalk.green('✔') -const X = chalk.red('✖') -const WARN = chalk.yellow('⚠') +export const CHECK = chalk.green('✔') +export const X = chalk.red('✖') +export const WARN = chalk.yellow('⚠') -exports.CHECK = CHECK -exports.X = X -exports.WARN = WARN - -exports.rightPad = function rightPad (str, max) { +export function rightPad (str, max) { const diff = max - str.length + 1 if (diff > 0) { return `${str}${' '.repeat(diff)}` @@ -17,7 +12,7 @@ exports.rightPad = function rightPad (str, max) { return str } -exports.leftPad = function leftPad (str, max) { +export function leftPad (str, max) { const diff = max - str.length + 1 if (diff > 0) { return `${' '.repeat(diff)}${str}` @@ -25,7 +20,7 @@ exports.leftPad = function leftPad (str, max) { return str } -exports.header = (sha, status) => { +export function header (sha, status) { switch (status) { case 'skip': case 'pass': { @@ -37,21 +32,21 @@ exports.header = (sha, status) => { } } -exports.describeRule = function describeRule (rule, max = 20) { +export function describeRule (rule, max = 20) { if (rule.meta && rule.meta.description) { const desc = rule.meta.description - const title = exports.leftPad(rule.id, max) + const title = leftPad(rule.id, max) console.log(' %s %s', chalk.red(title), chalk.dim(desc)) } } -exports.describeSubsystem = function describeSubsystem (subsystems, max = 20) { +export function describeSubsystem (subsystems, max = 20) { if (subsystems) { for (let sub = 0; sub < subsystems.length; sub = sub + 3) { console.log('%s %s %s', - chalk.green(exports.leftPad(subsystems[sub] || '', max)), - chalk.green(exports.leftPad(subsystems[sub + 1] || '', max)), - chalk.green(exports.leftPad(subsystems[sub + 2] || '', max)) + chalk.green(leftPad(subsystems[sub] || '', max)), + chalk.green(leftPad(subsystems[sub + 1] || '', max)), + chalk.green(leftPad(subsystems[sub + 2] || '', max)) ) } } diff --git a/lib/index.js b/lib/validator.js similarity index 61% rename from lib/index.js rename to lib/validator.js index 6afc938..bbd26bf 100644 --- a/lib/index.js +++ b/lib/validator.js @@ -1,11 +1,33 @@ -'use strict' +import EE from 'node:events' +import Parser from 'gitlint-parser-node' +import BaseRule from './rule.js' -const EE = require('events') -const Parser = require('gitlint-parser-node') -const BaseRule = require('./rule') -const RULES = require('./rules') +// Rules +import coAuthoredByIsTrailer from './rules/co-authored-by-is-trailer.js' +import fixesUrl from './rules/fixes-url.js' +import lineAfterTitle from './rules/line-after-title.js' +import lineLength from './rules/line-length.js' +import metadataEnd from './rules/metadata-end.js' +import prUrl from './rules/pr-url.js' +import reviewers from './rules/reviewers.js' +import subsystem from './rules/subsystem.js' +import titleFormat from './rules/title-format.js' +import titleLength from './rules/title-length.js' -module.exports = class ValidateCommit extends EE { +const RULES = { + 'co-authored-by-is-trailer': coAuthoredByIsTrailer, + 'fixes-url': fixesUrl, + 'line-after-title': lineAfterTitle, + 'line-length': lineLength, + 'metadata-end': metadataEnd, + 'pr-url': prUrl, + reviewers, + subsystem, + 'title-format': titleFormat, + 'title-length': titleLength +} + +export default class ValidateCommit extends EE { constructor (options) { super() diff --git a/package.json b/package.json index 8b50ac8..8fcf3f7 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "3.20.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", + "type": "module", "scripts": { "pretest": "standard && check-pkg", "test": "tap -j4 --no-check-coverage --cov test/**/*.js test/*.js", @@ -10,10 +11,9 @@ "test-ci": "npm run test -- --no-check-coverage --coverage-report=lcov" }, "dependencies": { - "chalk": "^4.1.2", + "chalk": "^5.2.0", "gitlint-parser-node": "^1.1.0", - "help": "^3.0.2", - "nopt": "^6.0.0" + "nopt": "^7.0.0" }, "devDependencies": { "check-pkg": "^2.1.1", diff --git a/test/cli-test.js b/test/cli-test.js index 03beaf4..fa82a0a 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -1,9 +1,7 @@ -'use strict' - -const { test } = require('tap') -const { readFileSync } = require('fs') -const { spawn } = require('child_process') -const subsystems = require('../lib/rules/subsystem') +import { test } from 'tap' +import { readFileSync } from 'node:fs' +import { spawn } from 'node:child_process' +import subsystems from '../lib/rules/subsystem.js' test('Test cli flags', (t) => { t.test('test list-subsystems', (tt) => { @@ -143,9 +141,12 @@ test('Test cli flags', (t) => { tt.fail('This should not happen') }) - ls.on('close', (code) => { + ls.on('close', async (code) => { + const pkgJsonPath = new URL('../package.json', import.meta.url) + const pkgJson = readFileSync(pkgJsonPath, { encoding: 'utf8' }) + const { version } = JSON.parse(pkgJson) tt.equal(compiledData.trim(), - `core-validate-commit v${require('../package.json').version}`, + `core-validate-commit v${version}`, 'output is equal') tt.end() }) diff --git a/test/rule-test.js b/test/rule-test.js index c721676..16c59d5 100644 --- a/test/rule-test.js +++ b/test/rule-test.js @@ -1,7 +1,5 @@ -'use strict' - -const test = require('tap').test -const BaseRule = require('../lib/rule') +import { test } from 'tap' +import BaseRule from '../lib/rule.js' test('Base Rule Test', (t) => { t.test('No id param', (tt) => { diff --git a/test/rules/co-authored-by-is-trailer.js b/test/rules/co-authored-by-is-trailer.js index 21b3986..c10baa0 100644 --- a/test/rules/co-authored-by-is-trailer.js +++ b/test/rules/co-authored-by-is-trailer.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/co-authored-by-is-trailer') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/co-authored-by-is-trailer.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' test('rule: co-authored-by-is-trailer', (t) => { t.test('no co-authors', (tt) => { diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index fe15f53..f728195 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/fixes-url') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/fixes-url.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' const INVALID_PRURL = 'Pull request URL must reference a comment or discussion.' const NOT_AN_ISSUE_NUMBER = 'Fixes must be a URL, not an issue number.' diff --git a/test/rules/line-after-title.js b/test/rules/line-after-title.js index acc8008..a7e7256 100644 --- a/test/rules/line-after-title.js +++ b/test/rules/line-after-title.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/line-after-title') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/line-after-title.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' test('rule: line-after-title', (t) => { t.test('no blank line', (tt) => { diff --git a/test/rules/line-length.js b/test/rules/line-length.js index 50e65cb..d8bda5f 100644 --- a/test/rules/line-length.js +++ b/test/rules/line-length.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/line-length') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/line-length.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' test('rule: line-length', (t) => { t.test('line too long', (tt) => { diff --git a/test/rules/pr-url.js b/test/rules/pr-url.js index 3c34770..27f2bdf 100644 --- a/test/rules/pr-url.js +++ b/test/rules/pr-url.js @@ -1,7 +1,5 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/pr-url') +import { test } from 'tap' +import Rule from '../../lib/rules/pr-url.js' const MISSING_PR_URL = 'Commit must have a PR-URL.' const INVALID_PR_URL = 'PR-URL must be a GitHub pull request URL.' const NUMERIC_PR_URL = 'PR-URL must be a URL, not a pull request number.' diff --git a/test/rules/reviewers.js b/test/rules/reviewers.js index 3ad7a4c..d76865a 100644 --- a/test/rules/reviewers.js +++ b/test/rules/reviewers.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/reviewers') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/reviewers.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' const MSG = 'Commit must have at least 1 reviewer.' test('rule: reviewers', (t) => { diff --git a/test/rules/subsystem.js b/test/rules/subsystem.js index 9b9bef9..5e47c01 100644 --- a/test/rules/subsystem.js +++ b/test/rules/subsystem.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/subsystem') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/subsystem.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' test('rule: subsystem', (t) => { t.test('invalid', (tt) => { diff --git a/test/rules/title-format.js b/test/rules/title-format.js index ab12101..405f37b 100644 --- a/test/rules/title-format.js +++ b/test/rules/title-format.js @@ -1,9 +1,7 @@ -'use strict' - -const test = require('tap').test -const Rule = require('../../lib/rules/title-format') -const Commit = require('gitlint-parser-node') -const Validator = require('../../') +import { test } from 'tap' +import Rule from '../../lib/rules/title-format.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' function makeCommit (title) { const v = new Validator() diff --git a/test/utils-test.js b/test/utils-test.js index 0f57f98..a4e27fd 100644 --- a/test/utils-test.js +++ b/test/utils-test.js @@ -1,7 +1,5 @@ -'use strict' - -const { test } = require('tap') -const utils = require('../lib/utils') +import { test } from 'tap' +import * as utils from '../lib/utils.js' // We aren't testing the chalk library, so strip off the colors/styles it adds const stripAnsiRegex = diff --git a/test/validator.js b/test/validator.js index 03ac1a6..d1c16d2 100644 --- a/test/validator.js +++ b/test/validator.js @@ -1,7 +1,6 @@ -'use strict' - -const test = require('tap').test -const Validator = require('../') +import { test } from 'tap' +import Validator from '../lib/validator.js' +import { readFileSync } from 'node:fs' // Note, these are not necessarily all real commit messages const str = `commit e7c077c610afa371430180fbd447bfef60ebc5ea @@ -188,14 +187,16 @@ test('Validator - misc', (t) => { test('Validator - real commits', (t) => { t.test('basic', (tt) => { + const commit = JSON.parse(readFileSync(new URL('fixtures/commit.json', import.meta.url), { encoding: 'utf8' })) + const pr = JSON.parse(readFileSync(new URL('fixtures/pr.json', import.meta.url), { encoding: 'utf8' })) tt.plan(21) const v = new Validator() // run against the output of git show --quiet // run against the output of github's get commit api request // run against the output of github's list commits for pr api request v.lint(str) - v.lint(require('./fixtures/commit')) - v.lint(require('./fixtures/pr')) + v.lint(commit) + v.lint(pr) v.on('commit', (data) => { const c = data.commit tt.equal(c.sha, 'e7c077c610afa371430180fbd447bfef60ebc5ea', 'sha') From 3472214bb64a196154d7ea12de321212bb4e6e6b Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Thu, 30 Mar 2023 08:54:27 -0700 Subject: [PATCH 084/110] 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8fcf3f7..32a72bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "3.20.0", + "version": "4.0.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "type": "module", From 964cfdcd8e0090e3c6493d9af2e38839ea0575cc Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 31 Mar 2023 14:57:15 -0700 Subject: [PATCH 085/110] chore: fix coverage reporting for tests (#115) * chore: fix coverage reporting for tests tap is not reporting coverage, probably due to the switch to ESM. Switch to c8. * fixup! chore: fix coverage reporting for tests --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 32a72bc..cd4b00b 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,8 @@ "type": "module", "scripts": { "pretest": "standard && check-pkg", - "test": "tap -j4 --no-check-coverage --cov test/**/*.js test/*.js", - "posttest": "tap --no-check-coverage --coverage-report=text-summary", - "test-ci": "npm run test -- --no-check-coverage --coverage-report=lcov" + "test": "c8 tap -j4 --no-coverage test/**/*.js test/*.js", + "test-ci": "npm run test && c8 report --reporter=lcov" }, "dependencies": { "chalk": "^5.2.0", @@ -16,6 +15,7 @@ "nopt": "^7.0.0" }, "devDependencies": { + "c8": "^7.13.0", "check-pkg": "^2.1.1", "standard": "^17.0.0", "tap": "^16.3.4" From bcde3291025b7ca65b93c7c927bc6d1d5def223f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Thu, 10 Aug 2023 13:17:12 +0200 Subject: [PATCH 086/110] chore: update Node.js test matrix for Q3 2023 --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index caa1d7a..6ea78ea 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x, 19.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 From 006aedd1c889ebfacdf2c346efd6e6a572cbc5e0 Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Wed, 1 Nov 2023 17:39:15 +0200 Subject: [PATCH 087/110] chore: diagnostics_channel subsystem (#98) --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 963df24..06773a7 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -40,6 +40,7 @@ const validSubsystems = [ 'constants', 'crypto', 'debugger', + 'diagnostics_channel', 'dgram', 'diagnostics_channel', 'dns', From 67c75e0e736b331974f7401c3a1ee5cba577b5c6 Mon Sep 17 00:00:00 2001 From: Rafael Gonzaga Date: Wed, 17 Jul 2024 16:48:32 -0300 Subject: [PATCH 088/110] fix: support trailing slash (#120) * fix: add support to trailing slash in PR-URL * fix: add support to trailing slash in Fixes * Update lib/rules/fixes-url.js Co-authored-by: Rich Trott --------- Co-authored-by: Rich Trott --- lib/rules/fixes-url.js | 2 +- lib/rules/pr-url.js | 2 +- test/rules/fixes-url.js | 2 ++ test/rules/pr-url.js | 23 +++++++++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/rules/fixes-url.js b/lib/rules/fixes-url.js index 2343481..b63edbe 100644 --- a/lib/rules/fixes-url.js +++ b/lib/rules/fixes-url.js @@ -1,6 +1,6 @@ const id = 'fixes-url' const github = new RegExp('^https://github\\.com/[\\w-]+/[\\w-]+/' + - '(issues|pull)/\\d+(#issuecomment-\\d+|#discussion_r\\d+)?$' + '(issues|pull)/\\d+(#issuecomment-\\d+|#discussion_r\\d+)?/?$' ) export default { diff --git a/lib/rules/pr-url.js b/lib/rules/pr-url.js index 823e644..e09af3d 100644 --- a/lib/rules/pr-url.js +++ b/lib/rules/pr-url.js @@ -1,5 +1,5 @@ const id = 'pr-url' -const prUrl = /^https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+$/ +const prUrl = /^https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+\/?$/ export default { id, diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index f728195..1ed7744 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -24,6 +24,8 @@ test('rule: fixes-url', (t) => { const valid = [ ['GitHub issue URL', 'https://github.com/nodejs/node/issues/1234'], + ['GitHub issue URL with trailing slash', + 'https://github.com/nodejs/node/issues/1234/'], ['GitHub issue URL containing hyphen', 'https://github.com/nodejs/node-report/issues/1234'], ['GitHub issue URL containing hyphen with comment', diff --git a/test/rules/pr-url.js b/test/rules/pr-url.js index 27f2bdf..20bddcd 100644 --- a/test/rules/pr-url.js +++ b/test/rules/pr-url.js @@ -115,5 +115,28 @@ test('rule: pr-url', (t) => { Rule.validate(context) }) + t.test('valid URL with trailing slash', (tt) => { + tt.plan(7) + const url = 'https://github.com/nodejs/node-report/pull/1234/' + const context = { + prUrl: url, + body: [ + '', + `PR-URL: ${url}` + ], + report: (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'pr-url', 'id') + tt.equal(opts.message, VALID_PR_URL, 'message') + tt.equal(opts.string, url, 'string') + tt.equal(opts.line, 1, 'line') + tt.equal(opts.column, 8, 'column') + tt.equal(opts.level, 'pass', 'level') + } + } + + Rule.validate(context) + }) + t.end() }) From 87c1bac0f7b5264a9e1a86fa1a4d88d85f34d70d Mon Sep 17 00:00:00 2001 From: Aviv Keller <38299977+RedYetiDev@users.noreply.github.com> Date: Mon, 5 Aug 2024 12:45:32 -0400 Subject: [PATCH 089/110] feat(sqlite): add `sqlite` subsystem (#121) Ref: https://github.com/nodejs/node/issues/53795#issuecomment-2219727938 Ref: https://github.com/nodejs/node/pull/53752 --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 06773a7..8ed04e9 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -63,6 +63,7 @@ const validSubsystems = [ 'readline', 'repl', 'report', + 'sqlite', 'stream', 'string_decoder', 'sys', From d584f653e19c5bbcab12c85012c01d9bff15f7e1 Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 5 Aug 2024 17:46:19 +0100 Subject: [PATCH 090/110] 4.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd4b00b..5548524 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "4.0.0", + "version": "4.1.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "type": "module", From 5aa959cdd971d8426b4d7f48ea2ef95cdf4242d9 Mon Sep 17 00:00:00 2001 From: Deokjin Kim Date: Tue, 6 Aug 2024 01:49:11 +0900 Subject: [PATCH 091/110] rules: remove duplicate `diagnostics_channel` from subsystem (#119) --- lib/rules/subsystem.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 8ed04e9..85b0fb8 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -40,7 +40,6 @@ const validSubsystems = [ 'constants', 'crypto', 'debugger', - 'diagnostics_channel', 'dgram', 'diagnostics_channel', 'dns', From 4556b7ced175f8802ef32a0cb1af273e9bab5c24 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Mon, 2 Sep 2024 16:27:27 +0200 Subject: [PATCH 092/110] chore: do not test on EOL Node.js versions (#124) BREAKING CHANGE: `package.json` now contains `engines.node` --- .github/workflows/node.js.yml | 39 ++++++++++++++--------------------- package.json | 3 +++ 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 6ea78ea..715ed26 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -10,26 +10,19 @@ on: branches: [ main ] jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [16.x, 18.x, 20.x] - - steps: - - uses: actions/checkout@v3 - with: - # Need commit history test for cli-tests - fetch-depth: 0 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - run: npm install - - run: npm run build --if-present - - run: npm run test-ci - env: - CI: true - - run: bash <(curl -s https://codecov.io/bash) + test: + name: Test on Node.js + uses: pkgjs/action/.github/workflows/node-test.yaml@v0 + with: + # We need to fetch some specific commits that we are using in our tests. We also need `--deepen=2` for CodCov. + post-checkout-steps: | + - run: git fetch --deepen=2 origin 2b98d02b52a0abe98054eccb351e1e5c71c81bb0 69435db261650dfc74ede6dca89acbe97ba30081 + shell: bash + post-install-steps: | + - run: npm run build --if-present + shell: bash + test-command: npm run test-ci + post-test-steps: | + - name: Upload coverage report to Codecov + run: bash <(curl -s https://codecov.io/bash) + shell: bash diff --git a/package.json b/package.json index 5548524..f61c78b 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,9 @@ "bin": { "core-validate-commit": "./bin/cmd.js" }, + "engines": { + "node": "^18.18.0 || >=20.10.0" + }, "author": "Evan Lucas ", "repository": { "type": "git", From b4dae98fcf2116e10f46b586710aadf2e883f682 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Sun, 21 Dec 2025 13:38:59 +0100 Subject: [PATCH 093/110] chore!: drop support for Node.js 18 (#133) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f61c78b..99056db 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "core-validate-commit": "./bin/cmd.js" }, "engines": { - "node": "^18.18.0 || >=20.10.0" + "node": "^20.19.6 || ^22.21.1 || >=24.12.0" }, "author": "Evan Lucas ", "repository": { From b5002a868c10e8a0a81a1e68a82dca79711201cb Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Sun, 21 Dec 2025 15:19:46 +0100 Subject: [PATCH 094/110] chore: remove `nopt` from dependencies (#131) --- bin/cmd.js | 56 +++++++++++++++++++++++++++++++--------------------- package.json | 3 +-- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/bin/cmd.js b/bin/cmd.js index bb0d394..01e361a 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -5,7 +5,7 @@ import fs from 'node:fs' import http from 'node:http' import https from 'node:https' import path from 'node:path' -import nopt from 'nopt' +import { parseArgs } from 'node:util' import pretty from '../lib/format-pretty.js' import formatTap from '../lib/format-tap.js' import Validator from '../lib/validator.js' @@ -13,26 +13,39 @@ import Tap from '../lib/tap.js' import * as utils from '../lib/utils.js' import subsystem from '../lib/rules/subsystem.js' -const knownOpts = { - help: Boolean, - version: Boolean, - 'validate-metadata': Boolean, - tap: Boolean, - out: path, - list: Boolean, - 'list-subsystems': Boolean -} -const shortHand = { - h: ['--help'], - v: ['--version'], - V: ['--validate-metadata'], - t: ['--tap'], - o: ['--out'], - l: ['--list'], - ls: ['--list-subsystems'] -} - -const parsed = nopt(knownOpts, shortHand) +const { values: parsed, positionals: args } = parseArgs({ + options: { + help: { + type: 'boolean', + short: 'h' + }, + version: { + type: 'boolean', + short: 'v' + }, + 'validate-metadata': { + type: 'boolean', + short: 'V' + }, + tap: { + type: 'boolean', + short: 't' + }, + out: { + type: 'string', + short: 'o' + }, + list: { + type: 'boolean', + short: 'l' + }, + 'list-subsystems': { + type: 'boolean' + } + }, + allowNegative: true, + allowPositionals: true +}) if (parsed.help) { const usagePath = path.join(new URL(import.meta.url).pathname, '../usage.txt') @@ -49,7 +62,6 @@ if (parsed.version) { process.exit(0) } -const args = parsed.argv.remain if (!parsed.help && !args.length) { args.push('HEAD') } function load (sha, cb) { diff --git a/package.json b/package.json index 99056db..d07f0af 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,7 @@ }, "dependencies": { "chalk": "^5.2.0", - "gitlint-parser-node": "^1.1.0", - "nopt": "^7.0.0" + "gitlint-parser-node": "^1.1.0" }, "devDependencies": { "c8": "^7.13.0", From a05e0b373c8f7fef5b3a34c61063e7fe766175d5 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Sun, 21 Dec 2025 15:21:18 +0100 Subject: [PATCH 095/110] chore: remove `chalk` from dependencies (#132) --- lib/format-pretty.js | 8 ++++---- lib/utils.js | 20 ++++++++++---------- package.json | 1 - 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/format-pretty.js b/lib/format-pretty.js index f26d02c..fad1d97 100644 --- a/lib/format-pretty.js +++ b/lib/format-pretty.js @@ -1,4 +1,4 @@ -import chalk from 'chalk' +import { styleText } from 'node:util' import * as utils from './utils.js' const MAX_LINE_COL_LEN = 6 @@ -61,7 +61,7 @@ function formatLength (msg, opts) { const l = str.length if (!opts.detailed) return out const col = msg.column || 0 - const diff = str.slice(0, col) + chalk.red(str.slice(col, l)) + const diff = str.slice(0, col) + styleText('red', str.slice(col, l)) return `${out} ${diff}` } @@ -70,7 +70,7 @@ function formatMessage (msg) { const l = msg.line || 0 const col = msg.column || 0 const pad = utils.rightPad(`${l}:${col}`, MAX_LINE_COL_LEN) - const line = chalk.grey(pad) + const line = styleText('gray', pad) const id = formatId(msg.id) const m = msg.message const icon = msg.level === 'fail' @@ -82,5 +82,5 @@ function formatMessage (msg) { } function formatId (id) { - return chalk.red(id) + return styleText('red', id) } diff --git a/lib/utils.js b/lib/utils.js index ac8346b..4f878c4 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,8 +1,8 @@ -import chalk from 'chalk' +import { styleText } from 'node:util' -export const CHECK = chalk.green('✔') -export const X = chalk.red('✖') -export const WARN = chalk.yellow('⚠') +export const CHECK = styleText('green', '✔') +export const X = styleText('red', '✖') +export const WARN = styleText('yellow', '⚠') export function rightPad (str, max) { const diff = max - str.length + 1 @@ -25,10 +25,10 @@ export function header (sha, status) { case 'skip': case 'pass': { const suffix = status === 'skip' ? ' # SKIPPED' : '' - return `${CHECK} ${chalk.underline(sha)}${suffix}` + return `${CHECK} ${styleText('underline', sha)}${suffix}` } case 'fail': - return `${X} ${chalk.underline(sha)}` + return `${X} ${styleText('underline', sha)}` } } @@ -36,7 +36,7 @@ export function describeRule (rule, max = 20) { if (rule.meta && rule.meta.description) { const desc = rule.meta.description const title = leftPad(rule.id, max) - console.log(' %s %s', chalk.red(title), chalk.dim(desc)) + console.log(' %s %s', styleText('red', title), styleText('dim', desc)) } } @@ -44,9 +44,9 @@ export function describeSubsystem (subsystems, max = 20) { if (subsystems) { for (let sub = 0; sub < subsystems.length; sub = sub + 3) { console.log('%s %s %s', - chalk.green(leftPad(subsystems[sub] || '', max)), - chalk.green(leftPad(subsystems[sub + 1] || '', max)), - chalk.green(leftPad(subsystems[sub + 2] || '', max)) + styleText('green', leftPad(subsystems[sub] || '', max)), + styleText('green', leftPad(subsystems[sub + 1] || '', max)), + styleText('green', leftPad(subsystems[sub + 2] || '', max)) ) } } diff --git a/package.json b/package.json index d07f0af..c120664 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "test-ci": "npm run test && c8 report --reporter=lcov" }, "dependencies": { - "chalk": "^5.2.0", "gitlint-parser-node": "^1.1.0" }, "devDependencies": { From b99ae2e2a344a304ddf42a1d0728025affbbabeb Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Mon, 22 Dec 2025 10:02:19 +0100 Subject: [PATCH 096/110] chore: pin transitive deps (#134) --- .npmrc | 1 - npm-shrinkwrap.json | 8439 +++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 8440 insertions(+), 1 deletion(-) delete mode 100644 .npmrc create mode 100644 npm-shrinkwrap.json diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 43c97e7..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json new file mode 100644 index 0000000..3b571e4 --- /dev/null +++ b/npm-shrinkwrap.json @@ -0,0 +1,8439 @@ +{ + "name": "core-validate-commit", + "version": "4.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "core-validate-commit", + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "gitlint-parser-node": "^1.1.0" + }, + "bin": { + "core-validate-commit": "bin/cmd.js" + }, + "devDependencies": { + "c8": "^7.13.0", + "check-pkg": "^2.1.1", + "standard": "^17.0.0", + "tap": "^16.3.4" + }, + "engines": { + "node": "^20.19.6 || ^22.21.1 || >=24.12.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-hook-domain": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", + "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bind-obj-methods": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", + "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-pkg": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-pkg/-/check-pkg-2.1.1.tgz", + "integrity": "sha512-qRxuZOQxfMyRuvo8n2nCb2aIWz3Wt0OuuMUWgO1oFAP8t1+vNzJCuD+r16E2PT26l4Ff/ofIGtWMbYpnYTF4hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "~1.1.3", + "detective": "^4.5.0", + "help": "~3.0.1", + "nopt": "~3.0.6", + "readdirp": "~2.0.0", + "resolve-from": "~2.0.0" + }, + "bin": { + "check-pkg": "bin/cmd.js" + } + }, + "node_modules/check-pkg/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-pkg/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-pkg/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-pkg/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-pkg/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-pkg/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", + "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", + "dev": true, + "license": "MIT" + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-loop": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", + "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gitlint-parser-base": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gitlint-parser-base/-/gitlint-parser-base-2.0.0.tgz", + "integrity": "sha512-kWkbGGH55AigPQgTz9ZEomv8uQn2GRZiFgAg+SbTIV+8ineU8f3QDeAQHzS7h9yKVuE7cjcgQm0ENmHPM0bxMQ==", + "license": "MIT" + }, + "node_modules/gitlint-parser-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gitlint-parser-node/-/gitlint-parser-node-1.1.0.tgz", + "integrity": "sha512-h99xAvajhfkTtwVo8q9oBlL8+QrljJltguykpszQWyu0D9SVE5+5CqfEn9qn5IJ254Q2mr1ByjrFu9Rs2niSyA==", + "license": "MIT", + "dependencies": { + "gitlint-parser-base": "^2.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/help/-/help-3.0.2.tgz", + "integrity": "sha512-jDd0MU+9xzvOQRC6CIzdjvb+agCvpzQY/Fp11quDnugDO4QQzh134EsLkRQMvFIJBleFkvnXagHFm4MTefkkpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz", + "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "cliui": "^7.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libtap": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.1.tgz", + "integrity": "sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw==", + "deprecated": "This library is no longer used by node-tap, and is unmaintained.", + "dev": true, + "license": "ISC", + "dependencies": { + "async-hook-domain": "^2.0.4", + "bind-obj-methods": "^3.0.0", + "diff": "^4.0.2", + "function-loop": "^2.0.1", + "minipass": "^3.1.5", + "own-or": "^1.0.0", + "own-or-env": "^1.0.2", + "signal-exit": "^3.0.4", + "stack-utils": "^2.0.4", + "tap-parser": "^11.0.0", + "tap-yaml": "^1.0.0", + "tcompare": "^5.0.6", + "trivial-deferred": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", + "dev": true, + "license": "ISC" + }, + "node_modules/own-or-env": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", + "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", + "dev": true, + "license": "ISC", + "dependencies": { + "own-or": "^1.0.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.1.tgz", + "integrity": "sha512-4ccmLnjcaQg1sBtWsolBgCbtjCv26taibhIWtFXQB0QRwWP8kK1HKMMJdBO5mz5EiTN/0ObXHsNfFGfGt8uPgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spawn-wrap/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/standard": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", + "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "eslint": "^8.41.0", + "eslint-config-standard": "17.1.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.36.1", + "standard-engine": "^15.1.0", + "version-guard": "^1.1.1" + }, + "bin": { + "standard": "bin/cmd.cjs" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tap": { + "version": "16.3.10", + "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.10.tgz", + "integrity": "sha512-q5Am+PpGHS6JSjk/Zn4bCRBihmZVM15v/MYXUy60wenw5HDe7pVrevLCEoMEz7tuw6jaPOJJqni1y8apN23IGw==", + "bundleDependencies": [ + "ink", + "treport", + "@types/react", + "@isaacs/import-jsx", + "react" + ], + "deprecated": "Versions of tap before v18 are no longer maintained. Please upgrade.", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/import-jsx": "^4.0.1", + "@types/react": "^17.0.52", + "chokidar": "^3.3.0", + "findit": "^2.0.0", + "foreground-child": "^2.0.0", + "fs-exists-cached": "^1.0.0", + "glob": "^7.2.3", + "ink": "^3.2.0", + "isexe": "^2.0.0", + "istanbul-lib-processinfo": "^2.0.3", + "jackspeak": "^1.4.2", + "libtap": "^1.4.0", + "minipass": "^3.3.4", + "mkdirp": "^1.0.4", + "nyc": "^15.1.0", + "opener": "^1.5.1", + "react": "^17.0.2", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.6", + "source-map-support": "^0.5.16", + "tap-mocha-reporter": "^5.0.3", + "tap-parser": "^11.0.2", + "tap-yaml": "^1.0.2", + "tcompare": "^5.0.7", + "treport": "^3.0.4", + "which": "^2.0.2" + }, + "bin": { + "tap": "bin/run.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "coveralls": "^3.1.1", + "flow-remove-types": ">=2.112.0", + "ts-node": ">=8.5.2", + "typescript": ">=3.7.2" + }, + "peerDependenciesMeta": { + "coveralls": { + "optional": true + }, + "flow-remove-types": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tap-mocha-reporter": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz", + "integrity": "sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "color-support": "^1.1.0", + "debug": "^4.1.1", + "diff": "^4.0.1", + "escape-string-regexp": "^2.0.0", + "glob": "^7.0.5", + "tap-parser": "^11.0.0", + "tap-yaml": "^1.0.0", + "unicode-length": "^2.0.2" + }, + "bin": { + "tap-mocha-reporter": "index.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap-parser": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", + "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-to-array": "^1.0.1", + "minipass": "^3.1.6", + "tap-yaml": "^1.0.0" + }, + "bin": { + "tap-parser": "bin/cmd.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tap-yaml": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", + "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "yaml": "^1.10.2" + } + }, + "node_modules/tap/node_modules/@ampproject/remapping": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@babel/code-frame": { + "version": "7.23.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/compat-data": { + "version": "7.23.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/core": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/tap/node_modules/@babel/generator": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/helpers": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/highlight": { + "version": "7.23.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/parser": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/template": { + "version": "7.22.15", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/traverse": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@babel/types": { + "version": "7.23.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/@isaacs/import-jsx": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", + "caller-path": "^3.0.1", + "find-cache-dir": "^3.2.0", + "make-dir": "^3.0.2", + "resolve-from": "^3.0.0", + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tap/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/tap/node_modules/@types/prop-types": { + "version": "15.7.11", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@types/react": { + "version": "17.0.73", + "dev": true, + "inBundle": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/tap/node_modules/@types/scheduler": { + "version": "0.16.8", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@types/yoga-layout": { + "version": "1.9.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "inBundle": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/ansicolors": { + "version": "0.3.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/auto-bind": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tap/node_modules/browserslist": { + "version": "4.22.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "inBundle": true, + "license": "MIT", + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/tap/node_modules/caller-callsite": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/caller-path": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "caller-callsite": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/caniuse-lite": { + "version": "1.0.30001570", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "inBundle": true, + "license": "CC-BY-4.0" + }, + "node_modules/tap/node_modules/cardinal": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/tap/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/cli-boxes": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/code-excerpt": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "convert-to-spaces": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tap/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tap/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/convert-to-spaces": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/tap/node_modules/csstype": { + "version": "3.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tap/node_modules/electron-to-chromium": { + "version": "1.4.614", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tap/node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/events-to-array": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/tap/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/globals": { + "version": "11.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/tap/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/ink": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "auto-bind": "4.0.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "indent-string": "^4.0.0", + "is-ci": "^2.0.0", + "lodash": "^4.17.20", + "patch-console": "^1.0.0", + "react-devtools-core": "^4.19.1", + "react-reconciler": "^0.26.2", + "scheduler": "^0.20.2", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "stack-utils": "^2.0.2", + "string-width": "^4.2.2", + "type-fest": "^0.12.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "ws": "^7.5.5", + "yoga-layout-prebuilt": "^1.9.6" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": ">=16.8.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/tap/node_modules/ink/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/ink/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/tap/node_modules/ink/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/ink/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/ink/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/ink/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/is-ci": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/tap/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/json5": { + "version": "2.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/loose-envify": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/tap/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/tap/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tap/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/tap/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/patch-console": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/tap/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/react": { + "version": "17.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/react-devtools-core": { + "version": "4.28.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/tap/node_modules/react-reconciler": { + "version": "0.26.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^17.0.2" + } + }, + "node_modules/tap/node_modules/redeyed": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/tap/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/scheduler": { + "version": "0.20.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/tap/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/tap/node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tap/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tap/node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/tap-parser": { + "version": "11.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "events-to-array": "^1.0.1", + "minipass": "^3.1.6", + "tap-yaml": "^1.0.0" + }, + "bin": { + "tap-parser": "bin/cmd.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tap/node_modules/tap-yaml": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yaml": "^1.10.2" + } + }, + "node_modules/tap/node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/treport": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/import-jsx": "^4.0.1", + "cardinal": "^2.1.1", + "chalk": "^3.0.0", + "ink": "^3.2.0", + "ms": "^2.1.2", + "tap-parser": "^11.0.0", + "tap-yaml": "^1.0.0", + "unicode-length": "^2.0.2" + }, + "peerDependencies": { + "react": "^17.0.2" + } + }, + "node_modules/tap/node_modules/treport/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/treport/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/treport/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/treport/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/treport/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/treport/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/type-fest": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/unicode-length": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.0.0" + } + }, + "node_modules/tap/node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/tap/node_modules/widest-line": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/ws": { + "version": "7.5.9", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/tap/node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tap/node_modules/yoga-layout-prebuilt": { + "version": "1.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/yoga-layout": "1.9.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tcompare": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", + "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "diff": "^4.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trivial-deferred": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.1.2.tgz", + "integrity": "sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-length": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", + "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/version-guard": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", + "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", + "dev": true, + "license": "0BSD", + "engines": { + "node": ">=0.10.48" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index c120664..06963ef 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "files": [ "lib/", "bin/", + "npm-shrinkwrap.json", "index.js" ], "license": "MIT", From 39b93a36688cabd4221e6c2e2c1c03c17de6f2e9 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Thu, 1 Jan 2026 19:55:01 +0100 Subject: [PATCH 097/110] fix(co-authored-by-is-trailer): trailers do not have leading spaces (#136) --- lib/rules/co-authored-by-is-trailer.js | 4 ++-- test/rules/co-authored-by-is-trailer.js | 31 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/rules/co-authored-by-is-trailer.js b/lib/rules/co-authored-by-is-trailer.js index 20a34a4..6e3b2de 100644 --- a/lib/rules/co-authored-by-is-trailer.js +++ b/lib/rules/co-authored-by-is-trailer.js @@ -11,7 +11,7 @@ export default { validate: (context, rule) => { const parsed = context.toJSON() const lines = parsed.body.map((line, i) => [line, i]) - const re = /^\s*Co-authored-by:/gi + const re = /^Co-authored-by:/gi const coauthors = lines.filter(([line]) => re.test(line)) if (coauthors.length !== 0) { const firstCoauthor = coauthors[0] @@ -19,7 +19,7 @@ export default { // There must be at least one empty line, and the last empty line must be // above the first Co-authored-by line. const isTrailer = (emptyLines.length !== 0) && - emptyLines.pop()[1] < firstCoauthor[1] + emptyLines.at(-1)[1] < firstCoauthor[1] if (isTrailer) { context.report({ id, diff --git a/test/rules/co-authored-by-is-trailer.js b/test/rules/co-authored-by-is-trailer.js index c10baa0..3dc3b8d 100644 --- a/test/rules/co-authored-by-is-trailer.js +++ b/test/rules/co-authored-by-is-trailer.js @@ -56,6 +56,37 @@ test('rule: co-authored-by-is-trailer', (t) => { Rule.validate(context) }) + t.test('quoting another commit message', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'deps: v8: cherry-pick deadbeef\n' + + '\n' + + 'Original commit message:' + + '\n' + + ' Some description.\n' + + '\n' + + ' Co-authored-by: Someone \n' + + '\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'co-authored-by-is-trailer', 'id') + tt.equal(opts.message, 'no Co-authored-by metadata', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + t.test('not trailer', (tt) => { tt.plan(7) const v = new Validator() From 47e1d6d51c2293ddab891ca6e9f2a6d7a93fe711 Mon Sep 17 00:00:00 2001 From: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:33:33 +0100 Subject: [PATCH 098/110] feat: support co-authorship lines in body (#130) --- lib/rules/line-length.js | 4 ++++ test/rules/line-length.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index 2d5b60c..3a568a9 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -29,10 +29,14 @@ export default { let failed = false for (let i = 0; i < parsed.body.length; i++) { const line = parsed.body[i] + // Skip quoted lines, e.g. for original commit messages of V8 backports. if (line.startsWith(' ')) { continue } // Skip lines with URLs. if (/https?:\/\//.test(line)) { continue } + // Skip co-authorship. + if (/^co-authored-by:/i.test(line)) { continue } + if (line.length > len) { failed = true context.report({ diff --git a/test/rules/line-length.js b/test/rules/line-length.js index d8bda5f..1eb781d 100644 --- a/test/rules/line-length.js +++ b/test/rules/line-length.js @@ -129,5 +129,37 @@ https://${'very-'.repeat(80)}-long-url.org/ tt.end() }) + t.test('Co-author lines', (tt) => { + const v = new Validator() + + const good = new Commit({ + sha: 'f1496de5a7d5474e39eafaafe6f79befe5883a5b', + author: { + name: 'Jacob Smith', + email: '3012099+JakobJingleheimer@users.noreply.github.com', + date: '2025-12-22T09:40:42Z' + }, + message: [ + 'fixup!: apply case-insensitive suggestion', + 'Co-authored-by: Michaël Zasso <37011812+targos@users.noreply.github.com>' + ].join('\n') + }, v) + + good.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'line-length', 'id') + tt.equal(opts.string, '', 'string') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(good, { + options: { + length: 72 + } + }) + + tt.end() + }) + t.end() }) From 32007307ca770180991991f6c1682fe5c048a887 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Tue, 20 Jan 2026 22:20:25 +0100 Subject: [PATCH 099/110] feat: add support for stdin JSON input (#135) Co-authored-by: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> --- bin/cmd.js | 70 ++++++++++++---- bin/usage.txt | 6 +- test/cli-test.js | 206 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 266 insertions(+), 16 deletions(-) diff --git a/bin/cmd.js b/bin/cmd.js index 01e361a..7ed0549 100755 --- a/bin/cmd.js +++ b/bin/cmd.js @@ -65,15 +65,21 @@ if (parsed.version) { if (!parsed.help && !args.length) { args.push('HEAD') } function load (sha, cb) { - try { - const parsed = new URL(sha) - return loadPatch(parsed, cb) - } catch (_) { - exec(`git show --quiet --format=medium ${sha}`, (err, stdout, stderr) => { - if (err) return cb(err) - cb(null, stdout.trim()) + // Handle pre-parsed commit objects from stdin + if (typeof sha === 'object') { + return process.nextTick(() => { + cb(null, sha) }) } + + const parsed = URL.parse(sha) + if (parsed != null) { + return loadPatch(parsed, cb) + } + exec(`git show --quiet --format=medium ${sha}`, (err, stdout, stderr) => { + if (err) return cb(err) + cb(null, stdout.trim()) + }) } function loadPatch (uri, cb) { @@ -121,7 +127,48 @@ if (parsed.list) { process.exit(0) } -if (parsed.tap) { +// Don't start processing if reading from stdin (handled in stdin.on('end')) +if (args.length === 1 && args[0] === '-') { + const chunks = [] + process.stdin.on('data', (chunk) => chunks.push(chunk)) + process.stdin.on('end', () => { + try { + const input = Buffer.concat(chunks).toString('utf8') + const commits = JSON.parse(input) + + if (!Array.isArray(commits)) { + throw new Error('Input must be an array') + } + + // Replace args with the commit data directly + for (let i = 0; i < commits.length; i++) { + const commit = commits[i] + if (!commit.id || !commit.message) { + throw new Error('Each commit must have "id" and "message" properties') + } + args[i] = { sha: commit.id, ...commit } + } + run() + } catch (err) { + console.error('Error parsing JSON input:', err.message) + process.exit(1) + } + }) + process.stdin.resume() +} else { + run() +} + +function run () { + if (!parsed.tap) { + v.on('commit', (c) => { + pretty(c.commit, c.messages, v) + commitRun() + }) + + commitRun() + return + } const tap = new Tap() tap.pipe(process.stdout) if (parsed.out) tap.pipe(fs.createWriteStream(parsed.out)) @@ -141,13 +188,6 @@ if (parsed.tap) { }) tapRun() -} else { - v.on('commit', (c) => { - pretty(c.commit, c.messages, v) - commitRun() - }) - - commitRun() } function tapRun () { diff --git a/bin/usage.txt b/bin/usage.txt index 02ec77b..8e2a0bc 100644 --- a/bin/usage.txt +++ b/bin/usage.txt @@ -1,6 +1,6 @@ core-validate-commit - Validate the commit message for a particular commit in node core - usage: core-validate-commit [options] [sha[, sha]] + usage: core-validate-commit [options] [sha[, sha] | -] options: -h, --help show help and usage @@ -26,3 +26,7 @@ core-validate-commit - Validate the commit message for a particular commit in no Passing a url to a specific sha on github: $ core-validate-commit https://api.github.com/repos/nodejs/node/git/commits/9e9d499b8be8ffc6050db25129b042507d7b4b02 + + Passing JSON from stdin (no git required): + + $ echo '[{"id":"287bdab","message":"doc: update README"}]' | core-validate-commit - diff --git a/test/cli-test.js b/test/cli-test.js index fa82a0a..9fc19fd 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -152,5 +152,211 @@ test('Test cli flags', (t) => { }) }) + t.test('test stdin with valid JSON', (tt) => { + const validCommit = { + id: '2b98d02b52', + message: 'stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ' + } + const input = JSON.stringify([validCommit]) + + const ls = spawn('./bin/cmd.js', ['-']) + let compiledData = '' + let errorData = '' + + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stderr.on('data', (data) => { + errorData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.equal(code, 0, 'CLI exits with zero code on success') + tt.match(compiledData, /[^0-9a-f]2b98d02b52[^0-9a-f]/, 'output contains commit id') + tt.equal(errorData, '', 'no error output') + tt.end() + }) + }) + + t.test('test stdin with invalid commit (missing subsystem)', (tt) => { + const invalidCommit = { + id: 'def456', + message: 'this is a bad commit message without subsystem\n\nPR-URL: https://github.com/nodejs/node/pull/1234\nReviewed-By: Someone ' + } + const input = JSON.stringify([invalidCommit]) + + const ls = spawn('./bin/cmd.js', ['-']) + let compiledData = '' + + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.notEqual(code, 0, 'CLI exits with non-zero code on failure') + tt.match(compiledData, /def456/, 'output contains commit id') + tt.match(compiledData, /title-format/, 'output mentions the rule violation') + tt.end() + }) + }) + + t.test('test stdin with multiple commits', (tt) => { + const commits = [ + { + id: 'commit1', + message: 'doc: update README\n\nPR-URL: https://github.com/nodejs/node/pull/1111\nReviewed-By: Someone ' + }, + { + id: 'commit2', + message: 'test: add new test case\n\nPR-URL: https://github.com/nodejs/node/pull/2222\nReviewed-By: Someone ' + } + ] + const input = JSON.stringify(commits) + + const ls = spawn('./bin/cmd.js', ['-']) + let compiledData = '' + + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.equal(code, 0, 'CLI exits with zero code on success') + tt.match(compiledData, /commit1/, 'output contains first commit id') + tt.match(compiledData, /commit2/, 'output contains second commit id') + tt.end() + }) + }) + + t.test('test stdin with TAP output', (tt) => { + const validCommit = { + id: '69435db261', + message: 'chore: update tested node release lines (#94)' + } + const input = JSON.stringify([validCommit]) + + const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', '--tap', '-']) + let compiledData = '' + + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + const output = compiledData.trim() + tt.match(output, + /# 69435db261/, + 'TAP output contains the sha of the commit being linted') + tt.match(output, + /not ok \d+ subsystem: Invalid subsystem: "chore" \(chore: update tested node release lines \(#94\)\)/, + 'TAP output contains failure for subsystem') + tt.match(output, + /# fail\s+\d+/, + 'TAP output contains total failures') + tt.match(output, + /# Please review the commit message guidelines:\s# https:\/\/github.com\/nodejs\/node\/blob\/HEAD\/doc\/contributing\/pull-requests.md#commit-message-guidelines/, + 'TAP output contains pointer to commit message guidelines') + tt.equal(code, 1, 'CLI exits with non-zero code on failure') + tt.end() + }) + }) + + t.test('test stdin with invalid JSON', (tt) => { + const input = 'this is not valid JSON' + + const ls = spawn('./bin/cmd.js', ['-']) + let errorData = '' + + ls.stderr.on('data', (data) => { + errorData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.equal(code, 1, 'CLI exits with non-zero code on error') + tt.match(errorData, /Error parsing JSON input/, 'error message is shown') + tt.end() + }) + }) + + t.test('test stdin with non-array JSON', (tt) => { + const input = JSON.stringify({ id: 'test', message: 'test' }) + + const ls = spawn('./bin/cmd.js', ['-']) + let errorData = '' + + ls.stderr.on('data', (data) => { + errorData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.equal(code, 1, 'CLI exits with non-zero code on error') + tt.match(errorData, /Input must be an array/, 'error message is shown') + tt.end() + }) + }) + + t.test('test stdin with missing properties', (tt) => { + const input = JSON.stringify([{ id: 'test' }]) // missing 'message' + + const ls = spawn('./bin/cmd.js', ['-']) + let errorData = '' + + ls.stderr.on('data', (data) => { + errorData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.equal(code, 1, 'CLI exits with non-zero code on error') + tt.match(errorData, /must have "id" and "message" properties/, 'error message is shown') + tt.end() + }) + }) + + t.test('test stdin with --no-validate-metadata', (tt) => { + const commit = { + id: 'novalidate', + message: 'doc: update README\n\nThis commit has no PR-URL or reviewers' + } + const input = JSON.stringify([commit]) + + const ls = spawn('./bin/cmd.js', ['--no-validate-metadata', '-']) + let compiledData = '' + + ls.stdout.on('data', (data) => { + compiledData += data + }) + + ls.stdin.write(input) + ls.stdin.end() + + ls.on('close', (code) => { + tt.equal(code, 0, 'CLI exits with zero code when metadata validation is disabled') + tt.match(compiledData, /novalidate/, 'output contains commit id') + tt.end() + }) + }) + t.end() }) From 7a6f6ba705a28fd8afeab95517026db0457447bb Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Fri, 13 Mar 2026 17:40:44 +0100 Subject: [PATCH 100/110] chore(publish): add Release Please Action (#137) --- .github/workflows/release-please.yml | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/release-please.yml diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..0f6db05 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,61 @@ +name: Release Please + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + release-please: + outputs: + release_created: ${{ steps.release.outputs.release_created }} + release_tag: ${{ steps.release.outputs.tag_name }} + permissions: + contents: write + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: googleapis/release-please-action@16a9c90856f42705d54a6fda1823352bdc62cf38 # v4.4.0 + id: release + with: + release-type: node + + npm-publish: + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + with: + node-version: lts/* + + - name: Get npm cache directory + id: npm-cache-dir + run: echo "dir=$(npm config get cache)" >> "${GITHUB_OUTPUT}" + + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: ${{ steps.npm-cache-dir.outputs.dir }} + key: ${{ runner.os }}-node-${{ hashFiles('**/npm-shrinkwrap.json') }} + restore-keys: | + ${{ runner.os }}-node- + + - run: npm ci + + - name: Add package archive to GitHub release + run: gh release upload "$RELEASE_TAG" "$(npm pack)" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_TAG: ${{ needs.release-please.outputs.release_tag }} + + - name: Publish to the npm registry + run: npm publish --access public --provenance + From 68015be3fd21c8f616e11f8a6f2f6dad50b10424 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:50:44 +0100 Subject: [PATCH 101/110] chore(main): release 5.0.0 (#138) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 25 +++++++++++++++++++++++++ npm-shrinkwrap.json | 4 ++-- package.json | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5c46cd2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,25 @@ +# Changelog + +## [5.0.0](https://github.com/nodejs/core-validate-commit/compare/v4.1.0...v5.0.0) (2026-03-13) + + +### ⚠ BREAKING CHANGES + +* drop support for Node.js 18 ([#133](https://github.com/nodejs/core-validate-commit/issues/133)) +* `package.json` now contains `engines.node` + +### Features + +* add support for stdin JSON input ([#135](https://github.com/nodejs/core-validate-commit/issues/135)) ([3200730](https://github.com/nodejs/core-validate-commit/commit/32007307ca770180991991f6c1682fe5c048a887)) +* support co-authorship lines in body ([#130](https://github.com/nodejs/core-validate-commit/issues/130)) ([47e1d6d](https://github.com/nodejs/core-validate-commit/commit/47e1d6d51c2293ddab891ca6e9f2a6d7a93fe711)) + + +### Bug Fixes + +* **co-authored-by-is-trailer:** trailers do not have leading spaces ([#136](https://github.com/nodejs/core-validate-commit/issues/136)) ([39b93a3](https://github.com/nodejs/core-validate-commit/commit/39b93a36688cabd4221e6c2e2c1c03c17de6f2e9)) + + +### Miscellaneous Chores + +* do not test on EOL Node.js versions ([#124](https://github.com/nodejs/core-validate-commit/issues/124)) ([4556b7c](https://github.com/nodejs/core-validate-commit/commit/4556b7ced175f8802ef32a0cb1af273e9bab5c24)) +* drop support for Node.js 18 ([#133](https://github.com/nodejs/core-validate-commit/issues/133)) ([b4dae98](https://github.com/nodejs/core-validate-commit/commit/b4dae98fcf2116e10f46b586710aadf2e883f682)) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 3b571e4..54eae10 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,12 +1,12 @@ { "name": "core-validate-commit", - "version": "4.1.0", + "version": "5.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "core-validate-commit", - "version": "4.1.0", + "version": "5.0.0", "license": "MIT", "dependencies": { "gitlint-parser-node": "^1.1.0" diff --git a/package.json b/package.json index 06963ef..373878e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "4.1.0", + "version": "5.0.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "type": "module", From d4ebfff7417f3cc252da892e27762b8211133e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Wed, 18 Mar 2026 22:54:17 +0000 Subject: [PATCH 102/110] fix(rules): add `vfs` subsystem (#139) --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 85b0fb8..d348c05 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -74,6 +74,7 @@ const validSubsystems = [ 'url', 'util', 'v8', + 'vfs', 'vm', 'wasi', 'worker', From 0371a3d2c043d3e17f1d0a91b4a7542b06949a42 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Wed, 18 Mar 2026 23:54:47 +0100 Subject: [PATCH 103/110] fix(rules): add `config` subsystem (#129) Refs: https://github.com/nodejs/node/commit/478a2e656d803970e93c --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index d348c05..611765d 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -5,6 +5,7 @@ const validSubsystems = [ 'build', 'bootstrap', 'cli', + 'config', 'deps', 'doc', 'errors', From 450f8588e9433e9fc5b5ad69b7da4746e96da707 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 23:55:53 +0100 Subject: [PATCH 104/110] chore(main): release 5.0.1 (#140) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ npm-shrinkwrap.json | 4 ++-- package.json | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c46cd2..e2125bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [5.0.1](https://github.com/nodejs/core-validate-commit/compare/v5.0.0...v5.0.1) (2026-03-18) + + +### Bug Fixes + +* **rules:** add `config` subsystem ([#129](https://github.com/nodejs/core-validate-commit/issues/129)) ([0371a3d](https://github.com/nodejs/core-validate-commit/commit/0371a3d2c043d3e17f1d0a91b4a7542b06949a42)) +* **rules:** add `vfs` subsystem ([#139](https://github.com/nodejs/core-validate-commit/issues/139)) ([d4ebfff](https://github.com/nodejs/core-validate-commit/commit/d4ebfff7417f3cc252da892e27762b8211133e6e)) + ## [5.0.0](https://github.com/nodejs/core-validate-commit/compare/v4.1.0...v5.0.0) (2026-03-13) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 54eae10..9a25b80 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,12 +1,12 @@ { "name": "core-validate-commit", - "version": "5.0.0", + "version": "5.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "core-validate-commit", - "version": "5.0.0", + "version": "5.0.1", "license": "MIT", "dependencies": { "gitlint-parser-node": "^1.1.0" diff --git a/package.json b/package.json index 373878e..a63502e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "5.0.0", + "version": "5.0.1", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "type": "module", From 3fce4e6f6cc4ebb2970406324b28fa6a03369489 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 3 Apr 2026 11:09:11 -0700 Subject: [PATCH 105/110] Add Signed-off-by and Assisted-By rules (#141) --- lib/rules/assisted-by-is-trailer.js | 49 ++ lib/rules/signed-off-by.js | 217 +++++++ lib/validator.js | 4 + test/cli-test.js | 8 +- test/fixtures/commit.json | 2 +- test/fixtures/pr.json | 2 +- test/rules/assisted-by-is-trailer.js | 190 +++++++ test/rules/signed-off-by.js | 819 +++++++++++++++++++++++++++ test/validator.js | 20 +- 9 files changed, 1302 insertions(+), 9 deletions(-) create mode 100644 lib/rules/assisted-by-is-trailer.js create mode 100644 lib/rules/signed-off-by.js create mode 100644 test/rules/assisted-by-is-trailer.js create mode 100644 test/rules/signed-off-by.js diff --git a/lib/rules/assisted-by-is-trailer.js b/lib/rules/assisted-by-is-trailer.js new file mode 100644 index 0000000..1864304 --- /dev/null +++ b/lib/rules/assisted-by-is-trailer.js @@ -0,0 +1,49 @@ +const id = 'assisted-by-is-trailer' + +export default { + id, + meta: { + description: 'enforce that "Assisted-by:" lines are trailers', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { + const parsed = context.toJSON() + const lines = parsed.body.map((line, i) => [line, i]) + const re = /^Assisted-by:/gi + const assisted = lines.filter(([line]) => re.test(line)) + if (assisted.length !== 0) { + const firstAssisted = assisted[0] + const emptyLines = lines.filter(([text]) => text.trim().length === 0) + // There must be at least one empty line, and the last empty line must be + // above the first Assisted-by line. + const isTrailer = (emptyLines.length !== 0) && + emptyLines.at(-1)[1] < firstAssisted[1] + if (isTrailer) { + context.report({ + id, + message: 'Assisted-by is a trailer', + string: '', + level: 'pass' + }) + } else { + context.report({ + id, + message: 'Assisted-by must be a trailer', + string: firstAssisted[0], + line: firstAssisted[1], + column: 0, + level: 'fail' + }) + } + } else { + context.report({ + id, + message: 'no Assisted-by metadata', + string: '', + level: 'pass' + }) + } + } +} diff --git a/lib/rules/signed-off-by.js b/lib/rules/signed-off-by.js new file mode 100644 index 0000000..b92d91d --- /dev/null +++ b/lib/rules/signed-off-by.js @@ -0,0 +1,217 @@ +const id = 'signed-off-by' + +// Matches the name and email from a Signed-off-by line +const signoffParts = /^Signed-off-by: (.*) <([^>]+)>/i + +// Bot/AI patterns: name ending in [bot], or GitHub bot noreply emails +// This is an imperfect heuristic, but there's no standard way to identify +// bot commits in a reliable, generic way. +const botNamePattern = /\[bot\]$/i +const botEmailPattern = /(?:\[bot\]@users\.noreply\.github\.com|github-bot@iojs\.org)$/i + +// Matches "Name " author strings +const authorPattern = /^(.*?)\s*<([^>]+)>/ +const signoffPattern = /^Signed-off-by: /i +const validSignoff = /^Signed-off-by: .+ <[^@]+@[^@]+\.[^@]+>/i +const backportPattern = /^Backport-PR-URL:/i + +// Parse name and email from an author string like "Name " +function parseAuthor (authorStr) { + if (!authorStr) return null + const match = authorStr.match(authorPattern) + if (!match) return null // Purely defensive check here + return { name: match[1].trim(), email: match[2].toLowerCase() } +} + +// Check if an author string looks like a bot +function isBotAuthor (authorStr) { + const author = parseAuthor(authorStr) + if (!author) return false + return botNamePattern.test(author.name) || botEmailPattern.test(author.email) +} + +export default { + id, + meta: { + description: 'enforce DCO sign-off', + recommended: true + }, + defaults: {}, + options: {}, + validate: (context, rule) => { + const parsed = context.toJSON() + + // Release commits generally won't have sign-offs + if (parsed.release) { + context.report({ + id, + message: 'skipping sign-off for release commit', + string: '', + level: 'skip' + }) + return + } + + // Deps commits are cherry-picks/backports/updates from upstream projects + // (V8, etc.) and are not expected to have a Signed-off-by. When deps + // is mixed with other subsystems, a sign-off might be required but we'll + // downgrade to a warn instead of fail in this case. + const hasDeps = parsed.subsystems.includes('deps') + if (hasDeps && parsed.subsystems.every((s) => s === 'deps')) { + context.report({ + id, + message: 'skipping sign-off for deps commit', + string: '', + level: 'skip' + }) + return + } + + // Backport commits (identified by a Backport-PR-URL trailer) are + // cherry-picks of existing commits into release branches. The + // original commit was already validated. + if (parsed.body.some((line) => backportPattern.test(line))) { + context.report({ + id, + message: 'skipping sign-off for backport commit', + string: '', + level: 'skip' + }) + return + } + + const signoffs = parsed.body + .map((line, i) => [line, i]) + .filter(([line]) => signoffPattern.test(line)) + + // Bot-authored commits don't need a sign-off. + // If they have one, warn; otherwise pass. + if (isBotAuthor(parsed.author)) { + if (signoffs.length === 0) { + context.report({ + id, + message: 'skipping sign-off for bot commit', + string: '', + level: 'pass' + }) + } else { + for (const [line, lineNum] of signoffs) { + context.report({ + id, + message: 'bot commit should not have a "Signed-off-by" trailer', + string: line, + line: lineNum, + column: 0, + level: 'warn' + }) + } + } + return + } + + // Assume it's not a bot commit... a Signed-off-by trailer is required. + // For mixed deps commits (deps + other subsystems), downgrade to warn + // since the deps portion may legitimately lack a sign-off. + if (signoffs.length === 0) { + context.report({ + id, + message: hasDeps + ? 'Commit with non-deps changes should have a "Signed-off-by" trailer' + : 'Commit must have a "Signed-off-by" trailer', + string: '', + level: hasDeps ? 'warn' : 'fail' + }) + return + } + + // Flag every sign-off that has an invalid email format. + // Collect valid sign-offs for further checks. + const valid = [] + for (const [line, lineNum] of signoffs) { + if (validSignoff.test(line)) { + valid.push([line, lineNum]) + } else { + context.report({ + id, + message: '"Signed-off-by" trailer has invalid email', + string: line, + line: lineNum, + column: 0, + level: 'fail' + }) + } + } + + if (valid.length === 0) { + // All sign-offs had invalid emails; already reported above. + return + } + + // Flag any sign-off that appears to be from a bot or AI agent. + // Bots and AI agents are not permitted to sign off on commits. + // Collect non-bot sign-offs for further checks. If the commit + // itself appears to be from a bot, the case is handled above. + const human = [] + for (const [line, lineNum] of valid) { + const { 1: name, 2: email } = line.match(signoffParts) + if (botNamePattern.test(name) || botEmailPattern.test(email)) { + context.report({ + id, + message: '"Signed-off-by" must be from a human author, ' + + 'not a bot or AI agent', + string: line, + line: lineNum, + column: 0, + level: 'warn' + }) + } else { + human.push([line, lineNum]) + } + } + + // All sign-offs appear to be from bots; already reported above. + // If there are no human sign-offs, fail (or warn for mixed deps). + if (human.length === 0) { + context.report({ + id, + message: hasDeps + ? 'Commit with non-deps changes should have a "Signed-off-by" ' + + 'trailer from a human author' + : 'Commit must have a "Signed-off-by" trailer from a human author', + string: '', + level: hasDeps ? 'warn' : 'fail' + }) + return + } + + // When author info is available, warn if none of the human sign-off + // emails match the commit author email. This may indicate an automated + // tool signed off on behalf of the author. + const authorEmail = parseAuthor(parsed.author)?.email + if (authorEmail) { + const authorMatch = human.some(([line]) => { + const { 2: email } = line.match(signoffParts) + return email.toLowerCase() === authorEmail + }) + if (!authorMatch) { + context.report({ + id, + message: '"Signed-off-by" email does not match the ' + + 'commit author email', + string: human[0][0], + line: human[0][1], + column: 0, + level: 'warn' + }) + return + } + } + + context.report({ + id, + message: 'has valid Signed-off-by', + string: '', + level: 'pass' + }) + } +} diff --git a/lib/validator.js b/lib/validator.js index bbd26bf..dfa2a94 100644 --- a/lib/validator.js +++ b/lib/validator.js @@ -3,6 +3,7 @@ import Parser from 'gitlint-parser-node' import BaseRule from './rule.js' // Rules +import assistedByIsTrailer from './rules/assisted-by-is-trailer.js' import coAuthoredByIsTrailer from './rules/co-authored-by-is-trailer.js' import fixesUrl from './rules/fixes-url.js' import lineAfterTitle from './rules/line-after-title.js' @@ -11,10 +12,12 @@ import metadataEnd from './rules/metadata-end.js' import prUrl from './rules/pr-url.js' import reviewers from './rules/reviewers.js' import subsystem from './rules/subsystem.js' +import signedOffBy from './rules/signed-off-by.js' import titleFormat from './rules/title-format.js' import titleLength from './rules/title-length.js' const RULES = { + 'assisted-by-is-trailer': assistedByIsTrailer, 'co-authored-by-is-trailer': coAuthoredByIsTrailer, 'fixes-url': fixesUrl, 'line-after-title': lineAfterTitle, @@ -22,6 +25,7 @@ const RULES = { 'metadata-end': metadataEnd, 'pr-url': prUrl, reviewers, + 'signed-off-by': signedOffBy, subsystem, 'title-format': titleFormat, 'title-length': titleLength diff --git a/test/cli-test.js b/test/cli-test.js index 9fc19fd..bcaea29 100644 --- a/test/cli-test.js +++ b/test/cli-test.js @@ -155,7 +155,7 @@ test('Test cli flags', (t) => { t.test('test stdin with valid JSON', (tt) => { const validCommit = { id: '2b98d02b52', - message: 'stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ' + message: 'stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nSigned-off-by: Calvin Metcalf \nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ' } const input = JSON.stringify([validCommit]) @@ -211,11 +211,11 @@ test('Test cli flags', (t) => { const commits = [ { id: 'commit1', - message: 'doc: update README\n\nPR-URL: https://github.com/nodejs/node/pull/1111\nReviewed-By: Someone ' + message: 'doc: update README\n\nSigned-off-by: Someone \nPR-URL: https://github.com/nodejs/node/pull/1111\nReviewed-By: Someone ' }, { id: 'commit2', - message: 'test: add new test case\n\nPR-URL: https://github.com/nodejs/node/pull/2222\nReviewed-By: Someone ' + message: 'test: add new test case\n\nSigned-off-by: Someone \nPR-URL: https://github.com/nodejs/node/pull/2222\nReviewed-By: Someone ' } ] const input = JSON.stringify(commits) @@ -337,7 +337,7 @@ test('Test cli flags', (t) => { t.test('test stdin with --no-validate-metadata', (tt) => { const commit = { id: 'novalidate', - message: 'doc: update README\n\nThis commit has no PR-URL or reviewers' + message: 'doc: update README\n\nThis commit has no PR-URL or reviewers\n\nSigned-off-by: Someone ' } const input = JSON.stringify([commit]) diff --git a/test/fixtures/commit.json b/test/fixtures/commit.json index 08bec52..a45f90a 100644 --- a/test/fixtures/commit.json +++ b/test/fixtures/commit.json @@ -16,7 +16,7 @@ "sha": "d3f20ccfaa7b0919a7c5a472e344b7de8829b30c", "url": "https://api.github.com/repos/nodejs/node/git/trees/d3f20ccfaa7b0919a7c5a472e344b7de8829b30c" }, - "message": "stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ", + "message": "stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nSigned-off-by: Calvin Metcalf \nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ", "parents": [ { "sha": "ec2822adaad76b126b5cccdeaa1addf2376c9aa6", diff --git a/test/fixtures/pr.json b/test/fixtures/pr.json index 3ad5078..5af96c6 100644 --- a/test/fixtures/pr.json +++ b/test/fixtures/pr.json @@ -12,7 +12,7 @@ "email": "cmetcalf@appgeo.com", "date": "2016-04-13T16:33:55Z" }, - "message": "stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ", + "message": "stream: make null an invalid chunk to write in object mode\n\nthis harmonizes behavior between readable, writable, and transform\nstreams so that they all handle nulls in object mode the same way by\nconsidering them invalid chunks.\n\nSigned-off-by: Calvin Metcalf \nPR-URL: https://github.com/nodejs/node/pull/6170\nReviewed-By: James M Snell \nReviewed-By: Matteo Collina ", "tree": { "sha": "e4f9381fdd77d1fd38fe27a80dc43486ac732d48", "url": "https://api.github.com/repos/nodejs/node/git/trees/e4f9381fdd77d1fd38fe27a80dc43486ac732d48" diff --git a/test/rules/assisted-by-is-trailer.js b/test/rules/assisted-by-is-trailer.js new file mode 100644 index 0000000..01d2a2d --- /dev/null +++ b/test/rules/assisted-by-is-trailer.js @@ -0,0 +1,190 @@ +import { test } from 'tap' +import Rule from '../../lib/rules/assisted-by-is-trailer.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' + +test('rule: assisted-by-is-trailer', (t) => { + t.test('no assisted-by', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'fhqwhgads' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'assisted-by-is-trailer', 'id') + tt.equal(opts.message, 'no Assisted-by metadata', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('no empty lines above', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + 'Assisted-by: Whatever' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'assisted-by-is-trailer', 'id') + tt.equal(opts.message, + 'Assisted-by must be a trailer', 'message') + tt.equal(opts.string, + 'Assisted-by: Whatever', 'string') + tt.equal(opts.line, 0, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('not trailer - in body before metadata', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Assisted-by: Whatever\n' + + '\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'assisted-by-is-trailer', 'id') + tt.equal(opts.message, + 'Assisted-by must be a trailer', 'message') + tt.equal(opts.string, + 'Assisted-by: Whatever', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('is trailer', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Assisted-by: Whatever\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'assisted-by-is-trailer', 'id') + tt.equal(opts.message, + 'Assisted-by is a trailer', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('multiple assisted-by as trailers', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Assisted-by: Whatever\n' + + 'Assisted-by: Something else\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'assisted-by-is-trailer', 'id') + tt.equal(opts.message, + 'Assisted-by is a trailer', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('not all are trailers', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Assisted-by: Whatever\n' + + '\n' + + 'Assisted-by: Something else\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'assisted-by-is-trailer', 'id') + tt.equal(opts.message, + 'Assisted-by must be a trailer', 'message') + tt.equal(opts.string, + 'Assisted-by: Whatever', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.end() +}) diff --git a/test/rules/signed-off-by.js b/test/rules/signed-off-by.js new file mode 100644 index 0000000..acff632 --- /dev/null +++ b/test/rules/signed-off-by.js @@ -0,0 +1,819 @@ +import { test } from 'tap' +import Rule from '../../lib/rules/signed-off-by.js' +import Commit from 'gitlint-parser-node' +import Validator from '../../index.js' + +test('rule: signed-off-by', (t) => { + t.test('valid sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, 'has valid Signed-off-by', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('missing sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'Commit must have a "Signed-off-by" trailer', 'message') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('invalid email - no angle brackets', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo foo@example.com\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + '"Signed-off-by" trailer has invalid email', 'message') + tt.equal(opts.string, + 'Signed-off-by: Foo foo@example.com', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('invalid email - no domain', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + '"Signed-off-by" trailer has invalid email', 'message') + tt.equal(opts.string, + 'Signed-off-by: Foo ', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('missing name', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + '"Signed-off-by" trailer has invalid email', 'message') + tt.equal(opts.string, + 'Signed-off-by: ', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context) + }) + + t.test('release commit', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: '2024-01-01, Version 22.0.0 (Current)\n' + + '\n' + + 'Notable changes:\n' + + '\n' + + 'Some changes here.' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for release commit', 'message') + tt.equal(opts.level, 'skip', 'level') + } + + Rule.validate(context) + }) + + t.test('deps commit without sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Richard Lau', + email: 'richard.lau@ibm.com', + date: '2026-03-28T22:57:44Z' + }, + message: 'deps: V8: cherry-pick cf1bce40a5ef\n' + + '\n' + + 'Original commit message:\n' + + '\n' + + ' [wasm] Fix S128Const on big endian\n' + + '\n' + + 'Refs: https://github.com/v8/v8/commit/cf1bce40a5ef\n' + + 'PR-URL: https://github.com/nodejs/node/pull/62449\n' + + 'Reviewed-By: Guy Bedford ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for deps commit', 'message') + tt.equal(opts.level, 'skip', 'level') + } + + Rule.validate(context) + }) + + t.test('deps commit with sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Richard Lau', + email: 'richard.lau@ibm.com', + date: '2026-03-28T22:57:44Z' + }, + message: 'deps: V8: cherry-pick cf1bce40a5ef\n' + + '\n' + + 'Original commit message:\n' + + '\n' + + ' [wasm] Fix S128Const on big endian\n' + + '\n' + + 'Signed-off-by: Richard Lau \n' + + 'Refs: https://github.com/v8/v8/commit/cf1bce40a5ef\n' + + 'PR-URL: https://github.com/nodejs/node/pull/62449\n' + + 'Reviewed-By: Guy Bedford ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for deps commit', 'message') + tt.equal(opts.level, 'skip', 'level') + } + + Rule.validate(context) + }) + + t.test('mixed deps commit without sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2026-03-28T22:57:44Z' + }, + message: 'deps,src: update V8 and fix build\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'Commit with non-deps changes should have a ' + + '"Signed-off-by" trailer', 'message') + tt.equal(opts.level, 'warn', 'level') + } + + Rule.validate(context) + }) + + t.test('mixed deps commit with valid sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2026-03-28T22:57:44Z' + }, + message: 'deps,src: update V8 and fix build\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, 'has valid Signed-off-by', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('backport commit without sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Anna Henningsen', + email: 'anna@addaleax.net', + date: '2026-03-03T23:12:18Z' + }, + message: 'src: convert context_frame field in AsyncWrap\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'PR-URL: https://github.com/nodejs/node/pull/62103\n' + + 'Backport-PR-URL: https://github.com/nodejs/node/pull/62357\n' + + 'Reviewed-By: Anna Henningsen ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for backport commit', 'message') + tt.equal(opts.level, 'skip', 'level') + } + + Rule.validate(context) + }) + + t.test('backport commit with sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Anna Henningsen', + email: 'anna@addaleax.net', + date: '2026-03-03T23:12:18Z' + }, + message: 'src: convert context_frame field in AsyncWrap\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Anna Henningsen \n' + + 'PR-URL: https://github.com/nodejs/node/pull/62103\n' + + 'Backport-PR-URL: https://github.com/nodejs/node/pull/62357\n' + + 'Reviewed-By: Anna Henningsen ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for backport commit', 'message') + tt.equal(opts.level, 'skip', 'level') + } + + Rule.validate(context) + }) + + t.test('multiple valid sign-offs', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo \n' + + 'Signed-off-by: Bar \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Baz ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, 'has valid Signed-off-by', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('bot author with sign-off - name with [bot] suffix', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'dependabot[bot]', + email: '49699333+dependabot[bot]@users.noreply.github.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: dependabot[bot] ' + + '<49699333+dependabot[bot]@users.noreply.github.com>\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'bot commit should not have a "Signed-off-by" trailer', 'message') + tt.match(opts.string, /dependabot\[bot\]/, 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'warn', 'level') + } + + Rule.validate(context) + }) + + t.test('bot author with sign-off - GitHub bot noreply email', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'some-tool[bot]', + email: 'some-tool[bot]@users.noreply.github.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: some-tool[bot] ' + + '\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'bot commit should not have a "Signed-off-by" trailer', 'message') + tt.match(opts.string, /some-tool\[bot\]/, 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'warn', 'level') + } + + Rule.validate(context) + }) + + t.test('bot author without sign-off', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'dependabot[bot]', + email: '49699333+dependabot[bot]@users.noreply.github.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'build(deps): bump some-package from 1.0.0 to 2.0.0\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for bot commit', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('bot author - Node.js GitHub Bot', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Node.js GitHub Bot', + email: 'github-bot@iojs.org', + date: '2026-03-22T00:28:21Z' + }, + message: 'test: update WPT for url to fc3e651593\n' + + '\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'skipping sign-off for bot commit', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('bot author with human sign-off', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'dependabot[bot]', + email: '49699333+dependabot[bot]@users.noreply.github.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'build(deps): bump some-package from 1.0.0 to 2.0.0\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Human \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + 'bot commit should not have a "Signed-off-by" trailer', 'message') + tt.equal(opts.string, + 'Signed-off-by: Human ', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'warn', 'level') + } + + Rule.validate(context) + }) + + t.test('author email mismatch', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Alice', + email: 'alice@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Bob \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, + '"Signed-off-by" email does not match the ' + + 'commit author email', 'message') + tt.equal(opts.string, + 'Signed-off-by: Bob ', 'string') + tt.equal(opts.line, 3, 'line') + tt.equal(opts.column, 0, 'column') + tt.equal(opts.level, 'warn', 'level') + } + + Rule.validate(context) + }) + + t.test('author email matches one of multiple sign-offs', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Alice', + email: 'alice@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Bob \n' + + 'Signed-off-by: Alice \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, 'has valid Signed-off-by', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('no author info available - skips mismatch check', (tt) => { + tt.plan(4) + const v = new Validator() + // Simulate stdin JSON input which has no author info. + // Use a plain object context with no author field. + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Someone \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, 'has valid Signed-off-by', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('author email mismatch is case-insensitive', (tt) => { + tt.plan(4) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'Foo@Example.COM', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'signed-off-by', 'id') + tt.equal(opts.message, 'has valid Signed-off-by', 'message') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(context) + }) + + t.test('multiple sign-offs with some invalid emails', (tt) => { + tt.plan(9) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Bad One bad@\n' + + 'Signed-off-by: Foo \n' + + 'Signed-off-by: Bad Two noangles@example.com\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + const reports = [] + context.report = (opts) => { + reports.push(opts) + } + + Rule.validate(context) + + // Should get 3 reports: 2 fails for invalid emails + 1 pass + tt.equal(reports.length, 3, 'total reports') + + tt.equal(reports[0].level, 'fail', 'first invalid is fail') + tt.equal(reports[0].message, + '"Signed-off-by" trailer has invalid email', 'first message') + tt.equal(reports[0].string, + 'Signed-off-by: Bad One bad@', 'first string') + + tt.equal(reports[1].level, 'fail', 'second invalid is fail') + tt.equal(reports[1].message, + '"Signed-off-by" trailer has invalid email', 'second message') + tt.equal(reports[1].string, + 'Signed-off-by: Bad Two noangles@example.com', 'second string') + + tt.equal(reports[2].level, 'pass', 'valid one passes') + tt.equal(reports[2].message, + 'has valid Signed-off-by', 'pass message') + }) + + t.test('human author with only bot sign-offs', (tt) => { + tt.plan(5) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Alice', + email: 'alice@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: dependabot[bot] ' + + '<49699333+dependabot[bot]@users.noreply.github.com>\n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + const reports = [] + context.report = (opts) => { + reports.push(opts) + } + + Rule.validate(context) + + // Should get 2 reports: warn for bot sign-off + fail for no human sign-off + tt.equal(reports.length, 2, 'total reports') + + tt.equal(reports[0].level, 'warn', 'bot sign-off is warn') + tt.match(reports[0].string, /dependabot\[bot\]/, 'bot string') + + tt.equal(reports[1].level, 'fail', 'no human sign-off is fail') + tt.equal(reports[1].message, + 'Commit must have a "Signed-off-by" trailer from a human author', + 'fail message') + }) + + t.test('multiple sign-offs with human and bot', (tt) => { + tt.plan(7) + const v = new Validator() + const context = new Commit({ + sha: 'e7c077c610afa371430180fbd447bfef60ebc5ea', + author: { + name: 'Foo', + email: 'foo@example.com', + date: '2016-04-12T19:42:23Z' + }, + message: 'test: fix something\n' + + '\n' + + 'Some description.\n' + + '\n' + + 'Signed-off-by: Foo \n' + + 'Signed-off-by: dependabot[bot] \n' + + 'PR-URL: https://github.com/nodejs/node/pull/1234\n' + + 'Reviewed-By: Bar ' + }, v) + + const reports = [] + context.report = (opts) => { + reports.push(opts) + } + + Rule.validate(context) + + // Should get 2 reports: warn for bot + pass for human + tt.equal(reports.length, 2, 'total reports') + + tt.equal(reports[0].level, 'warn', 'bot is warn') + tt.equal(reports[0].message, + '"Signed-off-by" must be from a human author, ' + + 'not a bot or AI agent', 'bot message') + tt.match(reports[0].string, + /dependabot\[bot\]/, 'bot string') + + tt.equal(reports[1].level, 'pass', 'human passes') + tt.equal(reports[1].message, + 'has valid Signed-off-by', 'pass message') + tt.equal(reports[1].string, '', 'pass string') + }) + + t.end() +}) diff --git a/test/validator.js b/test/validator.js index d1c16d2..27dcf5d 100644 --- a/test/validator.js +++ b/test/validator.js @@ -15,6 +15,7 @@ CommitDate: Wed Apr 20 13:28:35 2016 -0700 streams so that they all handle nulls in object mode the same way by considering them invalid chunks. + Signed-off-by: Calvin Metcalf PR-URL: https://github.com/nodejs/node/pull/6170 Reviewed-By: James M Snell Reviewed-By: Matteo Collina @@ -31,6 +32,7 @@ Date: Tue Mar 29 08:09:37 2016 -0500 The offending commit broke certain usages of piping from stdin. Fixes: https://github.com/nodejs/node/issues/5927 + Signed-off-by: Evan Lucas PR-URL: https://github.com/nodejs/node/pull/5947 Reviewed-By: Matteo Collina Reviewed-By: Alexis Campailla @@ -50,6 +52,7 @@ Date: Fri Apr 15 13:32:36 2016 +0200 [1] https://github.com/nodejs/node/pull/5172/commits/ae18bbef48d87d9c641df85369f62cfd5ed8c250 Fixes: https://github.com/nodejs/node/issues/6214 + Signed-off-by: Michaël Zasso PR-URL: https://github.com/nodejs/node/pull/6215 Reviewed-By: James M Snell Reviewed-By: Brian White ` @@ -63,6 +66,7 @@ Date: Thu Mar 3 10:10:46 2016 -0600 The properties on memoryUsage were not checked before, this commit checks them. + Signed-off-by: Wyatt Preul PR-URL: #5546 Reviewed-By: Colin Ihrig ` @@ -73,7 +77,9 @@ Date: Thu Mar 3 10:10:46 2016 -0600 test: check memoryUsage properties The properties on memoryUsage were not checked before, - this commit checks them.` + this commit checks them. + + Signed-off-by: Wyatt Preul ` /* eslint-disable */ const str6 = { @@ -94,7 +100,7 @@ const str6 = { "sha": "b505c0ffa0555730e9f4cdb391d1ebeb48bb2f59", "url": "https://api.github.com/repos/nodejs/node/git/trees/b505c0ffa0555730e9f4cdb391d1ebeb48bb2f59" }, - "message": "fs: fix handling of `uv_stat_t` fields\n\n`FChown` and `Chown` test that the `uid` and `gid` parameters\nthey receive are unsigned integers, but `Stat()` and `FStat()`\nwould return the corresponding fields of `uv_stat_t` as signed\nintegers. Applications which pass those these values directly\nto `Chown` may fail\n(e.g. for `nobody` on OS X, who has an `uid` of `-2`, see e.g.\nhttps://github.com/nodejs/node-v0.x-archive/issues/5890).\n\nThis patch changes the `Integer::New()` call for `uid` and `gid`\nto `Integer::NewFromUnsigned()`.\n\nAll other fields are kept as they are, for performance, but\nstrictly speaking the respective sizes of those\nfields aren’t specified, either.\n\nRef: https://github.com/npm/npm/issues/13918\nPR-URL: https://github.com/nodejs/node/pull/8515\nReviewed-By: Ben Noordhuis \nReviewed-By: Sakthipriyan Vairamani \nReviewed-By: James M Snell \n\nundo accidental change to other fields of uv_fs_stat", + "message": "fs: fix handling of `uv_stat_t` fields\n\n`FChown` and `Chown` test that the `uid` and `gid` parameters\nthey receive are unsigned integers, but `Stat()` and `FStat()`\nwould return the corresponding fields of `uv_stat_t` as signed\nintegers. Applications which pass those these values directly\nto `Chown` may fail\n(e.g. for `nobody` on OS X, who has an `uid` of `-2`, see e.g.\nhttps://github.com/nodejs/node-v0.x-archive/issues/5890).\n\nThis patch changes the `Integer::New()` call for `uid` and `gid`\nto `Integer::NewFromUnsigned()`.\n\nAll other fields are kept as they are, for performance, but\nstrictly speaking the respective sizes of those\nfields aren’t specified, either.\n\nSigned-off-by: Anna Henningsen \nRef: https://github.com/npm/npm/issues/13918\nPR-URL: https://github.com/nodejs/node/pull/8515\nReviewed-By: Ben Noordhuis \nReviewed-By: Sakthipriyan Vairamani \nReviewed-By: James M Snell \n\nundo accidental change to other fields of uv_fs_stat", "parents": [ { "sha": "4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4", @@ -110,6 +116,8 @@ Author: Wyatt Preul Date: Thu Mar 3 10:10:46 2016 -0600 test: check memoryUsage properties. + + Signed-off-by: Wyatt Preul ` const str8 = `commit 7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 @@ -117,6 +125,8 @@ Author: Wyatt Preul Date: Thu Mar 3 10:10:46 2016 -0600 test: Check memoryUsage properties + + Signed-off-by: Wyatt Preul ` const str9 = `commit 7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 @@ -124,6 +134,8 @@ Author: Wyatt Preul Date: Thu Mar 3 10:10:46 2016 -0600 test: Check memoryUsage properties. + + Signed-off-by: Wyatt Preul ` const str10 = `commit b04fe688d5859f707cf1a5e0206967268118bf7a @@ -169,6 +181,8 @@ Date: Sat Oct 22 10:22:43 2022 +0200 Revert "deps: V8: forward declaration of \`Rtl*FunctionTable\`" This reverts commit 01bc8e6fd81314e76c7fb0d09e5310f609e48bee. + + Signed-off-by: Michaël Zasso ` test('Validator - misc', (t) => { @@ -395,7 +409,7 @@ test('Validator - real commits', (t) => { const item = filtered[0] tt.equal(item.id, 'metadata-end', 'id') tt.equal(item.message, 'commit metadata at end of message', 'message') - tt.equal(item.line, 22, 'line') + tt.equal(item.line, 23, 'line') tt.equal(item.column, 0, 'column') tt.end() }) From 58c48dcead19eb9c868a7d67bc42bbc5a418725b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Mon, 13 Apr 2026 13:12:27 +0100 Subject: [PATCH 106/110] fix(rules): add line-length exemptions for DCO sign-offs (#142) Refs: https://github.com/nodejs/core-validate-commit/pull/141 --- lib/rules/line-length.js | 4 ++++ test/rules/line-length.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index 3a568a9..9a3be31 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -36,6 +36,10 @@ export default { if (/https?:\/\//.test(line)) { continue } // Skip co-authorship. if (/^co-authored-by:/i.test(line)) { continue } + // Skip DCO sign-offs. + if (/^signed-off-by:/i.test(line)) { continue } + // Skip agentic assistants. + if (/^assisted-by:/i.test(line)) { continue } if (line.length > len) { failed = true diff --git a/test/rules/line-length.js b/test/rules/line-length.js index 1eb781d..78e8f33 100644 --- a/test/rules/line-length.js +++ b/test/rules/line-length.js @@ -161,5 +161,37 @@ https://${'very-'.repeat(80)}-long-url.org/ tt.end() }) + t.test('Signed-off-by and Assisted-by lines', (tt) => { + const v = new Validator() + + const good = new Commit({ + sha: '016b3921626b58d9b595c90141e65c6fbe0c78e2', + author: { + name: 'John Connor', + email: '9092381+JConnor1985@users.noreply.github.com', + date: '2026-04-10T16:38:01Z' + }, + message: [ + 'Signed-off-by: John Connor <9092381+JConnor1985@users.noreply.github.com>', + 'Assisted-by: The Longest-Named Code Agent In The World ' + ].join('\n') + }, v) + + good.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'line-length', 'id') + tt.equal(opts.string, '', 'string') + tt.equal(opts.level, 'pass', 'level') + } + + Rule.validate(good, { + options: { + length: 72 + } + }) + + tt.end() + }) + t.end() }) From cd1a6a88c8b6d8fcdbc20355456934c2be37264f Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 22 Apr 2026 17:55:04 +0100 Subject: [PATCH 107/110] feat!: parse trailers using `git` if available, allow longer lines (#144) --- lib/gitlint-parser.js | 171 +++++++++++++ lib/rules/line-length.js | 35 ++- lib/rules/signed-off-by.js | 10 +- lib/validator.js | 2 +- npm-shrinkwrap.json | 36 +-- package.json | 2 +- test/gitlint-parser.js | 321 ++++++++++++++++++++++++ test/rules/assisted-by-is-trailer.js | 2 +- test/rules/co-authored-by-is-trailer.js | 2 +- test/rules/fixes-url.js | 2 +- test/rules/line-after-title.js | 2 +- test/rules/line-length.js | 137 +++++++++- test/rules/reviewers.js | 2 +- test/rules/signed-off-by.js | 2 +- test/rules/subsystem.js | 2 +- test/rules/title-format.js | 2 +- test/validator.js | 54 +--- 17 files changed, 662 insertions(+), 122 deletions(-) create mode 100644 lib/gitlint-parser.js create mode 100644 test/gitlint-parser.js diff --git a/lib/gitlint-parser.js b/lib/gitlint-parser.js new file mode 100644 index 0000000..7cfb775 --- /dev/null +++ b/lib/gitlint-parser.js @@ -0,0 +1,171 @@ +import { spawnSync } from 'node:child_process' +import Base from 'gitlint-parser-base' + +const revertRE = /Revert "(.*)"$/ +const workingRE = /Working on v([\d]+)\.([\d]+).([\d]+)$/ +const releaseRE = /([\d]{4})-([\d]{2})-([\d]{2}),? Version/ +const reviewedByRE = /^Reviewed-By: (.*)$/ +const fixesRE = /^Fixes: (.*)$/ +const prUrlRE = /^PR-URL: (.*)$/ +const refsRE = /^Refs?: (.*)$/ + +export default class Parser extends Base { + constructor (str, validator) { + super(str, validator) + this.subsystems = [] + this.fixes = [] + this.prUrl = null + this.refs = [] + this.reviewers = [] + this._metaStart = 0 + this._metaEnd = 0 + this._parse() + } + + _setMetaStart (n) { + if (this._metaStart) return + this._metaStart = n + } + + _setMetaEnd (n) { + if (n < this._metaEnd) return + this._metaEnd = n + } + + _parseTrailers (body) { + const interpretTrailers = commitMessage => spawnSync('git', [ + 'interpret-trailers', '--only-trailers', '--only-input', '--no-divider' + ], { + encoding: 'utf-8', + input: `'dummy subject\n\n${commitMessage.join('\n')}\n` + }).stdout + + let originalTrailers + try { + originalTrailers = interpretTrailers(body).trim() + } catch (err) { + console.warn('git is not available, trailers detection might be a bit ' + + 'off which is acceptable in most cases', err) + return body + } + const trailerFreeBody = body.slice(1) // clone, and remove the first empty line + const stillInTrailers = () => { + const result = interpretTrailers(trailerFreeBody) + return result.length && originalTrailers.startsWith(result.trim()) + } + for (let i = trailerFreeBody.length - 1; stillInTrailers(); i--) { + // Remove last line until git no longer detects any trailers + trailerFreeBody.pop() + } + this._metaStart = trailerFreeBody.length + 1 // the subject line needs to be counted + for (let i = trailerFreeBody.length - 1; trailerFreeBody[i] === ''; i--) { + // Remove additional empty line(s) + trailerFreeBody.pop() + } + this._metaEnd = body.length - 1 + this.trailerFreeBody = trailerFreeBody + return (this.trailers = originalTrailers.split('\n')) + } + + _parse () { + const revert = this.isRevert() + if (!revert) { + this.subsystems = getSubsystems(this.title || '') + } else { + const matches = this.title.match(revertRE) + if (matches) { + const title = matches[1] + this.subsystems = getSubsystems(title) + } + } + + const trailers = this._parseTrailers(this.body) + + for (let i = 0; i < trailers.length; i++) { + const line = trailers[i] + const reviewedBy = reviewedByRE.exec(line) + if (reviewedBy) { + this._setMetaStart(i) + this._setMetaEnd(i) + this.reviewers.push(reviewedBy[1]) + continue + } + + const fixes = fixesRE.exec(line) + if (fixes) { + this._setMetaStart(i) + this._setMetaEnd(i) + this.fixes.push(fixes[1]) + continue + } + + const prUrl = prUrlRE.exec(line) + if (prUrl) { + this._setMetaStart(i) + this._setMetaEnd(i) + this.prUrl = prUrl[1] + continue + } + + const refs = refsRE.exec(line) + if (refs) { + this._setMetaStart(i) + this._setMetaEnd(i) + this.refs.push(refs[1]) + continue + } + + if (this._metaStart && !this._metaEnd) { this._setMetaEnd(i) } + } + } + + isRevert () { + return revertRE.test(this.title) + } + + isWorkingCommit () { + return workingRE.test(this.title) + } + + isReleaseCommit () { + return releaseRE.test(this.title) + } + + toJSON () { + return { + sha: this.sha, + title: this.title, + subsystems: this.subsystems, + author: this.author, + date: this.date, + fixes: this.fixes, + refs: this.refs, + prUrl: this.prUrl, + reviewers: this.reviewers, + body: this.body, + trailers: this.trailers, + trailerFreeBody: this.trailerFreeBody, + revert: this.isRevert(), + release: this.isReleaseCommit(), + working: this.isWorkingCommit(), + metadata: { + start: this._metaStart, + end: this._metaEnd + } + } + } +} + +function getSubsystems (str) { + str = str || '' + const colon = str.indexOf(':') + if (colon === -1) { + return [] + } + + const subStr = str.slice(0, colon) + const subs = subStr.split(',') + return subs.map((item) => { + return item.trim() + }) +} diff --git a/lib/rules/line-length.js b/lib/rules/line-length.js index 9a3be31..dfa573a 100644 --- a/lib/rules/line-length.js +++ b/lib/rules/line-length.js @@ -7,10 +7,12 @@ export default { recommended: true }, defaults: { - length: 72 + length: 72, + trailerLength: 120 }, options: { - length: 72 + length: 72, + trailerLength: 120 }, validate: (context, rule) => { const len = rule.options.length @@ -27,19 +29,14 @@ export default { return } let failed = false - for (let i = 0; i < parsed.body.length; i++) { - const line = parsed.body[i] + const body = parsed.trailerFreeBody ?? parsed.body + for (let i = 0; i < body.length; i++) { + const line = body[i] // Skip quoted lines, e.g. for original commit messages of V8 backports. if (line.startsWith(' ')) { continue } // Skip lines with URLs. if (/https?:\/\//.test(line)) { continue } - // Skip co-authorship. - if (/^co-authored-by:/i.test(line)) { continue } - // Skip DCO sign-offs. - if (/^signed-off-by:/i.test(line)) { continue } - // Skip agentic assistants. - if (/^assisted-by:/i.test(line)) { continue } if (line.length > len) { failed = true @@ -48,7 +45,23 @@ export default { message: `Line should be <= ${len} columns.`, string: line, maxLength: len, - line: i, + line: i + parsed.body.length - body.length, + column: len, + level: 'fail' + }) + } + } + for (let i = 0; i < (parsed.trailers?.length ?? 0); i++) { + const line = parsed.trailers[i] + const len = rule.options.trailerLength + if (line.length > len) { + failed = true + context.report({ + id, + message: `Trailer should be <= ${len} columns.`, + string: line, + maxLength: len, + line: i + parsed.body.length - parsed.trailers.length, column: len, level: 'fail' }) diff --git a/lib/rules/signed-off-by.js b/lib/rules/signed-off-by.js index b92d91d..3bdf6ce 100644 --- a/lib/rules/signed-off-by.js +++ b/lib/rules/signed-off-by.js @@ -67,10 +67,12 @@ export default { return } + const body = parsed.trailers ?? parsed.body + // Backport commits (identified by a Backport-PR-URL trailer) are // cherry-picks of existing commits into release branches. The // original commit was already validated. - if (parsed.body.some((line) => backportPattern.test(line))) { + if (body.some((line) => backportPattern.test(line))) { context.report({ id, message: 'skipping sign-off for backport commit', @@ -80,9 +82,9 @@ export default { return } - const signoffs = parsed.body - .map((line, i) => [line, i]) - .filter(([line]) => signoffPattern.test(line)) + const signoffs = body + .filter(line => signoffPattern.test(line)) + .map((line, i) => [line, i + parsed.body.length - body.length]) // Bot-authored commits don't need a sign-off. // If they have one, warn; otherwise pass. diff --git a/lib/validator.js b/lib/validator.js index dfa2a94..c28cc94 100644 --- a/lib/validator.js +++ b/lib/validator.js @@ -1,5 +1,5 @@ import EE from 'node:events' -import Parser from 'gitlint-parser-node' +import Parser from './gitlint-parser.js' import BaseRule from './rule.js' // Rules diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9a25b80..87e41c9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -9,7 +9,7 @@ "version": "5.0.1", "license": "MIT", "dependencies": { - "gitlint-parser-node": "^1.1.0" + "gitlint-parser-base": "^2.0.0" }, "bin": { "core-validate-commit": "bin/cmd.js" @@ -55,7 +55,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1031,7 +1030,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -1223,19 +1221,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/check-pkg": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-pkg/-/check-pkg-2.1.1.tgz", @@ -1918,7 +1903,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2126,7 +2110,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -2194,7 +2177,6 @@ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", @@ -2221,7 +2203,6 @@ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2238,7 +2219,6 @@ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -2407,7 +2387,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2883,15 +2862,6 @@ "integrity": "sha512-kWkbGGH55AigPQgTz9ZEomv8uQn2GRZiFgAg+SbTIV+8ineU8f3QDeAQHzS7h9yKVuE7cjcgQm0ENmHPM0bxMQ==", "license": "MIT" }, - "node_modules/gitlint-parser-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gitlint-parser-node/-/gitlint-parser-node-1.1.0.tgz", - "integrity": "sha512-h99xAvajhfkTtwVo8q9oBlL8+QrljJltguykpszQWyu0D9SVE5+5CqfEn9qn5IJ254Q2mr1ByjrFu9Rs2niSyA==", - "license": "MIT", - "dependencies": { - "gitlint-parser-base": "^2.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6008,7 +5978,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", @@ -6465,7 +6434,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -6594,7 +6562,6 @@ ], "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001565", "electron-to-chromium": "^1.4.601", @@ -7365,7 +7332,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" diff --git a/package.json b/package.json index a63502e..dbe4224 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "test-ci": "npm run test && c8 report --reporter=lcov" }, "dependencies": { - "gitlint-parser-node": "^1.1.0" + "gitlint-parser-base": "^2.0.0" }, "devDependencies": { "c8": "^7.13.0", diff --git a/test/gitlint-parser.js b/test/gitlint-parser.js new file mode 100644 index 0000000..e00d5ab --- /dev/null +++ b/test/gitlint-parser.js @@ -0,0 +1,321 @@ +import { test } from 'tap' +import Parser from '../lib/gitlint-parser.js' + +test('Parser', (t) => { + t.test('basic commit with PR-URL and reviewers', (tt) => { + tt.plan(10) + const input = `commit e7c077c610afa371430180fbd447bfef60ebc5ea +Author: Calvin Metcalf +Date: Tue Apr 12 15:42:23 2016 -0400 + + stream: make null an invalid chunk to write in object mode + + this harmonizes behavior between readable, writable, and transform + streams so that they all handle nulls in object mode the same way by + considering them invalid chunks. + + PR-URL: https://github.com/nodejs/node/pull/6170 + Reviewed-By: James M Snell + Reviewed-By: Matteo Collina ` + + const data = { name: 'biscuits' } + + const v = { + report: (obj) => { + tt.pass('called report') + tt.equal(obj.data, data, 'obj') + } + } + const p = new Parser(input, v) + const c = p.toJSON() + tt.equal(c.sha, 'e7c077c610afa371430180fbd447bfef60ebc5ea', 'sha') + tt.equal(c.author, 'Calvin Metcalf ', 'author') + tt.equal(c.date, 'Tue Apr 12 15:42:23 2016 -0400', 'date') + tt.deepEqual(c.subsystems, ['stream'], 'subsystems') + tt.deepEqual(c.fixes, [], 'fixes') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/6170', 'prUrl') + tt.deepEqual(c.reviewers, [ + 'James M Snell ', + 'Matteo Collina ' + ], 'reviewers') + tt.deepEqual(c.metadata, { + start: 5, + end: 7 + }, 'metadata') + p.report(data) + }) + + t.test('basic commit using format=fuller', (tt) => { + tt.plan(9) + const input = `commit e7c077c610afa371430180fbd447bfef60ebc5ea +Author: Calvin Metcalf +AuthorDate: Tue Apr 12 15:42:23 2016 -0400 +Commit: James M Snell +CommitDate: Tue Apr 12 15:42:23 2016 -0400 + + stream: make null an invalid chunk to write in object mode + + this harmonizes behavior between readable, writable, and transform + streams so that they all handle nulls in object mode the same way by + considering them invalid chunks. + + PR-URL: https://github.com/nodejs/node/pull/6170 + Reviewed-By: James M Snell + Reviewed-By: Matteo Collina ` + + const data = { name: 'biscuits' } + + const v = { + report: (obj) => { + tt.pass('called report') + tt.equal(obj.data, data, 'obj') + } + } + const p = new Parser(input, v) + const c = p.toJSON() + tt.equal(c.sha, 'e7c077c610afa371430180fbd447bfef60ebc5ea', 'sha') + tt.equal(c.author, 'Calvin Metcalf ', 'author') + tt.equal(c.date, 'Tue Apr 12 15:42:23 2016 -0400', 'date') + tt.deepEqual(c.subsystems, ['stream'], 'subsystems') + tt.deepEqual(c.fixes, [], 'fixes') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/6170', 'prUrl') + tt.deepEqual(c.reviewers, [ + 'James M Snell ', + 'Matteo Collina ' + ], 'reviewers') + p.report(data) + }) + + t.test('revert commit', (tt) => { + tt.plan(13) + const input = `commit 1d4c7993a9c6dcacaca5074a80b1043e977c43fb +Author: Rod Vagg +Date: Wed Jun 8 16:32:10 2016 +1000 + + Revert "test: change duration_ms to duration" + + This reverts commit d413378e513c47a952f7979c74f4a4d9f144ca7d. + + PR-URL: https://github.com/nodejs/node/pull/7216 + Reviewed-By: Colin Ihrig + Reviewed-By: James M Snell + Reviewed-By: Michaël Zasso + Reviewed-By: Johan Bergström ` + const data = { name: 'biscuits' } + + const v = { + report: (obj) => { + tt.pass('called report') + tt.equal(obj.data, data, 'obj') + } + } + const p = new Parser(input, v) + const c = p.toJSON() + tt.equal(c.sha, '1d4c7993a9c6dcacaca5074a80b1043e977c43fb', 'sha') + tt.equal(c.author, 'Rod Vagg ', 'author') + tt.equal(c.date, 'Wed Jun 8 16:32:10 2016 +1000', 'date') + tt.deepEqual(c.subsystems, ['test'], 'subsystems') + tt.deepEqual(c.fixes, [], 'fixes') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/7216', 'prUrl') + tt.deepEqual(c.reviewers, [ + 'Colin Ihrig ', + 'James M Snell ', + 'Michaël Zasso ', + 'Johan Bergström ' + ], 'reviewers') + + tt.equal(c.revert, true, 'revert') + tt.equal(c.release, false, 'release') + tt.equal(c.working, false, 'working') + tt.deepEqual(c.metadata, { + start: 3, + end: 7 + }, 'metadata') + p.report(data) + }) + + t.test('backport commit', (tt) => { + const input = `commit 5cdbbdf94d6f656230293ddd2a71dedf11cab17d +Author: Ben Noordhuis +Date: Thu Jul 7 14:29:32 2016 -0700 + + deps: cherry-pick 1f53e42 from v8 upstream + + Original commit message: + + Handle symbols in FrameMirror#invocationText(). + + Fix a TypeError when putting together the invocationText for a + symbol method's stack frame. + + See https://github.com/nodejs/node/issues/7536. + + Review-Url: https://codereview.chromium.org/2122793003 + Cr-Commit-Position: refs/heads/master@{#37597} + + Fixes: https://github.com/nodejs/node/issues/7536 + PR-URL: https://github.com/nodejs/node/pull/7612 + Reviewed-By: Colin Ihrig + Reviewed-By: Michaël Zasso ` + const data = { name: 'biscuits' } + + const v = { + report: (obj) => { + tt.pass('called report') + tt.equal(obj.data, data, 'obj') + } + } + const p = new Parser(input, v) + const c = p.toJSON() + tt.equal(c.sha, '5cdbbdf94d6f656230293ddd2a71dedf11cab17d', 'sha') + tt.equal(c.author, 'Ben Noordhuis ', 'author') + tt.equal(c.date, 'Thu Jul 7 14:29:32 2016 -0700', 'date') + tt.deepEqual(c.subsystems, ['deps'], 'subsystems') + tt.deepEqual(c.fixes, [ + 'https://github.com/nodejs/node/issues/7536' + ], 'fixes') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/7612', 'prUrl') + tt.deepEqual(c.reviewers, [ + 'Colin Ihrig ', + 'Michaël Zasso ' + ], 'reviewers') + + tt.equal(c.revert, false, 'revert') + tt.equal(c.release, false, 'release') + tt.equal(c.working, false, 'working') + tt.deepEqual(c.metadata, { + start: 13, + end: 16 + }, 'metadata') + p.report(data) + tt.end() + }) + + t.test('release commit', (tt) => { + /* eslint-disable */ + const input = `commit 6a9438343bb63e2c1fc028f2e9387e6ae41b9fc8 +Author: Evan Lucas +Date: Thu Jun 23 07:27:44 2016 -0500 + + 2016-06-23, Version 5.12.0 (Stable) + + Notable changes: + + This is a security release. All Node.js users should consult the security + release summary at https://nodejs.org/en/blog/vulnerability/june-2016-security-releases + for details on patched vulnerabilities. + + * **buffer** + * backport allocUnsafeSlow (Сковорода Никита Андреевич) [#7169](https://github.com/nodejs/node/pull/7169) + * ignore negative allocation lengths (Anna Henningsen) [#7221](https://github.com/nodejs/node/pull/7221) + * **deps**: backport 3a9bfec from v8 upstream (Ben Noordhuis) [nodejs/node-private#40](https://github.com/nodejs/node-private/pull/40) + * Fixes a Buffer overflow vulnerability discovered in v8. More details + can be found in the CVE (CVE-2016-1699). + + PR-URL: https://github.com/nodejs/node-private/pull/51` + /* eslint-enable */ + const v = { + report: () => {} + } + const p = new Parser(input, v) + const c = p.toJSON() + tt.equal(c.sha, '6a9438343bb63e2c1fc028f2e9387e6ae41b9fc8', 'sha') + tt.equal(c.author, 'Evan Lucas ', 'author') + tt.equal(c.date, 'Thu Jun 23 07:27:44 2016 -0500', 'date') + tt.deepEqual(c.subsystems, [], 'subsystems') + tt.deepEqual(c.fixes, [], 'fixes') + tt.equal(c.prUrl, 'https://github.com/nodejs/node-private/pull/51', 'prUrl') + tt.deepEqual(c.reviewers, [], 'reviewers') + tt.deepEqual(c.metadata, { + start: 14, + end: 14 + }, 'metadata') + + tt.equal(c.revert, false, 'revert') + tt.equal(c.release, true, 'release') + tt.equal(c.working, false, 'working') + tt.end() + }) + + t.test('extra meta', (tt) => { + /* eslint-disable */ + const input = { + "sha": "c5545f2c63fe30b0cfcdafab18c26df8286881d0", + "url": "https://api.github.com/repos/nodejs/node/git/commits/c5545f2c63fe30b0cfcdafab18c26df8286881d0", + "html_url": "https://github.com/nodejs/node/commit/c5545f2c63fe30b0cfcdafab18c26df8286881d0", + "author": { + "name": "Anna Henningsen", + "email": "anna@addaleax.net", + "date": "2016-09-13T10:57:49Z" + }, + "committer": { + "name": "Anna Henningsen", + "email": "anna@addaleax.net", + "date": "2016-09-19T12:50:57Z" + }, + "tree": { + "sha": "b505c0ffa0555730e9f4cdb391d1ebeb48bb2f59", + "url": "https://api.github.com/repos/nodejs/node/git/trees/b505c0ffa0555730e9f4cdb391d1ebeb48bb2f59" + }, + "message": "fs: fix handling of `uv_stat_t` fields\n\n`FChown` and `Chown` test that the `uid` and `gid` parameters\nthey receive are unsigned integers, but `Stat()` and `FStat()`\nwould return the corresponding fields of `uv_stat_t` as signed\nintegers. Applications which pass those these values directly\nto `Chown` may fail\n(e.g. for `nobody` on OS X, who has an `uid` of `-2`, see e.g.\nhttps://github.com/nodejs/node-v0.x-archive/issues/5890).\n\nThis patch changes the `Integer::New()` call for `uid` and `gid`\nto `Integer::NewFromUnsigned()`.\n\nAll other fields are kept as they are, for performance, but\nstrictly speaking the respective sizes of those\nfields aren’t specified, either.\n\nRef: https://github.com/npm/npm/issues/13918\nPR-URL: https://github.com/nodejs/node/pull/8515\nReviewed-By: Ben Noordhuis \nReviewed-By: Sakthipriyan Vairamani \nReviewed-By: James M Snell ", + "parents": [ + { + "sha": "4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4", + "url": "https://api.github.com/repos/nodejs/node/git/commits/4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4", + "html_url": "https://github.com/nodejs/node/commit/4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4" + } + ] + } + /* eslint-enable */ + const v = { + report: () => {} + } + const p = new Parser(input, v) + const c = p.toJSON() + tt.equal(c.sha, 'c5545f2c63fe30b0cfcdafab18c26df8286881d0', 'sha') + tt.equal(c.author, 'Anna Henningsen ', 'author') + tt.equal(c.date, '2016-09-13T10:57:49Z', 'date') + tt.deepEqual(c.subsystems, ['fs'], 'subsystems') + tt.deepEqual(c.fixes, [], 'fixes') + tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/8515', 'prUrl') + tt.deepEqual(c.reviewers, [ + 'Ben Noordhuis ', + 'Sakthipriyan Vairamani ', + 'James M Snell ' + ], 'reviewers') + tt.deepEqual(c.metadata, { + start: 16, + end: 20 + }, 'metadata') + tt.deepEqual(c.trailers, [ + 'Ref: https://github.com/npm/npm/issues/13918', + 'PR-URL: https://github.com/nodejs/node/pull/8515', + 'Reviewed-By: Ben Noordhuis ', + 'Reviewed-By: Sakthipriyan Vairamani ', + 'Reviewed-By: James M Snell ' + ], 'c.trailers') + tt.deepEqual(c.trailerFreeBody, [ + '`FChown` and `Chown` test that the `uid` and `gid` parameters', + 'they receive are unsigned integers, but `Stat()` and `FStat()`', + 'would return the corresponding fields of `uv_stat_t` as signed', + 'integers. Applications which pass those these values directly', + 'to `Chown` may fail', + '(e.g. for `nobody` on OS X, who has an `uid` of `-2`, see e.g.', + 'https://github.com/nodejs/node-v0.x-archive/issues/5890).', + '', + 'This patch changes the `Integer::New()` call for `uid` and `gid`', + 'to `Integer::NewFromUnsigned()`.', + '', + 'All other fields are kept as they are, for performance, but', + 'strictly speaking the respective sizes of those', + 'fields aren’t specified, either.' + ], 'c.trailerFreeBody') + + tt.equal(c.revert, false, 'revert') + tt.equal(c.release, false, 'release') + tt.equal(c.working, false, 'working') + tt.end() + }) + + t.end() +}) diff --git a/test/rules/assisted-by-is-trailer.js b/test/rules/assisted-by-is-trailer.js index 01d2a2d..c4dd6b0 100644 --- a/test/rules/assisted-by-is-trailer.js +++ b/test/rules/assisted-by-is-trailer.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/assisted-by-is-trailer.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' test('rule: assisted-by-is-trailer', (t) => { diff --git a/test/rules/co-authored-by-is-trailer.js b/test/rules/co-authored-by-is-trailer.js index 3dc3b8d..c7a9cd9 100644 --- a/test/rules/co-authored-by-is-trailer.js +++ b/test/rules/co-authored-by-is-trailer.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/co-authored-by-is-trailer.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' test('rule: co-authored-by-is-trailer', (t) => { diff --git a/test/rules/fixes-url.js b/test/rules/fixes-url.js index 1ed7744..4f468b6 100644 --- a/test/rules/fixes-url.js +++ b/test/rules/fixes-url.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/fixes-url.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' const INVALID_PRURL = 'Pull request URL must reference a comment or discussion.' diff --git a/test/rules/line-after-title.js b/test/rules/line-after-title.js index a7e7256..ab9fabb 100644 --- a/test/rules/line-after-title.js +++ b/test/rules/line-after-title.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/line-after-title.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' test('rule: line-after-title', (t) => { diff --git a/test/rules/line-length.js b/test/rules/line-length.js index 78e8f33..061741e 100644 --- a/test/rules/line-length.js +++ b/test/rules/line-length.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/line-length.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' test('rule: line-length', (t) => { @@ -31,7 +31,8 @@ ${'aaa'.repeat(30)}` Rule.validate(context, { options: { - length: 72 + length: 72, + trailerLength: 120 } }) }) @@ -59,7 +60,8 @@ ${'aaa'.repeat(30)}` Rule.validate(context, { options: { - length: 72 + length: 72, + trailerLength: 120 } }) tt.end() @@ -93,7 +95,8 @@ That was the original code. Rule.validate(context, { options: { - length: 72 + length: 72, + trailerLength: 120 } }) tt.end() @@ -111,6 +114,8 @@ That was the original code. message: `src: make foo mor foo-ey https://${'very-'.repeat(80)}-long-url.org/ + +Trailer: value ` }, v) @@ -123,13 +128,14 @@ https://${'very-'.repeat(80)}-long-url.org/ Rule.validate(context, { options: { - length: 72 + length: 72, + trailerLength: 120 } }) tt.end() }) - t.test('Co-author lines', (tt) => { + t.test('Co-author trailers', (tt) => { const v = new Validator() const good = new Commit({ @@ -141,6 +147,7 @@ https://${'very-'.repeat(80)}-long-url.org/ }, message: [ 'fixup!: apply case-insensitive suggestion', + '', 'Co-authored-by: Michaël Zasso <37011812+targos@users.noreply.github.com>' ].join('\n') }, v) @@ -154,14 +161,81 @@ https://${'very-'.repeat(80)}-long-url.org/ Rule.validate(good, { options: { - length: 72 + length: 72, + trailerLength: 120 } }) tt.end() }) - t.test('Signed-off-by and Assisted-by lines', (tt) => { + t.test('Multi-line trailers', (tt) => { + const v = new Validator() + + const good = new Commit({ + sha: 'f1496de5a7d5474e39eafaafe6f79befe5883a5b', + author: { + name: 'Jacob Smith', + email: '3012099+JakobJingleheimer@users.noreply.github.com', + date: '2025-12-22T09:40:42Z' + }, + message: [ + 'subsystem: add support for foobar', + '', + 'Lorem-Ipsum: dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna', + ' aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', + ' Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint', + ' occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' + ].join('\n') + }, v) + const tooLong = ' Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.' + const bad = new Commit({ + sha: 'f1496de5a7d5474e39eafaafe6f79befe5883a5b', + author: { + name: 'Jacob Smith', + email: '3012099+JakobJingleheimer@users.noreply.github.com', + date: '2025-12-22T09:40:42Z' + }, + message: [ + 'subsystem: add support for foobar', + '', + 'Lorem-Ipsum: dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna', + ' aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', + tooLong + ].join('\n') + }, v) + + good.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'line-length', 'id') + tt.equal(opts.string, '', 'string') + tt.equal(opts.level, 'pass', 'level') + } + bad.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'line-length', 'id') + tt.equal(opts.message, 'Trailer should be <= 120 columns.', 'message') + tt.equal(opts.string, tooLong, 'string') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(good, { + options: { + length: 72, + trailerLength: 120 + } + }) + Rule.validate(bad, { + options: { + length: 72, + trailerLength: 120 + } + }) + + tt.end() + }) + + t.test('Signed-off-by and Assisted-by trailers', (tt) => { const v = new Validator() const good = new Commit({ @@ -172,6 +246,8 @@ https://${'very-'.repeat(80)}-long-url.org/ date: '2026-04-10T16:38:01Z' }, message: [ + 'subsystem: foobar', + '', 'Signed-off-by: John Connor <9092381+JConnor1985@users.noreply.github.com>', 'Assisted-by: The Longest-Named Code Agent In The World ' ].join('\n') @@ -186,7 +262,50 @@ https://${'very-'.repeat(80)}-long-url.org/ Rule.validate(good, { options: { - length: 72 + length: 72, + trailerLength: 120 + } + }) + + tt.end() + }) + + t.test('Signed-off-by and Assisted-by non-trailers', (tt) => { + tt.plan(8) + const v = new Validator() + + const context = new Commit({ + sha: '016b3921626b58d9b595c90141e65c6fbe0c78e2', + author: { + name: 'John Connor', + email: '9092381+JConnor1985@users.noreply.github.com', + date: '2026-04-10T16:38:01Z' + }, + message: [ + 'subsystem: foobar', + '', + 'Signed-off-by: John Connor <9092381+JConnor1985@users.noreply.github.com>', + 'Assisted-by: The Longest-Named Code Agent In The World ', + '', + 'Actual-trailer: Value' + ].join('\n') + }, v) + + let called = 0 + context.report = (opts) => { + tt.pass('called report') + tt.equal(opts.id, 'line-length', 'id') + tt.equal(opts.string, + called++ + ? 'Assisted-by: The Longest-Named Code Agent In The World ' + : 'Signed-off-by: John Connor <9092381+JConnor1985@users.noreply.github.com>', 'string') + tt.equal(opts.level, 'fail', 'level') + } + + Rule.validate(context, { + options: { + length: 72, + trailerLength: 120 } }) diff --git a/test/rules/reviewers.js b/test/rules/reviewers.js index d76865a..3639936 100644 --- a/test/rules/reviewers.js +++ b/test/rules/reviewers.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/reviewers.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' const MSG = 'Commit must have at least 1 reviewer.' diff --git a/test/rules/signed-off-by.js b/test/rules/signed-off-by.js index acff632..859d9e5 100644 --- a/test/rules/signed-off-by.js +++ b/test/rules/signed-off-by.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/signed-off-by.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' test('rule: signed-off-by', (t) => { diff --git a/test/rules/subsystem.js b/test/rules/subsystem.js index 5e47c01..ccb9bb4 100644 --- a/test/rules/subsystem.js +++ b/test/rules/subsystem.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/subsystem.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' test('rule: subsystem', (t) => { diff --git a/test/rules/title-format.js b/test/rules/title-format.js index 405f37b..c22384b 100644 --- a/test/rules/title-format.js +++ b/test/rules/title-format.js @@ -1,6 +1,6 @@ import { test } from 'tap' import Rule from '../../lib/rules/title-format.js' -import Commit from 'gitlint-parser-node' +import Commit from '../../lib/gitlint-parser.js' import Validator from '../../index.js' function makeCommit (title) { diff --git a/test/validator.js b/test/validator.js index 27dcf5d..2dee88b 100644 --- a/test/validator.js +++ b/test/validator.js @@ -81,34 +81,6 @@ Date: Thu Mar 3 10:10:46 2016 -0600 Signed-off-by: Wyatt Preul ` -/* eslint-disable */ -const str6 = { - "sha": "c5545f2c63fe30b0cfcdafab18c26df8286881d0", - "url": "https://api.github.com/repos/nodejs/node/git/commits/c5545f2c63fe30b0cfcdafab18c26df8286881d0", - "html_url": "https://github.com/nodejs/node/commit/c5545f2c63fe30b0cfcdafab18c26df8286881d0", - "author": { - "name": "Anna Henningsen", - "email": "anna@addaleax.net", - "date": "2016-09-13T10:57:49Z" - }, - "committer": { - "name": "Anna Henningsen", - "email": "anna@addaleax.net", - "date": "2016-09-19T12:50:57Z" - }, - "tree": { - "sha": "b505c0ffa0555730e9f4cdb391d1ebeb48bb2f59", - "url": "https://api.github.com/repos/nodejs/node/git/trees/b505c0ffa0555730e9f4cdb391d1ebeb48bb2f59" - }, - "message": "fs: fix handling of `uv_stat_t` fields\n\n`FChown` and `Chown` test that the `uid` and `gid` parameters\nthey receive are unsigned integers, but `Stat()` and `FStat()`\nwould return the corresponding fields of `uv_stat_t` as signed\nintegers. Applications which pass those these values directly\nto `Chown` may fail\n(e.g. for `nobody` on OS X, who has an `uid` of `-2`, see e.g.\nhttps://github.com/nodejs/node-v0.x-archive/issues/5890).\n\nThis patch changes the `Integer::New()` call for `uid` and `gid`\nto `Integer::NewFromUnsigned()`.\n\nAll other fields are kept as they are, for performance, but\nstrictly speaking the respective sizes of those\nfields aren’t specified, either.\n\nSigned-off-by: Anna Henningsen \nRef: https://github.com/npm/npm/issues/13918\nPR-URL: https://github.com/nodejs/node/pull/8515\nReviewed-By: Ben Noordhuis \nReviewed-By: Sakthipriyan Vairamani \nReviewed-By: James M Snell \n\nundo accidental change to other fields of uv_fs_stat", - "parents": [ - { - "sha": "4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4", - "url": "https://api.github.com/repos/nodejs/node/git/commits/4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4", - "html_url": "https://github.com/nodejs/node/commit/4e76bffc0c7076a5901179e70c7b8a8f9fcd22e4" - } - ] -} /* eslint-enable */ const str7 = `commit 7d3a7ea0d7df9b6f11df723dec370f49f4f87e99 @@ -289,7 +261,7 @@ test('Validator - real commits', (t) => { const filtered = msgs.filter((item) => { return item.level === 'fail' }) - tt.equal(filtered.length, 0, 'messages.length') + tt.same(filtered, [], 'messages.length') tt.end() }) }) @@ -391,30 +363,6 @@ test('Validator - real commits', (t) => { }) }) - t.test('non empty lines after metadata', (tt) => { - const v = new Validator() - v.lint(str6) - v.on('commit', (data) => { - const c = data.commit.toJSON() - tt.equal(c.sha, 'c5545f2c63fe30b0cfcdafab18c26df8286881d0', 'sha') - tt.equal(c.date, '2016-09-13T10:57:49Z', 'date') - tt.same(c.subsystems, ['fs'], 'subsystems') - tt.equal(c.prUrl, 'https://github.com/nodejs/node/pull/8515', 'pr') - tt.equal(c.revert, false, 'revert') - const msgs = data.messages - const filtered = msgs.filter((item) => { - return item.level === 'fail' - }) - tt.equal(filtered.length, 1, 'messages.length') - const item = filtered[0] - tt.equal(item.id, 'metadata-end', 'id') - tt.equal(item.message, 'commit metadata at end of message', 'message') - tt.equal(item.line, 23, 'line') - tt.equal(item.column, 0, 'column') - tt.end() - }) - }) - t.test('trailing punctuation in title line', (tt) => { const v = new Validator({ 'validate-metadata': false From 2481226956a0e9c6fb4175c6407b0c68ee1605a9 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 22 Apr 2026 22:47:27 +0100 Subject: [PATCH 108/110] feat!: drop support for Node.js 20.x and 25.x (#145) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbe4224..5d4622c 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "core-validate-commit": "./bin/cmd.js" }, "engines": { - "node": "^20.19.6 || ^22.21.1 || >=24.12.0" + "node": "^22.21.1 || ^24.12.0 || >=26.0.0" }, "author": "Evan Lucas ", "repository": { From 284263ffafaacb1affde9c5abb42986980d3bc16 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Mon, 27 Apr 2026 10:01:35 +0200 Subject: [PATCH 109/110] fix(rules): add `ffi` subsystem (#146) --- lib/rules/subsystem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/subsystem.js b/lib/rules/subsystem.js index 611765d..c32533f 100644 --- a/lib/rules/subsystem.js +++ b/lib/rules/subsystem.js @@ -46,6 +46,7 @@ const validSubsystems = [ 'dns', 'domain', 'events', + 'ffi', 'fs', 'http', 'http2', From 41b8777f780e941b97771e0ee42b51bf853c0edf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 10:09:45 +0200 Subject: [PATCH 110/110] chore(main): release 6.0.0 (#143) --- CHANGELOG.md | 20 ++++++++++++++++++++ npm-shrinkwrap.json | 4 ++-- package.json | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2125bd..7cb5fe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## [6.0.0](https://github.com/nodejs/core-validate-commit/compare/v5.0.1...v6.0.0) (2026-04-27) + + +### ⚠ BREAKING CHANGES + +* drop support for Node.js 20.x and 25.x ([#145](https://github.com/nodejs/core-validate-commit/issues/145)) +* parse trailers using `git` if available, allow longer lines ([#144](https://github.com/nodejs/core-validate-commit/issues/144)) + +### Features + +* add Signed-off-by and Assisted-By rules ([3fce4e6](https://github.com/nodejs/core-validate-commit/commit/3fce4e6f6cc4ebb2970406324b28fa6a03369489)) +* drop support for Node.js 20.x and 25.x ([#145](https://github.com/nodejs/core-validate-commit/issues/145)) ([2481226](https://github.com/nodejs/core-validate-commit/commit/2481226956a0e9c6fb4175c6407b0c68ee1605a9)) +* parse trailers using `git` if available, allow longer lines ([#144](https://github.com/nodejs/core-validate-commit/issues/144)) ([cd1a6a8](https://github.com/nodejs/core-validate-commit/commit/cd1a6a88c8b6d8fcdbc20355456934c2be37264f)) + + +### Bug Fixes + +* **rules:** add `ffi` subsystem ([#146](https://github.com/nodejs/core-validate-commit/issues/146)) ([284263f](https://github.com/nodejs/core-validate-commit/commit/284263ffafaacb1affde9c5abb42986980d3bc16)) +* **rules:** add line-length exemptions for DCO sign-offs ([#142](https://github.com/nodejs/core-validate-commit/issues/142)) ([58c48dc](https://github.com/nodejs/core-validate-commit/commit/58c48dcead19eb9c868a7d67bc42bbc5a418725b)) + ## [5.0.1](https://github.com/nodejs/core-validate-commit/compare/v5.0.0...v5.0.1) (2026-03-18) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 87e41c9..bee2c3a 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,12 +1,12 @@ { "name": "core-validate-commit", - "version": "5.0.1", + "version": "6.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "core-validate-commit", - "version": "5.0.1", + "version": "6.0.0", "license": "MIT", "dependencies": { "gitlint-parser-base": "^2.0.0" diff --git a/package.json b/package.json index 5d4622c..9fd3438 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "core-validate-commit", - "version": "5.0.1", + "version": "6.0.0", "description": "Validate the commit message for a particular commit in node core", "main": "index.js", "type": "module",