From b1a809cd3b976179362b309b197c69ae228521c4 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Tue, 12 Dec 2023 11:19:38 +0100 Subject: [PATCH 01/25] fix: unknown types should not be accepted by default Originally, the validation on Conventional Commit types was only working correctly in case the user would provide a list of additional types. This would result in the following commit subject to be accepted: ``` hippopotamus: feed it coleslaw ``` --- lib/action/index.js | 43 +++++++++++++++++++++--------------------- lib/cli/index.js | 43 +++++++++++++++++++++--------------------- lib/precommit/index.js | 43 +++++++++++++++++++++--------------------- package-lock.json | 6 +++--- test/validator.test.ts | 8 +++++--- 5 files changed, 74 insertions(+), 69 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index 5d995f4..681fe1e 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2650,7 +2650,7 @@ function highlightString(str, substring) { return result; } function createError(commit, description, highlight, type) { - var _a; + var _a, _b; const data = commit[type.toString()]; return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { text: highlightString(description, highlight), @@ -2660,7 +2660,7 @@ function createError(commit, description, highlight, type) { .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] : [commit.commit.subject]) - .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: ((_a = data.value) === null || _a === void 0 ? void 0 : _a.length) || 1 })); + .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: (_b = (_a = data.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1 })); } /** * Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., @@ -2750,46 +2750,47 @@ class CC05 { } } /** - * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (feat, fix, ...) surrounded by parenthesis + * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis */ class EC01 { constructor() { this.id = "EC-01"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (feat, fix, ...) surrounded by parenthesis"; + this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; } validate(commit, options) { - var _a, _b; - this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${(_a = options === null || options === void 0 ? void 0 : options.scopes) === null || _a === void 0 ? void 0 : _a.join(", ")}) surrounded by parenthesis`; - if (options === undefined || options.scopes === undefined || options.scopes.length === 0) + var _a; + const uniqueScopeList = Array.from(new Set((_a = options === null || options === void 0 ? void 0 : options.scopes) !== null && _a !== void 0 ? _a : [])); + if (uniqueScopeList.length === 0) return []; - if (commit.scope.value === undefined || options.scopes.includes(commit.scope.value.replace(/[()]+/g, ""))) + if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) return []; + this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${uniqueScopeList.join(", ")}) surrounded by parenthesis`; return [ - createError(commit, this.description, ["A scope MUST consist of", `(${(_b = options === null || options === void 0 ? void 0 : options.scopes) === null || _b === void 0 ? void 0 : _b.join(", ")})`], "scope"), + createError(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), ]; } } /** - * Commits MUST be prefixed with a type, which consists of one of the configured values (...) + * Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...) */ class EC02 { constructor() { this.id = "EC-02"; - this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (...)"; + this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; } validate(commit, options) { - var _a, _b; - this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${[ - "feat", - "fix", - ...((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []), - ].join(", ")}).`; - if (options === undefined || options.types === undefined || options.types.length === 0) - return []; - if (commit.type.value !== undefined && ["feat", "fix", ...options.types].includes(commit.type.value)) + var _a; + const uniqueAddedTypes = new Set((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []); + if (uniqueAddedTypes.has("feat")) + uniqueAddedTypes.delete("feat"); + if (uniqueAddedTypes.has("fix")) + uniqueAddedTypes.delete("fix"); + const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; + this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; + if (commit.type.value !== undefined && expectedTypes.includes(commit.type.value)) return []; return [ - createError(commit, this.description, ["prefixed with a type, which consists of", `(${["feat", "fix", ...((_b = options === null || options === void 0 ? void 0 : options.types) !== null && _b !== void 0 ? _b : [])].join(", ")})`], "type"), + createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), ]; } } diff --git a/lib/cli/index.js b/lib/cli/index.js index f0529a6..0b1c69d 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2651,7 +2651,7 @@ function highlightString(str, substring) { return result; } function createError(commit, description, highlight, type) { - var _a; + var _a, _b; const data = commit[type.toString()]; return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { text: highlightString(description, highlight), @@ -2661,7 +2661,7 @@ function createError(commit, description, highlight, type) { .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] : [commit.commit.subject]) - .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: ((_a = data.value) === null || _a === void 0 ? void 0 : _a.length) || 1 })); + .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: (_b = (_a = data.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1 })); } /** * Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., @@ -2751,46 +2751,47 @@ class CC05 { } } /** - * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (feat, fix, ...) surrounded by parenthesis + * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis */ class EC01 { constructor() { this.id = "EC-01"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (feat, fix, ...) surrounded by parenthesis"; + this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; } validate(commit, options) { - var _a, _b; - this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${(_a = options === null || options === void 0 ? void 0 : options.scopes) === null || _a === void 0 ? void 0 : _a.join(", ")}) surrounded by parenthesis`; - if (options === undefined || options.scopes === undefined || options.scopes.length === 0) + var _a; + const uniqueScopeList = Array.from(new Set((_a = options === null || options === void 0 ? void 0 : options.scopes) !== null && _a !== void 0 ? _a : [])); + if (uniqueScopeList.length === 0) return []; - if (commit.scope.value === undefined || options.scopes.includes(commit.scope.value.replace(/[()]+/g, ""))) + if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) return []; + this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${uniqueScopeList.join(", ")}) surrounded by parenthesis`; return [ - createError(commit, this.description, ["A scope MUST consist of", `(${(_b = options === null || options === void 0 ? void 0 : options.scopes) === null || _b === void 0 ? void 0 : _b.join(", ")})`], "scope"), + createError(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), ]; } } /** - * Commits MUST be prefixed with a type, which consists of one of the configured values (...) + * Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...) */ class EC02 { constructor() { this.id = "EC-02"; - this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (...)"; + this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; } validate(commit, options) { - var _a, _b; - this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${[ - "feat", - "fix", - ...((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []), - ].join(", ")}).`; - if (options === undefined || options.types === undefined || options.types.length === 0) - return []; - if (commit.type.value !== undefined && ["feat", "fix", ...options.types].includes(commit.type.value)) + var _a; + const uniqueAddedTypes = new Set((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []); + if (uniqueAddedTypes.has("feat")) + uniqueAddedTypes.delete("feat"); + if (uniqueAddedTypes.has("fix")) + uniqueAddedTypes.delete("fix"); + const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; + this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; + if (commit.type.value !== undefined && expectedTypes.includes(commit.type.value)) return []; return [ - createError(commit, this.description, ["prefixed with a type, which consists of", `(${["feat", "fix", ...((_b = options === null || options === void 0 ? void 0 : options.types) !== null && _b !== void 0 ? _b : [])].join(", ")})`], "type"), + createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), ]; } } diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 488ec30..8269e4d 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2651,7 +2651,7 @@ function highlightString(str, substring) { return result; } function createError(commit, description, highlight, type) { - var _a; + var _a, _b; const data = commit[type.toString()]; return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { text: highlightString(description, highlight), @@ -2661,7 +2661,7 @@ function createError(commit, description, highlight, type) { .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] : [commit.commit.subject]) - .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: ((_a = data.value) === null || _a === void 0 ? void 0 : _a.length) || 1 })); + .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: (_b = (_a = data.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1 })); } /** * Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., @@ -2751,46 +2751,47 @@ class CC05 { } } /** - * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (feat, fix, ...) surrounded by parenthesis + * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis */ class EC01 { constructor() { this.id = "EC-01"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (feat, fix, ...) surrounded by parenthesis"; + this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; } validate(commit, options) { - var _a, _b; - this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${(_a = options === null || options === void 0 ? void 0 : options.scopes) === null || _a === void 0 ? void 0 : _a.join(", ")}) surrounded by parenthesis`; - if (options === undefined || options.scopes === undefined || options.scopes.length === 0) + var _a; + const uniqueScopeList = Array.from(new Set((_a = options === null || options === void 0 ? void 0 : options.scopes) !== null && _a !== void 0 ? _a : [])); + if (uniqueScopeList.length === 0) return []; - if (commit.scope.value === undefined || options.scopes.includes(commit.scope.value.replace(/[()]+/g, ""))) + if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) return []; + this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${uniqueScopeList.join(", ")}) surrounded by parenthesis`; return [ - createError(commit, this.description, ["A scope MUST consist of", `(${(_b = options === null || options === void 0 ? void 0 : options.scopes) === null || _b === void 0 ? void 0 : _b.join(", ")})`], "scope"), + createError(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), ]; } } /** - * Commits MUST be prefixed with a type, which consists of one of the configured values (...) + * Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...) */ class EC02 { constructor() { this.id = "EC-02"; - this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (...)"; + this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; } validate(commit, options) { - var _a, _b; - this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${[ - "feat", - "fix", - ...((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []), - ].join(", ")}).`; - if (options === undefined || options.types === undefined || options.types.length === 0) - return []; - if (commit.type.value !== undefined && ["feat", "fix", ...options.types].includes(commit.type.value)) + var _a; + const uniqueAddedTypes = new Set((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []); + if (uniqueAddedTypes.has("feat")) + uniqueAddedTypes.delete("feat"); + if (uniqueAddedTypes.has("fix")) + uniqueAddedTypes.delete("fix"); + const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; + this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; + if (commit.type.value !== undefined && expectedTypes.includes(commit.type.value)) return []; return [ - createError(commit, this.description, ["prefixed with a type, which consists of", `(${["feat", "fix", ...((_b = options === null || options === void 0 ? void 0 : options.types) !== null && _b !== void 0 ? _b : [])].join(", ")})`], "type"), + createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), ]; } } diff --git a/package-lock.json b/package-lock.json index 854b5cf..779dbc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -743,9 +743,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-1.0.2.tgz", - "integrity": "sha512-iWpvzcrmesZCXbizeXeIS6i1328g2kQ6DsqyjiRh8tCKv8tF7uavYA+tksdVOl8GN1qQeXINtg4fKjQkGRCwFQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-1.0.3.tgz", + "integrity": "sha512-DygiSA/TdIF2jIhEOs1Tr5LXpYXlYdfPiUezTv5OSzcgRsGzOFky0P48uM/fLnaFXHteuL7iDogQL3egTbbbJw==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" diff --git a/test/validator.test.ts b/test/validator.test.ts index 154e437..9f11a50 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -34,11 +34,12 @@ describe("Validate commit messages", () => { }, ]); let count = 0; - result.forEach(item => (count += item.errors.length)); + result.forEach(item => count += item.errors.length); // Space in between type and scope + // Scope is not supported // Scope is not a noun - expect(count).toBe(2); + expect(count).toBe(3); }); test("Valid Pull Request message", () => { @@ -93,8 +94,9 @@ describe("Validate commit messages", () => { ); // Space in between type and scope + // Scope is not supported // Scope is not a noun - expect(result.errors.length).toBe(2); + expect(result.errors.length).toBe(3); }); test("Pull Request > Commits", () => { From 2429317b0e9438925e6ae706889487ebfafca38f Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Tue, 12 Dec 2023 14:24:15 +0100 Subject: [PATCH 02/25] fix: add support for whitespace highlighting in error messages This commit will improve the error messages generated for the different use cases where Conventional Commit elements are seperated by an incorrect amount of spacing. Instead of placing the FixIt hints on the next element, it will now correctly cover the added (and missing) white spacing. --- lib/action/index.js | 82 ++++++++++++++++++++++++------------------ lib/cli/index.js | 82 ++++++++++++++++++++++++------------------ lib/precommit/index.js | 82 ++++++++++++++++++++++++------------------ package-lock.json | 6 ++-- test/validator.test.ts | 6 ++-- 5 files changed, 149 insertions(+), 109 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index 681fe1e..ef437d2 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2339,8 +2339,8 @@ exports.isConventionalCommit = isConventionalCommit; * @returns Conventional Commit */ function getConventionalCommit(commit, options) { - var _a, _b, _c, _d, _e, _f; - const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\))?(?\s*!)?(?\s*:)?(?\s*)(?.*)?$/); + var _a, _b, _c, _d, _e; + const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\)\s*)?(?!\s*)?(?:\s*)?(?.*)?$/); const match = ConventionalCommitRegex.exec(commit.subject); let conventionalCommit = { commit: commit, @@ -2348,17 +2348,15 @@ function getConventionalCommit(commit, options) { scope: { index: 1, value: (_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.scope }, breaking: { index: 1, value: (_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.breaking }, seperator: { index: 1, value: (_d = match === null || match === void 0 ? void 0 : match.groups) === null || _d === void 0 ? void 0 : _d.separator }, - spacing: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.spacing }, - description: { index: 1, value: (_f = match === null || match === void 0 ? void 0 : match.groups) === null || _f === void 0 ? void 0 : _f.subject }, + description: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.subject }, body: { index: 1, value: commit.body }, }; function intializeIndices(commit) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + var _a, _b, _c, _d, _e, _f, _g, _h; commit.scope.index = commit.type.index + ((_b = (_a = commit.type.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); commit.breaking.index = commit.scope.index + ((_d = (_c = commit.scope.value) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0); commit.seperator.index = commit.breaking.index + ((_f = (_e = commit.breaking.value) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0); - commit.spacing.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); - commit.description.index = commit.spacing.index + ((_k = (_j = commit.spacing.value) === null || _j === void 0 ? void 0 : _j.length) !== null && _k !== void 0 ? _k : 0); + commit.description.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); return commit; } conventionalCommit = intializeIndices(conventionalCommit); @@ -2640,6 +2638,9 @@ SPDX-License-Identifier: CC-BY-3.0 */ const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); +function isNoun(str) { + return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); +} function highlightString(str, substring) { // Ensure that we handle both single and multiple substrings equally if (!Array.isArray(substring)) @@ -2649,18 +2650,30 @@ function highlightString(str, substring) { substring.forEach(sub => (result = result.replace(sub, `${chalk_1.default.cyan(sub)}`))); return result; } -function createError(commit, description, highlight, type) { - var _a, _b; - const data = commit[type.toString()]; +function createError(commit, description, highlight, type, whitespace = false) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + const element = commit[type]; + let hintIndex = element.index; + let hintLength = (_b = (_a = element.value) === null || _a === void 0 ? void 0 : _a.trimEnd().length) !== null && _b !== void 0 ? _b : 1; + if (whitespace) { + let prevElement = undefined; + for (const [_key, value] of Object.entries(commit)) { + if (value.index > ((_c = prevElement === null || prevElement === void 0 ? void 0 : prevElement.index) !== null && _c !== void 0 ? _c : 0) && value.index < element.index) { + prevElement = value; + } + } + hintIndex = prevElement ? prevElement.index + ((_e = (_d = prevElement.value) === null || _d === void 0 ? void 0 : _d.trimEnd().length) !== null && _e !== void 0 ? _e : 1) : 1; + hintLength = ((_g = (_f = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _f === void 0 ? void 0 : _f.length) !== null && _g !== void 0 ? _g : 1) - ((_j = (_h = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _h === void 0 ? void 0 : _h.trimEnd().length) !== null && _j !== void 0 ? _j : 1); + } return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { text: highlightString(description, highlight), linenumber: 1, - column: data.index, + column: hintIndex, }) .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] : [commit.commit.subject]) - .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: (_b = (_a = data.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1 })); + .addFixitHint(diagnose_it_1.FixItHint.create({ index: hintIndex, length: hintLength === 0 ? 1 : hintLength })); } /** * Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., @@ -2671,40 +2684,38 @@ class CC01 { this.id = "CC-01"; this.description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; // MUST be prefixed with a type if (!commit.type.value || commit.type.value.trim().length === 0) { - errors.push(createError(commit, this.description, "MUST be prefixed with a type", "type")); + // Validated with EC-02 } else { // Ensure that we have a noun - if (commit.type.value.trim().includes(" ") || /[^a-z]/i.test(commit.type.value.trim())) + if (!isNoun(commit.type.value)) errors.push(createError(commit, this.description, "which consists of a noun", "type")); // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { if (commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope")); + errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); else if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking")); + errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // Validate for spacing after the scope, breaking and seperator - if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope")); + if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) { + if (commit.breaking.value) + errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + else + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking")); - if (commit.seperator.value && commit.seperator.value.trim() !== commit.seperator.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // MUST have a terminal colon if (!commit.seperator.value) errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); - // MUST have a space after the terminal colon - else if (!commit.spacing.value || commit.spacing.value.length !== 1) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED", "space"], "spacing")); return errors; } } @@ -2717,13 +2728,11 @@ class CC04 { this.id = "CC-04"; this.description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; if (commit.scope.value && - (commit.scope.value.includes(" ") || - commit.scope.value === "()" || - /[^a-z]/i.test(commit.scope.value.substring(1, commit.scope.value.length - 1)))) { + (commit.scope.value === "()" || + !isNoun(commit.scope.value.trimEnd().substring(1, commit.scope.value.trimEnd().length - 1)))) { errors.push(createError(commit, this.description, "A scope MUST consist of a noun", "scope")); } return errors; @@ -2739,13 +2748,13 @@ class CC05 { this.id = "CC-05"; this.description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; if (!commit.seperator.value) return errors; - if (!commit.spacing.value || commit.spacing.value.length > 1 || !commit.description.value) - errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description")); + if (commit.description.value === undefined || + commit.seperator.value.length - commit.seperator.value.trim().length !== 1) + errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); return errors; } } @@ -2787,8 +2796,13 @@ class EC02 { uniqueAddedTypes.delete("fix"); const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; - if (commit.type.value !== undefined && expectedTypes.includes(commit.type.value)) + if (commit.type.value === undefined || + !isNoun(commit.type.value) || + expectedTypes.includes(commit.type.value.trimEnd())) return []; + if (commit.type.value.trim().length === 0) { + return [createError(commit, this.description, "prefixed with a type", "type")]; + } return [ createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), ]; diff --git a/lib/cli/index.js b/lib/cli/index.js index 0b1c69d..970a163 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2340,8 +2340,8 @@ exports.isConventionalCommit = isConventionalCommit; * @returns Conventional Commit */ function getConventionalCommit(commit, options) { - var _a, _b, _c, _d, _e, _f; - const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\))?(?\s*!)?(?\s*:)?(?\s*)(?.*)?$/); + var _a, _b, _c, _d, _e; + const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\)\s*)?(?!\s*)?(?:\s*)?(?.*)?$/); const match = ConventionalCommitRegex.exec(commit.subject); let conventionalCommit = { commit: commit, @@ -2349,17 +2349,15 @@ function getConventionalCommit(commit, options) { scope: { index: 1, value: (_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.scope }, breaking: { index: 1, value: (_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.breaking }, seperator: { index: 1, value: (_d = match === null || match === void 0 ? void 0 : match.groups) === null || _d === void 0 ? void 0 : _d.separator }, - spacing: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.spacing }, - description: { index: 1, value: (_f = match === null || match === void 0 ? void 0 : match.groups) === null || _f === void 0 ? void 0 : _f.subject }, + description: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.subject }, body: { index: 1, value: commit.body }, }; function intializeIndices(commit) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + var _a, _b, _c, _d, _e, _f, _g, _h; commit.scope.index = commit.type.index + ((_b = (_a = commit.type.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); commit.breaking.index = commit.scope.index + ((_d = (_c = commit.scope.value) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0); commit.seperator.index = commit.breaking.index + ((_f = (_e = commit.breaking.value) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0); - commit.spacing.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); - commit.description.index = commit.spacing.index + ((_k = (_j = commit.spacing.value) === null || _j === void 0 ? void 0 : _j.length) !== null && _k !== void 0 ? _k : 0); + commit.description.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); return commit; } conventionalCommit = intializeIndices(conventionalCommit); @@ -2641,6 +2639,9 @@ SPDX-License-Identifier: CC-BY-3.0 */ const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); +function isNoun(str) { + return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); +} function highlightString(str, substring) { // Ensure that we handle both single and multiple substrings equally if (!Array.isArray(substring)) @@ -2650,18 +2651,30 @@ function highlightString(str, substring) { substring.forEach(sub => (result = result.replace(sub, `${chalk_1.default.cyan(sub)}`))); return result; } -function createError(commit, description, highlight, type) { - var _a, _b; - const data = commit[type.toString()]; +function createError(commit, description, highlight, type, whitespace = false) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + const element = commit[type]; + let hintIndex = element.index; + let hintLength = (_b = (_a = element.value) === null || _a === void 0 ? void 0 : _a.trimEnd().length) !== null && _b !== void 0 ? _b : 1; + if (whitespace) { + let prevElement = undefined; + for (const [_key, value] of Object.entries(commit)) { + if (value.index > ((_c = prevElement === null || prevElement === void 0 ? void 0 : prevElement.index) !== null && _c !== void 0 ? _c : 0) && value.index < element.index) { + prevElement = value; + } + } + hintIndex = prevElement ? prevElement.index + ((_e = (_d = prevElement.value) === null || _d === void 0 ? void 0 : _d.trimEnd().length) !== null && _e !== void 0 ? _e : 1) : 1; + hintLength = ((_g = (_f = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _f === void 0 ? void 0 : _f.length) !== null && _g !== void 0 ? _g : 1) - ((_j = (_h = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _h === void 0 ? void 0 : _h.trimEnd().length) !== null && _j !== void 0 ? _j : 1); + } return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { text: highlightString(description, highlight), linenumber: 1, - column: data.index, + column: hintIndex, }) .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] : [commit.commit.subject]) - .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: (_b = (_a = data.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1 })); + .addFixitHint(diagnose_it_1.FixItHint.create({ index: hintIndex, length: hintLength === 0 ? 1 : hintLength })); } /** * Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., @@ -2672,40 +2685,38 @@ class CC01 { this.id = "CC-01"; this.description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; // MUST be prefixed with a type if (!commit.type.value || commit.type.value.trim().length === 0) { - errors.push(createError(commit, this.description, "MUST be prefixed with a type", "type")); + // Validated with EC-02 } else { // Ensure that we have a noun - if (commit.type.value.trim().includes(" ") || /[^a-z]/i.test(commit.type.value.trim())) + if (!isNoun(commit.type.value)) errors.push(createError(commit, this.description, "which consists of a noun", "type")); // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { if (commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope")); + errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); else if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking")); + errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // Validate for spacing after the scope, breaking and seperator - if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope")); + if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) { + if (commit.breaking.value) + errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + else + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking")); - if (commit.seperator.value && commit.seperator.value.trim() !== commit.seperator.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // MUST have a terminal colon if (!commit.seperator.value) errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); - // MUST have a space after the terminal colon - else if (!commit.spacing.value || commit.spacing.value.length !== 1) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED", "space"], "spacing")); return errors; } } @@ -2718,13 +2729,11 @@ class CC04 { this.id = "CC-04"; this.description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; if (commit.scope.value && - (commit.scope.value.includes(" ") || - commit.scope.value === "()" || - /[^a-z]/i.test(commit.scope.value.substring(1, commit.scope.value.length - 1)))) { + (commit.scope.value === "()" || + !isNoun(commit.scope.value.trimEnd().substring(1, commit.scope.value.trimEnd().length - 1)))) { errors.push(createError(commit, this.description, "A scope MUST consist of a noun", "scope")); } return errors; @@ -2740,13 +2749,13 @@ class CC05 { this.id = "CC-05"; this.description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; if (!commit.seperator.value) return errors; - if (!commit.spacing.value || commit.spacing.value.length > 1 || !commit.description.value) - errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description")); + if (commit.description.value === undefined || + commit.seperator.value.length - commit.seperator.value.trim().length !== 1) + errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); return errors; } } @@ -2788,8 +2797,13 @@ class EC02 { uniqueAddedTypes.delete("fix"); const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; - if (commit.type.value !== undefined && expectedTypes.includes(commit.type.value)) + if (commit.type.value === undefined || + !isNoun(commit.type.value) || + expectedTypes.includes(commit.type.value.trimEnd())) return []; + if (commit.type.value.trim().length === 0) { + return [createError(commit, this.description, "prefixed with a type", "type")]; + } return [ createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), ]; diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 8269e4d..edb6a35 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2340,8 +2340,8 @@ exports.isConventionalCommit = isConventionalCommit; * @returns Conventional Commit */ function getConventionalCommit(commit, options) { - var _a, _b, _c, _d, _e, _f; - const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\))?(?\s*!)?(?\s*:)?(?\s*)(?.*)?$/); + var _a, _b, _c, _d, _e; + const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\)\s*)?(?!\s*)?(?:\s*)?(?.*)?$/); const match = ConventionalCommitRegex.exec(commit.subject); let conventionalCommit = { commit: commit, @@ -2349,17 +2349,15 @@ function getConventionalCommit(commit, options) { scope: { index: 1, value: (_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.scope }, breaking: { index: 1, value: (_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.breaking }, seperator: { index: 1, value: (_d = match === null || match === void 0 ? void 0 : match.groups) === null || _d === void 0 ? void 0 : _d.separator }, - spacing: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.spacing }, - description: { index: 1, value: (_f = match === null || match === void 0 ? void 0 : match.groups) === null || _f === void 0 ? void 0 : _f.subject }, + description: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.subject }, body: { index: 1, value: commit.body }, }; function intializeIndices(commit) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; + var _a, _b, _c, _d, _e, _f, _g, _h; commit.scope.index = commit.type.index + ((_b = (_a = commit.type.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); commit.breaking.index = commit.scope.index + ((_d = (_c = commit.scope.value) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0); commit.seperator.index = commit.breaking.index + ((_f = (_e = commit.breaking.value) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0); - commit.spacing.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); - commit.description.index = commit.spacing.index + ((_k = (_j = commit.spacing.value) === null || _j === void 0 ? void 0 : _j.length) !== null && _k !== void 0 ? _k : 0); + commit.description.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); return commit; } conventionalCommit = intializeIndices(conventionalCommit); @@ -2641,6 +2639,9 @@ SPDX-License-Identifier: CC-BY-3.0 */ const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); +function isNoun(str) { + return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); +} function highlightString(str, substring) { // Ensure that we handle both single and multiple substrings equally if (!Array.isArray(substring)) @@ -2650,18 +2651,30 @@ function highlightString(str, substring) { substring.forEach(sub => (result = result.replace(sub, `${chalk_1.default.cyan(sub)}`))); return result; } -function createError(commit, description, highlight, type) { - var _a, _b; - const data = commit[type.toString()]; +function createError(commit, description, highlight, type, whitespace = false) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + const element = commit[type]; + let hintIndex = element.index; + let hintLength = (_b = (_a = element.value) === null || _a === void 0 ? void 0 : _a.trimEnd().length) !== null && _b !== void 0 ? _b : 1; + if (whitespace) { + let prevElement = undefined; + for (const [_key, value] of Object.entries(commit)) { + if (value.index > ((_c = prevElement === null || prevElement === void 0 ? void 0 : prevElement.index) !== null && _c !== void 0 ? _c : 0) && value.index < element.index) { + prevElement = value; + } + } + hintIndex = prevElement ? prevElement.index + ((_e = (_d = prevElement.value) === null || _d === void 0 ? void 0 : _d.trimEnd().length) !== null && _e !== void 0 ? _e : 1) : 1; + hintLength = ((_g = (_f = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _f === void 0 ? void 0 : _f.length) !== null && _g !== void 0 ? _g : 1) - ((_j = (_h = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _h === void 0 ? void 0 : _h.trimEnd().length) !== null && _j !== void 0 ? _j : 1); + } return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { text: highlightString(description, highlight), linenumber: 1, - column: data.index, + column: hintIndex, }) .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] : [commit.commit.subject]) - .addFixitHint(diagnose_it_1.FixItHint.create({ index: data.index, length: (_b = (_a = data.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 1 })); + .addFixitHint(diagnose_it_1.FixItHint.create({ index: hintIndex, length: hintLength === 0 ? 1 : hintLength })); } /** * Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., @@ -2672,40 +2685,38 @@ class CC01 { this.id = "CC-01"; this.description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; // MUST be prefixed with a type if (!commit.type.value || commit.type.value.trim().length === 0) { - errors.push(createError(commit, this.description, "MUST be prefixed with a type", "type")); + // Validated with EC-02 } else { // Ensure that we have a noun - if (commit.type.value.trim().includes(" ") || /[^a-z]/i.test(commit.type.value.trim())) + if (!isNoun(commit.type.value)) errors.push(createError(commit, this.description, "which consists of a noun", "type")); // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { if (commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope")); + errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); else if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking")); + errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // Validate for spacing after the scope, breaking and seperator - if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope")); + if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) { + if (commit.breaking.value) + errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + else + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking")); - if (commit.seperator.value && commit.seperator.value.trim() !== commit.seperator.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // MUST have a terminal colon if (!commit.seperator.value) errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); - // MUST have a space after the terminal colon - else if (!commit.spacing.value || commit.spacing.value.length !== 1) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED", "space"], "spacing")); return errors; } } @@ -2718,13 +2729,11 @@ class CC04 { this.id = "CC-04"; this.description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; if (commit.scope.value && - (commit.scope.value.includes(" ") || - commit.scope.value === "()" || - /[^a-z]/i.test(commit.scope.value.substring(1, commit.scope.value.length - 1)))) { + (commit.scope.value === "()" || + !isNoun(commit.scope.value.trimEnd().substring(1, commit.scope.value.trimEnd().length - 1)))) { errors.push(createError(commit, this.description, "A scope MUST consist of a noun", "scope")); } return errors; @@ -2740,13 +2749,13 @@ class CC05 { this.id = "CC-05"; this.description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars validate(commit, _options) { const errors = []; if (!commit.seperator.value) return errors; - if (!commit.spacing.value || commit.spacing.value.length > 1 || !commit.description.value) - errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description")); + if (commit.description.value === undefined || + commit.seperator.value.length - commit.seperator.value.trim().length !== 1) + errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); return errors; } } @@ -2788,8 +2797,13 @@ class EC02 { uniqueAddedTypes.delete("fix"); const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; - if (commit.type.value !== undefined && expectedTypes.includes(commit.type.value)) + if (commit.type.value === undefined || + !isNoun(commit.type.value) || + expectedTypes.includes(commit.type.value.trimEnd())) return []; + if (commit.type.value.trim().length === 0) { + return [createError(commit, this.description, "prefixed with a type", "type")]; + } return [ createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), ]; diff --git a/package-lock.json b/package-lock.json index 779dbc9..2b35c91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -743,9 +743,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-1.0.3.tgz", - "integrity": "sha512-DygiSA/TdIF2jIhEOs1Tr5LXpYXlYdfPiUezTv5OSzcgRsGzOFky0P48uM/fLnaFXHteuL7iDogQL3egTbbbJw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-1.0.4.tgz", + "integrity": "sha512-dT0bfSmDnj2SD4qVedHuwTIozOcKwEOb5RulndCjXUSJ2IazA3U3VJMyqAf0TTY9h7au/HaKjokjMtomNNi+XA==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" diff --git a/test/validator.test.ts b/test/validator.test.ts index 9f11a50..85afe7b 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -37,9 +37,8 @@ describe("Validate commit messages", () => { result.forEach(item => count += item.errors.length); // Space in between type and scope - // Scope is not supported // Scope is not a noun - expect(count).toBe(3); + expect(count).toBe(2); }); test("Valid Pull Request message", () => { @@ -94,9 +93,8 @@ describe("Validate commit messages", () => { ); // Space in between type and scope - // Scope is not supported // Scope is not a noun - expect(result.errors.length).toBe(3); + expect(result.errors.length).toBe(2); }); test("Pull Request > Commits", () => { From 54be0b2090a8b62ecbd515e22bc19176fc872c34 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Tue, 12 Dec 2023 11:17:47 +0100 Subject: [PATCH 03/25] feat: add configuration file support This commit introduces support for an external configuration file, allowing you to create consistency between the CLI, Pre-Commit hook, and GitHub Action. - CLI: added `--config`, `-c` to specify the configuration path - Pre-Commit: added `--config`, `-c` to specify the configuration path - GitHub Actions: added `config:` input to specify the configuration path > NOTE: By default, CommitMe will attempt to read `.commit-me.json` in the > root of your repository The configuration file can contain an array of `types` and `scopes`. --- .github/.commit-me.json | 4 + .github/workflows/conventional-commits.yml | 17 ++-- .reuse/dep5 | 4 + README.md | 81 ++++------------ action.yml | 4 + docs/cli.md | 8 +- docs/github-action.md | 7 +- docs/images/action-example.png | Bin 222122 -> 349878 bytes docs/pre-commit.md | 54 +++++++++++ lib/action/index.js | 103 +++++++++++++++++++-- lib/cli/index.js | 102 ++++++++++++++++++-- lib/precommit/index.js | 97 +++++++++++++++++-- src/configuration.ts | 50 ++++++++++ src/datasources.ts | 48 +++++++++- src/entrypoints/action.ts | 15 ++- src/entrypoints/cli.ts | 13 +-- src/entrypoints/pre-commit.ts | 7 +- test/validator.test.ts | 2 +- 18 files changed, 488 insertions(+), 128 deletions(-) create mode 100644 .github/.commit-me.json create mode 100644 docs/pre-commit.md diff --git a/.github/.commit-me.json b/.github/.commit-me.json new file mode 100644 index 0000000..e5f4d98 --- /dev/null +++ b/.github/.commit-me.json @@ -0,0 +1,4 @@ +{ + "types": [ "build", "chore", "ci", "docs", "style", "refactor", "perf", "test" ], + "scopes": [ "cli", "precommit", "action" ] +} diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml index 891c78e..6ee40b2 100644 --- a/.github/workflows/conventional-commits.yml +++ b/.github/workflows/conventional-commits.yml @@ -33,18 +33,13 @@ jobs: include-commits: true # Forces the inclusion of commits associated with your # Pull Request without requiring the `contents:write` # permission + config: .github/.commit-me.json # Path to your CommitMe configuration file types: | # Limit the Conventional Commits type to the following values; - build - chore - ci - docs - feat - fix - perf - refactor - revert - style - test + magic + void + scopes: | # Limit the Conventional Commits scopes to the following values; + foo + bar env: # Enable colored output in GitHub Actions FORCE_COLOR: 3 diff --git a/.reuse/dep5 b/.reuse/dep5 index 7c312e8..a2ffc89 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -20,3 +20,7 @@ License: CC0-1.0 Files: .prettierrc.json Copyright: 2023 Kevin de Jong License: CC0-1.0 + +Files: .github/.commit-me.json +Copyright: 2023 Kevin de Jong +License: CC0-1.0 diff --git a/README.md b/README.md index 5f0c16c..6abbe66 100644 --- a/README.md +++ b/README.md @@ -5,81 +5,38 @@ SPDX-License-Identifier: MIT # CommitMe -CommitMe provides a [Pre-commit hook](#pre-commit), [GitHub Action](#cicd-validation-github-action), and [Command Line Interface](#local-development-command-line-interface) for: +CommitMe provides a [Pre-commit hook](./docs/pre-commit.md), [GitHub Action](./docs/github-action.md), and [Command Line Interface](./docs/cli.md) for validating commit messages against the [Conventional Commits] specification; -- Validating commit messages against the [Conventional Commits] specification -- Ensure correct integration with GitHub based on extended [Pull Request](./docs/specifications.md#extended-pull-request-specification) and [Commit Message](./docs/specifications.md#extended-conventional-commits-specification) specifications +- Rich error messages to help identify non-compliances: -- Adding labels (`feature`, `fix`, or `breaking`) to your Pull Request +- Adds labels (`feature`, `fix`, or `breaking`) to your Pull Request - Limiting Conventional Commits `scope` and `types`. -## Pre-commit hook +Please refer to the document related to your environment for more details on the usage instructions: -You can add CommitMe as a [pre-commit](https://pre-commit.com) by: +- [GitHub Actions](./docs/github-action.md) +- [Command Line Interface](./docs/cli.md) +- [Pre-commit Hook](./docs/pre-commit.md) -1. [Installing pre-commit](https://pre-commit.com/#install) -2. Including CommitMe in your `.pre-commit.config.yaml` file, e.g.: +## Configuration file -```yaml -repos: -- repo: https://github.com/dev-build-deploy/commit-me - rev: v0.12.0 - hooks: - - id: commit-me -``` -3. Installing the `commit-msg` hooks -``` -$ pre-commit install --hook-type commit-msg -``` +You can create a global configuration file: -## CICD Validation (GitHub Action) - -The basic workflow can be set up as such: - -```yaml -name: Conventional Commits -on: - pull_request: - types: - - opened - - edited - - synchronize - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number }} # Ensure that only one instance of this workflow is running per Pull Request - cancel-in-progress: true # Cancel any previous runs of this workflow - -permissions: - contents: read # NOTE; you will need to change this permission to `write` in case you do not provide the `include-commits` input parameter. - pull-requests: write # OPTIONAL; only required when you want CommitMe to update labels in your Pull Request, set `update-labels` to `false` if you do not require this feature. - -jobs: - commit-me: - name: Conventional Commits Compliance - runs-on: ubuntu-latest - steps: - - uses: dev-build-deploy/commit-me@v0 - with: - token: ${{ github.token }} # Required to retrieve the commits associated with your Pull Request - include-commits: true # OPTIONAL; forces the inclusion of commits associated with your Pull Request - env: - # Enable colored output in GitHub Actions - FORCE_COLOR: 3 +```json +{ + "types": [ "build", "chore", "ci", "docs", "style", "refactor", "perf", "test" ], + "scopes": [ "server", "client" ] +} ``` -_You can find more details in the [dedicated documentation](./docs/github-action.md)_ - -## Local Development (Command Line Interface) - -Performing local validation is as simple as running the `check` command: - -``` -$ commit-me check -``` +| Configuration Item | Description | +| -------------------| ------------| +| `types` | Conventional Commit types to allow. By default it always supports `feat` and `fix`. | +| `scopes` | Conventional Commit scopes to allow. No restrictions will be applied when not specified. | -You can find more details in the [dedicated documentation](./docs/cli.md) +> :bulb: By default, CommitMe will attempt to load `.commit-me.json` in the root of your repository ## Contributing diff --git a/action.yml b/action.yml index 9afa5da..5151f03 100644 --- a/action.yml +++ b/action.yml @@ -31,6 +31,10 @@ inputs: types: description: 'Conventional Commits types allowed for this repository; by default we accept all types.' required: false + + config: + description: 'Path to the configuration file; by default ".pre-commit.json" is used.' + required: false runs: using: 'node20' diff --git a/docs/cli.md b/docs/cli.md index a03240e..fb0b682 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -17,8 +17,6 @@ $ npm install -g https://github.com/dev-build-deploy/commit-me $ commit-me ``` -> **NOTE**: Creation of an installable package is part of the roadmap! - ## Usage instructions ### Basic Usage @@ -55,12 +53,10 @@ Options: -b, --base-branch The base branch to compare the current branch with. -s, --scopes [scopes...] Conventional Commits scopes to validate against. -t, --types [types...] Conventional Commits types to validate against. + -c, --config The configuration file to use. -h, --help display help for command ``` -By default, it will use `main` as the base branch. - - Running this command... ```sh $ commit-me check @@ -70,4 +66,4 @@ $ commit-me check -Additionally, you can use the `--base-branch` option to change the reference branch to compare with. +Additionally, you can use the `--base-branch` option to change the reference branch (default: `main`) to compare with. diff --git a/docs/github-action.md b/docs/github-action.md index a363e15..69f35ea 100644 --- a/docs/github-action.md +++ b/docs/github-action.md @@ -82,6 +82,7 @@ jobs: with: update-labels: false # OPTIONAL; do not update the Pull Request labels based on the Conventional Commits information. include-commits: false # OPTIONAL; enforces the exclusion of commits associated with your Pull Request + config: '.github/.commit-me.json' # OPTIONAL; by default it will look in the root of your repository ``` In addition, above example has disabled pull request label management. @@ -97,10 +98,8 @@ You can limit the Conventional Commit Type and/or Scope using the related input scope: | backend frontend - # OPTIONAL; Limit the Conventional Commits type to `feat`, `fix`, `docs` and a custom entry `debt` + # OPTIONAL; Limit the Conventional Commits type to `feat`, `fix`, and a custom entries `docs` and `debt` types: | - feat - fix docs debt ``` @@ -126,7 +125,7 @@ In addition, we recommend the following activity types: | `token` | *NO* | GitHub token needed to access your commits in your pull request. This is **only** required in case you want to:
  • Validate commits associated with your Pull Request
  • Update labels in your Pull Request
| | `update-labels` | *NO* | Allow CommitMe to manage [labels](#pull-request-labels) based on the [Conventional Commits] metadata (requires `pull-requests:write` permission), defaults to `true` | | `include-commits` | *NO* | Include commits associated with the Pull Request; by default we use the repository configuration settings to determine this value (requires `contents:write` permission if **NOT** set). | -| +| `config` | *NO* | Path to the configuration file; by default `.pre-commit.json` is used. | ### Permissions diff --git a/docs/images/action-example.png b/docs/images/action-example.png index 252067d1c54ee41d001b245085e1e445ce9ed681..4d41e871b2211f9a3f6ff81888ceebe874922cfb 100644 GIT binary patch literal 349878 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

wQfHufiD?$b;1TcBzyo~NuEFc5eTi2E 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≻ZsQ(*h7CtS34Q*n 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 diff --git a/docs/pre-commit.md b/docs/pre-commit.md new file mode 100644 index 0000000..984d50b --- /dev/null +++ b/docs/pre-commit.md @@ -0,0 +1,54 @@ + + +# Pre-commit hook + +You can add CommitMe as a [pre-commit](https://pre-commit.com) by: + +1. [Installing pre-commit](https://pre-commit.com/#install) +2. Including CommitMe in your `.pre-commit.config.yaml` file, e.g.: + +```yaml +repos: +- repo: https://github.com/dev-build-deploy/commit-me + rev: v0.12.0 + hooks: + - id: commit-me +``` +3. Installing the `commit-msg` hooks +``` +$ pre-commit install --hook-type commit-msg +``` + +## Configuration + +The Pre-Commit hook will run the `./bin/pre-commit-me` executable: + +```sh +Usage: pre-commit-me [options] + +Conventional Commit message validation (pre-commit hook) + +Arguments: + file The file containing the commit messages to validate. + +Options: + -c, --config The configuration file to use. + -h, --help display help for command + ``` + +Therefor, you can use the `args` keyword to specify a list of `options`, for example: + +```yml +repos: +- repo: https://github.com/dev-build-deploy/commit-me + rev: v0.13.1 + hooks: + - id: commit-me + args: [ + # Specify a custom configuration file path + '--config', '.github/.commit-me.json' + ] +``` \ No newline at end of file diff --git a/lib/action/index.js b/lib/action/index.js index ef437d2..ce72c02 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -40872,7 +40872,7 @@ function wrappy (fn, cb) { /***/ }), /***/ 5778: -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -40882,6 +40882,7 @@ function wrappy (fn, cb) { */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Configuration = void 0; +const datasources_1 = __nccwpck_require__(1751); /** * Configuration class * @class Configuration @@ -40902,6 +40903,53 @@ class Configuration { } return Configuration._instance; } + /** + * Extends the list of types to validate against. + * @param types List of types to validate against + */ + addTypes(types) { + const typesList = Array.isArray(types) ? types : [types]; + const valid = typesList.every(item => typeof item === "string"); + if (!valid) + throw new Error("Invalid data provided for 'types', expected string or array of strings"); + this.types = this.types ? [...this.types, ...typesList] : typesList; + } + /** + * Extends the list of scopes to validate against. + * @param scopes List of scopes to validate against + */ + addScopes(scopes) { + const scopesList = Array.isArray(scopes) ? scopes : [scopes]; + const valid = scopesList.every(item => typeof item === "string"); + if (!valid) + throw new Error("Invalid data provided for 'scopes', expected string or array of strings"); + this.scopes = this.scopes ? [...this.scopes, ...scopesList] : scopesList; + } + /** + * Loads the configuration from a JSON5 file. + * @param file The file to load the configuration from + */ + async fromDatasource(datasource, configPath) { + const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); + if (!content) + return this; + if (datasource instanceof datasources_1.GitSource || datasource instanceof datasources_1.FileSource) { + this.includeCommits = true; + this.includePullRequest = false; + } + else if (datasource instanceof datasources_1.GitHubSource) { + this.includePullRequest = true; + } + else { + throw new Error("Unsupported data source"); + } + const config = JSON.parse(content); + this.includeCommits = config.includeCommits ?? this.includeCommits; + this.includePullRequest = config.includePullRequest ?? this.includePullRequest; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); + return this; + } } exports.Configuration = Configuration; @@ -40965,6 +41013,12 @@ class FileSource { async getCommitMessages() { return [(0, commit_it_1.getCommit)({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } + async getConfigurationFile(path) { + if (!fs.existsSync(path)) { + return undefined; + } + return fs.readFileSync(path, "utf8"); + } } exports.FileSource = FileSource; /** @@ -40979,6 +41033,12 @@ class GitSource { const data = await (0, simple_git_1.simpleGit)().log({ from: this.sourceBranch, to: "@{push}" }); return data.all.map(commit => (0, commit_it_1.getCommit)({ hash: commit.hash })); } + async getConfigurationFile(path) { + if (!fs.existsSync(path)) { + return undefined; + } + return fs.readFileSync(path, "utf8"); + } } exports.GitSource = GitSource; /** @@ -40993,11 +41053,35 @@ class GitHubSource { return commits.data.map(commit => { return { hash: commit.sha, - subject: commit.commit.message.split("\n")[0], - body: commit.commit.message.split("\n").slice(2).join("\n"), + subject: commit.commit.message.split(/\r?\n/)[0], + body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), }; }); } + /** + * Retrieves the specified configuration file from the repository using the REST API + * @param path + */ + async getConfigurationFile(path) { + const octokit = github.getOctokit(core.getInput("token")); + try { + const { data: config } = await octokit.rest.repos.getContent({ + ...github.context.repo, + path, + ref: github.context.ref, + }); + if ("content" in config === false) { + throw new Error("Unsupported metadata type for Configuration path"); + } + return Buffer.from(config.content, "base64").toString(); + } + catch (error) { + if (error.message !== "Not Found") { + throw error; + } + return undefined; + } + } } exports.GitHubSource = GitHubSource; @@ -41083,17 +41167,16 @@ const reportErrorMessages = (results) => { } return errorCount; }; -const setConfiguration = () => { +const setConfiguration = async (dataSource) => { (0, assert_1.default)(github.context.payload.pull_request); const pullrequestOnly = core.getInput("include-commits") ? !core.getBooleanInput("include-commits") : github.context.payload.pull_request.base.repo.allow_rebase_merge === false; // Set the global configuration - const config = configuration_1.Configuration.getInstance(); + const config = await configuration_1.Configuration.getInstance().fromDatasource(dataSource, core.getInput("config") || undefined); config.includeCommits = !pullrequestOnly; - config.includePullRequest = true; - config.scopes = core.getMultilineInput("scopes") ?? []; - config.types = core.getMultilineInput("types") ?? []; + config.addScopes(core.getMultilineInput("scopes") ?? []); + config.addTypes(core.getMultilineInput("types") ?? []); }; /** * Main entry point for the GitHub Action. @@ -41101,9 +41184,9 @@ const setConfiguration = () => { async function run() { try { core.info("📄 CommitMe - Conventional Commit compliance validation"); - setConfiguration(); - core.startGroup("📝 Checking repository configuration"); const datasource = new datasources_1.GitHubSource(); + await setConfiguration(datasource); + core.startGroup("📝 Checking repository configuration"); const config = configuration_1.Configuration.getInstance(); const githubToken = core.getInput("token") ?? undefined; (0, assert_1.default)(github.context.payload.pull_request); diff --git a/lib/cli/index.js b/lib/cli/index.js index 970a163..65fbe70 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -40873,7 +40873,7 @@ function wrappy (fn, cb) { /***/ }), /***/ 5778: -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -40883,6 +40883,7 @@ function wrappy (fn, cb) { */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Configuration = void 0; +const datasources_1 = __nccwpck_require__(1751); /** * Configuration class * @class Configuration @@ -40903,6 +40904,53 @@ class Configuration { } return Configuration._instance; } + /** + * Extends the list of types to validate against. + * @param types List of types to validate against + */ + addTypes(types) { + const typesList = Array.isArray(types) ? types : [types]; + const valid = typesList.every(item => typeof item === "string"); + if (!valid) + throw new Error("Invalid data provided for 'types', expected string or array of strings"); + this.types = this.types ? [...this.types, ...typesList] : typesList; + } + /** + * Extends the list of scopes to validate against. + * @param scopes List of scopes to validate against + */ + addScopes(scopes) { + const scopesList = Array.isArray(scopes) ? scopes : [scopes]; + const valid = scopesList.every(item => typeof item === "string"); + if (!valid) + throw new Error("Invalid data provided for 'scopes', expected string or array of strings"); + this.scopes = this.scopes ? [...this.scopes, ...scopesList] : scopesList; + } + /** + * Loads the configuration from a JSON5 file. + * @param file The file to load the configuration from + */ + async fromDatasource(datasource, configPath) { + const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); + if (!content) + return this; + if (datasource instanceof datasources_1.GitSource || datasource instanceof datasources_1.FileSource) { + this.includeCommits = true; + this.includePullRequest = false; + } + else if (datasource instanceof datasources_1.GitHubSource) { + this.includePullRequest = true; + } + else { + throw new Error("Unsupported data source"); + } + const config = JSON.parse(content); + this.includeCommits = config.includeCommits ?? this.includeCommits; + this.includePullRequest = config.includePullRequest ?? this.includePullRequest; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); + return this; + } } exports.Configuration = Configuration; @@ -40966,6 +41014,12 @@ class FileSource { async getCommitMessages() { return [(0, commit_it_1.getCommit)({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } + async getConfigurationFile(path) { + if (!fs.existsSync(path)) { + return undefined; + } + return fs.readFileSync(path, "utf8"); + } } exports.FileSource = FileSource; /** @@ -40980,6 +41034,12 @@ class GitSource { const data = await (0, simple_git_1.simpleGit)().log({ from: this.sourceBranch, to: "@{push}" }); return data.all.map(commit => (0, commit_it_1.getCommit)({ hash: commit.hash })); } + async getConfigurationFile(path) { + if (!fs.existsSync(path)) { + return undefined; + } + return fs.readFileSync(path, "utf8"); + } } exports.GitSource = GitSource; /** @@ -40994,11 +41054,35 @@ class GitHubSource { return commits.data.map(commit => { return { hash: commit.sha, - subject: commit.commit.message.split("\n")[0], - body: commit.commit.message.split("\n").slice(2).join("\n"), + subject: commit.commit.message.split(/\r?\n/)[0], + body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), }; }); } + /** + * Retrieves the specified configuration file from the repository using the REST API + * @param path + */ + async getConfigurationFile(path) { + const octokit = github.getOctokit(core.getInput("token")); + try { + const { data: config } = await octokit.rest.repos.getContent({ + ...github.context.repo, + path, + ref: github.context.ref, + }); + if ("content" in config === false) { + throw new Error("Unsupported metadata type for Configuration path"); + } + return Buffer.from(config.content, "base64").toString(); + } + catch (error) { + if (error.message !== "Not Found") { + throw error; + } + return undefined; + } + } } exports.GitHubSource = GitHubSource; @@ -41037,16 +41121,16 @@ program .option("-b, --base-branch ", "The base branch to compare the current branch with.") .option("-s, --scopes [scopes...]", "Conventional Commits scopes to validate against.") .option("-t, --types [types...]", "Conventional Commits types to validate against.") + .option("-c, --config ", "The configuration file to use.") .action(async (options) => { console.log("📄 CommitMe - Conventional Commit compliance validation"); console.log("-------------------------------------------------------"); - // Set the global configuration - const config = configuration_1.Configuration.getInstance(); - config.includeCommits = true; - config.includePullRequest = false; - config.scopes = options.scopes ?? []; - config.types = options.types ?? []; + // Set the data source const datasource = new datasources_1.GitSource(options.baseBranch ?? "main"); + // Set the global configuration + const config = await configuration_1.Configuration.getInstance().fromDatasource(datasource, options.config); + config.addScopes(options.scopes ?? []); + config.addTypes(options.types ?? []); const commits = await datasource.getCommitMessages(); let errorCount = 0; const results = (0, validator_1.validateCommits)(commits); diff --git a/lib/precommit/index.js b/lib/precommit/index.js index edb6a35..c0e381d 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -40873,7 +40873,7 @@ function wrappy (fn, cb) { /***/ }), /***/ 5778: -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -40883,6 +40883,7 @@ function wrappy (fn, cb) { */ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.Configuration = void 0; +const datasources_1 = __nccwpck_require__(1751); /** * Configuration class * @class Configuration @@ -40903,6 +40904,53 @@ class Configuration { } return Configuration._instance; } + /** + * Extends the list of types to validate against. + * @param types List of types to validate against + */ + addTypes(types) { + const typesList = Array.isArray(types) ? types : [types]; + const valid = typesList.every(item => typeof item === "string"); + if (!valid) + throw new Error("Invalid data provided for 'types', expected string or array of strings"); + this.types = this.types ? [...this.types, ...typesList] : typesList; + } + /** + * Extends the list of scopes to validate against. + * @param scopes List of scopes to validate against + */ + addScopes(scopes) { + const scopesList = Array.isArray(scopes) ? scopes : [scopes]; + const valid = scopesList.every(item => typeof item === "string"); + if (!valid) + throw new Error("Invalid data provided for 'scopes', expected string or array of strings"); + this.scopes = this.scopes ? [...this.scopes, ...scopesList] : scopesList; + } + /** + * Loads the configuration from a JSON5 file. + * @param file The file to load the configuration from + */ + async fromDatasource(datasource, configPath) { + const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); + if (!content) + return this; + if (datasource instanceof datasources_1.GitSource || datasource instanceof datasources_1.FileSource) { + this.includeCommits = true; + this.includePullRequest = false; + } + else if (datasource instanceof datasources_1.GitHubSource) { + this.includePullRequest = true; + } + else { + throw new Error("Unsupported data source"); + } + const config = JSON.parse(content); + this.includeCommits = config.includeCommits ?? this.includeCommits; + this.includePullRequest = config.includePullRequest ?? this.includePullRequest; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); + return this; + } } exports.Configuration = Configuration; @@ -40966,6 +41014,12 @@ class FileSource { async getCommitMessages() { return [(0, commit_it_1.getCommit)({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } + async getConfigurationFile(path) { + if (!fs.existsSync(path)) { + return undefined; + } + return fs.readFileSync(path, "utf8"); + } } exports.FileSource = FileSource; /** @@ -40980,6 +41034,12 @@ class GitSource { const data = await (0, simple_git_1.simpleGit)().log({ from: this.sourceBranch, to: "@{push}" }); return data.all.map(commit => (0, commit_it_1.getCommit)({ hash: commit.hash })); } + async getConfigurationFile(path) { + if (!fs.existsSync(path)) { + return undefined; + } + return fs.readFileSync(path, "utf8"); + } } exports.GitSource = GitSource; /** @@ -40994,11 +41054,35 @@ class GitHubSource { return commits.data.map(commit => { return { hash: commit.sha, - subject: commit.commit.message.split("\n")[0], - body: commit.commit.message.split("\n").slice(2).join("\n"), + subject: commit.commit.message.split(/\r?\n/)[0], + body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), }; }); } + /** + * Retrieves the specified configuration file from the repository using the REST API + * @param path + */ + async getConfigurationFile(path) { + const octokit = github.getOctokit(core.getInput("token")); + try { + const { data: config } = await octokit.rest.repos.getContent({ + ...github.context.repo, + path, + ref: github.context.ref, + }); + if ("content" in config === false) { + throw new Error("Unsupported metadata type for Configuration path"); + } + return Buffer.from(config.content, "base64").toString(); + } + catch (error) { + if (error.message !== "Not Found") { + throw error; + } + return undefined; + } + } } exports.GitHubSource = GitHubSource; @@ -41030,12 +41114,13 @@ const program = new commander_1.Command(); program .name("pre-commit-me") .description("Conventional Commit message validation (pre-commit hook)") + .option("-c, --config ", "The configuration file to use.") .argument("", "The file containing the commit messages to validate.") .action(async (file) => { // Set the global configuration - const config = configuration_1.Configuration.getInstance(); - config.includeCommits = true; - const commits = await new datasources_1.FileSource(file).getCommitMessages(); + const datasource = new datasources_1.FileSource(file); + await configuration_1.Configuration.getInstance().fromDatasource(datasource, program.opts().config); + const commits = await datasource.getCommitMessages(); let errorCount = 0; (0, validator_1.validateCommits)(commits).forEach(commit => { commit.errors.forEach(error => console.log(error, os_1.default.EOL)); diff --git a/src/configuration.ts b/src/configuration.ts index f046d68..483c1f0 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -5,6 +5,8 @@ import { IConventionalCommitOptions } from "@dev-build-deploy/commit-it"; +import { FileSource, GitHubSource, GitSource, IDataSource } from "./datasources"; + /** * Configuration class * @class Configuration @@ -28,6 +30,54 @@ class Configuration implements IConventionalCommitOptions { return Configuration._instance; } + + /** + * Extends the list of types to validate against. + * @param types List of types to validate against + */ + addTypes(types: string | string[]): void { + const typesList = Array.isArray(types) ? types : [types]; + const valid = typesList.every(item => typeof item === "string"); + if (!valid) throw new Error("Invalid data provided for 'types', expected string or array of strings"); + this.types = this.types ? [...this.types, ...typesList] : typesList; + } + + /** + * Extends the list of scopes to validate against. + * @param scopes List of scopes to validate against + */ + addScopes(scopes: string | string[]): void { + const scopesList = Array.isArray(scopes) ? scopes : [scopes]; + const valid = scopesList.every(item => typeof item === "string"); + if (!valid) throw new Error("Invalid data provided for 'scopes', expected string or array of strings"); + this.scopes = this.scopes ? [...this.scopes, ...scopesList] : scopesList; + } + + /** + * Loads the configuration from a JSON5 file. + * @param file The file to load the configuration from + */ + async fromDatasource(datasource: IDataSource, configPath?: string): Promise { + const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); + if (!content) return this; + + if (datasource instanceof GitSource || datasource instanceof FileSource) { + this.includeCommits = true; + this.includePullRequest = false; + } else if (datasource instanceof GitHubSource) { + this.includePullRequest = true; + } else { + throw new Error("Unsupported data source"); + } + + const config = JSON.parse(content); + this.includeCommits = config.includeCommits ?? this.includeCommits; + this.includePullRequest = config.includePullRequest ?? this.includePullRequest; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); + + return this; + } } export { Configuration }; diff --git a/src/datasources.ts b/src/datasources.ts index 2aa4671..689c545 100644 --- a/src/datasources.ts +++ b/src/datasources.ts @@ -17,6 +17,7 @@ import { simpleGit } from "simple-git"; */ export interface IDataSource { getCommitMessages(): Promise; + getConfigurationFile(path: string): Promise; } /** @@ -36,6 +37,14 @@ export class FileSource implements IDataSource { async getCommitMessages(): Promise { return [getCommit({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } + + async getConfigurationFile(path: string): Promise { + if (!fs.existsSync(path)) { + return undefined; + } + + return fs.readFileSync(path, "utf8"); + } } /** @@ -52,6 +61,14 @@ export class GitSource implements IDataSource { const data = await simpleGit().log({ from: this.sourceBranch, to: "@{push}" }); return data.all.map(commit => getCommit({ hash: commit.hash })); } + + async getConfigurationFile(path: string): Promise { + if (!fs.existsSync(path)) { + return undefined; + } + + return fs.readFileSync(path, "utf8"); + } } /** @@ -68,9 +85,36 @@ export class GitHubSource implements IDataSource { return commits.data.map(commit => { return { hash: commit.sha, - subject: commit.commit.message.split("\n")[0], - body: commit.commit.message.split("\n").slice(2).join("\n"), + subject: commit.commit.message.split(/\r?\n/)[0], + body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), }; }); } + + /** + * Retrieves the specified configuration file from the repository using the REST API + * @param path + */ + async getConfigurationFile(path: string): Promise { + const octokit = github.getOctokit(core.getInput("token")); + + try { + const { data: config } = await octokit.rest.repos.getContent({ + ...github.context.repo, + path, + ref: github.context.ref, + }); + + if ("content" in config === false) { + throw new Error("Unsupported metadata type for Configuration path"); + } + + return Buffer.from(config.content, "base64").toString(); + } catch (error: unknown) { + if ((error as Error).message !== "Not Found") { + throw error; + } + return undefined; + } + } } diff --git a/src/entrypoints/action.ts b/src/entrypoints/action.ts index baf09b4..d22e256 100644 --- a/src/entrypoints/action.ts +++ b/src/entrypoints/action.ts @@ -10,7 +10,7 @@ import * as github from "@actions/github"; import { isConventionalCommit, ICommit, IConventionalCommit } from "@dev-build-deploy/commit-it"; import { Configuration } from "../configuration"; -import { GitHubSource } from "../datasources"; +import { GitHubSource, IDataSource } from "../datasources"; import { updatePullRequestLabels } from "../github"; import * as repository from "../repository"; import { IValidationResult, validateCommits, validatePullRequest } from "../validator"; @@ -51,7 +51,7 @@ const reportErrorMessages = (results: IValidationResult[]): number => { return errorCount; }; -const setConfiguration = (): void => { +const setConfiguration = async (dataSource: IDataSource): Promise => { assert(github.context.payload.pull_request); const pullrequestOnly = core.getInput("include-commits") @@ -59,11 +59,10 @@ const setConfiguration = (): void => { : github.context.payload.pull_request.base.repo.allow_rebase_merge === false; // Set the global configuration - const config = Configuration.getInstance(); + const config = await Configuration.getInstance().fromDatasource(dataSource, core.getInput("config") || undefined); config.includeCommits = !pullrequestOnly; - config.includePullRequest = true; - config.scopes = core.getMultilineInput("scopes") ?? []; - config.types = core.getMultilineInput("types") ?? []; + config.addScopes(core.getMultilineInput("scopes") ?? []); + config.addTypes(core.getMultilineInput("types") ?? []); }; /** @@ -72,10 +71,10 @@ const setConfiguration = (): void => { async function run(): Promise { try { core.info("📄 CommitMe - Conventional Commit compliance validation"); - setConfiguration(); + const datasource = new GitHubSource(); + await setConfiguration(datasource); core.startGroup("📝 Checking repository configuration"); - const datasource = new GitHubSource(); const config = Configuration.getInstance(); const githubToken = core.getInput("token") ?? undefined; diff --git a/src/entrypoints/cli.ts b/src/entrypoints/cli.ts index 9cfb816..b2f85de 100644 --- a/src/entrypoints/cli.ts +++ b/src/entrypoints/cli.ts @@ -29,18 +29,19 @@ program .option("-b, --base-branch ", "The base branch to compare the current branch with.") .option("-s, --scopes [scopes...]", "Conventional Commits scopes to validate against.") .option("-t, --types [types...]", "Conventional Commits types to validate against.") + .option("-c, --config ", "The configuration file to use.") .action(async options => { console.log("📄 CommitMe - Conventional Commit compliance validation"); console.log("-------------------------------------------------------"); + // Set the data source + const datasource = new GitSource(options.baseBranch ?? "main"); + // Set the global configuration - const config = Configuration.getInstance(); - config.includeCommits = true; - config.includePullRequest = false; - config.scopes = options.scopes ?? []; - config.types = options.types ?? []; + const config = await Configuration.getInstance().fromDatasource(datasource, options.config); + config.addScopes(options.scopes ?? []); + config.addTypes(options.types ?? []); - const datasource = new GitSource(options.baseBranch ?? "main"); const commits = await datasource.getCommitMessages(); let errorCount = 0; diff --git a/src/entrypoints/pre-commit.ts b/src/entrypoints/pre-commit.ts index 26173ed..0980ce8 100644 --- a/src/entrypoints/pre-commit.ts +++ b/src/entrypoints/pre-commit.ts @@ -21,13 +21,14 @@ const program = new Command(); program .name("pre-commit-me") .description("Conventional Commit message validation (pre-commit hook)") + .option("-c, --config ", "The configuration file to use.") .argument("", "The file containing the commit messages to validate.") .action(async file => { // Set the global configuration - const config = Configuration.getInstance(); - config.includeCommits = true; + const datasource = new FileSource(file); + await Configuration.getInstance().fromDatasource(datasource, program.opts().config); - const commits = await new FileSource(file).getCommitMessages(); + const commits = await datasource.getCommitMessages(); let errorCount = 0; validateCommits(commits).forEach(commit => { diff --git a/test/validator.test.ts b/test/validator.test.ts index 85afe7b..154e437 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -34,7 +34,7 @@ describe("Validate commit messages", () => { }, ]); let count = 0; - result.forEach(item => count += item.errors.length); + result.forEach(item => (count += item.errors.length)); // Space in between type and scope // Scope is not a noun From f3c4c472f0c23a18ce2869ec5812dbcea04c9a69 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Thu, 14 Dec 2023 09:22:13 +0100 Subject: [PATCH 04/25] chore: update pre-commit hooks --- .pre-commit-config.yaml | 6 +++++- package-lock.json | 12 ++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9699731..309ec37 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,9 +3,13 @@ repos: - repo: https://github.com/dev-build-deploy/commit-me - rev: v0.13.1 + rev: v1.1.0 hooks: - id: commit-me + args: [ + # Custom configuration file path + '--config', '.github/.commit-me.json' + ] - repo: https://github.com/dev-build-deploy/reuse-me rev: v0.10.0 diff --git a/package-lock.json b/package-lock.json index 2b35c91..0728e05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2319,9 +2319,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", "dev": true, "funding": [ { @@ -2616,9 +2616,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.610", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", - "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==", + "version": "1.4.612", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.612.tgz", + "integrity": "sha512-dM8BMtXtlH237ecSMnYdYuCkib2QHq0kpWfUnavjdYsyr/6OsAwg5ZGUfnQ9KD1Ga4QgB2sqXlB2NT8zy2GnVg==", "dev": true }, "node_modules/emittery": { From 426e828d3029abf93b9aae7d022abb43abafc9d5 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Sat, 16 Dec 2023 20:02:14 +0100 Subject: [PATCH 05/25] feat: extend Conventional Commit ruleset (errors and warnings) This commit will introduce the following new rules: - `CC-06` - A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description. - `CC-15` - The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase. - `WA-01` - A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer. --- lib/action/index.js | 743 +++++++++++++++++++++------------- lib/cli/index.js | 713 ++++++++++++++++++++------------ lib/precommit/index.js | 711 ++++++++++++++++++++------------ package-lock.json | 31 +- package.json | 2 +- src/datasources.ts | 25 +- src/entrypoints/action.ts | 54 ++- src/entrypoints/cli.ts | 13 +- src/entrypoints/pre-commit.ts | 9 +- src/validator.ts | 58 +-- test/validator.test.ts | 154 +++---- 11 files changed, 1527 insertions(+), 986 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index ce72c02..bf88738 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2093,9 +2093,9 @@ function isLoopbackAddress(host) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2120,8 +2120,75 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getCommit = exports.isConventionalCommit = exports.parseCommitMessage = void 0; +exports.parseCommitMessage = exports.getFooterElementsFromParagraph = exports.Commit = void 0; const git = __importStar(__nccwpck_require__(8433)); +const TRAILER_REGEX = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w*)/i; +/** + * Git Commit + * @class Commit + * @member author The commit author and date + * @member commiter The commit commiter and date + * @member hash The commit hash + * @member subject The commit subject + * @member body The commit body + * @member footer The commit footer + * @member raw The commit message + */ +class Commit { + _commit; + constructor(commit) { + this._commit = commit; + } + /** + * Retrieves the commit information from git using the provided hash + * @param props The commit hash and root path + * @returns The commit object + */ + static fromHash(props) { + const commit = git.getCommitFromHash(props.hash, props.rootPath ?? process.cwd()); + return new Commit(commit); + } + /** + * Creates a Commit object from the provided string + * @param props The commit hash, author, committer and message + * @returns The commit object + */ + static fromString(props) { + const commit = { + hash: props.hash, + ...parseCommitMessage(props.message), + author: props.author, + committer: props.committer, + raw: props.message, + }; + return new Commit(commit); + } + get author() { + return this._commit.author; + } + get committer() { + return this._commit.committer; + } + get hash() { + return this._commit.hash; + } + get subject() { + return this._commit.subject; + } + get body() { + return this._commit.body; + } + get footer() { + return this._commit.footer; + } + get raw() { + return this._commit.raw; + } + toJSON() { + return this._commit; + } +} +exports.Commit = Commit; /** * Returns a dictionary containing key-value pairs extracted from the footer of the provided commit message. * The key must either be: @@ -2131,13 +2198,15 @@ const git = __importStar(__nccwpck_require__(8433)); * The value is either: * - the remainder of the line * - the remainder of the line + anything that follows on the next lines which is indented by at least one space + * + * @internal */ -function parseCommitFooter(footer) { - const footerLines = footer.split(/[\r\n]+/); - const result = {}; +function getFooterElementsFromParagraph(footer) { + const footerLines = footer.split(/\r?\n/); + const result = []; for (let lineNr = 0; lineNr < footerLines.length; lineNr++) { const line = footerLines[lineNr]; - const match = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w)/.exec(line); + const match = TRAILER_REGEX.exec(line); if (match === null) continue; let key = match[1].replace(/:$/, ""); @@ -2146,15 +2215,22 @@ function parseCommitFooter(footer) { key = match[1].substring(0, match[1].length - 2); value = `#${value}`; } + const matchLine = lineNr; // Check if the value continues on the next line - while (lineNr + 1 < footerLines.length && footerLines[lineNr + 1].startsWith(" ")) { + while (lineNr + 1 < footerLines.length && + (/^\s/.test(footerLines[lineNr + 1]) || footerLines[lineNr + 1].length === 0)) { lineNr++; value += "\n" + footerLines[lineNr].trim(); } - result[key] = value; + result.push({ + lineNumber: matchLine + 1, + key, + value, + }); } return Object.keys(result).length > 0 ? result : undefined; } +exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; /** * Parses the provided commit message (full message, not just the subject) into * a Commit object. @@ -2163,11 +2239,11 @@ function parseCommitFooter(footer) { * @internal */ function parseCommitMessage(message) { - const isTrailerOnly = (message) => message.split(/[\r\n]+/).every(line => { - const match = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w)/.exec(line); + const isTrailerOnly = (message) => message.split(/\r?\n/).every(line => { + const match = TRAILER_REGEX.exec(line); return match !== null; }); - const paragraphs = message.split(/^[\r\n]+/m); + const paragraphs = message.split(/^\r?\n/m); let footer = undefined; let body = undefined; if (paragraphs.length > 1 && isTrailerOnly(paragraphs[paragraphs.length - 1])) { @@ -2182,69 +2258,26 @@ function parseCommitMessage(message) { return { subject: paragraphs[0].trim(), body: body, - footer: parseCommitFooter(footer !== null && footer !== void 0 ? footer : ""), + footer: getFooterElementsFromParagraph(footer ?? "")?.reduce((acc, cur) => { + acc[cur.key] = cur.value; + return acc; + }, {}), }; } exports.parseCommitMessage = parseCommitMessage; -/** - * Confirms whether the provided commit is a Conventional Commit - * @param commit - * @returns - */ -function isConventionalCommit(commit) { - return "type" in commit; -} -exports.isConventionalCommit = isConventionalCommit; -/** - * Retrieves the commit message (from the indicated source) given the provided SHA hash - * @param hash SHA of the commit - * @param source The data source to retrieve the commit message from (git or github) - * @param options The options to use when retrieving the commit message - * @returns Commit object - */ -function getCommit(options) { - var _a; - let commit; - // String data source - if ("message" in options) { - const stringOptions = options; - commit = { - hash: stringOptions.hash, - ...parseCommitMessage(stringOptions.message), - author: stringOptions.author, - committer: stringOptions.committer, - }; - // GitHub data source - } - else if ("owner" in options) { - const githubOptions = options; - // TODO; implement basic GitHub client - commit = { - hash: githubOptions.hash, - subject: "", - }; - // Git data source - } - else { - const gitOptions = options; - commit = git.getCommitFromHash(gitOptions.hash, (_a = gitOptions.rootPath) !== null && _a !== void 0 ? _a : process.cwd()); - } - return commit; -} -exports.getCommit = getCommit; /***/ }), -/***/ 8436: +/***/ 1124: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2268,101 +2301,162 @@ var __importStar = (this && this.__importStar) || function (mod) { __setModuleDefault(result, mod); return result; }; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getConventionalCommit = exports.isConventionalCommit = exports.ConventionalCommitError = void 0; -const assert_1 = __importDefault(__nccwpck_require__(9491)); +exports.ConventionalCommit = void 0; +const diagnose_it_1 = __nccwpck_require__(4657); +const commit_1 = __nccwpck_require__(8065); const requirements = __importStar(__nccwpck_require__(4374)); /** - * Conventional Commit error - * @class ConventionalCommitError - * @extends Error + * Conventional Commit + * @class ConventionalCommit + * @member type Conventional Commit type + * @member scope Conventional Commit scope + * @member breaking Commit message has a Conventional Commit breaking change (!) + * @member description Conventional Commit description + * @member hash Commit hash + * @member subject Commit subject + * @member body Commit body + * @member footer Commit footer + * @member author Commit author and date + * @member committer Commit committer and date + * @member isValid Whether the Conventional Commit is valid * @member errors List of error messages + * @member warnings List of warning messages */ -class ConventionalCommitError extends Error { - constructor(errors) { - super("Commit is not compliant with the Conventional Commits specification."); - this.name = "ConventionalCommitError"; - this.errors = errors; +class ConventionalCommit { + _raw; + _errors = []; + _warnings = []; + constructor(raw, options) { + this._raw = raw; + this.validate(options); + } + /** + * Creates a new Conventional Commit object from the provided Commit. + * @param commit Commit to convert to a Conventional Commit + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromCommit(commit, options) { + // Convert the Commit message to Raw Conventional Commit data + const rawConvCommit = createRawConventionalCommit(commit); + // Create a new Conventional Commit object + return new ConventionalCommit(rawConvCommit, options); + } + /** + * Creates a new Conventional Commit object from the provided string. + * @param props Hash, message and author/committer information + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromString(props, options) { + return ConventionalCommit.fromCommit(commit_1.Commit.fromString(props), options); + } + /** + * Creates a new Conventional Commit object from the provided hash. + * @param props Hash and root path + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromHash(props, options) { + return ConventionalCommit.fromCommit(commit_1.Commit.fromHash(props), options); + } + // Contributors + get author() { + return this._raw.commit.author; + } + get committer() { + return this._raw.commit.committer; + } + // Commit + get hash() { + return this._raw.commit.hash; + } + get subject() { + return this._raw.commit.subject; + } + get body() { + return this._raw.commit.body; + } + get footer() { + return this._raw.commit.footer; + } + // Conventional Commit + get type() { + return this._raw.type.value; + } + get scope() { + return this._raw.scope.value; + } + get description() { + return this._raw.description.value; + } + get breaking() { + return (this._raw.breaking.value === "!" || + (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); + } + // Raw + get raw() { + return this._raw.commit.raw; + } + // Validation + get isValid() { + return this._errors.length === 0; + } + get warnings() { + return this._warnings; + } + get errors() { + return this._errors; + } + toJSON() { + return { + hash: this.hash, + author: this.author, + committer: this.committer, + subject: this.subject, + body: this.body, + footer: this.footer, + type: this.type, + breaking: this.breaking, + description: this.description, + validation: { + isValid: this.isValid, + errors: this.errors, + warnings: this.warnings, + }, + }; + } + // Private validation function + validate(options) { + let results = []; + requirements.commitRules.forEach(rule => (results = [...results, ...rule.validate(this._raw, options)])); + this._errors = results.filter(r => r.level === diagnose_it_1.DiagnosticsLevelEnum.Error); + this._warnings = results.filter(r => r.level === diagnose_it_1.DiagnosticsLevelEnum.Warning); } } -exports.ConventionalCommitError = ConventionalCommitError; -/** - * Returns whether the provided commit has a breaking change (either "!" in subject, or usage of /BREAKING[- ]CHANGE:/). - * @param commit Commit to check - * @returns Whether the provided commit has a breaking change - */ -function hasBreakingChange(commit) { - return (commit.breaking.value === "!" || - (commit.commit.footer !== undefined && - ("BREAKING CHANGE" in commit.commit.footer || "BREAKING-CHANGE" in commit.commit.footer))); -} -/** - * Validates a commit message against the Conventional Commit specification. - * @param commit Commit message to validate against the Conventional Commit specification - * @returns Conventional Commit mesage - * @throws ExpressiveMessage[] if the commit message is not a valid Conventional Commit - * @see https://www.conventionalcommits.org/en/v1.0.0/ - */ -function validate(commit, options) { - let errors = []; - requirements.commitRules.forEach(rule => (errors = [...errors, ...rule.validate(commit, options)])); - if (errors.length > 0) - throw new ConventionalCommitError(errors); - // Assume that we have a valid Conventional Commit message - (0, assert_1.default)(commit.type.value); - (0, assert_1.default)(commit.description.value); - return { - ...commit.commit, - type: commit.type.value, - scope: commit.scope.value, - breaking: hasBreakingChange(commit), - description: commit.description.value, - }; -} -/** - * Returns whether the provided commit is a Conventional Commit. - * @param commit Commit to check - * @returns Whether the provided commit is a Conventional Commit - */ -function isConventionalCommit(commit) { - return "type" in commit; -} -exports.isConventionalCommit = isConventionalCommit; -/** - * Parses a Commit message into a Conventional Commit. - * @param commit Commit message to parse - * @param options Options to use when parsing the commit message - * @throws ExpressiveMessage[] if the commit message is not a valid Conventional Commit - * @returns Conventional Commit - */ -function getConventionalCommit(commit, options) { - var _a, _b, _c, _d, _e; +exports.ConventionalCommit = ConventionalCommit; +function createRawConventionalCommit(commit) { const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\)\s*)?(?!\s*)?(?:\s*)?(?.*)?$/); - const match = ConventionalCommitRegex.exec(commit.subject); - let conventionalCommit = { + const match = ConventionalCommitRegex.exec(commit.subject.split(/\r?\n/)[0]); + const conventionalCommit = { commit: commit, - type: { index: 1, value: (_a = match === null || match === void 0 ? void 0 : match.groups) === null || _a === void 0 ? void 0 : _a.type }, - scope: { index: 1, value: (_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.scope }, - breaking: { index: 1, value: (_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.breaking }, - seperator: { index: 1, value: (_d = match === null || match === void 0 ? void 0 : match.groups) === null || _d === void 0 ? void 0 : _d.separator }, - description: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.subject }, + type: { index: 1, value: match?.groups?.type }, + scope: { index: 1, value: match?.groups?.scope }, + breaking: { index: 1, value: match?.groups?.breaking }, + seperator: { index: 1, value: match?.groups?.separator }, + description: { index: 1, value: match?.groups?.subject }, body: { index: 1, value: commit.body }, }; function intializeIndices(commit) { - var _a, _b, _c, _d, _e, _f, _g, _h; - commit.scope.index = commit.type.index + ((_b = (_a = commit.type.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); - commit.breaking.index = commit.scope.index + ((_d = (_c = commit.scope.value) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0); - commit.seperator.index = commit.breaking.index + ((_f = (_e = commit.breaking.value) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0); - commit.description.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); + commit.scope.index = commit.type.index + (commit.type.value?.length ?? 0); + commit.breaking.index = commit.scope.index + (commit.scope.value?.length ?? 0); + commit.seperator.index = commit.breaking.index + (commit.breaking.value?.length ?? 0); + commit.description.index = commit.seperator.index + (commit.seperator.value?.length ?? 0); return commit; } - conventionalCommit = intializeIndices(conventionalCommit); - return validate(conventionalCommit, options); + return intializeIndices(conventionalCommit); } -exports.getConventionalCommit = getConventionalCommit; /***/ }), @@ -2373,9 +2467,9 @@ exports.getConventionalCommit = getConventionalCommit; "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2455,15 +2549,17 @@ function getValueFromKey(commit, key) { function parseCommitMessage(commit, hash) { const author = extractNameAndDate(getValueFromKey(commit, "author")); const committer = extractNameAndDate(getValueFromKey(commit, "committer")); + const raw = commit + .split(/^[\r\n]+/m) + .splice(1) + .join("\n") + .trim(); return { + raw, hash: hash, author: author, committer: committer, - ...ccommit.parseCommitMessage(commit - .split(/^[\r\n]+/m) - .splice(1) - .join("\n") - .trim()), + ...ccommit.parseCommitMessage(raw), }; } /** @@ -2605,17 +2701,15 @@ function readPackFile(path, index) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ConventionalCommitError = exports.isConventionalCommit = exports.getConventionalCommit = exports.getCommit = void 0; +exports.ConventionalCommit = exports.Commit = void 0; var commit_1 = __nccwpck_require__(8065); -Object.defineProperty(exports, "getCommit", ({ enumerable: true, get: function () { return commit_1.getCommit; } })); -var conventional_commit_1 = __nccwpck_require__(8436); -Object.defineProperty(exports, "getConventionalCommit", ({ enumerable: true, get: function () { return conventional_commit_1.getConventionalCommit; } })); -Object.defineProperty(exports, "isConventionalCommit", ({ enumerable: true, get: function () { return conventional_commit_1.isConventionalCommit; } })); -Object.defineProperty(exports, "ConventionalCommitError", ({ enumerable: true, get: function () { return conventional_commit_1.ConventionalCommitError; } })); +Object.defineProperty(exports, "Commit", ({ enumerable: true, get: function () { return commit_1.Commit; } })); +var conventionalCommit_1 = __nccwpck_require__(1124); +Object.defineProperty(exports, "ConventionalCommit", ({ enumerable: true, get: function () { return conventionalCommit_1.ConventionalCommit; } })); /***/ }), @@ -2631,13 +2725,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.commitRules = void 0; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong - -SPDX-License-Identifier: MIT -SPDX-License-Identifier: CC-BY-3.0 -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * + * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: CC-BY-3.0 + */ const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); +const commit_1 = __nccwpck_require__(8065); function isNoun(str) { return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); } @@ -2650,29 +2745,30 @@ function highlightString(str, substring) { substring.forEach(sub => (result = result.replace(sub, `${chalk_1.default.cyan(sub)}`))); return result; } -function createError(commit, description, highlight, type, whitespace = false) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j; +function createDiagnosticsMessage(commit, description, highlight, type, whitespace = false, level = diagnose_it_1.DiagnosticsLevelEnum.Error) { const element = commit[type]; let hintIndex = element.index; - let hintLength = (_b = (_a = element.value) === null || _a === void 0 ? void 0 : _a.trimEnd().length) !== null && _b !== void 0 ? _b : 1; + let hintLength = element.value?.trimEnd().length ?? 1; if (whitespace) { let prevElement = undefined; for (const [_key, value] of Object.entries(commit)) { - if (value.index > ((_c = prevElement === null || prevElement === void 0 ? void 0 : prevElement.index) !== null && _c !== void 0 ? _c : 0) && value.index < element.index) { + if (value.index > (prevElement?.index ?? 0) && value.index < element.index) { prevElement = value; } } - hintIndex = prevElement ? prevElement.index + ((_e = (_d = prevElement.value) === null || _d === void 0 ? void 0 : _d.trimEnd().length) !== null && _e !== void 0 ? _e : 1) : 1; - hintLength = ((_g = (_f = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _f === void 0 ? void 0 : _f.length) !== null && _g !== void 0 ? _g : 1) - ((_j = (_h = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _h === void 0 ? void 0 : _h.trimEnd().length) !== null && _j !== void 0 ? _j : 1); + hintIndex = prevElement ? prevElement.index + (prevElement.value?.trimEnd().length ?? 1) : 1; + hintLength = (prevElement?.value?.length ?? 1) - (prevElement?.value?.trimEnd().length ?? 1); } - return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { - text: highlightString(description, highlight), - linenumber: 1, - column: hintIndex, + return new diagnose_it_1.DiagnosticsMessage({ + file: commit.commit.hash, + level, + message: { + text: highlightString(description, highlight), + linenumber: 1, + column: hintIndex, + }, }) - .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 - ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] - : [commit.commit.subject]) + .setContext(1, commit.commit.subject.split(/\r?\n/)[0]) .addFixitHint(diagnose_it_1.FixItHint.create({ index: hintIndex, length: hintLength === 0 ? 1 : hintLength })); } /** @@ -2680,10 +2776,8 @@ function createError(commit, description, highlight, type, whitespace = false) { * followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space. */ class CC01 { - constructor() { - this.id = "CC-01"; - this.description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; - } + id = "CC-01"; + description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; validate(commit, _options) { const errors = []; // MUST be prefixed with a type @@ -2693,29 +2787,36 @@ class CC01 { else { // Ensure that we have a noun if (!isNoun(commit.type.value)) - errors.push(createError(commit, this.description, "which consists of a noun", "type")); + errors.push(createDiagnosticsMessage(commit, this.description, "which consists of a noun", "type")); // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { - if (commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); - else if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); - else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + if (commit.scope.value) { + errors.push(createDiagnosticsMessage(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); + } + else if (commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + } + else { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } } // Validate for spacing after the scope, breaking and seperator if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) { - if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); - else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + if (commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + } + else { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } + } + if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } - if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // MUST have a terminal colon - if (!commit.seperator.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + if (!commit.seperator.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + } return errors; } } @@ -2724,16 +2825,14 @@ class CC01 { * a section of the codebase surrounded by parenthesis, e.g., fix(parser): */ class CC04 { - constructor() { - this.id = "CC-04"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; - } + id = "CC-04"; + description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; validate(commit, _options) { const errors = []; if (commit.scope.value && (commit.scope.value === "()" || !isNoun(commit.scope.value.trimEnd().substring(1, commit.scope.value.trimEnd().length - 1)))) { - errors.push(createError(commit, this.description, "A scope MUST consist of a noun", "scope")); + errors.push(createDiagnosticsMessage(commit, this.description, "A scope MUST consist of a noun", "scope")); } return errors; } @@ -2744,17 +2843,73 @@ class CC04 { * when multiple spaces were contained in string. */ class CC05 { - constructor() { - this.id = "CC-05"; - this.description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; - } + id = "CC-05"; + description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; validate(commit, _options) { const errors = []; - if (!commit.seperator.value) + if (!commit.seperator.value) { return errors; + } if (commit.description.value === undefined || - commit.seperator.value.length - commit.seperator.value.trim().length !== 1) - errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); + commit.seperator.value.length - commit.seperator.value.trim().length !== 1) { + errors.push(createDiagnosticsMessage(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); + } + return errors; + } +} +/** + * A longer commit body MAY be provided after the short description, providing + * additional contextual information about the code changes. The body MUST begin one + * blank line after the description. + */ +class CC06 { + id = "CC-06"; + description = "A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description."; + validate(commit, _options) { + const errors = []; + if (!commit.commit.subject) { + return errors; + } + const lines = commit.commit.subject.split(/\r?\n/); + if (lines.length > 1) { + return [ + diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { + text: highlightString(this.description, "The body MUST begin one blank line after the description"), + linenumber: 2, + column: 1, + }) + .setContext(1, lines) + .addFixitHint(diagnose_it_1.FixItHint.createRemoval({ index: 1, length: lines[1].length })), + ]; + } + return errors; + } +} +/** + * The units of information that make up Conventional Commits MUST NOT be treated as case + * sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase. + */ +class CC15 { + id = "CC-15"; + description = "The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase."; + validate(commit, _options) { + const errors = []; + const footerElements = (0, commit_1.getFooterElementsFromParagraph)(commit.commit.raw); + if (footerElements === undefined) + return errors; + for (const element of footerElements) { + if (["BREAKING CHANGE", "BREAKING-CHANGE"].includes(element.key.toUpperCase())) { + if (element.key !== element.key.toUpperCase()) { + errors.push(diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { + text: highlightString(this.description, "BREAKING CHANGE MUST be uppercase"), + linenumber: element.lineNumber, + column: 1, + }) + .setContext(element.lineNumber, commit.commit.raw.split(/\r?\n/)[element.lineNumber - 1]) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: element.key.length }))); + } + } + } return errors; } } @@ -2762,20 +2917,19 @@ class CC05 { * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis */ class EC01 { - constructor() { - this.id = "EC-01"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; - } + id = "EC-01"; + description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; validate(commit, options) { - var _a; - const uniqueScopeList = Array.from(new Set((_a = options === null || options === void 0 ? void 0 : options.scopes) !== null && _a !== void 0 ? _a : [])); - if (uniqueScopeList.length === 0) + const uniqueScopeList = Array.from(new Set(options?.scopes ?? [])); + if (uniqueScopeList.length === 0) { return []; - if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) + } + if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) { return []; + } this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${uniqueScopeList.join(", ")}) surrounded by parenthesis`; return [ - createError(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), + createDiagnosticsMessage(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), ]; } } @@ -2783,33 +2937,74 @@ class EC01 { * Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...) */ class EC02 { - constructor() { - this.id = "EC-02"; - this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; - } + id = "EC-02"; + description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; validate(commit, options) { - var _a; - const uniqueAddedTypes = new Set((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []); + const uniqueAddedTypes = new Set(options?.types ?? []); if (uniqueAddedTypes.has("feat")) uniqueAddedTypes.delete("feat"); if (uniqueAddedTypes.has("fix")) uniqueAddedTypes.delete("fix"); const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; - this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; + this.description = `Commits ${uniqueAddedTypes.size > 0 ? "MUST" : "MAY"} be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; if (commit.type.value === undefined || !isNoun(commit.type.value) || - expectedTypes.includes(commit.type.value.trimEnd())) + expectedTypes.includes(commit.type.value.toLowerCase().trimEnd())) { return []; + } if (commit.type.value.trim().length === 0) { - return [createError(commit, this.description, "prefixed with a type", "type")]; + return [createDiagnosticsMessage(commit, this.description, "prefixed with a type", "type")]; + } + if (uniqueAddedTypes.size > 0) { + return [ + createDiagnosticsMessage(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), + ]; + } + else { + return [ + createDiagnosticsMessage(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type", false, diagnose_it_1.DiagnosticsLevelEnum.Warning), + ]; } - return [ - createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), - ]; + } +} +/** + * A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer. + */ +class WA01 { + id = "WA-01"; + description = "A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer."; + validate(commit, _options) { + const errors = []; + if (commit.commit.body === undefined) + return errors; + const elements = (0, commit_1.getFooterElementsFromParagraph)(commit.commit.body); + if (elements === undefined) + return errors; + for (const element of elements) { + if (element.key === "BREAKING CHANGE" || element.key === "BREAKING-CHANGE") { + errors.push(diagnose_it_1.DiagnosticsMessage.createWarning(commit.commit.hash, { + text: highlightString(`A \`${element.key}\` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer.`, [element.key, "will be ignored as it MUST be included in the footer"]), + linenumber: commit.commit.subject.split(/\r?\n/).length + element.lineNumber, + column: 1, + }) + .setContext(commit.commit.subject.split(/\r?\n/).length + 1, commit.commit.body.split(/\r?\n/)) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: element.key.length }))); + } + } + return errors; } } /** @internal */ -exports.commitRules = [new CC01(), new CC04(), new CC05(), new EC01(), new EC02()]; +exports.commitRules = [ + new CC01(), + new CC04(), + new CC05(), + new CC06(), + new CC15(), + new EC01(), + new EC02(), + new WA01(), +]; /***/ }), @@ -41011,7 +41206,7 @@ class FileSource { } } async getCommitMessages() { - return [(0, commit_it_1.getCommit)({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; + return [commit_it_1.Commit.fromString({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } async getConfigurationFile(path) { if (!fs.existsSync(path)) { @@ -41031,7 +41226,7 @@ class GitSource { } async getCommitMessages() { const data = await (0, simple_git_1.simpleGit)().log({ from: this.sourceBranch, to: "@{push}" }); - return data.all.map(commit => (0, commit_it_1.getCommit)({ hash: commit.hash })); + return data.all.map(commit => commit_it_1.Commit.fromHash({ hash: commit.hash })); } async getConfigurationFile(path) { if (!fs.existsSync(path)) { @@ -41050,13 +41245,10 @@ class GitHubSource { const pullRequestNumber = github.context.payload.pull_request?.number; (0, assert_1.default)(pullRequestNumber); const commits = await octokit.rest.pulls.listCommits({ ...github.context.repo, pull_number: pullRequestNumber }); - return commits.data.map(commit => { - return { - hash: commit.sha, - subject: commit.commit.message.split(/\r?\n/)[0], - body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), - }; - }); + return commits.data.map(commit => commit_it_1.Commit.fromString({ + hash: commit.sha, + message: commit.commit.message, + })); } /** * Retrieves the specified configuration file from the repository using the REST API @@ -41141,14 +41333,13 @@ const validator_1 = __nccwpck_require__(4630); const determineLabel = async (commits) => { let type; for (const commit of commits) { - if (!(0, commit_it_1.isConventionalCommit)(commit.commit)) + if (!commit.isValid) continue; - const convCommit = commit.commit; - if (convCommit.breaking) + if (commit.breaking) return "breaking"; - if (convCommit.type === "feat") + if (commit.type?.toLowerCase() === "feat") type = "feature"; - else if (convCommit.type === "fix" && type !== "feature") + else if (commit.type?.toLowerCase() === "fix" && type !== "feature") type = "fix"; } return type; @@ -41160,12 +41351,15 @@ const determineLabel = async (commits) => { */ const reportErrorMessages = (results) => { let errorCount = 0; + let warningCount = 0; for (const commit of results) { - core.info(`${commit.errors.length === 0 ? "✅" : "❌"} ${commit.commit.hash}: ${commit.commit.subject}`); - commit.errors.forEach(error => core.error(error, { title: "Conventional Commit Compliance" })); + core.info(`${commit.errors.length === 0 ? "✅" : "❌"} ${commit.hash}: ${commit.subject}`); + commit.errors.forEach(error => core.error(error.toString(), { title: "Conventional Commit Compliance" })); errorCount += commit.errors.length; + commit.warnings.forEach(warning => core.warning(warning.toString(), { title: "Conventional Commit Compliance" })); + warningCount += commit.warnings.length; } - return errorCount; + return { errors: errorCount, warnings: warningCount }; }; const setConfiguration = async (dataSource) => { (0, assert_1.default)(github.context.payload.pull_request); @@ -41212,27 +41406,34 @@ async function run() { // Gathering commit message information const resultCommits = (0, validator_1.validateCommits)(commits); let errorCount = 0; + let warningCount = 0; const allResults = [...resultCommits]; if (config.includePullRequest === true) { core.startGroup(`🔎 Scanning Pull Request`); - const resultPullrequest = (0, validator_1.validatePullRequest)({ + const resultPullrequest = (0, validator_1.validatePullRequest)(commit_it_1.Commit.fromString({ hash: `#${github.context.payload.pull_request.number}`, - subject: github.context.payload.pull_request.title, - body: github.context.payload.pull_request.body ?? "", - }, resultCommits.map(commit => commit.commit).filter(commit => commit !== undefined)); + message: [github.context.payload.pull_request.title, "", github.context.payload.pull_request.body].join("\n"), + }), allResults); allResults.push(resultPullrequest); - errorCount += reportErrorMessages([resultPullrequest]); + const counts = reportErrorMessages([resultPullrequest]); + errorCount += counts.errors; + warningCount += counts.warnings; core.endGroup(); } if (config.includeCommits === true) { core.startGroup("🔎 Scanning Commits associated with Pull Request"); - errorCount += reportErrorMessages(resultCommits); + const counts = reportErrorMessages(resultCommits); + errorCount += counts.errors; + warningCount += counts.warnings; core.endGroup(); } if (errorCount > 0) { - core.setFailed(`❌ Found ${errorCount} Conventional Commits compliance issues.`); + core.setFailed(`❌ Found ${errorCount} Conventional Commit compliance issues, and ${warningCount} warnings.`); return; } + else if (warningCount > 0) { + core.warning(`⚠️ Found ${warningCount} Conventional Commit compliance warnings.`); + } // Updating the pull request label if (githubToken === undefined) { core.warning("⚠️ The token input is required to update the pull request label."); @@ -41408,16 +41609,7 @@ const configuration_1 = __nccwpck_require__(5778); * @returns Validation result */ function validateCommit(commit) { - const result = { commit: commit, errors: [] }; - try { - result.commit = (0, commit_it_1.getConventionalCommit)(commit, configuration_1.Configuration.getInstance()); - } - catch (error) { - if (!(error instanceof commit_it_1.ConventionalCommitError)) - throw error; - error.errors.forEach(e => result.errors.push(e.toString())); - } - return result; + return commit_it_1.ConventionalCommit.fromCommit(commit, configuration_1.Configuration.getInstance()); } /** * Validates the pull request against CommitMe requirements. @@ -41427,27 +41619,28 @@ function validateCommit(commit) { */ function validatePullRequest(pullrequest, commits) { const result = validateCommit(pullrequest); - if (result.errors.length > 0) + if (!result.isValid) return result; const orderValue = (commit) => { - if (!commit || !("type" in commit)) - return 0; if (commit.breaking) return 3; - if (commit.type === "feat") + if (commit.type?.toLowerCase() === "feat") return 2; - if (commit.type === "fix") + if (commit.type?.toLowerCase() === "fix") return 1; return 0; }; - const pullRequestValue = orderValue(result.commit); - const commitsValue = orderValue(commits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); + const pullRequestValue = orderValue(result); + const validConventionalCommits = commits.filter(commit => commit.isValid); + const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { - result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.commit.hash, { + result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, - }).toString()); + }) + .setContext(1, result.subject) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: result.type?.length ?? 1 }))); } return result; } diff --git a/lib/cli/index.js b/lib/cli/index.js index 65fbe70..ab721cb 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2094,9 +2094,9 @@ function isLoopbackAddress(host) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2121,8 +2121,75 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getCommit = exports.isConventionalCommit = exports.parseCommitMessage = void 0; +exports.parseCommitMessage = exports.getFooterElementsFromParagraph = exports.Commit = void 0; const git = __importStar(__nccwpck_require__(8433)); +const TRAILER_REGEX = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w*)/i; +/** + * Git Commit + * @class Commit + * @member author The commit author and date + * @member commiter The commit commiter and date + * @member hash The commit hash + * @member subject The commit subject + * @member body The commit body + * @member footer The commit footer + * @member raw The commit message + */ +class Commit { + _commit; + constructor(commit) { + this._commit = commit; + } + /** + * Retrieves the commit information from git using the provided hash + * @param props The commit hash and root path + * @returns The commit object + */ + static fromHash(props) { + const commit = git.getCommitFromHash(props.hash, props.rootPath ?? process.cwd()); + return new Commit(commit); + } + /** + * Creates a Commit object from the provided string + * @param props The commit hash, author, committer and message + * @returns The commit object + */ + static fromString(props) { + const commit = { + hash: props.hash, + ...parseCommitMessage(props.message), + author: props.author, + committer: props.committer, + raw: props.message, + }; + return new Commit(commit); + } + get author() { + return this._commit.author; + } + get committer() { + return this._commit.committer; + } + get hash() { + return this._commit.hash; + } + get subject() { + return this._commit.subject; + } + get body() { + return this._commit.body; + } + get footer() { + return this._commit.footer; + } + get raw() { + return this._commit.raw; + } + toJSON() { + return this._commit; + } +} +exports.Commit = Commit; /** * Returns a dictionary containing key-value pairs extracted from the footer of the provided commit message. * The key must either be: @@ -2132,13 +2199,15 @@ const git = __importStar(__nccwpck_require__(8433)); * The value is either: * - the remainder of the line * - the remainder of the line + anything that follows on the next lines which is indented by at least one space + * + * @internal */ -function parseCommitFooter(footer) { - const footerLines = footer.split(/[\r\n]+/); - const result = {}; +function getFooterElementsFromParagraph(footer) { + const footerLines = footer.split(/\r?\n/); + const result = []; for (let lineNr = 0; lineNr < footerLines.length; lineNr++) { const line = footerLines[lineNr]; - const match = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w)/.exec(line); + const match = TRAILER_REGEX.exec(line); if (match === null) continue; let key = match[1].replace(/:$/, ""); @@ -2147,15 +2216,22 @@ function parseCommitFooter(footer) { key = match[1].substring(0, match[1].length - 2); value = `#${value}`; } + const matchLine = lineNr; // Check if the value continues on the next line - while (lineNr + 1 < footerLines.length && footerLines[lineNr + 1].startsWith(" ")) { + while (lineNr + 1 < footerLines.length && + (/^\s/.test(footerLines[lineNr + 1]) || footerLines[lineNr + 1].length === 0)) { lineNr++; value += "\n" + footerLines[lineNr].trim(); } - result[key] = value; + result.push({ + lineNumber: matchLine + 1, + key, + value, + }); } return Object.keys(result).length > 0 ? result : undefined; } +exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; /** * Parses the provided commit message (full message, not just the subject) into * a Commit object. @@ -2164,11 +2240,11 @@ function parseCommitFooter(footer) { * @internal */ function parseCommitMessage(message) { - const isTrailerOnly = (message) => message.split(/[\r\n]+/).every(line => { - const match = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w)/.exec(line); + const isTrailerOnly = (message) => message.split(/\r?\n/).every(line => { + const match = TRAILER_REGEX.exec(line); return match !== null; }); - const paragraphs = message.split(/^[\r\n]+/m); + const paragraphs = message.split(/^\r?\n/m); let footer = undefined; let body = undefined; if (paragraphs.length > 1 && isTrailerOnly(paragraphs[paragraphs.length - 1])) { @@ -2183,69 +2259,26 @@ function parseCommitMessage(message) { return { subject: paragraphs[0].trim(), body: body, - footer: parseCommitFooter(footer !== null && footer !== void 0 ? footer : ""), + footer: getFooterElementsFromParagraph(footer ?? "")?.reduce((acc, cur) => { + acc[cur.key] = cur.value; + return acc; + }, {}), }; } exports.parseCommitMessage = parseCommitMessage; -/** - * Confirms whether the provided commit is a Conventional Commit - * @param commit - * @returns - */ -function isConventionalCommit(commit) { - return "type" in commit; -} -exports.isConventionalCommit = isConventionalCommit; -/** - * Retrieves the commit message (from the indicated source) given the provided SHA hash - * @param hash SHA of the commit - * @param source The data source to retrieve the commit message from (git or github) - * @param options The options to use when retrieving the commit message - * @returns Commit object - */ -function getCommit(options) { - var _a; - let commit; - // String data source - if ("message" in options) { - const stringOptions = options; - commit = { - hash: stringOptions.hash, - ...parseCommitMessage(stringOptions.message), - author: stringOptions.author, - committer: stringOptions.committer, - }; - // GitHub data source - } - else if ("owner" in options) { - const githubOptions = options; - // TODO; implement basic GitHub client - commit = { - hash: githubOptions.hash, - subject: "", - }; - // Git data source - } - else { - const gitOptions = options; - commit = git.getCommitFromHash(gitOptions.hash, (_a = gitOptions.rootPath) !== null && _a !== void 0 ? _a : process.cwd()); - } - return commit; -} -exports.getCommit = getCommit; /***/ }), -/***/ 8436: +/***/ 1124: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2269,101 +2302,162 @@ var __importStar = (this && this.__importStar) || function (mod) { __setModuleDefault(result, mod); return result; }; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getConventionalCommit = exports.isConventionalCommit = exports.ConventionalCommitError = void 0; -const assert_1 = __importDefault(__nccwpck_require__(9491)); +exports.ConventionalCommit = void 0; +const diagnose_it_1 = __nccwpck_require__(4657); +const commit_1 = __nccwpck_require__(8065); const requirements = __importStar(__nccwpck_require__(4374)); /** - * Conventional Commit error - * @class ConventionalCommitError - * @extends Error + * Conventional Commit + * @class ConventionalCommit + * @member type Conventional Commit type + * @member scope Conventional Commit scope + * @member breaking Commit message has a Conventional Commit breaking change (!) + * @member description Conventional Commit description + * @member hash Commit hash + * @member subject Commit subject + * @member body Commit body + * @member footer Commit footer + * @member author Commit author and date + * @member committer Commit committer and date + * @member isValid Whether the Conventional Commit is valid * @member errors List of error messages + * @member warnings List of warning messages */ -class ConventionalCommitError extends Error { - constructor(errors) { - super("Commit is not compliant with the Conventional Commits specification."); - this.name = "ConventionalCommitError"; - this.errors = errors; +class ConventionalCommit { + _raw; + _errors = []; + _warnings = []; + constructor(raw, options) { + this._raw = raw; + this.validate(options); + } + /** + * Creates a new Conventional Commit object from the provided Commit. + * @param commit Commit to convert to a Conventional Commit + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromCommit(commit, options) { + // Convert the Commit message to Raw Conventional Commit data + const rawConvCommit = createRawConventionalCommit(commit); + // Create a new Conventional Commit object + return new ConventionalCommit(rawConvCommit, options); + } + /** + * Creates a new Conventional Commit object from the provided string. + * @param props Hash, message and author/committer information + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromString(props, options) { + return ConventionalCommit.fromCommit(commit_1.Commit.fromString(props), options); + } + /** + * Creates a new Conventional Commit object from the provided hash. + * @param props Hash and root path + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromHash(props, options) { + return ConventionalCommit.fromCommit(commit_1.Commit.fromHash(props), options); + } + // Contributors + get author() { + return this._raw.commit.author; + } + get committer() { + return this._raw.commit.committer; + } + // Commit + get hash() { + return this._raw.commit.hash; + } + get subject() { + return this._raw.commit.subject; + } + get body() { + return this._raw.commit.body; + } + get footer() { + return this._raw.commit.footer; + } + // Conventional Commit + get type() { + return this._raw.type.value; + } + get scope() { + return this._raw.scope.value; + } + get description() { + return this._raw.description.value; + } + get breaking() { + return (this._raw.breaking.value === "!" || + (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); + } + // Raw + get raw() { + return this._raw.commit.raw; + } + // Validation + get isValid() { + return this._errors.length === 0; + } + get warnings() { + return this._warnings; + } + get errors() { + return this._errors; + } + toJSON() { + return { + hash: this.hash, + author: this.author, + committer: this.committer, + subject: this.subject, + body: this.body, + footer: this.footer, + type: this.type, + breaking: this.breaking, + description: this.description, + validation: { + isValid: this.isValid, + errors: this.errors, + warnings: this.warnings, + }, + }; + } + // Private validation function + validate(options) { + let results = []; + requirements.commitRules.forEach(rule => (results = [...results, ...rule.validate(this._raw, options)])); + this._errors = results.filter(r => r.level === diagnose_it_1.DiagnosticsLevelEnum.Error); + this._warnings = results.filter(r => r.level === diagnose_it_1.DiagnosticsLevelEnum.Warning); } } -exports.ConventionalCommitError = ConventionalCommitError; -/** - * Returns whether the provided commit has a breaking change (either "!" in subject, or usage of /BREAKING[- ]CHANGE:/). - * @param commit Commit to check - * @returns Whether the provided commit has a breaking change - */ -function hasBreakingChange(commit) { - return (commit.breaking.value === "!" || - (commit.commit.footer !== undefined && - ("BREAKING CHANGE" in commit.commit.footer || "BREAKING-CHANGE" in commit.commit.footer))); -} -/** - * Validates a commit message against the Conventional Commit specification. - * @param commit Commit message to validate against the Conventional Commit specification - * @returns Conventional Commit mesage - * @throws ExpressiveMessage[] if the commit message is not a valid Conventional Commit - * @see https://www.conventionalcommits.org/en/v1.0.0/ - */ -function validate(commit, options) { - let errors = []; - requirements.commitRules.forEach(rule => (errors = [...errors, ...rule.validate(commit, options)])); - if (errors.length > 0) - throw new ConventionalCommitError(errors); - // Assume that we have a valid Conventional Commit message - (0, assert_1.default)(commit.type.value); - (0, assert_1.default)(commit.description.value); - return { - ...commit.commit, - type: commit.type.value, - scope: commit.scope.value, - breaking: hasBreakingChange(commit), - description: commit.description.value, - }; -} -/** - * Returns whether the provided commit is a Conventional Commit. - * @param commit Commit to check - * @returns Whether the provided commit is a Conventional Commit - */ -function isConventionalCommit(commit) { - return "type" in commit; -} -exports.isConventionalCommit = isConventionalCommit; -/** - * Parses a Commit message into a Conventional Commit. - * @param commit Commit message to parse - * @param options Options to use when parsing the commit message - * @throws ExpressiveMessage[] if the commit message is not a valid Conventional Commit - * @returns Conventional Commit - */ -function getConventionalCommit(commit, options) { - var _a, _b, _c, _d, _e; +exports.ConventionalCommit = ConventionalCommit; +function createRawConventionalCommit(commit) { const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\)\s*)?(?!\s*)?(?:\s*)?(?.*)?$/); - const match = ConventionalCommitRegex.exec(commit.subject); - let conventionalCommit = { + const match = ConventionalCommitRegex.exec(commit.subject.split(/\r?\n/)[0]); + const conventionalCommit = { commit: commit, - type: { index: 1, value: (_a = match === null || match === void 0 ? void 0 : match.groups) === null || _a === void 0 ? void 0 : _a.type }, - scope: { index: 1, value: (_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.scope }, - breaking: { index: 1, value: (_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.breaking }, - seperator: { index: 1, value: (_d = match === null || match === void 0 ? void 0 : match.groups) === null || _d === void 0 ? void 0 : _d.separator }, - description: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.subject }, + type: { index: 1, value: match?.groups?.type }, + scope: { index: 1, value: match?.groups?.scope }, + breaking: { index: 1, value: match?.groups?.breaking }, + seperator: { index: 1, value: match?.groups?.separator }, + description: { index: 1, value: match?.groups?.subject }, body: { index: 1, value: commit.body }, }; function intializeIndices(commit) { - var _a, _b, _c, _d, _e, _f, _g, _h; - commit.scope.index = commit.type.index + ((_b = (_a = commit.type.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); - commit.breaking.index = commit.scope.index + ((_d = (_c = commit.scope.value) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0); - commit.seperator.index = commit.breaking.index + ((_f = (_e = commit.breaking.value) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0); - commit.description.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); + commit.scope.index = commit.type.index + (commit.type.value?.length ?? 0); + commit.breaking.index = commit.scope.index + (commit.scope.value?.length ?? 0); + commit.seperator.index = commit.breaking.index + (commit.breaking.value?.length ?? 0); + commit.description.index = commit.seperator.index + (commit.seperator.value?.length ?? 0); return commit; } - conventionalCommit = intializeIndices(conventionalCommit); - return validate(conventionalCommit, options); + return intializeIndices(conventionalCommit); } -exports.getConventionalCommit = getConventionalCommit; /***/ }), @@ -2374,9 +2468,9 @@ exports.getConventionalCommit = getConventionalCommit; "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2456,15 +2550,17 @@ function getValueFromKey(commit, key) { function parseCommitMessage(commit, hash) { const author = extractNameAndDate(getValueFromKey(commit, "author")); const committer = extractNameAndDate(getValueFromKey(commit, "committer")); + const raw = commit + .split(/^[\r\n]+/m) + .splice(1) + .join("\n") + .trim(); return { + raw, hash: hash, author: author, committer: committer, - ...ccommit.parseCommitMessage(commit - .split(/^[\r\n]+/m) - .splice(1) - .join("\n") - .trim()), + ...ccommit.parseCommitMessage(raw), }; } /** @@ -2606,17 +2702,15 @@ function readPackFile(path, index) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ConventionalCommitError = exports.isConventionalCommit = exports.getConventionalCommit = exports.getCommit = void 0; +exports.ConventionalCommit = exports.Commit = void 0; var commit_1 = __nccwpck_require__(8065); -Object.defineProperty(exports, "getCommit", ({ enumerable: true, get: function () { return commit_1.getCommit; } })); -var conventional_commit_1 = __nccwpck_require__(8436); -Object.defineProperty(exports, "getConventionalCommit", ({ enumerable: true, get: function () { return conventional_commit_1.getConventionalCommit; } })); -Object.defineProperty(exports, "isConventionalCommit", ({ enumerable: true, get: function () { return conventional_commit_1.isConventionalCommit; } })); -Object.defineProperty(exports, "ConventionalCommitError", ({ enumerable: true, get: function () { return conventional_commit_1.ConventionalCommitError; } })); +Object.defineProperty(exports, "Commit", ({ enumerable: true, get: function () { return commit_1.Commit; } })); +var conventionalCommit_1 = __nccwpck_require__(1124); +Object.defineProperty(exports, "ConventionalCommit", ({ enumerable: true, get: function () { return conventionalCommit_1.ConventionalCommit; } })); /***/ }), @@ -2632,13 +2726,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.commitRules = void 0; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong - -SPDX-License-Identifier: MIT -SPDX-License-Identifier: CC-BY-3.0 -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * + * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: CC-BY-3.0 + */ const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); +const commit_1 = __nccwpck_require__(8065); function isNoun(str) { return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); } @@ -2651,29 +2746,30 @@ function highlightString(str, substring) { substring.forEach(sub => (result = result.replace(sub, `${chalk_1.default.cyan(sub)}`))); return result; } -function createError(commit, description, highlight, type, whitespace = false) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j; +function createDiagnosticsMessage(commit, description, highlight, type, whitespace = false, level = diagnose_it_1.DiagnosticsLevelEnum.Error) { const element = commit[type]; let hintIndex = element.index; - let hintLength = (_b = (_a = element.value) === null || _a === void 0 ? void 0 : _a.trimEnd().length) !== null && _b !== void 0 ? _b : 1; + let hintLength = element.value?.trimEnd().length ?? 1; if (whitespace) { let prevElement = undefined; for (const [_key, value] of Object.entries(commit)) { - if (value.index > ((_c = prevElement === null || prevElement === void 0 ? void 0 : prevElement.index) !== null && _c !== void 0 ? _c : 0) && value.index < element.index) { + if (value.index > (prevElement?.index ?? 0) && value.index < element.index) { prevElement = value; } } - hintIndex = prevElement ? prevElement.index + ((_e = (_d = prevElement.value) === null || _d === void 0 ? void 0 : _d.trimEnd().length) !== null && _e !== void 0 ? _e : 1) : 1; - hintLength = ((_g = (_f = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _f === void 0 ? void 0 : _f.length) !== null && _g !== void 0 ? _g : 1) - ((_j = (_h = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _h === void 0 ? void 0 : _h.trimEnd().length) !== null && _j !== void 0 ? _j : 1); + hintIndex = prevElement ? prevElement.index + (prevElement.value?.trimEnd().length ?? 1) : 1; + hintLength = (prevElement?.value?.length ?? 1) - (prevElement?.value?.trimEnd().length ?? 1); } - return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { - text: highlightString(description, highlight), - linenumber: 1, - column: hintIndex, + return new diagnose_it_1.DiagnosticsMessage({ + file: commit.commit.hash, + level, + message: { + text: highlightString(description, highlight), + linenumber: 1, + column: hintIndex, + }, }) - .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 - ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] - : [commit.commit.subject]) + .setContext(1, commit.commit.subject.split(/\r?\n/)[0]) .addFixitHint(diagnose_it_1.FixItHint.create({ index: hintIndex, length: hintLength === 0 ? 1 : hintLength })); } /** @@ -2681,10 +2777,8 @@ function createError(commit, description, highlight, type, whitespace = false) { * followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space. */ class CC01 { - constructor() { - this.id = "CC-01"; - this.description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; - } + id = "CC-01"; + description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; validate(commit, _options) { const errors = []; // MUST be prefixed with a type @@ -2694,29 +2788,36 @@ class CC01 { else { // Ensure that we have a noun if (!isNoun(commit.type.value)) - errors.push(createError(commit, this.description, "which consists of a noun", "type")); + errors.push(createDiagnosticsMessage(commit, this.description, "which consists of a noun", "type")); // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { - if (commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); - else if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); - else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + if (commit.scope.value) { + errors.push(createDiagnosticsMessage(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); + } + else if (commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + } + else { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } } // Validate for spacing after the scope, breaking and seperator if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) { - if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); - else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + if (commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + } + else { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } + } + if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } - if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // MUST have a terminal colon - if (!commit.seperator.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + if (!commit.seperator.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + } return errors; } } @@ -2725,16 +2826,14 @@ class CC01 { * a section of the codebase surrounded by parenthesis, e.g., fix(parser): */ class CC04 { - constructor() { - this.id = "CC-04"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; - } + id = "CC-04"; + description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; validate(commit, _options) { const errors = []; if (commit.scope.value && (commit.scope.value === "()" || !isNoun(commit.scope.value.trimEnd().substring(1, commit.scope.value.trimEnd().length - 1)))) { - errors.push(createError(commit, this.description, "A scope MUST consist of a noun", "scope")); + errors.push(createDiagnosticsMessage(commit, this.description, "A scope MUST consist of a noun", "scope")); } return errors; } @@ -2745,17 +2844,73 @@ class CC04 { * when multiple spaces were contained in string. */ class CC05 { - constructor() { - this.id = "CC-05"; - this.description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; - } + id = "CC-05"; + description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; validate(commit, _options) { const errors = []; - if (!commit.seperator.value) + if (!commit.seperator.value) { return errors; + } if (commit.description.value === undefined || - commit.seperator.value.length - commit.seperator.value.trim().length !== 1) - errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); + commit.seperator.value.length - commit.seperator.value.trim().length !== 1) { + errors.push(createDiagnosticsMessage(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); + } + return errors; + } +} +/** + * A longer commit body MAY be provided after the short description, providing + * additional contextual information about the code changes. The body MUST begin one + * blank line after the description. + */ +class CC06 { + id = "CC-06"; + description = "A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description."; + validate(commit, _options) { + const errors = []; + if (!commit.commit.subject) { + return errors; + } + const lines = commit.commit.subject.split(/\r?\n/); + if (lines.length > 1) { + return [ + diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { + text: highlightString(this.description, "The body MUST begin one blank line after the description"), + linenumber: 2, + column: 1, + }) + .setContext(1, lines) + .addFixitHint(diagnose_it_1.FixItHint.createRemoval({ index: 1, length: lines[1].length })), + ]; + } + return errors; + } +} +/** + * The units of information that make up Conventional Commits MUST NOT be treated as case + * sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase. + */ +class CC15 { + id = "CC-15"; + description = "The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase."; + validate(commit, _options) { + const errors = []; + const footerElements = (0, commit_1.getFooterElementsFromParagraph)(commit.commit.raw); + if (footerElements === undefined) + return errors; + for (const element of footerElements) { + if (["BREAKING CHANGE", "BREAKING-CHANGE"].includes(element.key.toUpperCase())) { + if (element.key !== element.key.toUpperCase()) { + errors.push(diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { + text: highlightString(this.description, "BREAKING CHANGE MUST be uppercase"), + linenumber: element.lineNumber, + column: 1, + }) + .setContext(element.lineNumber, commit.commit.raw.split(/\r?\n/)[element.lineNumber - 1]) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: element.key.length }))); + } + } + } return errors; } } @@ -2763,20 +2918,19 @@ class CC05 { * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis */ class EC01 { - constructor() { - this.id = "EC-01"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; - } + id = "EC-01"; + description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; validate(commit, options) { - var _a; - const uniqueScopeList = Array.from(new Set((_a = options === null || options === void 0 ? void 0 : options.scopes) !== null && _a !== void 0 ? _a : [])); - if (uniqueScopeList.length === 0) + const uniqueScopeList = Array.from(new Set(options?.scopes ?? [])); + if (uniqueScopeList.length === 0) { return []; - if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) + } + if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) { return []; + } this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${uniqueScopeList.join(", ")}) surrounded by parenthesis`; return [ - createError(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), + createDiagnosticsMessage(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), ]; } } @@ -2784,33 +2938,74 @@ class EC01 { * Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...) */ class EC02 { - constructor() { - this.id = "EC-02"; - this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; - } + id = "EC-02"; + description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; validate(commit, options) { - var _a; - const uniqueAddedTypes = new Set((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []); + const uniqueAddedTypes = new Set(options?.types ?? []); if (uniqueAddedTypes.has("feat")) uniqueAddedTypes.delete("feat"); if (uniqueAddedTypes.has("fix")) uniqueAddedTypes.delete("fix"); const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; - this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; + this.description = `Commits ${uniqueAddedTypes.size > 0 ? "MUST" : "MAY"} be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; if (commit.type.value === undefined || !isNoun(commit.type.value) || - expectedTypes.includes(commit.type.value.trimEnd())) + expectedTypes.includes(commit.type.value.toLowerCase().trimEnd())) { return []; + } if (commit.type.value.trim().length === 0) { - return [createError(commit, this.description, "prefixed with a type", "type")]; + return [createDiagnosticsMessage(commit, this.description, "prefixed with a type", "type")]; + } + if (uniqueAddedTypes.size > 0) { + return [ + createDiagnosticsMessage(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), + ]; + } + else { + return [ + createDiagnosticsMessage(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type", false, diagnose_it_1.DiagnosticsLevelEnum.Warning), + ]; } - return [ - createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), - ]; + } +} +/** + * A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer. + */ +class WA01 { + id = "WA-01"; + description = "A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer."; + validate(commit, _options) { + const errors = []; + if (commit.commit.body === undefined) + return errors; + const elements = (0, commit_1.getFooterElementsFromParagraph)(commit.commit.body); + if (elements === undefined) + return errors; + for (const element of elements) { + if (element.key === "BREAKING CHANGE" || element.key === "BREAKING-CHANGE") { + errors.push(diagnose_it_1.DiagnosticsMessage.createWarning(commit.commit.hash, { + text: highlightString(`A \`${element.key}\` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer.`, [element.key, "will be ignored as it MUST be included in the footer"]), + linenumber: commit.commit.subject.split(/\r?\n/).length + element.lineNumber, + column: 1, + }) + .setContext(commit.commit.subject.split(/\r?\n/).length + 1, commit.commit.body.split(/\r?\n/)) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: element.key.length }))); + } + } + return errors; } } /** @internal */ -exports.commitRules = [new CC01(), new CC04(), new CC05(), new EC01(), new EC02()]; +exports.commitRules = [ + new CC01(), + new CC04(), + new CC05(), + new CC06(), + new CC15(), + new EC01(), + new EC02(), + new WA01(), +]; /***/ }), @@ -41012,7 +41207,7 @@ class FileSource { } } async getCommitMessages() { - return [(0, commit_it_1.getCommit)({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; + return [commit_it_1.Commit.fromString({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } async getConfigurationFile(path) { if (!fs.existsSync(path)) { @@ -41032,7 +41227,7 @@ class GitSource { } async getCommitMessages() { const data = await (0, simple_git_1.simpleGit)().log({ from: this.sourceBranch, to: "@{push}" }); - return data.all.map(commit => (0, commit_it_1.getCommit)({ hash: commit.hash })); + return data.all.map(commit => commit_it_1.Commit.fromHash({ hash: commit.hash })); } async getConfigurationFile(path) { if (!fs.existsSync(path)) { @@ -41051,13 +41246,10 @@ class GitHubSource { const pullRequestNumber = github.context.payload.pull_request?.number; (0, assert_1.default)(pullRequestNumber); const commits = await octokit.rest.pulls.listCommits({ ...github.context.repo, pull_number: pullRequestNumber }); - return commits.data.map(commit => { - return { - hash: commit.sha, - subject: commit.commit.message.split(/\r?\n/)[0], - body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), - }; - }); + return commits.data.map(commit => commit_it_1.Commit.fromString({ + hash: commit.sha, + message: commit.commit.message, + })); } /** * Retrieves the specified configuration file from the repository using the REST API @@ -41133,18 +41325,21 @@ program config.addTypes(options.types ?? []); const commits = await datasource.getCommitMessages(); let errorCount = 0; + let warningCount = 0; const results = (0, validator_1.validateCommits)(commits); for (const commit of results) { - console.log(`${commit.errors.length === 0 ? "✅" : "❌"} ${commit.commit.hash}: ${commit.commit.subject.substring(0, 77)}${commit.commit.subject.length > 80 ? "..." : ""}`); - commit.errors.forEach(error => console.log(error, os_1.default.EOL)); + console.log(`${commit.errors.length === 0 ? "✅" : "❌"} ${commit.hash}: ${commit.subject.substring(0, 77)}${commit.subject.length > 80 ? "..." : ""}`); + commit.errors.forEach(err => console.log(err.toString(), os_1.default.EOL)); + commit.warnings.forEach(err => console.log(err.toString(), os_1.default.EOL)); errorCount += commit.errors.length; + warningCount += commit.warnings.length; } console.log("-------------------------------------------------------"); if (errorCount === 0) { console.log(`✅ All your commits are compliant with Conventional Commit.`); } else { - program.error(`❌ Found ${errorCount} Conventional Commit compliance issues.`); + program.error(`❌ Found ${errorCount} Conventional Commit compliance issues, and ${warningCount} warnings.`); } }); program.parse(process.argv); @@ -41172,16 +41367,7 @@ const configuration_1 = __nccwpck_require__(5778); * @returns Validation result */ function validateCommit(commit) { - const result = { commit: commit, errors: [] }; - try { - result.commit = (0, commit_it_1.getConventionalCommit)(commit, configuration_1.Configuration.getInstance()); - } - catch (error) { - if (!(error instanceof commit_it_1.ConventionalCommitError)) - throw error; - error.errors.forEach(e => result.errors.push(e.toString())); - } - return result; + return commit_it_1.ConventionalCommit.fromCommit(commit, configuration_1.Configuration.getInstance()); } /** * Validates the pull request against CommitMe requirements. @@ -41191,27 +41377,28 @@ function validateCommit(commit) { */ function validatePullRequest(pullrequest, commits) { const result = validateCommit(pullrequest); - if (result.errors.length > 0) + if (!result.isValid) return result; const orderValue = (commit) => { - if (!commit || !("type" in commit)) - return 0; if (commit.breaking) return 3; - if (commit.type === "feat") + if (commit.type?.toLowerCase() === "feat") return 2; - if (commit.type === "fix") + if (commit.type?.toLowerCase() === "fix") return 1; return 0; }; - const pullRequestValue = orderValue(result.commit); - const commitsValue = orderValue(commits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); + const pullRequestValue = orderValue(result); + const validConventionalCommits = commits.filter(commit => commit.isValid); + const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { - result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.commit.hash, { + result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, - }).toString()); + }) + .setContext(1, result.subject) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: result.type?.length ?? 1 }))); } return result; } diff --git a/lib/precommit/index.js b/lib/precommit/index.js index c0e381d..c37b1eb 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2094,9 +2094,9 @@ function isLoopbackAddress(host) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2121,8 +2121,75 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getCommit = exports.isConventionalCommit = exports.parseCommitMessage = void 0; +exports.parseCommitMessage = exports.getFooterElementsFromParagraph = exports.Commit = void 0; const git = __importStar(__nccwpck_require__(8433)); +const TRAILER_REGEX = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w*)/i; +/** + * Git Commit + * @class Commit + * @member author The commit author and date + * @member commiter The commit commiter and date + * @member hash The commit hash + * @member subject The commit subject + * @member body The commit body + * @member footer The commit footer + * @member raw The commit message + */ +class Commit { + _commit; + constructor(commit) { + this._commit = commit; + } + /** + * Retrieves the commit information from git using the provided hash + * @param props The commit hash and root path + * @returns The commit object + */ + static fromHash(props) { + const commit = git.getCommitFromHash(props.hash, props.rootPath ?? process.cwd()); + return new Commit(commit); + } + /** + * Creates a Commit object from the provided string + * @param props The commit hash, author, committer and message + * @returns The commit object + */ + static fromString(props) { + const commit = { + hash: props.hash, + ...parseCommitMessage(props.message), + author: props.author, + committer: props.committer, + raw: props.message, + }; + return new Commit(commit); + } + get author() { + return this._commit.author; + } + get committer() { + return this._commit.committer; + } + get hash() { + return this._commit.hash; + } + get subject() { + return this._commit.subject; + } + get body() { + return this._commit.body; + } + get footer() { + return this._commit.footer; + } + get raw() { + return this._commit.raw; + } + toJSON() { + return this._commit; + } +} +exports.Commit = Commit; /** * Returns a dictionary containing key-value pairs extracted from the footer of the provided commit message. * The key must either be: @@ -2132,13 +2199,15 @@ const git = __importStar(__nccwpck_require__(8433)); * The value is either: * - the remainder of the line * - the remainder of the line + anything that follows on the next lines which is indented by at least one space + * + * @internal */ -function parseCommitFooter(footer) { - const footerLines = footer.split(/[\r\n]+/); - const result = {}; +function getFooterElementsFromParagraph(footer) { + const footerLines = footer.split(/\r?\n/); + const result = []; for (let lineNr = 0; lineNr < footerLines.length; lineNr++) { const line = footerLines[lineNr]; - const match = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w)/.exec(line); + const match = TRAILER_REGEX.exec(line); if (match === null) continue; let key = match[1].replace(/:$/, ""); @@ -2147,15 +2216,22 @@ function parseCommitFooter(footer) { key = match[1].substring(0, match[1].length - 2); value = `#${value}`; } + const matchLine = lineNr; // Check if the value continues on the next line - while (lineNr + 1 < footerLines.length && footerLines[lineNr + 1].startsWith(" ")) { + while (lineNr + 1 < footerLines.length && + (/^\s/.test(footerLines[lineNr + 1]) || footerLines[lineNr + 1].length === 0)) { lineNr++; value += "\n" + footerLines[lineNr].trim(); } - result[key] = value; + result.push({ + lineNumber: matchLine + 1, + key, + value, + }); } return Object.keys(result).length > 0 ? result : undefined; } +exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; /** * Parses the provided commit message (full message, not just the subject) into * a Commit object. @@ -2164,11 +2240,11 @@ function parseCommitFooter(footer) { * @internal */ function parseCommitMessage(message) { - const isTrailerOnly = (message) => message.split(/[\r\n]+/).every(line => { - const match = /^((BREAKING CHANGE:)|([\w-]+(:| #))|([ \t]+)\w)/.exec(line); + const isTrailerOnly = (message) => message.split(/\r?\n/).every(line => { + const match = TRAILER_REGEX.exec(line); return match !== null; }); - const paragraphs = message.split(/^[\r\n]+/m); + const paragraphs = message.split(/^\r?\n/m); let footer = undefined; let body = undefined; if (paragraphs.length > 1 && isTrailerOnly(paragraphs[paragraphs.length - 1])) { @@ -2183,69 +2259,26 @@ function parseCommitMessage(message) { return { subject: paragraphs[0].trim(), body: body, - footer: parseCommitFooter(footer !== null && footer !== void 0 ? footer : ""), + footer: getFooterElementsFromParagraph(footer ?? "")?.reduce((acc, cur) => { + acc[cur.key] = cur.value; + return acc; + }, {}), }; } exports.parseCommitMessage = parseCommitMessage; -/** - * Confirms whether the provided commit is a Conventional Commit - * @param commit - * @returns - */ -function isConventionalCommit(commit) { - return "type" in commit; -} -exports.isConventionalCommit = isConventionalCommit; -/** - * Retrieves the commit message (from the indicated source) given the provided SHA hash - * @param hash SHA of the commit - * @param source The data source to retrieve the commit message from (git or github) - * @param options The options to use when retrieving the commit message - * @returns Commit object - */ -function getCommit(options) { - var _a; - let commit; - // String data source - if ("message" in options) { - const stringOptions = options; - commit = { - hash: stringOptions.hash, - ...parseCommitMessage(stringOptions.message), - author: stringOptions.author, - committer: stringOptions.committer, - }; - // GitHub data source - } - else if ("owner" in options) { - const githubOptions = options; - // TODO; implement basic GitHub client - commit = { - hash: githubOptions.hash, - subject: "", - }; - // Git data source - } - else { - const gitOptions = options; - commit = git.getCommitFromHash(gitOptions.hash, (_a = gitOptions.rootPath) !== null && _a !== void 0 ? _a : process.cwd()); - } - return commit; -} -exports.getCommit = getCommit; /***/ }), -/***/ 8436: +/***/ 1124: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2269,101 +2302,162 @@ var __importStar = (this && this.__importStar) || function (mod) { __setModuleDefault(result, mod); return result; }; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getConventionalCommit = exports.isConventionalCommit = exports.ConventionalCommitError = void 0; -const assert_1 = __importDefault(__nccwpck_require__(9491)); +exports.ConventionalCommit = void 0; +const diagnose_it_1 = __nccwpck_require__(4657); +const commit_1 = __nccwpck_require__(8065); const requirements = __importStar(__nccwpck_require__(4374)); /** - * Conventional Commit error - * @class ConventionalCommitError - * @extends Error + * Conventional Commit + * @class ConventionalCommit + * @member type Conventional Commit type + * @member scope Conventional Commit scope + * @member breaking Commit message has a Conventional Commit breaking change (!) + * @member description Conventional Commit description + * @member hash Commit hash + * @member subject Commit subject + * @member body Commit body + * @member footer Commit footer + * @member author Commit author and date + * @member committer Commit committer and date + * @member isValid Whether the Conventional Commit is valid * @member errors List of error messages + * @member warnings List of warning messages */ -class ConventionalCommitError extends Error { - constructor(errors) { - super("Commit is not compliant with the Conventional Commits specification."); - this.name = "ConventionalCommitError"; - this.errors = errors; +class ConventionalCommit { + _raw; + _errors = []; + _warnings = []; + constructor(raw, options) { + this._raw = raw; + this.validate(options); + } + /** + * Creates a new Conventional Commit object from the provided Commit. + * @param commit Commit to convert to a Conventional Commit + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromCommit(commit, options) { + // Convert the Commit message to Raw Conventional Commit data + const rawConvCommit = createRawConventionalCommit(commit); + // Create a new Conventional Commit object + return new ConventionalCommit(rawConvCommit, options); + } + /** + * Creates a new Conventional Commit object from the provided string. + * @param props Hash, message and author/committer information + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromString(props, options) { + return ConventionalCommit.fromCommit(commit_1.Commit.fromString(props), options); + } + /** + * Creates a new Conventional Commit object from the provided hash. + * @param props Hash and root path + * @param options Options to use when validating the commit message + * @returns Conventional Commit + */ + static fromHash(props, options) { + return ConventionalCommit.fromCommit(commit_1.Commit.fromHash(props), options); + } + // Contributors + get author() { + return this._raw.commit.author; + } + get committer() { + return this._raw.commit.committer; + } + // Commit + get hash() { + return this._raw.commit.hash; + } + get subject() { + return this._raw.commit.subject; + } + get body() { + return this._raw.commit.body; + } + get footer() { + return this._raw.commit.footer; + } + // Conventional Commit + get type() { + return this._raw.type.value; + } + get scope() { + return this._raw.scope.value; + } + get description() { + return this._raw.description.value; + } + get breaking() { + return (this._raw.breaking.value === "!" || + (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); + } + // Raw + get raw() { + return this._raw.commit.raw; + } + // Validation + get isValid() { + return this._errors.length === 0; + } + get warnings() { + return this._warnings; + } + get errors() { + return this._errors; + } + toJSON() { + return { + hash: this.hash, + author: this.author, + committer: this.committer, + subject: this.subject, + body: this.body, + footer: this.footer, + type: this.type, + breaking: this.breaking, + description: this.description, + validation: { + isValid: this.isValid, + errors: this.errors, + warnings: this.warnings, + }, + }; + } + // Private validation function + validate(options) { + let results = []; + requirements.commitRules.forEach(rule => (results = [...results, ...rule.validate(this._raw, options)])); + this._errors = results.filter(r => r.level === diagnose_it_1.DiagnosticsLevelEnum.Error); + this._warnings = results.filter(r => r.level === diagnose_it_1.DiagnosticsLevelEnum.Warning); } } -exports.ConventionalCommitError = ConventionalCommitError; -/** - * Returns whether the provided commit has a breaking change (either "!" in subject, or usage of /BREAKING[- ]CHANGE:/). - * @param commit Commit to check - * @returns Whether the provided commit has a breaking change - */ -function hasBreakingChange(commit) { - return (commit.breaking.value === "!" || - (commit.commit.footer !== undefined && - ("BREAKING CHANGE" in commit.commit.footer || "BREAKING-CHANGE" in commit.commit.footer))); -} -/** - * Validates a commit message against the Conventional Commit specification. - * @param commit Commit message to validate against the Conventional Commit specification - * @returns Conventional Commit mesage - * @throws ExpressiveMessage[] if the commit message is not a valid Conventional Commit - * @see https://www.conventionalcommits.org/en/v1.0.0/ - */ -function validate(commit, options) { - let errors = []; - requirements.commitRules.forEach(rule => (errors = [...errors, ...rule.validate(commit, options)])); - if (errors.length > 0) - throw new ConventionalCommitError(errors); - // Assume that we have a valid Conventional Commit message - (0, assert_1.default)(commit.type.value); - (0, assert_1.default)(commit.description.value); - return { - ...commit.commit, - type: commit.type.value, - scope: commit.scope.value, - breaking: hasBreakingChange(commit), - description: commit.description.value, - }; -} -/** - * Returns whether the provided commit is a Conventional Commit. - * @param commit Commit to check - * @returns Whether the provided commit is a Conventional Commit - */ -function isConventionalCommit(commit) { - return "type" in commit; -} -exports.isConventionalCommit = isConventionalCommit; -/** - * Parses a Commit message into a Conventional Commit. - * @param commit Commit message to parse - * @param options Options to use when parsing the commit message - * @throws ExpressiveMessage[] if the commit message is not a valid Conventional Commit - * @returns Conventional Commit - */ -function getConventionalCommit(commit, options) { - var _a, _b, _c, _d, _e; +exports.ConventionalCommit = ConventionalCommit; +function createRawConventionalCommit(commit) { const ConventionalCommitRegex = new RegExp(/^(?[^(!:]*)(?\([^)]*\)\s*)?(?!\s*)?(?:\s*)?(?.*)?$/); - const match = ConventionalCommitRegex.exec(commit.subject); - let conventionalCommit = { + const match = ConventionalCommitRegex.exec(commit.subject.split(/\r?\n/)[0]); + const conventionalCommit = { commit: commit, - type: { index: 1, value: (_a = match === null || match === void 0 ? void 0 : match.groups) === null || _a === void 0 ? void 0 : _a.type }, - scope: { index: 1, value: (_b = match === null || match === void 0 ? void 0 : match.groups) === null || _b === void 0 ? void 0 : _b.scope }, - breaking: { index: 1, value: (_c = match === null || match === void 0 ? void 0 : match.groups) === null || _c === void 0 ? void 0 : _c.breaking }, - seperator: { index: 1, value: (_d = match === null || match === void 0 ? void 0 : match.groups) === null || _d === void 0 ? void 0 : _d.separator }, - description: { index: 1, value: (_e = match === null || match === void 0 ? void 0 : match.groups) === null || _e === void 0 ? void 0 : _e.subject }, + type: { index: 1, value: match?.groups?.type }, + scope: { index: 1, value: match?.groups?.scope }, + breaking: { index: 1, value: match?.groups?.breaking }, + seperator: { index: 1, value: match?.groups?.separator }, + description: { index: 1, value: match?.groups?.subject }, body: { index: 1, value: commit.body }, }; function intializeIndices(commit) { - var _a, _b, _c, _d, _e, _f, _g, _h; - commit.scope.index = commit.type.index + ((_b = (_a = commit.type.value) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); - commit.breaking.index = commit.scope.index + ((_d = (_c = commit.scope.value) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0); - commit.seperator.index = commit.breaking.index + ((_f = (_e = commit.breaking.value) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0); - commit.description.index = commit.seperator.index + ((_h = (_g = commit.seperator.value) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0); + commit.scope.index = commit.type.index + (commit.type.value?.length ?? 0); + commit.breaking.index = commit.scope.index + (commit.scope.value?.length ?? 0); + commit.seperator.index = commit.breaking.index + (commit.breaking.value?.length ?? 0); + commit.description.index = commit.seperator.index + (commit.seperator.value?.length ?? 0); return commit; } - conventionalCommit = intializeIndices(conventionalCommit); - return validate(conventionalCommit, options); + return intializeIndices(conventionalCommit); } -exports.getConventionalCommit = getConventionalCommit; /***/ }), @@ -2374,9 +2468,9 @@ exports.getConventionalCommit = getConventionalCommit; "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); @@ -2456,15 +2550,17 @@ function getValueFromKey(commit, key) { function parseCommitMessage(commit, hash) { const author = extractNameAndDate(getValueFromKey(commit, "author")); const committer = extractNameAndDate(getValueFromKey(commit, "committer")); + const raw = commit + .split(/^[\r\n]+/m) + .splice(1) + .join("\n") + .trim(); return { + raw, hash: hash, author: author, committer: committer, - ...ccommit.parseCommitMessage(commit - .split(/^[\r\n]+/m) - .splice(1) - .join("\n") - .trim()), + ...ccommit.parseCommitMessage(raw), }; } /** @@ -2606,17 +2702,15 @@ function readPackFile(path, index) { "use strict"; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong -SPDX-License-Identifier: MIT -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ConventionalCommitError = exports.isConventionalCommit = exports.getConventionalCommit = exports.getCommit = void 0; +exports.ConventionalCommit = exports.Commit = void 0; var commit_1 = __nccwpck_require__(8065); -Object.defineProperty(exports, "getCommit", ({ enumerable: true, get: function () { return commit_1.getCommit; } })); -var conventional_commit_1 = __nccwpck_require__(8436); -Object.defineProperty(exports, "getConventionalCommit", ({ enumerable: true, get: function () { return conventional_commit_1.getConventionalCommit; } })); -Object.defineProperty(exports, "isConventionalCommit", ({ enumerable: true, get: function () { return conventional_commit_1.isConventionalCommit; } })); -Object.defineProperty(exports, "ConventionalCommitError", ({ enumerable: true, get: function () { return conventional_commit_1.ConventionalCommitError; } })); +Object.defineProperty(exports, "Commit", ({ enumerable: true, get: function () { return commit_1.Commit; } })); +var conventionalCommit_1 = __nccwpck_require__(1124); +Object.defineProperty(exports, "ConventionalCommit", ({ enumerable: true, get: function () { return conventionalCommit_1.ConventionalCommit; } })); /***/ }), @@ -2632,13 +2726,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.commitRules = void 0; /* -SPDX-FileCopyrightText: 2023 Kevin de Jong - -SPDX-License-Identifier: MIT -SPDX-License-Identifier: CC-BY-3.0 -*/ + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * + * SPDX-License-Identifier: MIT + * SPDX-License-Identifier: CC-BY-3.0 + */ const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); +const commit_1 = __nccwpck_require__(8065); function isNoun(str) { return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); } @@ -2651,29 +2746,30 @@ function highlightString(str, substring) { substring.forEach(sub => (result = result.replace(sub, `${chalk_1.default.cyan(sub)}`))); return result; } -function createError(commit, description, highlight, type, whitespace = false) { - var _a, _b, _c, _d, _e, _f, _g, _h, _j; +function createDiagnosticsMessage(commit, description, highlight, type, whitespace = false, level = diagnose_it_1.DiagnosticsLevelEnum.Error) { const element = commit[type]; let hintIndex = element.index; - let hintLength = (_b = (_a = element.value) === null || _a === void 0 ? void 0 : _a.trimEnd().length) !== null && _b !== void 0 ? _b : 1; + let hintLength = element.value?.trimEnd().length ?? 1; if (whitespace) { let prevElement = undefined; for (const [_key, value] of Object.entries(commit)) { - if (value.index > ((_c = prevElement === null || prevElement === void 0 ? void 0 : prevElement.index) !== null && _c !== void 0 ? _c : 0) && value.index < element.index) { + if (value.index > (prevElement?.index ?? 0) && value.index < element.index) { prevElement = value; } } - hintIndex = prevElement ? prevElement.index + ((_e = (_d = prevElement.value) === null || _d === void 0 ? void 0 : _d.trimEnd().length) !== null && _e !== void 0 ? _e : 1) : 1; - hintLength = ((_g = (_f = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _f === void 0 ? void 0 : _f.length) !== null && _g !== void 0 ? _g : 1) - ((_j = (_h = prevElement === null || prevElement === void 0 ? void 0 : prevElement.value) === null || _h === void 0 ? void 0 : _h.trimEnd().length) !== null && _j !== void 0 ? _j : 1); + hintIndex = prevElement ? prevElement.index + (prevElement.value?.trimEnd().length ?? 1) : 1; + hintLength = (prevElement?.value?.length ?? 1) - (prevElement?.value?.trimEnd().length ?? 1); } - return diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { - text: highlightString(description, highlight), - linenumber: 1, - column: hintIndex, + return new diagnose_it_1.DiagnosticsMessage({ + file: commit.commit.hash, + level, + message: { + text: highlightString(description, highlight), + linenumber: 1, + column: hintIndex, + }, }) - .setContext(1, commit.commit.body !== undefined && commit.commit.body.split("\n").length >= 1 - ? [commit.commit.subject, "", ...commit.commit.body.split("\n")] - : [commit.commit.subject]) + .setContext(1, commit.commit.subject.split(/\r?\n/)[0]) .addFixitHint(diagnose_it_1.FixItHint.create({ index: hintIndex, length: hintLength === 0 ? 1 : hintLength })); } /** @@ -2681,10 +2777,8 @@ function createError(commit, description, highlight, type, whitespace = false) { * followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space. */ class CC01 { - constructor() { - this.id = "CC-01"; - this.description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; - } + id = "CC-01"; + description = "Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space."; validate(commit, _options) { const errors = []; // MUST be prefixed with a type @@ -2694,29 +2788,36 @@ class CC01 { else { // Ensure that we have a noun if (!isNoun(commit.type.value)) - errors.push(createError(commit, this.description, "which consists of a noun", "type")); + errors.push(createDiagnosticsMessage(commit, this.description, "which consists of a noun", "type")); // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { - if (commit.scope.value) - errors.push(createError(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); - else if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); - else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + if (commit.scope.value) { + errors.push(createDiagnosticsMessage(commit, this.description, "followed by the OPTIONAL scope", "scope", true)); + } + else if (commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + } + else { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } } // Validate for spacing after the scope, breaking and seperator if (commit.scope.value && commit.scope.value.trim() !== commit.scope.value) { - if (commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); - else - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + if (commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "OPTIONAL !"], "breaking", true)); + } + else { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); + } + } + if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } - if (commit.breaking.value && commit.breaking.value.trim() !== commit.breaking.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator", true)); } // MUST have a terminal colon - if (!commit.seperator.value) - errors.push(createError(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + if (!commit.seperator.value) { + errors.push(createDiagnosticsMessage(commit, this.description, ["followed by the", "REQUIRED terminal colon"], "seperator")); + } return errors; } } @@ -2725,16 +2826,14 @@ class CC01 { * a section of the codebase surrounded by parenthesis, e.g., fix(parser): */ class CC04 { - constructor() { - this.id = "CC-04"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; - } + id = "CC-04"; + description = "A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):"; validate(commit, _options) { const errors = []; if (commit.scope.value && (commit.scope.value === "()" || !isNoun(commit.scope.value.trimEnd().substring(1, commit.scope.value.trimEnd().length - 1)))) { - errors.push(createError(commit, this.description, "A scope MUST consist of a noun", "scope")); + errors.push(createDiagnosticsMessage(commit, this.description, "A scope MUST consist of a noun", "scope")); } return errors; } @@ -2745,17 +2844,73 @@ class CC04 { * when multiple spaces were contained in string. */ class CC05 { - constructor() { - this.id = "CC-05"; - this.description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; - } + id = "CC-05"; + description = "A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string."; validate(commit, _options) { const errors = []; - if (!commit.seperator.value) + if (!commit.seperator.value) { return errors; + } if (commit.description.value === undefined || - commit.seperator.value.length - commit.seperator.value.trim().length !== 1) - errors.push(createError(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); + commit.seperator.value.length - commit.seperator.value.trim().length !== 1) { + errors.push(createDiagnosticsMessage(commit, this.description, "A description MUST immediately follow the colon and space", "description", true)); + } + return errors; + } +} +/** + * A longer commit body MAY be provided after the short description, providing + * additional contextual information about the code changes. The body MUST begin one + * blank line after the description. + */ +class CC06 { + id = "CC-06"; + description = "A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description."; + validate(commit, _options) { + const errors = []; + if (!commit.commit.subject) { + return errors; + } + const lines = commit.commit.subject.split(/\r?\n/); + if (lines.length > 1) { + return [ + diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { + text: highlightString(this.description, "The body MUST begin one blank line after the description"), + linenumber: 2, + column: 1, + }) + .setContext(1, lines) + .addFixitHint(diagnose_it_1.FixItHint.createRemoval({ index: 1, length: lines[1].length })), + ]; + } + return errors; + } +} +/** + * The units of information that make up Conventional Commits MUST NOT be treated as case + * sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase. + */ +class CC15 { + id = "CC-15"; + description = "The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase."; + validate(commit, _options) { + const errors = []; + const footerElements = (0, commit_1.getFooterElementsFromParagraph)(commit.commit.raw); + if (footerElements === undefined) + return errors; + for (const element of footerElements) { + if (["BREAKING CHANGE", "BREAKING-CHANGE"].includes(element.key.toUpperCase())) { + if (element.key !== element.key.toUpperCase()) { + errors.push(diagnose_it_1.DiagnosticsMessage.createError(commit.commit.hash, { + text: highlightString(this.description, "BREAKING CHANGE MUST be uppercase"), + linenumber: element.lineNumber, + column: 1, + }) + .setContext(element.lineNumber, commit.commit.raw.split(/\r?\n/)[element.lineNumber - 1]) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: element.key.length }))); + } + } + } return errors; } } @@ -2763,20 +2918,19 @@ class CC05 { * A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis */ class EC01 { - constructor() { - this.id = "EC-01"; - this.description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; - } + id = "EC-01"; + description = "A scope MAY be provided after a type. A scope MUST consist of one of the configured values (...) surrounded by parenthesis"; validate(commit, options) { - var _a; - const uniqueScopeList = Array.from(new Set((_a = options === null || options === void 0 ? void 0 : options.scopes) !== null && _a !== void 0 ? _a : [])); - if (uniqueScopeList.length === 0) + const uniqueScopeList = Array.from(new Set(options?.scopes ?? [])); + if (uniqueScopeList.length === 0) { return []; - if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) + } + if (commit.scope.value === undefined || uniqueScopeList.includes(commit.scope.value.replace(/[()]+/g, ""))) { return []; + } this.description = `A scope MAY be provided after a type. A scope MUST consist of one of the configured values (${uniqueScopeList.join(", ")}) surrounded by parenthesis`; return [ - createError(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), + createDiagnosticsMessage(commit, this.description, ["A scope MUST consist of", `(${uniqueScopeList.join(", ")})`], "scope"), ]; } } @@ -2784,33 +2938,74 @@ class EC01 { * Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...) */ class EC02 { - constructor() { - this.id = "EC-02"; - this.description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; - } + id = "EC-02"; + description = "Commits MUST be prefixed with a type, which consists of one of the configured values (feat, fix, ...)"; validate(commit, options) { - var _a; - const uniqueAddedTypes = new Set((_a = options === null || options === void 0 ? void 0 : options.types) !== null && _a !== void 0 ? _a : []); + const uniqueAddedTypes = new Set(options?.types ?? []); if (uniqueAddedTypes.has("feat")) uniqueAddedTypes.delete("feat"); if (uniqueAddedTypes.has("fix")) uniqueAddedTypes.delete("fix"); const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; - this.description = `Commits MUST be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; + this.description = `Commits ${uniqueAddedTypes.size > 0 ? "MUST" : "MAY"} be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; if (commit.type.value === undefined || !isNoun(commit.type.value) || - expectedTypes.includes(commit.type.value.trimEnd())) + expectedTypes.includes(commit.type.value.toLowerCase().trimEnd())) { return []; + } if (commit.type.value.trim().length === 0) { - return [createError(commit, this.description, "prefixed with a type", "type")]; + return [createDiagnosticsMessage(commit, this.description, "prefixed with a type", "type")]; + } + if (uniqueAddedTypes.size > 0) { + return [ + createDiagnosticsMessage(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), + ]; + } + else { + return [ + createDiagnosticsMessage(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type", false, diagnose_it_1.DiagnosticsLevelEnum.Warning), + ]; } - return [ - createError(commit, this.description, ["prefixed with a type, which consists of", `(${expectedTypes.join(", ")})`], "type"), - ]; + } +} +/** + * A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer. + */ +class WA01 { + id = "WA-01"; + description = "A `BREAKING CHANGE` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer."; + validate(commit, _options) { + const errors = []; + if (commit.commit.body === undefined) + return errors; + const elements = (0, commit_1.getFooterElementsFromParagraph)(commit.commit.body); + if (elements === undefined) + return errors; + for (const element of elements) { + if (element.key === "BREAKING CHANGE" || element.key === "BREAKING-CHANGE") { + errors.push(diagnose_it_1.DiagnosticsMessage.createWarning(commit.commit.hash, { + text: highlightString(`A \`${element.key}\` git-trailer has been found in the body of the commit message and will be ignored as it MUST be included in the footer.`, [element.key, "will be ignored as it MUST be included in the footer"]), + linenumber: commit.commit.subject.split(/\r?\n/).length + element.lineNumber, + column: 1, + }) + .setContext(commit.commit.subject.split(/\r?\n/).length + 1, commit.commit.body.split(/\r?\n/)) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: element.key.length }))); + } + } + return errors; } } /** @internal */ -exports.commitRules = [new CC01(), new CC04(), new CC05(), new EC01(), new EC02()]; +exports.commitRules = [ + new CC01(), + new CC04(), + new CC05(), + new CC06(), + new CC15(), + new EC01(), + new EC02(), + new WA01(), +]; /***/ }), @@ -41012,7 +41207,7 @@ class FileSource { } } async getCommitMessages() { - return [(0, commit_it_1.getCommit)({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; + return [commit_it_1.Commit.fromString({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } async getConfigurationFile(path) { if (!fs.existsSync(path)) { @@ -41032,7 +41227,7 @@ class GitSource { } async getCommitMessages() { const data = await (0, simple_git_1.simpleGit)().log({ from: this.sourceBranch, to: "@{push}" }); - return data.all.map(commit => (0, commit_it_1.getCommit)({ hash: commit.hash })); + return data.all.map(commit => commit_it_1.Commit.fromHash({ hash: commit.hash })); } async getConfigurationFile(path) { if (!fs.existsSync(path)) { @@ -41051,13 +41246,10 @@ class GitHubSource { const pullRequestNumber = github.context.payload.pull_request?.number; (0, assert_1.default)(pullRequestNumber); const commits = await octokit.rest.pulls.listCommits({ ...github.context.repo, pull_number: pullRequestNumber }); - return commits.data.map(commit => { - return { - hash: commit.sha, - subject: commit.commit.message.split(/\r?\n/)[0], - body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), - }; - }); + return commits.data.map(commit => commit_it_1.Commit.fromString({ + hash: commit.sha, + message: commit.commit.message, + })); } /** * Retrieves the specified configuration file from the repository using the REST API @@ -41122,12 +41314,15 @@ program await configuration_1.Configuration.getInstance().fromDatasource(datasource, program.opts().config); const commits = await datasource.getCommitMessages(); let errorCount = 0; + let warningCount = 0; (0, validator_1.validateCommits)(commits).forEach(commit => { - commit.errors.forEach(error => console.log(error, os_1.default.EOL)); + commit.errors.forEach(err => console.log(err.toString(), os_1.default.EOL)); + commit.warnings.forEach(err => console.log(err.toString(), os_1.default.EOL)); errorCount += commit.errors.length; + warningCount += commit.warnings.length; }); if (errorCount > 0) { - program.error(`❌ Found ${errorCount} Conventional Commit compliance issues.`); + program.error(`❌ Found ${errorCount} Conventional Commit compliance issues, and ${warningCount} warnings.`); } }); program.parse(process.argv); @@ -41155,16 +41350,7 @@ const configuration_1 = __nccwpck_require__(5778); * @returns Validation result */ function validateCommit(commit) { - const result = { commit: commit, errors: [] }; - try { - result.commit = (0, commit_it_1.getConventionalCommit)(commit, configuration_1.Configuration.getInstance()); - } - catch (error) { - if (!(error instanceof commit_it_1.ConventionalCommitError)) - throw error; - error.errors.forEach(e => result.errors.push(e.toString())); - } - return result; + return commit_it_1.ConventionalCommit.fromCommit(commit, configuration_1.Configuration.getInstance()); } /** * Validates the pull request against CommitMe requirements. @@ -41174,27 +41360,28 @@ function validateCommit(commit) { */ function validatePullRequest(pullrequest, commits) { const result = validateCommit(pullrequest); - if (result.errors.length > 0) + if (!result.isValid) return result; const orderValue = (commit) => { - if (!commit || !("type" in commit)) - return 0; if (commit.breaking) return 3; - if (commit.type === "feat") + if (commit.type?.toLowerCase() === "feat") return 2; - if (commit.type === "fix") + if (commit.type?.toLowerCase() === "fix") return 1; return 0; }; - const pullRequestValue = orderValue(result.commit); - const commitsValue = orderValue(commits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); + const pullRequestValue = orderValue(result); + const validConventionalCommits = commits.filter(commit => commit.isValid); + const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { - result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.commit.hash, { + result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, - }).toString()); + }) + .setContext(1, result.subject) + .addFixitHint(diagnose_it_1.FixItHint.create({ index: 1, length: result.type?.length ?? 1 }))); } return result; } diff --git a/package-lock.json b/package-lock.json index 0728e05..713cece 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@actions/core": "^1", "@actions/github": "^6", - "@dev-build-deploy/commit-it": "^1", + "@dev-build-deploy/commit-it": "^2", "@dev-build-deploy/diagnose-it": "^1", "commander": "^11", "simple-git": "^3" @@ -743,12 +743,15 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-1.0.4.tgz", - "integrity": "sha512-dT0bfSmDnj2SD4qVedHuwTIozOcKwEOb5RulndCjXUSJ2IazA3U3VJMyqAf0TTY9h7au/HaKjokjMtomNNi+XA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.0.2.tgz", + "integrity": "sha512-gMcFU3ik5ikkx+xnwH9wdkucWhxONy7+5g+F7z/XEjzXPxJSY02WusxnCFu+KalTvc9T3bZbXyqtYClTMy5e8Q==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" + }, + "engines": { + "node": ">=20" } }, "node_modules/@dev-build-deploy/diagnose-it": { @@ -2616,9 +2619,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.612", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.612.tgz", - "integrity": "sha512-dM8BMtXtlH237ecSMnYdYuCkib2QHq0kpWfUnavjdYsyr/6OsAwg5ZGUfnQ9KD1Ga4QgB2sqXlB2NT8zy2GnVg==", + "version": "1.4.614", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", + "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", "dev": true }, "node_modules/emittery": { @@ -2902,9 +2905,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", @@ -2923,7 +2926,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -6267,9 +6270,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "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, "dependencies": { "@types/json5": "^0.0.29", diff --git a/package.json b/package.json index e5b7da7..beed04c 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "dependencies": { "@actions/core": "^1", "@actions/github": "^6", - "@dev-build-deploy/commit-it": "^1", + "@dev-build-deploy/commit-it": "^2", "@dev-build-deploy/diagnose-it": "^1", "commander": "^11", "simple-git": "^3" diff --git a/src/datasources.ts b/src/datasources.ts index 689c545..9bc9d65 100644 --- a/src/datasources.ts +++ b/src/datasources.ts @@ -8,7 +8,7 @@ import * as fs from "fs"; import * as core from "@actions/core"; import * as github from "@actions/github"; -import { ICommit, getCommit } from "@dev-build-deploy/commit-it"; +import { Commit } from "@dev-build-deploy/commit-it"; import { simpleGit } from "simple-git"; /** DataSource abstraction interface @@ -16,7 +16,7 @@ import { simpleGit } from "simple-git"; * @member getCommitMessages Returns a list of commits to be validated */ export interface IDataSource { - getCommitMessages(): Promise; + getCommitMessages(): Promise; getConfigurationFile(path: string): Promise; } @@ -34,8 +34,8 @@ export class FileSource implements IDataSource { } } - async getCommitMessages(): Promise { - return [getCommit({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; + async getCommitMessages(): Promise { + return [Commit.fromString({ hash: "HEAD", message: fs.readFileSync(this.file, "utf8") })]; } async getConfigurationFile(path: string): Promise { @@ -57,9 +57,9 @@ export class GitSource implements IDataSource { this.sourceBranch = baseBranch; } - async getCommitMessages(): Promise { + async getCommitMessages(): Promise { const data = await simpleGit().log({ from: this.sourceBranch, to: "@{push}" }); - return data.all.map(commit => getCommit({ hash: commit.hash })); + return data.all.map(commit => Commit.fromHash({ hash: commit.hash })); } async getConfigurationFile(path: string): Promise { @@ -75,20 +75,19 @@ export class GitSource implements IDataSource { * GitHub data source for determining which commits need to be validated. */ export class GitHubSource implements IDataSource { - async getCommitMessages(): Promise { + async getCommitMessages(): Promise { const octokit = github.getOctokit(core.getInput("token")); const pullRequestNumber = github.context.payload.pull_request?.number; assert(pullRequestNumber); const commits = await octokit.rest.pulls.listCommits({ ...github.context.repo, pull_number: pullRequestNumber }); - return commits.data.map(commit => { - return { + return commits.data.map(commit => + Commit.fromString({ hash: commit.sha, - subject: commit.commit.message.split(/\r?\n/)[0], - body: commit.commit.message.split(/\r?\n/).slice(2).join("\n"), - }; - }); + message: commit.commit.message, + }) + ); } /** diff --git a/src/entrypoints/action.ts b/src/entrypoints/action.ts index d22e256..7034b46 100644 --- a/src/entrypoints/action.ts +++ b/src/entrypoints/action.ts @@ -7,29 +7,28 @@ import assert from "assert"; import * as core from "@actions/core"; import * as github from "@actions/github"; -import { isConventionalCommit, ICommit, IConventionalCommit } from "@dev-build-deploy/commit-it"; +import { Commit, ConventionalCommit } from "@dev-build-deploy/commit-it"; import { Configuration } from "../configuration"; import { GitHubSource, IDataSource } from "../datasources"; import { updatePullRequestLabels } from "../github"; import * as repository from "../repository"; -import { IValidationResult, validateCommits, validatePullRequest } from "../validator"; +import { validateCommits, validatePullRequest } from "../validator"; /** * Determines the label to be applied to the pull request. * @param commits The validated commits to determine the label from * @returns The label to be applied to the pull request ("breaking", "feature", "fix" or undefined) */ -const determineLabel = async (commits: IValidationResult[]): Promise<"breaking" | "feature" | "fix" | undefined> => { +const determineLabel = async (commits: ConventionalCommit[]): Promise<"breaking" | "feature" | "fix" | undefined> => { let type: "breaking" | "feature" | "fix" | undefined; for (const commit of commits) { - if (!isConventionalCommit(commit.commit)) continue; + if (!commit.isValid) continue; - const convCommit = commit.commit as IConventionalCommit; - if (convCommit.breaking) return "breaking"; - if (convCommit.type === "feat") type = "feature"; - else if (convCommit.type === "fix" && type !== "feature") type = "fix"; + if (commit.breaking) return "breaking"; + if (commit.type?.toLowerCase() === "feat") type = "feature"; + else if (commit.type?.toLowerCase() === "fix" && type !== "feature") type = "fix"; } return type; @@ -40,15 +39,20 @@ const determineLabel = async (commits: IValidationResult[]): Promise<"breaking" * @param results The validation results to report * @returns The total number of errors reported */ -const reportErrorMessages = (results: IValidationResult[]): number => { +const reportErrorMessages = (results: ConventionalCommit[]): { errors: number; warnings: number } => { let errorCount = 0; + let warningCount = 0; for (const commit of results) { - core.info(`${commit.errors.length === 0 ? "✅" : "❌"} ${commit.commit.hash}: ${commit.commit.subject}`); - commit.errors.forEach(error => core.error(error, { title: "Conventional Commit Compliance" })); + core.info(`${commit.errors.length === 0 ? "✅" : "❌"} ${commit.hash}: ${commit.subject}`); + commit.errors.forEach(error => core.error(error.toString(), { title: "Conventional Commit Compliance" })); errorCount += commit.errors.length; + + commit.warnings.forEach(warning => core.warning(warning.toString(), { title: "Conventional Commit Compliance" })); + warningCount += commit.warnings.length; } - return errorCount; + + return { errors: errorCount, warnings: warningCount }; }; const setConfiguration = async (dataSource: IDataSource): Promise => { @@ -108,32 +112,40 @@ async function run(): Promise { const resultCommits = validateCommits(commits); let errorCount = 0; - const allResults: IValidationResult[] = [...resultCommits]; + let warningCount = 0; + const allResults: ConventionalCommit[] = [...resultCommits]; if (config.includePullRequest === true) { core.startGroup(`🔎 Scanning Pull Request`); const resultPullrequest = validatePullRequest( - { + Commit.fromString({ hash: `#${github.context.payload.pull_request.number}`, - subject: github.context.payload.pull_request.title, - body: github.context.payload.pull_request.body ?? "", - } as ICommit, - resultCommits.map(commit => commit.commit as IConventionalCommit).filter(commit => commit !== undefined) + message: [github.context.payload.pull_request.title, "", github.context.payload.pull_request.body].join("\n"), + }), + allResults ); allResults.push(resultPullrequest); - errorCount += reportErrorMessages([resultPullrequest]); + const counts = reportErrorMessages([resultPullrequest]); + errorCount += counts.errors; + warningCount += counts.warnings; + core.endGroup(); } if (config.includeCommits === true) { core.startGroup("🔎 Scanning Commits associated with Pull Request"); - errorCount += reportErrorMessages(resultCommits); + const counts = reportErrorMessages(resultCommits); + errorCount += counts.errors; + warningCount += counts.warnings; + core.endGroup(); } if (errorCount > 0) { - core.setFailed(`❌ Found ${errorCount} Conventional Commits compliance issues.`); + core.setFailed(`❌ Found ${errorCount} Conventional Commit compliance issues, and ${warningCount} warnings.`); return; + } else if (warningCount > 0) { + core.warning(`⚠️ Found ${warningCount} Conventional Commit compliance warnings.`); } // Updating the pull request label diff --git a/src/entrypoints/cli.ts b/src/entrypoints/cli.ts index b2f85de..6192b3f 100644 --- a/src/entrypoints/cli.ts +++ b/src/entrypoints/cli.ts @@ -45,23 +45,28 @@ program const commits = await datasource.getCommitMessages(); let errorCount = 0; + let warningCount = 0; const results = validateCommits(commits); for (const commit of results) { console.log( - `${commit.errors.length === 0 ? "✅" : "❌"} ${commit.commit.hash}: ${commit.commit.subject.substring(0, 77)}${ - commit.commit.subject.length > 80 ? "..." : "" + `${commit.errors.length === 0 ? "✅" : "❌"} ${commit.hash}: ${commit.subject.substring(0, 77)}${ + commit.subject.length > 80 ? "..." : "" }` ); - commit.errors.forEach(error => console.log(error, os.EOL)); + + commit.errors.forEach(err => console.log(err.toString(), os.EOL)); + commit.warnings.forEach(err => console.log(err.toString(), os.EOL)); + errorCount += commit.errors.length; + warningCount += commit.warnings.length; } console.log("-------------------------------------------------------"); if (errorCount === 0) { console.log(`✅ All your commits are compliant with Conventional Commit.`); } else { - program.error(`❌ Found ${errorCount} Conventional Commit compliance issues.`); + program.error(`❌ Found ${errorCount} Conventional Commit compliance issues, and ${warningCount} warnings.`); } }); diff --git a/src/entrypoints/pre-commit.ts b/src/entrypoints/pre-commit.ts index 0980ce8..95ba483 100644 --- a/src/entrypoints/pre-commit.ts +++ b/src/entrypoints/pre-commit.ts @@ -31,13 +31,18 @@ program const commits = await datasource.getCommitMessages(); let errorCount = 0; + let warningCount = 0; + validateCommits(commits).forEach(commit => { - commit.errors.forEach(error => console.log(error, os.EOL)); + commit.errors.forEach(err => console.log(err.toString(), os.EOL)); + commit.warnings.forEach(err => console.log(err.toString(), os.EOL)); + errorCount += commit.errors.length; + warningCount += commit.warnings.length; }); if (errorCount > 0) { - program.error(`❌ Found ${errorCount} Conventional Commit compliance issues.`); + program.error(`❌ Found ${errorCount} Conventional Commit compliance issues, and ${warningCount} warnings.`); } }); diff --git a/src/validator.ts b/src/validator.ts index 511957f..4ec64ac 100644 --- a/src/validator.ts +++ b/src/validator.ts @@ -3,44 +3,18 @@ * SPDX-License-Identifier: MIT */ -import { - ICommit, - IConventionalCommit, - getConventionalCommit, - ConventionalCommitError, -} from "@dev-build-deploy/commit-it"; -import { DiagnosticsMessage } from "@dev-build-deploy/diagnose-it"; +import { Commit, ConventionalCommit } from "@dev-build-deploy/commit-it"; +import { DiagnosticsMessage, FixItHint } from "@dev-build-deploy/diagnose-it"; import { Configuration } from "./configuration"; -/** - * Validation result interface - * @interface IValidationResult - * @member commit The commit that was validated - * @member conventionalCommit The associated conventional commit - * @member errors List of error messages - */ -export interface IValidationResult { - commit: ICommit | IConventionalCommit; - errors: string[]; -} - /** * Validates a single commit message against the Conventional Commit specification. * @param commit Commit message to validate against the Conventional Commit specification * @returns Validation result */ -function validateCommit(commit: ICommit): IValidationResult { - const result: IValidationResult = { commit: commit, errors: [] }; - - try { - result.commit = getConventionalCommit(commit, Configuration.getInstance()); - } catch (error) { - if (!(error instanceof ConventionalCommitError)) throw error; - error.errors.forEach(e => result.errors.push(e.toString())); - } - - return result; +function validateCommit(commit: Commit): ConventionalCommit { + return ConventionalCommit.fromCommit(commit, Configuration.getInstance()); } /** @@ -49,29 +23,31 @@ function validateCommit(commit: ICommit): IValidationResult { * @param commits The commits associated with the pull request * @returns Validation result */ -export function validatePullRequest(pullrequest: ICommit, commits: IConventionalCommit[]): IValidationResult { +export function validatePullRequest(pullrequest: Commit, commits: ConventionalCommit[]): ConventionalCommit { const result = validateCommit(pullrequest); - if (result.errors.length > 0) return result; + if (!result.isValid) return result; - const orderValue = (commit?: ICommit | IConventionalCommit): number => { - if (!commit || !("type" in commit)) return 0; + const orderValue = (commit: ConventionalCommit): number => { if (commit.breaking) return 3; - if (commit.type === "feat") return 2; - if (commit.type === "fix") return 1; + if (commit.type?.toLowerCase() === "feat") return 2; + if (commit.type?.toLowerCase() === "fix") return 1; return 0; }; - const pullRequestValue = orderValue(result.commit); - const commitsValue = orderValue(commits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); + const pullRequestValue = orderValue(result); + const validConventionalCommits = commits.filter(commit => commit.isValid); + const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push( - DiagnosticsMessage.createError(result.commit.hash, { + DiagnosticsMessage.createError(result.hash, { text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, - }).toString() + }) + .setContext(1, result.subject) + .addFixitHint(FixItHint.create({ index: 1, length: result.type?.length ?? 1 })) ); } @@ -84,6 +60,6 @@ export function validatePullRequest(pullrequest: ICommit, commits: IConventional * @returns A list of validation results * @see https://www.conventionalcommits.org/en/v1.0.0/ */ -export function validateCommits(commits: ICommit[]): IValidationResult[] { +export function validateCommits(commits: Commit[]): ConventionalCommit[] { return commits.filter(commit => !commit.subject.startsWith("fixup!")).map(commit => validateCommit(commit)); } diff --git a/test/validator.test.ts b/test/validator.test.ts index 154e437..133ed1b 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -3,20 +3,19 @@ * SPDX-License-Identifier: MIT */ +import { Commit, ConventionalCommit } from "@dev-build-deploy/commit-it"; + import * as validator from "../src/validator"; describe("Validate commit messages", () => { test("Valid commit message", () => { const result = validator.validateCommits([ - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), ]); + let count = 0; result.forEach(item => (count += item.errors.length)); expect(count).toBe(0); @@ -24,15 +23,12 @@ describe("Validate commit messages", () => { test("Invalid commit message", () => { const result = validator.validateCommits([ - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "feat (no noun): Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat (no noun): Add new feature", + }), ]); + let count = 0; result.forEach(item => (count += item.errors.length)); @@ -41,27 +37,41 @@ describe("Validate commit messages", () => { expect(count).toBe(2); }); + test("Commit messages with warnings", () => { + const result = validator.validateCommits([ + Commit.fromString({ + hash: "0a0b0c0d", + message: `feat: Add new feature + +BREAKING CHANGE: this will be ignored and raise a warning... + +... as it is followed by a new paragraph`, + }), + ]); + + let errorCount = 0; + let warningCount = 0; + result.forEach(item => (errorCount += item.errors.length)); + result.forEach(item => (warningCount += item.warnings.length)); + expect(errorCount).toBe(0); + expect(warningCount).toBe(1); + }); + test("Valid Pull Request message", () => { const result = validator.validatePullRequest( - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), [ - { + ConventionalCommit.fromString({ + hash: "0a0b0c0d", + message: "feat: Add new feature", + }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", - type: "feat", - description: "Add new feature", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "fix: Fixed a bug", + }), ] ); @@ -70,25 +80,15 @@ describe("Validate commit messages", () => { test("Invalid Pull Request message", () => { const result = validator.validatePullRequest( - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "feat (no noun): Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat (no noun): Add new feature", + }), [ - { + ConventionalCommit.fromString({ hash: "0a0b0c0d", - type: "feat", - description: "Add new feature", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), ] ); @@ -99,25 +99,15 @@ describe("Validate commit messages", () => { test("Pull Request > Commits", () => { const result = validator.validatePullRequest( - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "feat!: Add new breaking change", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat!: Add new breaking change", + }), [ - { + ConventionalCommit.fromString({ hash: "0a0b0c0d", - type: "feat", - description: "Add new feature", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), ] ); @@ -126,25 +116,15 @@ describe("Validate commit messages", () => { test("Pull Request === Commits", () => { const result = validator.validatePullRequest( - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "feat: Add new breaking change", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), [ - { + ConventionalCommit.fromString({ hash: "0a0b0c0d", - type: "feat", - description: "Add new feature", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), ] ); @@ -153,21 +133,15 @@ describe("Validate commit messages", () => { test("Pull Request < Commits", () => { const result = validator.validatePullRequest( - { + Commit.fromString({ hash: "0a0b0c0d", - subject: "chore: Add new breaking change", - }, + message: "chore: Add new breaking change", + }), [ - { + ConventionalCommit.fromString({ hash: "0a0b0c0d", - type: "feat", - description: "Add new feature", - subject: "feat: Add new feature", - body: "This is a body", - footer: { - "Acked-by": "Jane Doe", - }, - }, + message: "feat: Add new feature", + }), ] ); From ef114af3d79e2f0a69c64a3b4b7245476bbc0709 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Sun, 17 Dec 2023 08:09:46 +0100 Subject: [PATCH 06/25] chore: update commit-it to v2.0.3 --- lib/action/index.js | 8 ++++++-- lib/cli/index.js | 8 ++++++-- lib/precommit/index.js | 8 ++++++-- package-lock.json | 26 +++++++++++++------------- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index bf88738..c767a62 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2383,16 +2383,20 @@ class ConventionalCommit { } // Conventional Commit get type() { - return this._raw.type.value; + return this._raw.type.value?.trimEnd(); } get scope() { + // Removes the parenthesis from the scope + if (this._raw.scope.value !== undefined) { + return this._raw.scope.value.trimEnd().replace(/(\(|\))/g, ""); + } return this._raw.scope.value; } get description() { return this._raw.description.value; } get breaking() { - return (this._raw.breaking.value === "!" || + return (this._raw.breaking.value?.trimEnd() === "!" || (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); } // Raw diff --git a/lib/cli/index.js b/lib/cli/index.js index ab721cb..1eb3f34 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2384,16 +2384,20 @@ class ConventionalCommit { } // Conventional Commit get type() { - return this._raw.type.value; + return this._raw.type.value?.trimEnd(); } get scope() { + // Removes the parenthesis from the scope + if (this._raw.scope.value !== undefined) { + return this._raw.scope.value.trimEnd().replace(/(\(|\))/g, ""); + } return this._raw.scope.value; } get description() { return this._raw.description.value; } get breaking() { - return (this._raw.breaking.value === "!" || + return (this._raw.breaking.value?.trimEnd() === "!" || (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); } // Raw diff --git a/lib/precommit/index.js b/lib/precommit/index.js index c37b1eb..9136523 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2384,16 +2384,20 @@ class ConventionalCommit { } // Conventional Commit get type() { - return this._raw.type.value; + return this._raw.type.value?.trimEnd(); } get scope() { + // Removes the parenthesis from the scope + if (this._raw.scope.value !== undefined) { + return this._raw.scope.value.trimEnd().replace(/(\(|\))/g, ""); + } return this._raw.scope.value; } get description() { return this._raw.description.value; } get breaking() { - return (this._raw.breaking.value === "!" || + return (this._raw.breaking.value?.trimEnd() === "!" || (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); } // Raw diff --git a/package-lock.json b/package-lock.json index 713cece..ff78745 100644 --- a/package-lock.json +++ b/package-lock.json @@ -743,9 +743,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.0.2.tgz", - "integrity": "sha512-gMcFU3ik5ikkx+xnwH9wdkucWhxONy7+5g+F7z/XEjzXPxJSY02WusxnCFu+KalTvc9T3bZbXyqtYClTMy5e8Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.0.3.tgz", + "integrity": "sha512-snSsstI8kytKXmEY5MXxj0pYM2t1JD0uf2uOTQSgHg6pKfC1A8YeiCUFPqbNFSeALLI580RZ3FafTTvU+Gyjyw==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" @@ -820,9 +820,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1513,9 +1513,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -2779,15 +2779,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", From b458c2fc9ac21d38a5b5654b6864a49cd2c1c591 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Wed, 17 Jan 2024 13:27:07 +0100 Subject: [PATCH 07/25] feat: extend configuration management This commit reworks the configuration management for the different options of CommitMe (GitHub Action, CLI and PreCommit), incl: - Extending the Configuration file with `githubActions` settings - Ensure that the GitHub Actions inputs take precedence over the configuration file In addition, this resolves several issue related to the configuration as applied during the GHA execution. --- .github/workflows/conventional-commits.yml | 6 - README.md | 18 +- docs/config.md | 47 ++++ docs/github-action.md | 17 +- lib/action/index.js | 163 ++++++++++--- lib/cli/index.js | 198 ++++++++++++++-- lib/precommit/index.js | 198 ++++++++++++++-- src/configuration.ts | 49 +++- src/entrypoints/action.ts | 45 ++-- src/validator.ts | 2 +- test/configuration.test.ts | 258 +++++++++++++++++++++ test/validator.test.ts | 144 +++++++----- 12 files changed, 962 insertions(+), 183 deletions(-) create mode 100644 docs/config.md create mode 100644 test/configuration.test.ts diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml index 6ee40b2..7293b40 100644 --- a/.github/workflows/conventional-commits.yml +++ b/.github/workflows/conventional-commits.yml @@ -34,12 +34,6 @@ jobs: # Pull Request without requiring the `contents:write` # permission config: .github/.commit-me.json # Path to your CommitMe configuration file - types: | # Limit the Conventional Commits type to the following values; - magic - void - scopes: | # Limit the Conventional Commits scopes to the following values; - foo - bar env: # Enable colored output in GitHub Actions FORCE_COLOR: 3 diff --git a/README.md b/README.md index 6abbe66..a67c29c 100644 --- a/README.md +++ b/README.md @@ -20,23 +20,9 @@ Please refer to the document related to your environment for more details on the - [Command Line Interface](./docs/cli.md) - [Pre-commit Hook](./docs/pre-commit.md) -## Configuration file +## Configuration -You can create a global configuration file: - -```json -{ - "types": [ "build", "chore", "ci", "docs", "style", "refactor", "perf", "test" ], - "scopes": [ "server", "client" ] -} -``` - -| Configuration Item | Description | -| -------------------| ------------| -| `types` | Conventional Commit types to allow. By default it always supports `feat` and `fix`. | -| `scopes` | Conventional Commit scopes to allow. No restrictions will be applied when not specified. | - -> :bulb: By default, CommitMe will attempt to load `.commit-me.json` in the root of your repository +Please refer to the [Global Configuration documentation](./docs/config.md) for details on how to configure `CommitMe`. ## Contributing diff --git a/docs/config.md b/docs/config.md new file mode 100644 index 0000000..d331ff6 --- /dev/null +++ b/docs/config.md @@ -0,0 +1,47 @@ + + +# Global configuration file + +You can create a global configuration file, for example: + +```json +{ + "types": [ "build", "chore", "ci", "docs", "style", "refactor", "perf", "test" ], + "scopes": [ "server", "client" ], + "githubAction": { + "includeCommits": true, + "includePullRequest": true, + "updatePullRequestLabels": true, + } +} +``` + +> [!NOTE] +> By default, CommitMe will attempt to load `.commit-me.json` in the root of your repository + +## Generic settings + +The following settings will be taken into account for all `CommitMe` clients ([GitHub Action](./github-action.md), [CLI](./cli.md), and [Pre-Commit](./pre-commit.md)) + +| Configuration Item | Description | +| -------------------| ------------| +| `types` | Conventional Commit types to allow. By default it always supports `feat` and `fix`. | +| `scopes` | Conventional Commit scopes to allow. No restrictions will be applied when not specified. | + +## GitHub Actions settings + +You can also configure the majority of inputs for the [GitHub Action](./github-action.md) using the configuration file: + +| Configuration Item | Description | +| ---------------------------------------| ------------| +| `githubAction.includeCommits` | Include commits associated with the Pull Request during validation; by default we use the repository configuration settings to determine this value (requires `contents:write` permission if **NOT** set). | +| `githubAction.includePullRequest` | Include the Pull Request during validation, defaults to `true`. | +| `githubAction.updatePullRequestLabels` | Allow CommitMe to manage [labels](./github-action.md#pull-request-labels) based on the [Conventional Commits] metadata (requires `pull-requests:write` permission), defaults to `true` | + +> [!WARNING] +> The inputs given to the GitHub Action take precedence over the configuration file + +[Conventional Commits]: https://www.conventionalcommits.org/en/v1.0.0/ diff --git a/docs/github-action.md b/docs/github-action.md index 69f35ea..fba371b 100644 --- a/docs/github-action.md +++ b/docs/github-action.md @@ -12,8 +12,8 @@ You can scan your [pull requests](#pull-request-scanning) for determining compli ## Validation strategies Currently there are two distinct [Conventional Commits] validation strategies implemented; -- Validate the Pull Request title and all associated commits _(default behavior)_. -- **ONLY** validate the Pull Request title. +- Validate the Pull Request and all associated commits _(default behavior)_. +- **ONLY** validate the Pull Request. Selection of the strategy is based on either: - The allowed merge strategies in your repository (the `contents: write` permission needs to be set in order for this detection to work.) @@ -95,7 +95,7 @@ You can limit the Conventional Commit Type and/or Scope using the related input - uses: dev-build-deploy/commit-me@v0 with: # OPTIONAL; Enforce that each commit contains a predefined scope - scope: | + scopes: | backend frontend # OPTIONAL; Limit the Conventional Commits type to `feat`, `fix`, and a custom entries `docs` and `debt` @@ -112,8 +112,8 @@ We recommend using the [`pull_request`](https://docs.github.com/en/actions/using In addition, we recommend the following activity types: | Activity | Description | | --- | --- | -| `opened` | Validates all commits in the source branch of your Pull Request upon opening the PR | -| `edited` | Validates any change to the Pull Requests title | +| `opened` | Validvates all commits in the source branch of your Pull Request upon opening the PR | +| `edited` | Validates any change to the Pull Requests | | `synchronize` | Validate all subsequent commits added to the (open) Pull Request. This is only required in case rebase merges are enabled on the target repository. | > **NOTE**: Although supported, the trigger `pull_request_target` has elevated permissions to access secrets and your repository. Please refer to this [GitHub security blog post](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) for more details @@ -124,9 +124,14 @@ In addition, we recommend the following activity types: | --- | --- | --- | | `token` | *NO* | GitHub token needed to access your commits in your pull request. This is **only** required in case you want to:

| | `update-labels` | *NO* | Allow CommitMe to manage [labels](#pull-request-labels) based on the [Conventional Commits] metadata (requires `pull-requests:write` permission), defaults to `true` | -| `include-commits` | *NO* | Include commits associated with the Pull Request; by default we use the repository configuration settings to determine this value (requires `contents:write` permission if **NOT** set). | +| `scopes` | *NO* | Conventional Commit scopes to allow. No restrictions will be applied when not specified. | +| `types` | *NO* | Conventional Commit types to allow. By default it always supports `feat` and `fix`. | +| `include-commits` | *NO* | Include commits associated with the Pull Request during validation; by default we use the repository configuration settings to determine this value (requires `contents:write` permission if **NOT** set). | | `config` | *NO* | Path to the configuration file; by default `.pre-commit.json` is used. | +> [!NOTE] +> You can also configure the majority of the inputs using the [Global Configuration file](./config.md#github-actions-settings) + ### Permissions | Name | Value | Comment | diff --git a/lib/action/index.js b/lib/action/index.js index c767a62..f365448 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2154,9 +2154,15 @@ class Commit { * @returns The commit object */ static fromString(props) { + // Git will trim all comments (lines starting with #), so we do the same + // to ensure the commit message is parsed correctly. + const trimmedMessage = props.message + .split(/\r?\n/) + .filter(line => !line.startsWith("#")) + .join("\n"); const commit = { hash: props.hash, - ...parseCommitMessage(props.message), + ...parseCommitMessage(trimmedMessage), author: props.author, committer: props.committer, raw: props.message, @@ -13965,6 +13971,12 @@ function pick(source, properties) { function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); } +function orVoid(input) { + if (input === false) { + return void 0; + } + return input; +} var import_file_exists, NULL, NOOP, objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { @@ -14231,6 +14243,7 @@ __export(utils_exports, { isUserFunction: () => isUserFunction, last: () => last, objectToString: () => objectToString, + orVoid: () => orVoid, parseStringResponse: () => parseStringResponse, pick: () => pick, prefixedArray: () => prefixedArray, @@ -14665,6 +14678,29 @@ var init_config = __esm({ } }); +// src/lib/tasks/diff-name-status.ts +function isDiffNameStatus(input) { + return diffNameStatus.has(input); +} +var DiffNameStatus, diffNameStatus; +var init_diff_name_status = __esm({ + "src/lib/tasks/diff-name-status.ts"() { + DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus2) => { + DiffNameStatus2["ADDED"] = "A"; + DiffNameStatus2["COPIED"] = "C"; + DiffNameStatus2["DELETED"] = "D"; + DiffNameStatus2["MODIFIED"] = "M"; + DiffNameStatus2["RENAMED"] = "R"; + DiffNameStatus2["CHANGED"] = "T"; + DiffNameStatus2["UNMERGED"] = "U"; + DiffNameStatus2["UNKNOWN"] = "X"; + DiffNameStatus2["BROKEN"] = "B"; + return DiffNameStatus2; + })(DiffNameStatus || {}); + diffNameStatus = new Set(Object.values(DiffNameStatus)); + } +}); + // src/lib/tasks/grep.ts function grepQueryBuilder(...params) { return new GrepQuery().param(...params); @@ -14788,6 +14824,7 @@ var api_exports = {}; __export(api_exports, { CheckRepoActions: () => CheckRepoActions, CleanOptions: () => CleanOptions, + DiffNameStatus: () => DiffNameStatus, GitConfigScope: () => GitConfigScope, GitConstructError: () => GitConstructError, GitError: () => GitError, @@ -14809,6 +14846,7 @@ var init_api = __esm({ init_check_is_repo(); init_clean(); init_config(); + init_diff_name_status(); init_grep(); init_reset(); } @@ -15864,6 +15902,7 @@ var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { init_log_format(); init_DiffSummary(); + init_diff_name_status(); init_utils(); statParser = [ new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { @@ -15929,11 +15968,12 @@ var init_parse_diff_summary = __esm({ }) ]; nameStatusParser = [ - new LineParser(/([ACDMRTUXB])\s*(.+)$/, (result, [_status, file]) => { + new LineParser(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, (result, [status, _similarity, from, _to, to]) => { result.changed++; result.files.push({ - file, + file: to != null ? to : from, changes: 0, + status: orVoid(isDiffNameStatus(status) && status), insertions: 0, deletions: 0, binary: false @@ -41071,17 +41111,47 @@ function wrappy (fn, cb) { /***/ }), /***/ 5778: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Configuration = void 0; /* * SPDX-FileCopyrightText: 2023 Kevin de Jong * SPDX-License-Identifier: MIT */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Configuration = void 0; +const assert_1 = __importDefault(__nccwpck_require__(9491)); +const core = __importStar(__nccwpck_require__(2186)); +const github = __importStar(__nccwpck_require__(5438)); const datasources_1 = __nccwpck_require__(1751); +const repository = __importStar(__nccwpck_require__(259)); /** * Configuration class * @class Configuration @@ -41094,6 +41164,7 @@ class Configuration { static _instance; includeCommits = false; includePullRequest = false; + updatePullRequestLabels = false; scopes; types; static getInstance() { @@ -41130,23 +41201,48 @@ class Configuration { */ async fromDatasource(datasource, configPath) { const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); - if (!content) - return this; + const config = content ? JSON.parse(content) : {}; if (datasource instanceof datasources_1.GitSource || datasource instanceof datasources_1.FileSource) { this.includeCommits = true; this.includePullRequest = false; + this.updatePullRequestLabels = false; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); } else if (datasource instanceof datasources_1.GitHubSource) { - this.includePullRequest = true; + const hasIncludeCommitsInput = core.getInput("include-commits") !== ""; + const hasPullRequestLabelsInput = core.getInput("update-labels") !== ""; + const autoDetectIncludeCommits = !hasIncludeCommitsInput && config.githubAction?.includeCommits === undefined; + if (autoDetectIncludeCommits) { + (0, assert_1.default)(github.context.payload.pull_request); + repository.checkConfiguration(github.context.payload.pull_request.base.repo); + this.includeCommits = github.context.payload.pull_request.base.repo.allow_rebase_merge === true; + } + else { + this.includeCommits = hasIncludeCommitsInput + ? core.getBooleanInput("include-commits") + : config.githubAction?.includeCommits ?? false; + } + this.includePullRequest = config.githubAction?.includePullRequest ?? true; + if (core.getMultilineInput("scopes").length > 0) { + this.addScopes(core.getMultilineInput("scopes")); + } + else { + this.addScopes(config.scopes ?? []); + } + if (core.getMultilineInput("types").length > 0) { + this.addTypes(core.getMultilineInput("types")); + } + else { + this.addTypes(config.types ?? []); + } + this.updatePullRequestLabels = hasPullRequestLabelsInput + ? core.getBooleanInput("update-labels") + : config.githubAction?.updatePullRequestLabels ?? false; } else { throw new Error("Unsupported data source"); } - const config = JSON.parse(content); - this.includeCommits = config.includeCommits ?? this.includeCommits; - this.includePullRequest = config.includePullRequest ?? this.includePullRequest; - this.addScopes(config.scopes ?? []); - this.addTypes(config.types ?? []); return this; } } @@ -41327,7 +41423,6 @@ const commit_it_1 = __nccwpck_require__(9403); const configuration_1 = __nccwpck_require__(5778); const datasources_1 = __nccwpck_require__(1751); const github_1 = __nccwpck_require__(978); -const repository = __importStar(__nccwpck_require__(259)); const validator_1 = __nccwpck_require__(4630); /** * Determines the label to be applied to the pull request. @@ -41365,27 +41460,15 @@ const reportErrorMessages = (results) => { } return { errors: errorCount, warnings: warningCount }; }; -const setConfiguration = async (dataSource) => { - (0, assert_1.default)(github.context.payload.pull_request); - const pullrequestOnly = core.getInput("include-commits") - ? !core.getBooleanInput("include-commits") - : github.context.payload.pull_request.base.repo.allow_rebase_merge === false; - // Set the global configuration - const config = await configuration_1.Configuration.getInstance().fromDatasource(dataSource, core.getInput("config") || undefined); - config.includeCommits = !pullrequestOnly; - config.addScopes(core.getMultilineInput("scopes") ?? []); - config.addTypes(core.getMultilineInput("types") ?? []); -}; /** * Main entry point for the GitHub Action. */ async function run() { try { core.info("📄 CommitMe - Conventional Commit compliance validation"); - const datasource = new datasources_1.GitHubSource(); - await setConfiguration(datasource); core.startGroup("📝 Checking repository configuration"); - const config = configuration_1.Configuration.getInstance(); + const datasource = new datasources_1.GitHubSource(); + const config = await configuration_1.Configuration.getInstance().fromDatasource(datasource, core.getInput("config") || undefined); const githubToken = core.getInput("token") ?? undefined; (0, assert_1.default)(github.context.payload.pull_request); if (!["pull_request", "pull_request_target"].includes(github.context.eventName)) { @@ -41396,13 +41479,21 @@ async function run() { core.setFailed("❌ The `token` input is required for the current configuration of CommitMe."); return; } - if (core.getInput("include-commits") === undefined) { - repository.checkConfiguration(github.context.payload.pull_request.base.repo); + if (config.includeCommits === true) { + if (config.includePullRequest === true) { + core.info("ℹ️ Validating both Pull Request and all associated commits."); + } + else { + core.info("ℹ️ Only validating the commits associated with the Pull Request."); + } } else { - core.info(config.includeCommits === true - ? "ℹ️ Validating both Pull Request title and all associated commits." - : "ℹ️ Only validating the Pull Request title."); + if (config.includePullRequest === true) { + core.info("ℹ️ Only validating the Pull Request."); + } + else { + core.setFailed("❌ The current configuration of CommitMe does not validate either Pull Request or the associated commits."); + } } // Setting up the environment const commits = config.includeCommits ? await datasource.getCommitMessages() : []; @@ -41442,7 +41533,7 @@ async function run() { if (githubToken === undefined) { core.warning("⚠️ The token input is required to update the pull request label."); } - else if (core.getBooleanInput("update-labels") === true) { + else if (config.updatePullRequestLabels === true) { const label = await determineLabel(allResults); if (label !== undefined) await (0, github_1.updatePullRequestLabels)(label); @@ -41639,7 +41730,7 @@ function validatePullRequest(pullrequest, commits) { const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { - text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, + text: `A Pull Request MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, }) diff --git a/lib/cli/index.js b/lib/cli/index.js index 1eb3f34..5feb295 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2155,9 +2155,15 @@ class Commit { * @returns The commit object */ static fromString(props) { + // Git will trim all comments (lines starting with #), so we do the same + // to ensure the commit message is parsed correctly. + const trimmedMessage = props.message + .split(/\r?\n/) + .filter(line => !line.startsWith("#")) + .join("\n"); const commit = { hash: props.hash, - ...parseCommitMessage(props.message), + ...parseCommitMessage(trimmedMessage), author: props.author, committer: props.committer, raw: props.message, @@ -13966,6 +13972,12 @@ function pick(source, properties) { function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); } +function orVoid(input) { + if (input === false) { + return void 0; + } + return input; +} var import_file_exists, NULL, NOOP, objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { @@ -14232,6 +14244,7 @@ __export(utils_exports, { isUserFunction: () => isUserFunction, last: () => last, objectToString: () => objectToString, + orVoid: () => orVoid, parseStringResponse: () => parseStringResponse, pick: () => pick, prefixedArray: () => prefixedArray, @@ -14666,6 +14679,29 @@ var init_config = __esm({ } }); +// src/lib/tasks/diff-name-status.ts +function isDiffNameStatus(input) { + return diffNameStatus.has(input); +} +var DiffNameStatus, diffNameStatus; +var init_diff_name_status = __esm({ + "src/lib/tasks/diff-name-status.ts"() { + DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus2) => { + DiffNameStatus2["ADDED"] = "A"; + DiffNameStatus2["COPIED"] = "C"; + DiffNameStatus2["DELETED"] = "D"; + DiffNameStatus2["MODIFIED"] = "M"; + DiffNameStatus2["RENAMED"] = "R"; + DiffNameStatus2["CHANGED"] = "T"; + DiffNameStatus2["UNMERGED"] = "U"; + DiffNameStatus2["UNKNOWN"] = "X"; + DiffNameStatus2["BROKEN"] = "B"; + return DiffNameStatus2; + })(DiffNameStatus || {}); + diffNameStatus = new Set(Object.values(DiffNameStatus)); + } +}); + // src/lib/tasks/grep.ts function grepQueryBuilder(...params) { return new GrepQuery().param(...params); @@ -14789,6 +14825,7 @@ var api_exports = {}; __export(api_exports, { CheckRepoActions: () => CheckRepoActions, CleanOptions: () => CleanOptions, + DiffNameStatus: () => DiffNameStatus, GitConfigScope: () => GitConfigScope, GitConstructError: () => GitConstructError, GitError: () => GitError, @@ -14810,6 +14847,7 @@ var init_api = __esm({ init_check_is_repo(); init_clean(); init_config(); + init_diff_name_status(); init_grep(); init_reset(); } @@ -15865,6 +15903,7 @@ var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { init_log_format(); init_DiffSummary(); + init_diff_name_status(); init_utils(); statParser = [ new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { @@ -15930,11 +15969,12 @@ var init_parse_diff_summary = __esm({ }) ]; nameStatusParser = [ - new LineParser(/([ACDMRTUXB])\s*(.+)$/, (result, [_status, file]) => { + new LineParser(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, (result, [status, _similarity, from, _to, to]) => { result.changed++; result.files.push({ - file, + file: to != null ? to : from, changes: 0, + status: orVoid(isDiffNameStatus(status) && status), insertions: 0, deletions: 0, binary: false @@ -41072,17 +41112,47 @@ function wrappy (fn, cb) { /***/ }), /***/ 5778: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Configuration = void 0; /* * SPDX-FileCopyrightText: 2023 Kevin de Jong * SPDX-License-Identifier: MIT */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Configuration = void 0; +const assert_1 = __importDefault(__nccwpck_require__(9491)); +const core = __importStar(__nccwpck_require__(2186)); +const github = __importStar(__nccwpck_require__(5438)); const datasources_1 = __nccwpck_require__(1751); +const repository = __importStar(__nccwpck_require__(259)); /** * Configuration class * @class Configuration @@ -41095,6 +41165,7 @@ class Configuration { static _instance; includeCommits = false; includePullRequest = false; + updatePullRequestLabels = false; scopes; types; static getInstance() { @@ -41131,23 +41202,48 @@ class Configuration { */ async fromDatasource(datasource, configPath) { const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); - if (!content) - return this; + const config = content ? JSON.parse(content) : {}; if (datasource instanceof datasources_1.GitSource || datasource instanceof datasources_1.FileSource) { this.includeCommits = true; this.includePullRequest = false; + this.updatePullRequestLabels = false; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); } else if (datasource instanceof datasources_1.GitHubSource) { - this.includePullRequest = true; + const hasIncludeCommitsInput = core.getInput("include-commits") !== ""; + const hasPullRequestLabelsInput = core.getInput("update-labels") !== ""; + const autoDetectIncludeCommits = !hasIncludeCommitsInput && config.githubAction?.includeCommits === undefined; + if (autoDetectIncludeCommits) { + (0, assert_1.default)(github.context.payload.pull_request); + repository.checkConfiguration(github.context.payload.pull_request.base.repo); + this.includeCommits = github.context.payload.pull_request.base.repo.allow_rebase_merge === true; + } + else { + this.includeCommits = hasIncludeCommitsInput + ? core.getBooleanInput("include-commits") + : config.githubAction?.includeCommits ?? false; + } + this.includePullRequest = config.githubAction?.includePullRequest ?? true; + if (core.getMultilineInput("scopes").length > 0) { + this.addScopes(core.getMultilineInput("scopes")); + } + else { + this.addScopes(config.scopes ?? []); + } + if (core.getMultilineInput("types").length > 0) { + this.addTypes(core.getMultilineInput("types")); + } + else { + this.addTypes(config.types ?? []); + } + this.updatePullRequestLabels = hasPullRequestLabelsInput + ? core.getBooleanInput("update-labels") + : config.githubAction?.updatePullRequestLabels ?? false; } else { throw new Error("Unsupported data source"); } - const config = JSON.parse(content); - this.includeCommits = config.includeCommits ?? this.includeCommits; - this.includePullRequest = config.includePullRequest ?? this.includePullRequest; - this.addScopes(config.scopes ?? []); - this.addTypes(config.types ?? []); return this; } } @@ -41349,6 +41445,78 @@ program program.parse(process.argv); +/***/ }), + +/***/ 259: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkConfiguration = void 0; +const core = __importStar(__nccwpck_require__(2186)); +/** + * Checks the repository merge configuration; + * - Whether merge commits are enabled and whether the default subject is based on the Pull Request title + * - Whether squash commits are enabled and whether the default subject is based on the Pull Request title + * - Whether rebase commits are enabled + */ +function checkConfiguration(repository) { + if (repository.allow_merge_commit === undefined || + repository.allow_squash_merge === undefined || + repository.allow_rebase_merge === undefined) { + throw new Error("❌ CommitMe is not configured correctly. Please provide either:\n - The `contents: write` permission, or\n - Use the `include-commits` input parameter."); + } + if (repository.allow_merge_commit) { + core.info(repository.merge_commit_title === "PR_TITLE" + ? "✅ Default merge commit subject will use the Pull Request title." + : "⚠️ Default merge commit subject is not based on your Pull Request title."); + } + else { + core.info("ℹ️ Merge commit strategy is disabled."); + } + if (repository.allow_squash_merge === true) { + core.info(repository.squash_merge_commit_title === "PR_TITLE" + ? "✅ Default squash commit subject will use the Pull Request title." + : "⚠️ Default squash commit subject is based on either your Commit message or Pull Request title."); + } + else { + core.info("ℹ️ Squash commit strategy is disabled."); + } + core.info(repository.allow_rebase_merge === true + ? "ℹ️ Rebase merges are enabled, validating both Pull Request title and all associated commits." + : "ℹ️ Rebase merges are disabled, only validating the Pull Request title."); +} +exports.checkConfiguration = checkConfiguration; + + /***/ }), /***/ 4630: @@ -41397,7 +41565,7 @@ function validatePullRequest(pullrequest, commits) { const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { - text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, + text: `A Pull Request MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, }) diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 9136523..6b74f96 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2155,9 +2155,15 @@ class Commit { * @returns The commit object */ static fromString(props) { + // Git will trim all comments (lines starting with #), so we do the same + // to ensure the commit message is parsed correctly. + const trimmedMessage = props.message + .split(/\r?\n/) + .filter(line => !line.startsWith("#")) + .join("\n"); const commit = { hash: props.hash, - ...parseCommitMessage(props.message), + ...parseCommitMessage(trimmedMessage), author: props.author, committer: props.committer, raw: props.message, @@ -13966,6 +13972,12 @@ function pick(source, properties) { function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); } +function orVoid(input) { + if (input === false) { + return void 0; + } + return input; +} var import_file_exists, NULL, NOOP, objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { @@ -14232,6 +14244,7 @@ __export(utils_exports, { isUserFunction: () => isUserFunction, last: () => last, objectToString: () => objectToString, + orVoid: () => orVoid, parseStringResponse: () => parseStringResponse, pick: () => pick, prefixedArray: () => prefixedArray, @@ -14666,6 +14679,29 @@ var init_config = __esm({ } }); +// src/lib/tasks/diff-name-status.ts +function isDiffNameStatus(input) { + return diffNameStatus.has(input); +} +var DiffNameStatus, diffNameStatus; +var init_diff_name_status = __esm({ + "src/lib/tasks/diff-name-status.ts"() { + DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus2) => { + DiffNameStatus2["ADDED"] = "A"; + DiffNameStatus2["COPIED"] = "C"; + DiffNameStatus2["DELETED"] = "D"; + DiffNameStatus2["MODIFIED"] = "M"; + DiffNameStatus2["RENAMED"] = "R"; + DiffNameStatus2["CHANGED"] = "T"; + DiffNameStatus2["UNMERGED"] = "U"; + DiffNameStatus2["UNKNOWN"] = "X"; + DiffNameStatus2["BROKEN"] = "B"; + return DiffNameStatus2; + })(DiffNameStatus || {}); + diffNameStatus = new Set(Object.values(DiffNameStatus)); + } +}); + // src/lib/tasks/grep.ts function grepQueryBuilder(...params) { return new GrepQuery().param(...params); @@ -14789,6 +14825,7 @@ var api_exports = {}; __export(api_exports, { CheckRepoActions: () => CheckRepoActions, CleanOptions: () => CleanOptions, + DiffNameStatus: () => DiffNameStatus, GitConfigScope: () => GitConfigScope, GitConstructError: () => GitConstructError, GitError: () => GitError, @@ -14810,6 +14847,7 @@ var init_api = __esm({ init_check_is_repo(); init_clean(); init_config(); + init_diff_name_status(); init_grep(); init_reset(); } @@ -15865,6 +15903,7 @@ var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { init_log_format(); init_DiffSummary(); + init_diff_name_status(); init_utils(); statParser = [ new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { @@ -15930,11 +15969,12 @@ var init_parse_diff_summary = __esm({ }) ]; nameStatusParser = [ - new LineParser(/([ACDMRTUXB])\s*(.+)$/, (result, [_status, file]) => { + new LineParser(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, (result, [status, _similarity, from, _to, to]) => { result.changed++; result.files.push({ - file, + file: to != null ? to : from, changes: 0, + status: orVoid(isDiffNameStatus(status) && status), insertions: 0, deletions: 0, binary: false @@ -41072,17 +41112,47 @@ function wrappy (fn, cb) { /***/ }), /***/ 5778: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Configuration = void 0; /* * SPDX-FileCopyrightText: 2023 Kevin de Jong * SPDX-License-Identifier: MIT */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Configuration = void 0; +const assert_1 = __importDefault(__nccwpck_require__(9491)); +const core = __importStar(__nccwpck_require__(2186)); +const github = __importStar(__nccwpck_require__(5438)); const datasources_1 = __nccwpck_require__(1751); +const repository = __importStar(__nccwpck_require__(259)); /** * Configuration class * @class Configuration @@ -41095,6 +41165,7 @@ class Configuration { static _instance; includeCommits = false; includePullRequest = false; + updatePullRequestLabels = false; scopes; types; static getInstance() { @@ -41131,23 +41202,48 @@ class Configuration { */ async fromDatasource(datasource, configPath) { const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); - if (!content) - return this; + const config = content ? JSON.parse(content) : {}; if (datasource instanceof datasources_1.GitSource || datasource instanceof datasources_1.FileSource) { this.includeCommits = true; this.includePullRequest = false; + this.updatePullRequestLabels = false; + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); } else if (datasource instanceof datasources_1.GitHubSource) { - this.includePullRequest = true; + const hasIncludeCommitsInput = core.getInput("include-commits") !== ""; + const hasPullRequestLabelsInput = core.getInput("update-labels") !== ""; + const autoDetectIncludeCommits = !hasIncludeCommitsInput && config.githubAction?.includeCommits === undefined; + if (autoDetectIncludeCommits) { + (0, assert_1.default)(github.context.payload.pull_request); + repository.checkConfiguration(github.context.payload.pull_request.base.repo); + this.includeCommits = github.context.payload.pull_request.base.repo.allow_rebase_merge === true; + } + else { + this.includeCommits = hasIncludeCommitsInput + ? core.getBooleanInput("include-commits") + : config.githubAction?.includeCommits ?? false; + } + this.includePullRequest = config.githubAction?.includePullRequest ?? true; + if (core.getMultilineInput("scopes").length > 0) { + this.addScopes(core.getMultilineInput("scopes")); + } + else { + this.addScopes(config.scopes ?? []); + } + if (core.getMultilineInput("types").length > 0) { + this.addTypes(core.getMultilineInput("types")); + } + else { + this.addTypes(config.types ?? []); + } + this.updatePullRequestLabels = hasPullRequestLabelsInput + ? core.getBooleanInput("update-labels") + : config.githubAction?.updatePullRequestLabels ?? false; } else { throw new Error("Unsupported data source"); } - const config = JSON.parse(content); - this.includeCommits = config.includeCommits ?? this.includeCommits; - this.includePullRequest = config.includePullRequest ?? this.includePullRequest; - this.addScopes(config.scopes ?? []); - this.addTypes(config.types ?? []); return this; } } @@ -41332,6 +41428,78 @@ program program.parse(process.argv); +/***/ }), + +/***/ 259: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* + * SPDX-FileCopyrightText: 2023 Kevin de Jong + * SPDX-License-Identifier: MIT + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkConfiguration = void 0; +const core = __importStar(__nccwpck_require__(2186)); +/** + * Checks the repository merge configuration; + * - Whether merge commits are enabled and whether the default subject is based on the Pull Request title + * - Whether squash commits are enabled and whether the default subject is based on the Pull Request title + * - Whether rebase commits are enabled + */ +function checkConfiguration(repository) { + if (repository.allow_merge_commit === undefined || + repository.allow_squash_merge === undefined || + repository.allow_rebase_merge === undefined) { + throw new Error("❌ CommitMe is not configured correctly. Please provide either:\n - The `contents: write` permission, or\n - Use the `include-commits` input parameter."); + } + if (repository.allow_merge_commit) { + core.info(repository.merge_commit_title === "PR_TITLE" + ? "✅ Default merge commit subject will use the Pull Request title." + : "⚠️ Default merge commit subject is not based on your Pull Request title."); + } + else { + core.info("ℹ️ Merge commit strategy is disabled."); + } + if (repository.allow_squash_merge === true) { + core.info(repository.squash_merge_commit_title === "PR_TITLE" + ? "✅ Default squash commit subject will use the Pull Request title." + : "⚠️ Default squash commit subject is based on either your Commit message or Pull Request title."); + } + else { + core.info("ℹ️ Squash commit strategy is disabled."); + } + core.info(repository.allow_rebase_merge === true + ? "ℹ️ Rebase merges are enabled, validating both Pull Request title and all associated commits." + : "ℹ️ Rebase merges are disabled, only validating the Pull Request title."); +} +exports.checkConfiguration = checkConfiguration; + + /***/ }), /***/ 4630: @@ -41380,7 +41548,7 @@ function validatePullRequest(pullrequest, commits) { const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { - text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, + text: `A Pull Request MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, }) diff --git a/src/configuration.ts b/src/configuration.ts index 483c1f0..65450af 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -2,10 +2,14 @@ * SPDX-FileCopyrightText: 2023 Kevin de Jong * SPDX-License-Identifier: MIT */ +import assert from "assert"; +import * as core from "@actions/core"; +import * as github from "@actions/github"; import { IConventionalCommitOptions } from "@dev-build-deploy/commit-it"; import { FileSource, GitHubSource, GitSource, IDataSource } from "./datasources"; +import * as repository from "./repository"; /** * Configuration class @@ -20,6 +24,7 @@ class Configuration implements IConventionalCommitOptions { includeCommits = false; includePullRequest = false; + updatePullRequestLabels = false; scopes?: string[]; types?: string[]; @@ -59,23 +64,51 @@ class Configuration implements IConventionalCommitOptions { */ async fromDatasource(datasource: IDataSource, configPath?: string): Promise { const content = await datasource.getConfigurationFile(configPath ?? ".commit-me.json"); - if (!content) return this; + const config = content ? JSON.parse(content) : {}; if (datasource instanceof GitSource || datasource instanceof FileSource) { this.includeCommits = true; this.includePullRequest = false; + this.updatePullRequestLabels = false; + + this.addScopes(config.scopes ?? []); + this.addTypes(config.types ?? []); } else if (datasource instanceof GitHubSource) { - this.includePullRequest = true; + const hasIncludeCommitsInput = core.getInput("include-commits") !== ""; + const hasPullRequestLabelsInput = core.getInput("update-labels") !== ""; + + const autoDetectIncludeCommits = !hasIncludeCommitsInput && config.githubAction?.includeCommits === undefined; + + if (autoDetectIncludeCommits) { + assert(github.context.payload.pull_request); + repository.checkConfiguration(github.context.payload.pull_request.base.repo); + this.includeCommits = github.context.payload.pull_request.base.repo.allow_rebase_merge === true; + } else { + this.includeCommits = hasIncludeCommitsInput + ? core.getBooleanInput("include-commits") + : config.githubAction?.includeCommits ?? false; + } + this.includePullRequest = config.githubAction?.includePullRequest ?? true; + + if (core.getMultilineInput("scopes").length > 0) { + this.addScopes(core.getMultilineInput("scopes")); + } else { + this.addScopes(config.scopes ?? []); + } + + if (core.getMultilineInput("types").length > 0) { + this.addTypes(core.getMultilineInput("types")); + } else { + this.addTypes(config.types ?? []); + } + + this.updatePullRequestLabels = hasPullRequestLabelsInput + ? core.getBooleanInput("update-labels") + : config.githubAction?.updatePullRequestLabels ?? false; } else { throw new Error("Unsupported data source"); } - const config = JSON.parse(content); - this.includeCommits = config.includeCommits ?? this.includeCommits; - this.includePullRequest = config.includePullRequest ?? this.includePullRequest; - this.addScopes(config.scopes ?? []); - this.addTypes(config.types ?? []); - return this; } } diff --git a/src/entrypoints/action.ts b/src/entrypoints/action.ts index 7034b46..577cde5 100644 --- a/src/entrypoints/action.ts +++ b/src/entrypoints/action.ts @@ -10,9 +10,8 @@ import * as github from "@actions/github"; import { Commit, ConventionalCommit } from "@dev-build-deploy/commit-it"; import { Configuration } from "../configuration"; -import { GitHubSource, IDataSource } from "../datasources"; +import { GitHubSource } from "../datasources"; import { updatePullRequestLabels } from "../github"; -import * as repository from "../repository"; import { validateCommits, validatePullRequest } from "../validator"; /** @@ -55,31 +54,17 @@ const reportErrorMessages = (results: ConventionalCommit[]): { errors: number; w return { errors: errorCount, warnings: warningCount }; }; -const setConfiguration = async (dataSource: IDataSource): Promise => { - assert(github.context.payload.pull_request); - - const pullrequestOnly = core.getInput("include-commits") - ? !core.getBooleanInput("include-commits") - : github.context.payload.pull_request.base.repo.allow_rebase_merge === false; - - // Set the global configuration - const config = await Configuration.getInstance().fromDatasource(dataSource, core.getInput("config") || undefined); - config.includeCommits = !pullrequestOnly; - config.addScopes(core.getMultilineInput("scopes") ?? []); - config.addTypes(core.getMultilineInput("types") ?? []); -}; - /** * Main entry point for the GitHub Action. */ async function run(): Promise { try { core.info("📄 CommitMe - Conventional Commit compliance validation"); - const datasource = new GitHubSource(); - await setConfiguration(datasource); core.startGroup("📝 Checking repository configuration"); - const config = Configuration.getInstance(); + const datasource = new GitHubSource(); + const config = await Configuration.getInstance().fromDatasource(datasource, core.getInput("config") || undefined); + const githubToken = core.getInput("token") ?? undefined; assert(github.context.payload.pull_request); @@ -94,14 +79,20 @@ async function run(): Promise { return; } - if (core.getInput("include-commits") === undefined) { - repository.checkConfiguration(github.context.payload.pull_request.base.repo); + if (config.includeCommits === true) { + if (config.includePullRequest === true) { + core.info("ℹ️ Validating both Pull Request and all associated commits."); + } else { + core.info("ℹ️ Only validating the commits associated with the Pull Request."); + } } else { - core.info( - config.includeCommits === true - ? "ℹ️ Validating both Pull Request title and all associated commits." - : "ℹ️ Only validating the Pull Request title." - ); + if (config.includePullRequest === true) { + core.info("ℹ️ Only validating the Pull Request."); + } else { + core.setFailed( + "❌ The current configuration of CommitMe does not validate either Pull Request or the associated commits." + ); + } } // Setting up the environment @@ -151,7 +142,7 @@ async function run(): Promise { // Updating the pull request label if (githubToken === undefined) { core.warning("⚠️ The token input is required to update the pull request label."); - } else if (core.getBooleanInput("update-labels") === true) { + } else if (config.updatePullRequestLabels === true) { const label = await determineLabel(allResults); if (label !== undefined) await updatePullRequestLabels(label); } diff --git a/src/validator.ts b/src/validator.ts index 4ec64ac..e1cf8ec 100644 --- a/src/validator.ts +++ b/src/validator.ts @@ -42,7 +42,7 @@ export function validatePullRequest(pullrequest: Commit, commits: ConventionalCo if (pullRequestValue < commitsValue) { result.errors.push( DiagnosticsMessage.createError(result.hash, { - text: `A Pull Request title MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, + text: `A Pull Request MUST correlate with a Semantic Versioning identifier (\`MAJOR\`, \`MINOR\`, or \`PATCH\`) with the same or higher precedence than its associated commits`, linenumber: 1, column: 1, }) diff --git a/test/configuration.test.ts b/test/configuration.test.ts new file mode 100644 index 0000000..90bfcb3 --- /dev/null +++ b/test/configuration.test.ts @@ -0,0 +1,258 @@ +/* + * SPDX-FileCopyrightText: 2024 Kevin de Jong + * SPDX-License-Identifier: MIT + */ + +import * as core from "@actions/core"; +import * as github from "@actions/github"; + +import { Configuration } from "../src/configuration"; +import { FileSource, GitHubSource, GitSource } from "../src/datasources"; + +jest.mock("../src/datasources"); + +describe("FileSource", () => { + test("No Configuration file", async () => { + const config = new Configuration(); + await config.fromDatasource(new FileSource("")); + + expect(config.includeCommits).toBe(true); + expect(config.includePullRequest).toBe(false); + expect(config.updatePullRequestLabels).toBe(false); + expect(config.scopes).toStrictEqual([]); + expect(config.types).toStrictEqual([]); + }); + + test("Configuration file", async () => { + const config = new Configuration(); + + const datasource = new FileSource(""); + // Mock the getConfigurationFile method + datasource.getConfigurationFile = jest.fn().mockResolvedValue(`{ + "includeCommits": false, + "includePullRequest": true, + "updatePullRequestLabels": true, + "scopes": ["test-scope"], + "types": ["test-type"] + }`); + await config.fromDatasource(datasource, "configuration.json"); + + // These will be ignored as they only apply for GitHub Actions + expect(config.includeCommits).toBe(true); + expect(config.includePullRequest).toBe(false); + expect(config.updatePullRequestLabels).toBe(false); + + // These will be set + expect(config.scopes).toStrictEqual(["test-scope"]); + expect(config.types).toStrictEqual(["test-type"]); + }); +}); + +describe("GitSource", () => { + test("No Configuration file", async () => { + const config = new Configuration(); + await config.fromDatasource(new GitSource()); + + expect(config.includeCommits).toBe(true); + expect(config.includePullRequest).toBe(false); + expect(config.updatePullRequestLabels).toBe(false); + expect(config.scopes).toStrictEqual([]); + expect(config.types).toStrictEqual([]); + }); + + test("Configuration file", async () => { + const config = new Configuration(); + + const datasource = new GitSource(); + // Mock the getConfigurationFile method + datasource.getConfigurationFile = jest.fn().mockResolvedValue(`{ + "githubAction": { + "includeCommits": false, + "includePullRequest": true, + "updatePullRequestLabels": true + }, + "scopes": ["test-scope"], + "types": ["test-type"] + }`); + await config.fromDatasource(datasource, "configuration.json"); + + // These will be ignored as they only apply for GitHub Actions + expect(config.includeCommits).toBe(true); + expect(config.includePullRequest).toBe(false); + expect(config.updatePullRequestLabels).toBe(false); + + // These will be set + expect(config.scopes).toStrictEqual(["test-scope"]); + expect(config.types).toStrictEqual(["test-type"]); + }); +}); + +describe("GitHubSource", () => { + test("Auto Detect: No merge strategy configuration", async () => { + // Disable the GitHub Action inputs + jest.spyOn(core, "getInput").mockReturnValue(""); + jest.spyOn(core, "getBooleanInput").mockReturnValue(false); + + // Set the payload + github.context.payload.pull_request = { number: 1, base: { repo: {} } }; + + const config = new Configuration(); + await expect(config.fromDatasource(new GitHubSource())).rejects.toThrow(); + }); + + test("Auto Detect: allow rebase merge", async () => { + // Disable the GitHub Action inputs + jest.spyOn(core, "getInput").mockReturnValue(""); + jest.spyOn(core, "getBooleanInput").mockReturnValue(false); + + // Set the payload + github.context.payload.pull_request = { + number: 1, + base: { repo: { allow_merge_commit: true, allow_squash_merge: true, allow_rebase_merge: true } }, + }; + + const config = new Configuration(); + await config.fromDatasource(new GitHubSource()); + + expect(config.includeCommits).toBe(true); + }); + + test("Auto Detect: disallow rebase merge", async () => { + // Disable the GitHub Action inputs + jest.spyOn(core, "getInput").mockReturnValue(""); + jest.spyOn(core, "getBooleanInput").mockReturnValue(false); + + // Set the payload + github.context.payload.pull_request = { + number: 1, + base: { repo: { allow_merge_commit: true, allow_squash_merge: true, allow_rebase_merge: false } }, + }; + + const config = new Configuration(); + await config.fromDatasource(new GitHubSource()); + + expect(config.includeCommits).toBe(false); + }); + + test("Configuration file only", async () => { + // Disable the GitHub Action inputs + jest.spyOn(core, "getInput").mockReturnValue(""); + jest.spyOn(core, "getBooleanInput").mockReturnValue(false); + + const datasource = new GitHubSource(); + datasource.getConfigurationFile = jest.fn().mockResolvedValue(`{ + "githubAction": { + "includeCommits": true, + "includePullRequest": true, + "updatePullRequestLabels": true + }, + "scopes": ["test-scope"], + "types": ["test-type"] + }`); + + // Set the payload + github.context.payload.pull_request = { + number: 1, + base: { repo: { allow_merge_commit: true, allow_squash_merge: true, allow_rebase_merge: false } }, + }; + + const config = new Configuration(); + await config.fromDatasource(datasource, "configuration.json"); + + // GitHub Actions configuration items + expect(config.includeCommits).toBe(true); + expect(config.includePullRequest).toBe(true); + expect(config.updatePullRequestLabels).toBe(true); + + // Generic configuration items + expect(config.scopes).toStrictEqual(["test-scope"]); + expect(config.types).toStrictEqual(["test-type"]); + }); + + test("Inputs only", async () => { + jest.spyOn(core, "getInput").mockImplementation((name: string) => { + if (name === "include-commits") return "true"; + if (name === "update-labels") return "true"; + return ""; + }); + + jest.spyOn(core, "getBooleanInput").mockImplementation((name: string) => { + if (name === "include-commits") return true; + if (name === "update-labels") return true; + return false; + }); + + jest.spyOn(core, "getMultilineInput").mockImplementation((name: string) => { + if (name === "scopes") return ["test-scope"]; + if (name === "types") return ["test-type"]; + return []; + }); + + // Set the payload + github.context.payload.pull_request = { + number: 1, + base: { repo: { allow_merge_commit: true, allow_squash_merge: true, allow_rebase_merge: false } }, + }; + + const config = new Configuration(); + await config.fromDatasource(new GitHubSource()); + + // GitHub Actions configuration items + expect(config.includeCommits).toBe(true); + expect(config.includePullRequest).toBe(true); + expect(config.updatePullRequestLabels).toBe(true); + + // Generic configuration items + expect(config.scopes).toStrictEqual(["test-scope"]); + expect(config.types).toStrictEqual(["test-type"]); + }); + + test("Inputs and Configuration", async () => { + jest.spyOn(core, "getInput").mockImplementation((name: string) => { + if (name === "include-commits") return "false"; + if (name === "update-labels") return "false"; + return ""; + }); + + jest.spyOn(core, "getBooleanInput").mockImplementation((name: string) => { + if (name === "include-commits") return false; + if (name === "update-labels") return false; + return false; + }); + + jest.spyOn(core, "getMultilineInput").mockImplementation((name: string) => { + if (name === "scopes") return ["test-scope"]; + if (name === "types") return ["test-type"]; + return []; + }); + + const datasource = new GitHubSource(); + datasource.getConfigurationFile = jest.fn().mockResolvedValue(`{ + "githubAction": { + "includeCommits": true, + "includePullRequest": true, + "updatePullRequestLabels": true + }, + "scopes": ["wrong-scope"], + "types": ["wrong-type"] + }`); + + // Set the payload + github.context.payload.pull_request = { + number: 1, + base: { repo: { allow_merge_commit: true, allow_squash_merge: true, allow_rebase_merge: false } }, + }; + + const config = new Configuration(); + await config.fromDatasource(datasource); + + // GitHub Actions configuration items + expect(config.includeCommits).toBe(false); + expect(config.includePullRequest).toBe(true); + expect(config.updatePullRequestLabels).toBe(false); + + // Generic configuration items + expect(config.scopes).toStrictEqual(["test-scope"]); + expect(config.types).toStrictEqual(["test-type"]); + }); +}); diff --git a/test/validator.test.ts b/test/validator.test.ts index 133ed1b..55b10b6 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -59,19 +59,10 @@ BREAKING CHANGE: this will be ignored and raise a warning... test("Valid Pull Request message", () => { const result = validator.validatePullRequest( - Commit.fromString({ - hash: "0a0b0c0d", - message: "feat: Add new feature", - }), + Commit.fromString({ hash: "0a0b0c0d", message: "feat: Add new feature" }), [ - ConventionalCommit.fromString({ - hash: "0a0b0c0d", - message: "feat: Add new feature", - }), - ConventionalCommit.fromString({ - hash: "0a0b0c0d", - message: "fix: Fixed a bug", - }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: Add new feature" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "fix: Fixed a bug" }), ] ); @@ -96,56 +87,103 @@ BREAKING CHANGE: this will be ignored and raise a warning... // Scope is not a noun expect(result.errors.length).toBe(2); }); +}); - test("Pull Request > Commits", () => { - const result = validator.validatePullRequest( - Commit.fromString({ +describe("Validate Pull Request version bump", () => { + const testData = [ + { + description: "Pull Request < Commit", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + commits: [ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" })], + error: true, + }, + { + description: "Pull Request < Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" }), + ], + error: true, + }, + { + description: "Pull Request === Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "chore!: silly change" }), + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat!: add new feature" }), + ], + error: false, + }, + { + description: "Pull Request === Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: add a new feature" }), + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" }), + ], + error: false, + }, + { + description: "Pull Request === Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", - message: "feat!: Add new breaking change", + message: "feat: add a new feature\n\nBREAKING-CHANGE: This is breaking", }), - [ - ConventionalCommit.fromString({ - hash: "0a0b0c0d", - message: "feat: Add new feature", - }), - ] - ); - - expect(result.errors.length).toBe(0); - }); - - test("Pull Request === Commits", () => { - const result = validator.validatePullRequest( - Commit.fromString({ + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat!: add new feature" }), + ], + error: false, + }, + { + description: "Pull Request === Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", - message: "feat: Add new feature", + message: "feat: add a new feature\n\nBREAKING-CHANGE: This is breaking", }), - [ + commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", - message: "feat: Add new feature", + message: "chore: silly change\n\nBREAKING CHANGE: This is breaking?", }), - ] - ); - - expect(result.errors.length).toBe(0); - }); - - test("Pull Request < Commits", () => { - const result = validator.validatePullRequest( - Commit.fromString({ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" }), + ], + error: false, + }, + { + description: "Pull Request > Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", - message: "chore: Add new breaking change", + message: "fix: add fix\n\nBREAKING-CHANGE: This is breaking", }), - [ - ConventionalCommit.fromString({ - hash: "0a0b0c0d", - message: "feat: Add new feature", - }), - ] - ); - - // Pull Request < Commits - expect(result.errors.length).toBe(1); + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "fix: fixed a bug" }), + ], + error: false, + }, + { + description: "Pull Request > Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: add a new feature" }), + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "fix: fixed a bug" }), + ], + error: false, + }, + ]; + + it.each(testData)("$test.description", test => { + const result = validator.validatePullRequest(test.pullRequest, test.commits); + + if (test.error) { + expect(result.errors.length).toBe(1); + expect(result.errors[0].message.text).toBe( + "A Pull Request MUST correlate with a Semantic Versioning identifier (`MAJOR`, `MINOR`, or `PATCH`) with the same or higher precedence than its associated commits" + ); + } else { + expect(result.errors.length).toBe(0); + } }); }); From ffee899855a302c2e290dd51723c8f2c47472a2b Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Wed, 17 Jan 2024 13:48:24 +0100 Subject: [PATCH 08/25] fix: prevent failure when comparing PR against non-compliant commits This commit prevents the error... ``` Cannot read properties of undefined (reading 'breaking') ``` ...when validating both the Pull Request and its associated commits, where the associated commits are all non-compliant with Conventional Commits. --- lib/action/index.js | 4 + lib/cli/index.js | 4 + lib/precommit/index.js | 4 + package-lock.json | 409 ++++++++++++++++++++++++++--------------- src/validator.ts | 4 + test/validator.test.ts | 62 ++++++- 6 files changed, 332 insertions(+), 155 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index f365448..1bf625f 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -41727,6 +41727,10 @@ function validatePullRequest(pullrequest, commits) { }; const pullRequestValue = orderValue(result); const validConventionalCommits = commits.filter(commit => commit.isValid); + // No valid commits found, return the pull request validation result + if (validConventionalCommits.length === 0) + return result; + // Sort the commits by order of precedence (SemVer) and validate against the Pull Request (SemVer) const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { diff --git a/lib/cli/index.js b/lib/cli/index.js index 5feb295..ead4acc 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -41562,6 +41562,10 @@ function validatePullRequest(pullrequest, commits) { }; const pullRequestValue = orderValue(result); const validConventionalCommits = commits.filter(commit => commit.isValid); + // No valid commits found, return the pull request validation result + if (validConventionalCommits.length === 0) + return result; + // Sort the commits by order of precedence (SemVer) and validate against the Pull Request (SemVer) const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 6b74f96..162499c 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -41545,6 +41545,10 @@ function validatePullRequest(pullrequest, commits) { }; const pullRequestValue = orderValue(result); const validConventionalCommits = commits.filter(commit => commit.isValid); + // No valid commits found, return the pull request validation result + if (validConventionalCommits.length === 0) + return result; + // Sort the commits by order of precedence (SemVer) and validate against the Pull Request (SemVer) const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { result.errors.push(diagnose_it_1.DiagnosticsMessage.createError(result.hash, { diff --git a/package-lock.json b/package-lock.json index ff78745..e3eb5d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -187,9 +187,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -197,10 +197,10 @@ "@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/helpers": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -391,13 +391,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" }, "engines": { @@ -693,9 +693,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -743,9 +743,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.0.3.tgz", - "integrity": "sha512-snSsstI8kytKXmEY5MXxj0pYM2t1JD0uf2uOTQSgHg6pKfC1A8YeiCUFPqbNFSeALLI580RZ3FafTTvU+Gyjyw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.0.4.tgz", + "integrity": "sha512-yhAj8RH0c8w4VCGYbt77JnRxemb/uwQrC/LpHEs0euiCTooTZW8VTGXgsOH/KnJC0lHeSoIHNF/Axk2UPSnU9A==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" @@ -819,6 +819,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "8.56.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", @@ -837,19 +859,41 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -864,9 +908,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1294,9 +1338,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", + "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1532,9 +1576,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -1596,9 +1640,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", - "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "version": "18.19.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.8.tgz", + "integrity": "sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1643,16 +1687,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", - "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz", + "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/type-utils": "6.14.0", - "@typescript-eslint/utils": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/type-utils": "6.19.0", + "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1678,15 +1722,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", + "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4" }, "engines": { @@ -1706,13 +1750,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", + "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1723,13 +1767,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", - "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", + "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/utils": "6.19.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1750,9 +1794,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", + "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1763,16 +1807,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", + "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -1790,17 +1835,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", + "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", "semver": "^7.5.4" }, "engines": { @@ -1815,12 +1860,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", + "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/types": "6.19.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1847,9 +1892,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2209,13 +2254,12 @@ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2322,9 +2366,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001578", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001578.tgz", + "integrity": "sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==", "dev": true, "funding": [ { @@ -2619,9 +2663,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", + "version": "1.4.635", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.635.tgz", + "integrity": "sha512-iu/2D0zolKU3iDGXXxdOzNf72Jnokn+K1IN6Kk4iV6l1Tr2g/qy+mvmtfAiBwZe5S3aB5r92vp+zSZ69scYRrg==", "dev": true }, "node_modules/emittery": { @@ -2935,6 +2979,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -2956,6 +3010,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2966,9 +3032,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", - "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "version": "27.6.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", + "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -3140,6 +3206,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -3307,9 +3395,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3563,6 +3651,28 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -4962,15 +5072,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -5066,30 +5179,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm-run-all2/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-run-all2/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -5448,9 +5537,9 @@ } }, "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", + "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5620,9 +5709,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -5771,13 +5860,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -5789,15 +5878,18 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", + "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5836,15 +5928,16 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dev": true, "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5915,9 +6008,9 @@ "dev": true }, "node_modules/simple-git": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.21.0.tgz", - "integrity": "sha512-oTzw9248AF5bDTMk9MrxsRzEzivMlY+DWH0yWS4VYpMhNLhDWnN06pCtaUyPnqv/FpsdeNmRqmZugMABHRPdDA==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -6181,6 +6274,28 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/src/validator.ts b/src/validator.ts index e1cf8ec..7596456 100644 --- a/src/validator.ts +++ b/src/validator.ts @@ -37,6 +37,10 @@ export function validatePullRequest(pullrequest: Commit, commits: ConventionalCo const pullRequestValue = orderValue(result); const validConventionalCommits = commits.filter(commit => commit.isValid); + // No valid commits found, return the pull request validation result + if (validConventionalCommits.length === 0) return result; + + // Sort the commits by order of precedence (SemVer) and validate against the Pull Request (SemVer) const commitsValue = orderValue(validConventionalCommits.sort((a, b) => (orderValue(a) < orderValue(b) ? 1 : -1))[0]); if (pullRequestValue < commitsValue) { diff --git a/test/validator.test.ts b/test/validator.test.ts index 55b10b6..b86da81 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -89,7 +89,47 @@ BREAKING CHANGE: this will be ignored and raise a warning... }); }); -describe("Validate Pull Request version bump", () => { +describe("Validate invalid Pull Request vs Commits", () => { + const testData = [ + { + description: "Invalid Pull Request", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat (no noun): Add new feature" }), + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" }), + ], + errorCount: 2, + }, + { + description: "Valid and Invalid Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: Add new feature" }), + commits: [ + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat (no noun)!: silly change" }), + ], + errorCount: 0, + }, + { + description: "Only Invalid Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: Add new feature" }), + commits: [ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat (no noun)!: silly change" })], + errorCount: 0, + }, + { + description: "No Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: Add new feature" }), + commits: [], + errorCount: 0, + }, + ]; + + it.each(testData)("$test.description", test => { + const result = validator.validatePullRequest(test.pullRequest, test.commits); + expect(result.errors.length).toBe(test.errorCount); + }); +}); + +describe("Validate valid Pull Request vs Commits", () => { const testData = [ { description: "Pull Request < Commit", @@ -107,7 +147,7 @@ describe("Validate Pull Request version bump", () => { error: true, }, { - description: "Pull Request === Commits", + description: "Breaking Pull Request === Breaking Commits", pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "chore!: silly change" }), commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), @@ -116,16 +156,22 @@ describe("Validate Pull Request version bump", () => { error: false, }, { - description: "Pull Request === Commits", + description: "Pull Request === Invalid Commits", pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: add a new feature" }), commits: [ - ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), - ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore (no noun): silly change" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "add new feature" }), ], error: false, }, { - description: "Pull Request === Commits", + description: "Pull Request === No Commits", + pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: add a new feature" }), + commits: [], + error: false, + }, + { + description: "Pull Request (BREAKING CHANGE) === Breaking Commits", pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: add a new feature\n\nBREAKING-CHANGE: This is breaking", @@ -137,7 +183,7 @@ describe("Validate Pull Request version bump", () => { error: false, }, { - description: "Pull Request === Commits", + description: "Pull Request (BREAKING CHANGE) === Commits (BREAKING CHANGE)", pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "feat: add a new feature\n\nBREAKING-CHANGE: This is breaking", @@ -152,7 +198,7 @@ describe("Validate Pull Request version bump", () => { error: false, }, { - description: "Pull Request > Commits", + description: "Pull Request (BREAKING CHANGE) > Commits", pullRequest: Commit.fromString({ hash: "0a0b0c0d", message: "fix: add fix\n\nBREAKING-CHANGE: This is breaking", From 78f24bec90a6f5a6565d1955ea9a71815dcebe11 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Wed, 17 Jan 2024 15:04:21 +0100 Subject: [PATCH 09/25] docs: update documentation to mention FORCE_COLOR for colored output --- docs/github-action.md | 6 ++++++ lib/action/index.js | 2 +- src/entrypoints/action.ts | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/github-action.md b/docs/github-action.md index fba371b..9d605bd 100644 --- a/docs/github-action.md +++ b/docs/github-action.md @@ -46,6 +46,9 @@ jobs: commit-me: name: Conventional Commits Compliance runs-on: ubuntu-latest + env: + # Enable colored output in GitHub Actions + FORCE_COLOR: 3 steps: - uses: dev-build-deploy/commit-me@v0 with: @@ -77,6 +80,9 @@ jobs: commit-me: name: Conventional Commits Compliance runs-on: ubuntu-latest + env: + # Enable colored output in GitHub Actions + FORCE_COLOR: 3 steps: - uses: dev-build-deploy/commit-me@v0 with: diff --git a/lib/action/index.js b/lib/action/index.js index 1bf625f..657eaa9 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -41506,7 +41506,7 @@ async function run() { if (config.includePullRequest === true) { core.startGroup(`🔎 Scanning Pull Request`); const resultPullrequest = (0, validator_1.validatePullRequest)(commit_it_1.Commit.fromString({ - hash: `#${github.context.payload.pull_request.number}`, + hash: `PullRequest`, message: [github.context.payload.pull_request.title, "", github.context.payload.pull_request.body].join("\n"), }), allResults); allResults.push(resultPullrequest); diff --git a/src/entrypoints/action.ts b/src/entrypoints/action.ts index 577cde5..feac7e5 100644 --- a/src/entrypoints/action.ts +++ b/src/entrypoints/action.ts @@ -110,7 +110,7 @@ async function run(): Promise { core.startGroup(`🔎 Scanning Pull Request`); const resultPullrequest = validatePullRequest( Commit.fromString({ - hash: `#${github.context.payload.pull_request.number}`, + hash: `PullRequest`, message: [github.context.payload.pull_request.title, "", github.context.payload.pull_request.body].join("\n"), }), allResults From b1dec93c1632e5bd1adb2e590a46a2e81d35bd8a Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Wed, 17 Jan 2024 21:28:27 +0100 Subject: [PATCH 10/25] fix: ignore both fixup! and merge commits This commit updates the ignore patterns for both `fixup!` and merge commits. The latter supports the default commit message subjects as generated by GitHub, GitLab and BitBucket. --- lib/action/index.js | 54 ++++++++++++++++++++++++++++++++++-------- lib/cli/index.js | 54 ++++++++++++++++++++++++++++++++++-------- lib/precommit/index.js | 54 ++++++++++++++++++++++++++++++++++-------- package-lock.json | 12 +++++----- src/validator.ts | 2 +- test/validator.test.ts | 20 ++++++++++++++++ 6 files changed, 159 insertions(+), 37 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index 657eaa9..e1dee17 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2190,6 +2190,12 @@ class Commit { get raw() { return this._commit.raw; } + get isFixupCommit() { + return this._commit.attributes.isFixup; + } + get isMergeCommit() { + return this._commit.attributes.isMerge; + } toJSON() { return this._commit; } @@ -2237,6 +2243,22 @@ function getFooterElementsFromParagraph(footer) { return Object.keys(result).length > 0 ? result : undefined; } exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; +/** + * Checks if the provided subject is a common (default) merge pattern. + * Currently supported: + * - GitHub + * - BitBucket + * - GitLab + * + * @param subject The subject to check + * @returns True if the subject is a common merge pattern, false otherwise + */ +function subjectIsMergePattern(subject) { + const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; + const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; + const gitlabMergeRegex = /^Merge branch '?(.*?)'? into '?(.*?)'?$/; + return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); +} /** * Parses the provided commit message (full message, not just the subject) into * a Commit object. @@ -2261,13 +2283,20 @@ function parseCommitMessage(message) { if (body === "") body = undefined; } + const subject = paragraphs[0].trim(); + const isFixup = subject.toLowerCase().startsWith("fixup!"); + const isMerge = subjectIsMergePattern(subject); return { - subject: paragraphs[0].trim(), - body: body, + subject, + body, footer: getFooterElementsFromParagraph(footer ?? "")?.reduce((acc, cur) => { acc[cur.key] = cur.value; return acc; }, {}), + attributes: { + isFixup, + isMerge, + }, }; } exports.parseCommitMessage = parseCommitMessage; @@ -2405,6 +2434,13 @@ class ConventionalCommit { return (this._raw.breaking.value?.trimEnd() === "!" || (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); } + // Attributes + get isFixupCommit() { + return this._raw.commit.isFixupCommit; + } + get isMergeCommit() { + return this._raw.commit.isMergeCommit; + } // Raw get raw() { return this._raw.commit.raw; @@ -2435,6 +2471,10 @@ class ConventionalCommit { errors: this.errors, warnings: this.warnings, }, + attributes: { + isFixup: this.isFixupCommit, + isMerge: this.isMergeCommit, + }, }; } // Private validation function @@ -2564,13 +2604,7 @@ function parseCommitMessage(commit, hash) { .splice(1) .join("\n") .trim(); - return { - raw, - hash: hash, - author: author, - committer: committer, - ...ccommit.parseCommitMessage(raw), - }; + return { raw, hash, author, committer, ...ccommit.parseCommitMessage(raw) }; } /** * Reads a (local) commit message from the .git/objects folder @@ -41751,7 +41785,7 @@ exports.validatePullRequest = validatePullRequest; * @see https://www.conventionalcommits.org/en/v1.0.0/ */ function validateCommits(commits) { - return commits.filter(commit => !commit.subject.startsWith("fixup!")).map(commit => validateCommit(commit)); + return commits.filter(commit => !commit.isFixupCommit && !commit.isMergeCommit).map(commit => validateCommit(commit)); } exports.validateCommits = validateCommits; diff --git a/lib/cli/index.js b/lib/cli/index.js index ead4acc..9ef6fe6 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2191,6 +2191,12 @@ class Commit { get raw() { return this._commit.raw; } + get isFixupCommit() { + return this._commit.attributes.isFixup; + } + get isMergeCommit() { + return this._commit.attributes.isMerge; + } toJSON() { return this._commit; } @@ -2238,6 +2244,22 @@ function getFooterElementsFromParagraph(footer) { return Object.keys(result).length > 0 ? result : undefined; } exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; +/** + * Checks if the provided subject is a common (default) merge pattern. + * Currently supported: + * - GitHub + * - BitBucket + * - GitLab + * + * @param subject The subject to check + * @returns True if the subject is a common merge pattern, false otherwise + */ +function subjectIsMergePattern(subject) { + const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; + const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; + const gitlabMergeRegex = /^Merge branch '?(.*?)'? into '?(.*?)'?$/; + return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); +} /** * Parses the provided commit message (full message, not just the subject) into * a Commit object. @@ -2262,13 +2284,20 @@ function parseCommitMessage(message) { if (body === "") body = undefined; } + const subject = paragraphs[0].trim(); + const isFixup = subject.toLowerCase().startsWith("fixup!"); + const isMerge = subjectIsMergePattern(subject); return { - subject: paragraphs[0].trim(), - body: body, + subject, + body, footer: getFooterElementsFromParagraph(footer ?? "")?.reduce((acc, cur) => { acc[cur.key] = cur.value; return acc; }, {}), + attributes: { + isFixup, + isMerge, + }, }; } exports.parseCommitMessage = parseCommitMessage; @@ -2406,6 +2435,13 @@ class ConventionalCommit { return (this._raw.breaking.value?.trimEnd() === "!" || (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); } + // Attributes + get isFixupCommit() { + return this._raw.commit.isFixupCommit; + } + get isMergeCommit() { + return this._raw.commit.isMergeCommit; + } // Raw get raw() { return this._raw.commit.raw; @@ -2436,6 +2472,10 @@ class ConventionalCommit { errors: this.errors, warnings: this.warnings, }, + attributes: { + isFixup: this.isFixupCommit, + isMerge: this.isMergeCommit, + }, }; } // Private validation function @@ -2565,13 +2605,7 @@ function parseCommitMessage(commit, hash) { .splice(1) .join("\n") .trim(); - return { - raw, - hash: hash, - author: author, - committer: committer, - ...ccommit.parseCommitMessage(raw), - }; + return { raw, hash, author, committer, ...ccommit.parseCommitMessage(raw) }; } /** * Reads a (local) commit message from the .git/objects folder @@ -41586,7 +41620,7 @@ exports.validatePullRequest = validatePullRequest; * @see https://www.conventionalcommits.org/en/v1.0.0/ */ function validateCommits(commits) { - return commits.filter(commit => !commit.subject.startsWith("fixup!")).map(commit => validateCommit(commit)); + return commits.filter(commit => !commit.isFixupCommit && !commit.isMergeCommit).map(commit => validateCommit(commit)); } exports.validateCommits = validateCommits; diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 162499c..d00e239 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2191,6 +2191,12 @@ class Commit { get raw() { return this._commit.raw; } + get isFixupCommit() { + return this._commit.attributes.isFixup; + } + get isMergeCommit() { + return this._commit.attributes.isMerge; + } toJSON() { return this._commit; } @@ -2238,6 +2244,22 @@ function getFooterElementsFromParagraph(footer) { return Object.keys(result).length > 0 ? result : undefined; } exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; +/** + * Checks if the provided subject is a common (default) merge pattern. + * Currently supported: + * - GitHub + * - BitBucket + * - GitLab + * + * @param subject The subject to check + * @returns True if the subject is a common merge pattern, false otherwise + */ +function subjectIsMergePattern(subject) { + const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; + const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; + const gitlabMergeRegex = /^Merge branch '?(.*?)'? into '?(.*?)'?$/; + return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); +} /** * Parses the provided commit message (full message, not just the subject) into * a Commit object. @@ -2262,13 +2284,20 @@ function parseCommitMessage(message) { if (body === "") body = undefined; } + const subject = paragraphs[0].trim(); + const isFixup = subject.toLowerCase().startsWith("fixup!"); + const isMerge = subjectIsMergePattern(subject); return { - subject: paragraphs[0].trim(), - body: body, + subject, + body, footer: getFooterElementsFromParagraph(footer ?? "")?.reduce((acc, cur) => { acc[cur.key] = cur.value; return acc; }, {}), + attributes: { + isFixup, + isMerge, + }, }; } exports.parseCommitMessage = parseCommitMessage; @@ -2406,6 +2435,13 @@ class ConventionalCommit { return (this._raw.breaking.value?.trimEnd() === "!" || (this.footer !== undefined && ("BREAKING CHANGE" in this.footer || "BREAKING-CHANGE" in this.footer))); } + // Attributes + get isFixupCommit() { + return this._raw.commit.isFixupCommit; + } + get isMergeCommit() { + return this._raw.commit.isMergeCommit; + } // Raw get raw() { return this._raw.commit.raw; @@ -2436,6 +2472,10 @@ class ConventionalCommit { errors: this.errors, warnings: this.warnings, }, + attributes: { + isFixup: this.isFixupCommit, + isMerge: this.isMergeCommit, + }, }; } // Private validation function @@ -2565,13 +2605,7 @@ function parseCommitMessage(commit, hash) { .splice(1) .join("\n") .trim(); - return { - raw, - hash: hash, - author: author, - committer: committer, - ...ccommit.parseCommitMessage(raw), - }; + return { raw, hash, author, committer, ...ccommit.parseCommitMessage(raw) }; } /** * Reads a (local) commit message from the .git/objects folder @@ -41569,7 +41603,7 @@ exports.validatePullRequest = validatePullRequest; * @see https://www.conventionalcommits.org/en/v1.0.0/ */ function validateCommits(commits) { - return commits.filter(commit => !commit.subject.startsWith("fixup!")).map(commit => validateCommit(commit)); + return commits.filter(commit => !commit.isFixupCommit && !commit.isMergeCommit).map(commit => validateCommit(commit)); } exports.validateCommits = validateCommits; diff --git a/package-lock.json b/package-lock.json index e3eb5d8..9378b67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -743,9 +743,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.0.4.tgz", - "integrity": "sha512-yhAj8RH0c8w4VCGYbt77JnRxemb/uwQrC/LpHEs0euiCTooTZW8VTGXgsOH/KnJC0lHeSoIHNF/Axk2UPSnU9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.1.0.tgz", + "integrity": "sha512-ivPexRuSLBOKhjnyxou0iGomsxj63mtLpReL437AKFOCWoCC2ruu76lSWShGdLSf4jjv8oxV9+YH5RJGbc4Vew==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" @@ -2663,9 +2663,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.635", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.635.tgz", - "integrity": "sha512-iu/2D0zolKU3iDGXXxdOzNf72Jnokn+K1IN6Kk4iV6l1Tr2g/qy+mvmtfAiBwZe5S3aB5r92vp+zSZ69scYRrg==", + "version": "1.4.636", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.636.tgz", + "integrity": "sha512-NLE0GIy1OL9wRiKL20h9TkctBEYZuc99tquSS9MVdTahnuHputoETHeqDzgqGqyOY9NUH0g9wjfEuw5OD+wRcQ==", "dev": true }, "node_modules/emittery": { diff --git a/src/validator.ts b/src/validator.ts index 7596456..9039605 100644 --- a/src/validator.ts +++ b/src/validator.ts @@ -65,5 +65,5 @@ export function validatePullRequest(pullrequest: Commit, commits: ConventionalCo * @see https://www.conventionalcommits.org/en/v1.0.0/ */ export function validateCommits(commits: Commit[]): ConventionalCommit[] { - return commits.filter(commit => !commit.subject.startsWith("fixup!")).map(commit => validateCommit(commit)); + return commits.filter(commit => !commit.isFixupCommit && !commit.isMergeCommit).map(commit => validateCommit(commit)); } diff --git a/test/validator.test.ts b/test/validator.test.ts index b86da81..ad15628 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -233,3 +233,23 @@ describe("Validate valid Pull Request vs Commits", () => { } }); }); + +describe("Ignore fixup and merge commits", () => { + const testData = [ + "fixup! feat: add new feature", + "fixup! fixup! feat: add new feature", + "Merge pull request #123 from some-branch/feature/branch", + "Merge pull request #123 from 'some-branch/feature/branch'", + "Merged in ci/some-branch (pull request #123)", + "Merged in 'ci/some-branch' (pull request #123)", + "Merge branch 'ci/some-branch' into 'main'", + "Merge branch 'ci/some-branch' into main", + "Merge branch ci/some-branch into main", + ]; + + it.each(testData)("$test", test => { + const result = validator.validateCommits([Commit.fromString({ hash: "0a0b0c0d", message: test })]); + + expect(result.length).toBe(0); + }); +}); From 27f09bd98cad709a51a99f80de1937547cedb4c5 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Wed, 17 Jan 2024 21:39:00 +0100 Subject: [PATCH 11/25] chore(deps): enable auto-updating dependencies --- .github/.commit-me.json | 2 +- .github/dependabot.yml | 2 -- .pre-commit-config.yaml | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/.commit-me.json b/.github/.commit-me.json index e5f4d98..153f824 100644 --- a/.github/.commit-me.json +++ b/.github/.commit-me.json @@ -1,4 +1,4 @@ { "types": [ "build", "chore", "ci", "docs", "style", "refactor", "perf", "test" ], - "scopes": [ "cli", "precommit", "action" ] + "scopes": [ "cli", "precommit", "action", "deps" ] } diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fde1bb0..43f583d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,6 @@ updates: directory: "/" schedule: interval: "daily" - open-pull-requests-limit: 0 - package-ecosystem: "npm" directory: "/" @@ -15,4 +14,3 @@ updates: interval: "weekly" allow: - dependency-type: "production" - open-pull-requests-limit: 0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 309ec37..3d5425e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ repos: - repo: https://github.com/dev-build-deploy/commit-me - rev: v1.1.0 + rev: v1.3.1 hooks: - id: commit-me args: [ @@ -12,6 +12,6 @@ repos: ] - repo: https://github.com/dev-build-deploy/reuse-me - rev: v0.10.0 + rev: v1.0.0 hooks: - id: reuse-me From b32199536cf52fcb2e4ef84492f88f302e0eee02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:40:03 +0000 Subject: [PATCH 12/25] chore(deps): bump actions/setup-node from 3 to 4 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index f1fec58..342666c 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v3 - name: Set up Node.js 16.x - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 16.x From 72060fede215fd2c36a0e880084d5e4ee859e116 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:43:10 +0000 Subject: [PATCH 13/25] chore(deps): bump actions/publish-action from 0.2.2 to 0.3.0 Bumps [actions/publish-action](https://github.com/actions/publish-action) from 0.2.2 to 0.3.0. - [Commits](https://github.com/actions/publish-action/compare/v0.2.2...v0.3.0) --- updated-dependencies: - dependency-name: actions/publish-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d8cd3fc..f391909 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,6 +57,6 @@ jobs: ref: ${{ fromJSON(needs.release-me.outputs.release).tag_name }} - name: Update the ${{ fromJSON(needs.release-me.outputs.release).tag_name }} tag - uses: actions/publish-action@v0.2.2 + uses: actions/publish-action@v0.3.0 with: source-tag: ${{ fromJSON(needs.release-me.outputs.release).tag_name }} From e5b2ac1f0b3865b285dd55f6d257b672fece233c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:54:48 +0000 Subject: [PATCH 14/25] chore(deps): bump dev-build-deploy/reuse-me from 0 to 1 Bumps [dev-build-deploy/reuse-me](https://github.com/dev-build-deploy/reuse-me) from 0 to 1. - [Release notes](https://github.com/dev-build-deploy/reuse-me/releases) - [Commits](https://github.com/dev-build-deploy/reuse-me/compare/v0...v1) --- updated-dependencies: - dependency-name: dev-build-deploy/reuse-me dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/copyright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/copyright.yml b/.github/workflows/copyright.yml index 7a44a71..9da1260 100644 --- a/.github/workflows/copyright.yml +++ b/.github/workflows/copyright.yml @@ -14,4 +14,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: dev-build-deploy/reuse-me@v0 + - uses: dev-build-deploy/reuse-me@v1 From abc90ee04b514001520efa202249b352da707653 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 21:06:13 +0000 Subject: [PATCH 15/25] chore(deps): bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/conventional-commits.yml | 2 +- .github/workflows/copyright.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/validate.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/conventional-commits.yml b/.github/workflows/conventional-commits.yml index 7293b40..6944c4a 100644 --- a/.github/workflows/conventional-commits.yml +++ b/.github/workflows/conventional-commits.yml @@ -24,7 +24,7 @@ jobs: name: Conventional Commits Compliance runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run CommitMe uses: ./ with: diff --git a/.github/workflows/copyright.yml b/.github/workflows/copyright.yml index 9da1260..530af2e 100644 --- a/.github/workflows/copyright.yml +++ b/.github/workflows/copyright.yml @@ -13,5 +13,5 @@ jobs: name: REUSE compliance runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: dev-build-deploy/reuse-me@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f391909..d7dc5e8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,7 +52,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ fromJSON(needs.release-me.outputs.release).tag_name }} diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 342666c..9a11a32 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Node.js 16.x uses: actions/setup-node@v4 From 8fc01ac4ca99d28c669b7327d45bc4fed5ea715b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 02:51:36 +0000 Subject: [PATCH 16/25] chore(deps): bump commander from 11.1.0 to 12.0.0 Bumps [commander](https://github.com/tj/commander.js) from 11.1.0 to 12.0.0. - [Release notes](https://github.com/tj/commander.js/releases) - [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/tj/commander.js/compare/v11.1.0...v12.0.0) --- updated-dependencies: - dependency-name: commander dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lib/cli/index.js | 487 +++++++++++++++++++++++++---------------- lib/precommit/index.js | 487 +++++++++++++++++++++++++---------------- package-lock.json | 10 +- package.json | 2 +- 4 files changed, 604 insertions(+), 382 deletions(-) diff --git a/lib/cli/index.js b/lib/cli/index.js index 9ef6fe6..864a109 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -43503,7 +43503,7 @@ module.exports = parseParams /***/ }), /***/ 4379: -/***/ ((module, exports, __nccwpck_require__) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { const { Argument } = __nccwpck_require__(9414); const { Command } = __nccwpck_require__(552); @@ -43511,13 +43511,11 @@ const { CommanderError, InvalidArgumentError } = __nccwpck_require__(2625); const { Help } = __nccwpck_require__(5153); const { Option } = __nccwpck_require__(6558); -/** - * Expose the root command. - */ +exports.program = new Command(); -exports = module.exports = new Command(); -exports.program = exports; // More explicit access to global command. -// createArgument, createCommand, and createOption are implicitly available as they are methods on program. +exports.createCommand = (name) => new Command(name); +exports.createOption = (flags, description) => new Option(flags, description); +exports.createArgument = (name, description) => new Argument(name, description); /** * Expose classes @@ -43590,7 +43588,7 @@ class Argument { } /** - * @api private + * @package internal use only */ _concatValue(value, previous) { @@ -43670,7 +43668,7 @@ class Argument { * * @param {Argument} arg * @return {string} - * @api private + * @private */ function humanReadableArgName(arg) { @@ -43699,7 +43697,7 @@ const process = __nccwpck_require__(7282); const { Argument, humanReadableArgName } = __nccwpck_require__(9414); const { CommanderError } = __nccwpck_require__(2625); const { Help } = __nccwpck_require__(5153); -const { Option, splitOptionFlags, DualOptions } = __nccwpck_require__(6558); +const { Option, DualOptions } = __nccwpck_require__(6558); const { suggestSimilar } = __nccwpck_require__(7592); class Command extends EventEmitter { @@ -43744,7 +43742,7 @@ class Command extends EventEmitter { this._enablePositionalOptions = false; this._passThroughOptions = false; this._lifeCycleHooks = {}; // a hash of arrays - /** @type {boolean | string} */ + /** @type {(boolean | string)} */ this._showHelpAfterError = false; this._showSuggestionAfterError = true; @@ -43758,15 +43756,11 @@ class Command extends EventEmitter { }; this._hidden = false; - this._hasHelpOption = true; - this._helpFlags = '-h, --help'; - this._helpDescription = 'display help for command'; - this._helpShortFlag = '-h'; - this._helpLongFlag = '--help'; - this._addImplicitHelpCommand = undefined; // Deliberately undefined, not decided whether true or false - this._helpCommandName = 'help'; - this._helpCommandnameAndArgs = 'help [command]'; - this._helpCommandDescription = 'display help for command'; + /** @type {(Option | null | undefined)} */ + this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled. + this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited + /** @type {Command} */ + this._helpCommand = undefined; // lazy initialised, inherited this._helpConfiguration = {}; } @@ -43780,14 +43774,8 @@ class Command extends EventEmitter { */ copyInheritedSettings(sourceCommand) { this._outputConfiguration = sourceCommand._outputConfiguration; - this._hasHelpOption = sourceCommand._hasHelpOption; - this._helpFlags = sourceCommand._helpFlags; - this._helpDescription = sourceCommand._helpDescription; - this._helpShortFlag = sourceCommand._helpShortFlag; - this._helpLongFlag = sourceCommand._helpLongFlag; - this._helpCommandName = sourceCommand._helpCommandName; - this._helpCommandnameAndArgs = sourceCommand._helpCommandnameAndArgs; - this._helpCommandDescription = sourceCommand._helpCommandDescription; + this._helpOption = sourceCommand._helpOption; + this._helpCommand = sourceCommand._helpCommand; this._helpConfiguration = sourceCommand._helpConfiguration; this._exitCallback = sourceCommand._exitCallback; this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties; @@ -43802,7 +43790,7 @@ class Command extends EventEmitter { /** * @returns {Command[]} - * @api private + * @private */ _getCommandAndAncestors() { @@ -43833,7 +43821,7 @@ class Command extends EventEmitter { * .command('stop [service]', 'stop named service, or all if no name supplied'); * * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {(Object|string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) * @param {Object} [execOpts] - configuration options (for executable) * @return {Command} returns new command for action handler, or `this` for executable command */ @@ -43857,7 +43845,7 @@ class Command extends EventEmitter { cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor if (args) cmd.arguments(args); - this.commands.push(cmd); + this._registerCommand(cmd); cmd.parent = this; cmd.copyInheritedSettings(this); @@ -43895,7 +43883,7 @@ class Command extends EventEmitter { * or with a subclass of Help by overriding createHelp(). * * @param {Object} [configuration] - configuration options - * @return {Command|Object} `this` command for chaining, or stored configuration + * @return {(Command|Object)} `this` command for chaining, or stored configuration */ configureHelp(configuration) { @@ -43921,7 +43909,7 @@ class Command extends EventEmitter { * outputError(str, write) // used for displaying errors, and not used for displaying help * * @param {Object} [configuration] - configuration options - * @return {Command|Object} `this` command for chaining, or stored configuration + * @return {(Command|Object)} `this` command for chaining, or stored configuration */ configureOutput(configuration) { @@ -43934,7 +43922,7 @@ class Command extends EventEmitter { /** * Display the help or a custom message after an error occurs. * - * @param {boolean|string} [displayHelp] + * @param {(boolean|string)} [displayHelp] * @return {Command} `this` command for chaining */ showHelpAfterError(displayHelp = true) { @@ -43974,8 +43962,10 @@ class Command extends EventEmitter { if (opts.isDefault) this._defaultCommandName = cmd._name; if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation - this.commands.push(cmd); + this._registerCommand(cmd); cmd.parent = this; + cmd._checkForBrokenPassThrough(); + return this; } @@ -44006,7 +43996,7 @@ class Command extends EventEmitter { * * @param {string} name * @param {string} [description] - * @param {Function|*} [fn] - custom argument processing function + * @param {(Function|*)} [fn] - custom argument processing function * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ @@ -44059,39 +44049,76 @@ class Command extends EventEmitter { } /** - * Override default decision whether to add implicit help command. + * Customise or override default help command. By default a help command is automatically added if your command has subcommands. * - * addHelpCommand() // force on - * addHelpCommand(false); // force off - * addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details + * program.helpCommand('help [cmd]'); + * program.helpCommand('help [cmd]', 'show help'); + * program.helpCommand(false); // suppress default help command + * program.helpCommand(true); // add help command even if no subcommands * + * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added + * @param {string} [description] - custom description * @return {Command} `this` command for chaining */ - addHelpCommand(enableOrNameAndArgs, description) { - if (enableOrNameAndArgs === false) { - this._addImplicitHelpCommand = false; - } else { - this._addImplicitHelpCommand = true; - if (typeof enableOrNameAndArgs === 'string') { - this._helpCommandName = enableOrNameAndArgs.split(' ')[0]; - this._helpCommandnameAndArgs = enableOrNameAndArgs; - } - this._helpCommandDescription = description || this._helpCommandDescription; + helpCommand(enableOrNameAndArgs, description) { + if (typeof enableOrNameAndArgs === 'boolean') { + this._addImplicitHelpCommand = enableOrNameAndArgs; + return this; } + + enableOrNameAndArgs = enableOrNameAndArgs ?? 'help [command]'; + const [, helpName, helpArgs] = enableOrNameAndArgs.match(/([^ ]+) *(.*)/); + const helpDescription = description ?? 'display help for command'; + + const helpCommand = this.createCommand(helpName); + helpCommand.helpOption(false); + if (helpArgs) helpCommand.arguments(helpArgs); + if (helpDescription) helpCommand.description(helpDescription); + + this._addImplicitHelpCommand = true; + this._helpCommand = helpCommand; + return this; } /** - * @return {boolean} - * @api private + * Add prepared custom help command. + * + * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()` + * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only + * @return {Command} `this` command for chaining */ + addHelpCommand(helpCommand, deprecatedDescription) { + // If not passed an object, call through to helpCommand for backwards compatibility, + // as addHelpCommand was originally used like helpCommand is now. + if (typeof helpCommand !== 'object') { + this.helpCommand(helpCommand, deprecatedDescription); + return this; + } - _hasImplicitHelpCommand() { - if (this._addImplicitHelpCommand === undefined) { - return this.commands.length && !this._actionHandler && !this._findCommand('help'); + this._addImplicitHelpCommand = true; + this._helpCommand = helpCommand; + return this; + } + + /** + * Lazy create help command. + * + * @return {(Command|null)} + * @package + */ + _getHelpCommand() { + const hasImplicitHelpCommand = this._addImplicitHelpCommand ?? + (this.commands.length && !this._actionHandler && !this._findCommand('help')); + + if (hasImplicitHelpCommand) { + if (this._helpCommand === undefined) { + this.helpCommand(undefined, undefined); // use default name and description + } + return this._helpCommand; } - return this._addImplicitHelpCommand; + return null; } /** @@ -44145,7 +44172,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * @param {string} code an id string representing the error * @param {string} message human-readable description of the error * @return never - * @api private + * @private */ _exit(exitCode, code, message) { @@ -44207,11 +44234,11 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Wrap parseArgs to catch 'commander.invalidArgument'. * - * @param {Option | Argument} target + * @param {(Option | Argument)} target * @param {string} value * @param {*} previous * @param {string} invalidArgumentMessage - * @api private + * @private */ _callParseArg(target, value, previous, invalidArgumentMessage) { @@ -44226,6 +44253,49 @@ Expecting one of '${allowedValues.join("', '")}'`); } } + /** + * Check for option flag conflicts. + * Register option if no conflicts found, or throw on conflict. + * + * @param {Option} option + * @api private + */ + + _registerOption(option) { + const matchingOption = (option.short && this._findOption(option.short)) || + (option.long && this._findOption(option.long)); + if (matchingOption) { + const matchingFlag = (option.long && this._findOption(option.long)) ? option.long : option.short; + throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}' +- already used by option '${matchingOption.flags}'`); + } + + this.options.push(option); + } + + /** + * Check for command name and alias conflicts with existing commands. + * Register command if no conflicts found, or throw on conflict. + * + * @param {Command} command + * @api private + */ + + _registerCommand(command) { + const knownBy = (cmd) => { + return [cmd.name()].concat(cmd.aliases()); + }; + + const alreadyUsed = knownBy(command).find((name) => this._findCommand(name)); + if (alreadyUsed) { + const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|'); + const newCmd = knownBy(command).join('|'); + throw new Error(`cannot add command '${newCmd}' as already have command '${existingCmd}'`); + } + + this.commands.push(command); + } + /** * Add an option. * @@ -44233,6 +44303,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * @return {Command} `this` command for chaining */ addOption(option) { + this._registerOption(option); + const oname = option.name(); const name = option.attributeName(); @@ -44247,9 +44319,6 @@ Expecting one of '${allowedValues.join("', '")}'`); this.setOptionValueWithSource(name, option.defaultValue, 'default'); } - // register the option - this.options.push(option); - // handler for cli and env supplied values const handleOptionValue = (val, invalidValueMessage, valueSource) => { // val is null for optional option used without an optional-argument. @@ -44297,7 +44366,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Internal implementation shared by .option() and .requiredOption() * - * @api private + * @private */ _optionEx(config, flags, description, fn, defaultValue) { if (typeof flags === 'object' && flags instanceof Option) { @@ -44339,7 +44408,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} flags * @param {string} [description] - * @param {Function|*} [parseArg] - custom option processing function or default value + * @param {(Function|*)} [parseArg] - custom option processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ @@ -44356,7 +44425,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} flags * @param {string} [description] - * @param {Function|*} [parseArg] - custom option processing function or default value + * @param {(Function|*)} [parseArg] - custom option processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ @@ -44373,7 +44442,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` * - * @param {Boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. + * @param {boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. */ combineFlagAndOptionalValue(combine = true) { this._combineFlagAndOptionalValue = !!combine; @@ -44383,7 +44452,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow unknown options on the command line. * - * @param {Boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown + * @param {boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown * for unknown options. */ allowUnknownOption(allowUnknown = true) { @@ -44394,7 +44463,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow excess command-arguments on the command line. Pass false to make excess arguments an error. * - * @param {Boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown + * @param {boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown * for excess arguments. */ allowExcessArguments(allowExcess = true) { @@ -44407,7 +44476,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions. * The default behaviour is non-positional and global options may appear anywhere on the command line. * - * @param {Boolean} [positional=true] + * @param {boolean} [positional=true] */ enablePositionalOptions(positional = true) { this._enablePositionalOptions = !!positional; @@ -44420,17 +44489,25 @@ Expecting one of '${allowedValues.join("', '")}'`); * positional options to have been enabled on the program (parent commands). * The default behaviour is non-positional and options may appear before or after command-arguments. * - * @param {Boolean} [passThrough=true] + * @param {boolean} [passThrough=true] * for unknown options. */ passThroughOptions(passThrough = true) { this._passThroughOptions = !!passThrough; - if (!!this.parent && passThrough && !this.parent._enablePositionalOptions) { - throw new Error('passThroughOptions can not be used without turning on enablePositionalOptions for parent command(s)'); - } + this._checkForBrokenPassThrough(); return this; } + /** + * @private + */ + + _checkForBrokenPassThrough() { + if (this.parent && this._passThroughOptions && !this.parent._enablePositionalOptions) { + throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`); + } + } + /** * Whether to store option values as properties on command object, * or store separately (specify false). In both cases the option values can be accessed using .opts(). @@ -44443,9 +44520,9 @@ Expecting one of '${allowedValues.join("', '")}'`); if (this.options.length) { throw new Error('call .storeOptionsAsProperties() before adding options'); } - // if (Object.keys(this._optionValues).length) { - // throw new Error('call .storeOptionsAsProperties() before setting option values'); - // } + if (Object.keys(this._optionValues).length) { + throw new Error('call .storeOptionsAsProperties() before setting option values'); + } this._storeOptionsAsProperties = !!storeAsProperties; return this; } @@ -44530,7 +44607,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Get user arguments from implied or explicit arguments. * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches. * - * @api private + * @private */ _prepareUserArgs(argv, parseOptions) { @@ -44633,7 +44710,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Execute a sub-command executable. * - * @api private + * @private */ _executeSubCommand(subcommand, args) { @@ -44720,15 +44797,15 @@ Expecting one of '${allowedValues.join("', '")}'`); } // By default terminate process when spawned process terminates. - // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running! const exitCallback = this._exitCallback; - if (!exitCallback) { - proc.on('close', process.exit.bind(process)); - } else { - proc.on('close', () => { - exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)')); - }); - } + proc.on('close', (code, _signal) => { + code = code ?? 1; // code is null if spawned process terminated due to a signal + if (!exitCallback) { + process.exit(code); + } else { + exitCallback(new CommanderError(code, 'commander.executeSubCommandAsync', '(close)')); + } + }); proc.on('error', (err) => { // @ts-ignore if (err.code === 'ENOENT') { @@ -44758,7 +44835,7 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * @api private + * @private */ _dispatchSubcommand(commandName, operands, unknown) { @@ -44781,7 +44858,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Invoke help directly if possible, or dispatch if necessary. * e.g. help foo * - * @api private + * @private */ _dispatchHelpCommand(subcommandName) { @@ -44795,14 +44872,14 @@ Expecting one of '${allowedValues.join("', '")}'`); // Fallback to parsing the help flag to invoke the help. return this._dispatchSubcommand(subcommandName, [], [ - this._helpLongFlag || this._helpShortFlag + this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help' ]); } /** * Check this.args against expected this.registeredArguments. * - * @api private + * @private */ _checkNumberOfArguments() { @@ -44824,7 +44901,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Process this.args using this.registeredArguments and save as this.processedArgs! * - * @api private + * @private */ _processArguments() { @@ -44869,10 +44946,10 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Once we have a promise we chain, but call synchronously until then. * - * @param {Promise|undefined} promise + * @param {(Promise|undefined)} promise * @param {Function} fn - * @return {Promise|undefined} - * @api private + * @return {(Promise|undefined)} + * @private */ _chainOrCall(promise, fn) { @@ -44887,10 +44964,10 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * - * @param {Promise|undefined} promise + * @param {(Promise|undefined)} promise * @param {string} event - * @return {Promise|undefined} - * @api private + * @return {(Promise|undefined)} + * @private */ _chainOrCallHooks(promise, event) { @@ -44918,11 +44995,11 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * - * @param {Promise|undefined} promise + * @param {(Promise|undefined)} promise * @param {Command} subCommand * @param {string} event - * @return {Promise|undefined} - * @api private + * @return {(Promise|undefined)} + * @private */ _chainOrCallSubCommandHook(promise, subCommand, event) { @@ -44941,7 +45018,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Process arguments in context of this command. * Returns action result, in case it is a promise. * - * @api private + * @private */ _parseCommand(operands, unknown) { @@ -44955,11 +45032,11 @@ Expecting one of '${allowedValues.join("', '")}'`); if (operands && this._findCommand(operands[0])) { return this._dispatchSubcommand(operands[0], operands.slice(1), unknown); } - if (this._hasImplicitHelpCommand() && operands[0] === this._helpCommandName) { + if (this._getHelpCommand() && operands[0] === this._getHelpCommand().name()) { return this._dispatchHelpCommand(operands[1]); } if (this._defaultCommandName) { - outputHelpIfRequested(this, unknown); // Run the help for default command from parent rather than passing to default command + this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command return this._dispatchSubcommand(this._defaultCommandName, operands, unknown); } if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { @@ -44967,7 +45044,7 @@ Expecting one of '${allowedValues.join("', '")}'`); this.help({ error: true }); } - outputHelpIfRequested(this, parsed.unknown); + this._outputHelpIfRequested(parsed.unknown); this._checkForMissingMandatoryOptions(); this._checkForConflictingOptions(); @@ -45025,7 +45102,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Find matching command. * - * @api private + * @private */ _findCommand(name) { if (!name) return undefined; @@ -45037,7 +45114,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} arg * @return {Option} - * @api private + * @package internal use only */ _findOption(arg) { @@ -45048,7 +45125,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Display an error message if a mandatory option does not have a value. * Called after checking for help flags in leaf subcommand. * - * @api private + * @private */ _checkForMissingMandatoryOptions() { @@ -45065,7 +45142,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Display an error message if conflicting options are used together in this. * - * @api private + * @private */ _checkForConflictingLocalOptions() { const definedNonDefaultOptions = this.options.filter( @@ -45096,7 +45173,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Display an error message if conflicting options are used together. * Called after checking for help flags in leaf subcommand. * - * @api private + * @private */ _checkForConflictingOptions() { // Walk up hierarchy so can call in subcommand after checking for displaying help. @@ -45117,8 +45194,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * sub --unknown uuu op => [sub], [--unknown uuu op] * sub -- --unknown uuu op => [sub --unknown uuu op], [] * - * @param {String[]} argv - * @return {{operands: String[], unknown: String[]}} + * @param {string[]} argv + * @return {{operands: string[], unknown: string[]}} */ parseOptions(argv) { @@ -45212,7 +45289,7 @@ Expecting one of '${allowedValues.join("', '")}'`); operands.push(arg); if (args.length > 0) unknown.push(...args); break; - } else if (arg === this._helpCommandName && this._hasImplicitHelpCommand()) { + } else if (this._getHelpCommand() && arg === this._getHelpCommand().name()) { operands.push(arg); if (args.length > 0) operands.push(...args); break; @@ -45300,7 +45377,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Apply any option related environment variables, if option does * not have a value from cli or client code. * - * @api private + * @private */ _parseOptionsEnv() { this.options.forEach((option) => { @@ -45323,7 +45400,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Apply any implied option values, if option is undefined or default value. * - * @api private + * @private */ _parseOptionsImplied() { const dualHelper = new DualOptions(this.options); @@ -45347,7 +45424,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Argument `name` is missing. * * @param {string} name - * @api private + * @private */ missingArgument(name) { @@ -45359,7 +45436,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * `Option` is missing an argument. * * @param {Option} option - * @api private + * @private */ optionMissingArgument(option) { @@ -45371,7 +45448,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * `Option` does not have a value, and is a mandatory option. * * @param {Option} option - * @api private + * @private */ missingMandatoryOptionValue(option) { @@ -45384,7 +45461,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {Option} option * @param {Option} conflictingOption - * @api private + * @private */ _conflictingOption(option, conflictingOption) { // The calling code does not know whether a negated option is the source of the @@ -45421,7 +45498,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Unknown option `flag`. * * @param {string} flag - * @api private + * @private */ unknownOption(flag) { @@ -45450,7 +45527,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Excess arguments, more than expected. * * @param {string[]} receivedArgs - * @api private + * @private */ _excessArguments(receivedArgs) { @@ -45466,7 +45543,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Unknown command. * - * @api private + * @private */ unknownCommand() { @@ -45497,7 +45574,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * @param {string} [str] * @param {string} [flags] * @param {string} [description] - * @return {this | string | undefined} `this` command for chaining, or version string if no arguments + * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments */ version(str, flags, description) { @@ -45506,8 +45583,9 @@ Expecting one of '${allowedValues.join("', '")}'`); flags = flags || '-V, --version'; description = description || 'output the version number'; const versionOption = this.createOption(flags, description); - this._versionOptionName = versionOption.attributeName(); // [sic] not defined in constructor, partly legacy, partly only needed at root - this.options.push(versionOption); + this._versionOptionName = versionOption.attributeName(); + this._registerOption(versionOption); + this.on('option:' + versionOption.name(), () => { this._outputConfiguration.writeOut(`${str}\n`); this._exit(0, 'commander.version', str); @@ -45520,7 +45598,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} [str] * @param {Object} [argsDescription] - * @return {string|Command} + * @return {(string|Command)} */ description(str, argsDescription) { if (str === undefined && argsDescription === undefined) return this._description; @@ -45535,7 +45613,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Set the summary. Used when listed as subcommand of parent. * * @param {string} [str] - * @return {string|Command} + * @return {(string|Command)} */ summary(str) { if (str === undefined) return this._summary; @@ -45549,7 +45627,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help. * * @param {string} [alias] - * @return {string|Command} + * @return {(string|Command)} */ alias(alias) { @@ -45563,6 +45641,12 @@ Expecting one of '${allowedValues.join("', '")}'`); } if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); + const matchingCommand = this.parent?._findCommand(alias); + if (matchingCommand) { + // c.f. _registerCommand + const existingCmd = [matchingCommand.name()].concat(matchingCommand.aliases()).join('|'); + throw new Error(`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`); + } command._aliases.push(alias); return this; @@ -45574,7 +45658,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Only the first alias is shown in the auto-generated help. * * @param {string[]} [aliases] - * @return {string[]|Command} + * @return {(string[]|Command)} */ aliases(aliases) { @@ -45589,7 +45673,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Set / get the command usage `str`. * * @param {string} [str] - * @return {String|Command} + * @return {(string|Command)} */ usage(str) { @@ -45600,7 +45684,7 @@ Expecting one of '${allowedValues.join("', '")}'`); return humanReadableArgName(arg); }); return [].concat( - (this.options.length || this._hasHelpOption ? '[options]' : []), + (this.options.length || (this._helpOption !== null) ? '[options]' : []), (this.commands.length ? '[command]' : []), (this.registeredArguments.length ? args : []) ).join(' '); @@ -45614,7 +45698,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Get or set the name of the command. * * @param {string} [str] - * @return {string|Command} + * @return {(string|Command)} */ name(str) { @@ -45651,7 +45735,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * program.executableDir('subcommands'); * * @param {string} [path] - * @return {string|null|Command} + * @return {(string|null|Command)} */ executableDir(path) { @@ -45676,7 +45760,7 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * @api private + * @private */ _getHelpContext(contextOptions) { @@ -45721,38 +45805,72 @@ Expecting one of '${allowedValues.join("', '")}'`); } context.write(helpInformation); - if (this._helpLongFlag) { - this.emit(this._helpLongFlag); // deprecated + if (this._getHelpOption()?.long) { + this.emit(this._getHelpOption().long); // deprecated } this.emit('afterHelp', context); this._getCommandAndAncestors().forEach(command => command.emit('afterAllHelp', context)); } /** - * You can pass in flags and a description to override the help - * flags and help description for your command. Pass in false to - * disable the built-in help option. + * You can pass in flags and a description to customise the built-in help option. + * Pass in false to disable the built-in help option. + * + * @example + * program.helpOption('-?, --help' 'show help'); // customise + * program.helpOption(false); // disable * - * @param {string | boolean} [flags] + * @param {(string | boolean)} flags * @param {string} [description] * @return {Command} `this` command for chaining */ helpOption(flags, description) { + // Support disabling built-in help option. if (typeof flags === 'boolean') { - this._hasHelpOption = flags; + if (flags) { + this._helpOption = this._helpOption ?? undefined; // preserve existing option + } else { + this._helpOption = null; // disable + } return this; } - this._helpFlags = flags || this._helpFlags; - this._helpDescription = description || this._helpDescription; - const helpFlags = splitOptionFlags(this._helpFlags); - this._helpShortFlag = helpFlags.shortFlag; - this._helpLongFlag = helpFlags.longFlag; + // Customise flags and description. + flags = flags ?? '-h, --help'; + description = description ?? 'display help for command'; + this._helpOption = this.createOption(flags, description); return this; } + /** + * Lazy create help option. + * Returns null if has been disabled with .helpOption(false). + * + * @returns {(Option | null)} the help option + * @package internal use only + */ + _getHelpOption() { + // Lazy create help option on demand. + if (this._helpOption === undefined) { + this.helpOption(undefined, undefined); + } + return this._helpOption; + } + + /** + * Supply your own option to use for the built-in help option. + * This is an alternative to using helpOption() to customise the flags and description etc. + * + * @param {Option} option + * @return {Command} `this` command for chaining + */ + addHelpOption(option) { + this._helpOption = option; + return this; + } + /** * Output help information and exit. * @@ -45778,7 +45896,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands. * * @param {string} position - before or after built-in help - * @param {string | Function} text - string to add, or a function returning a string + * @param {(string | Function)} text - string to add, or a function returning a string * @return {Command} `this` command for chaining */ addHelpText(position, text) { @@ -45802,22 +45920,22 @@ Expecting one of '${allowedValues.join("', '")}'`); }); return this; } -} -/** - * Output help information if help flags specified - * - * @param {Command} cmd - command to output help for - * @param {Array} args - array of options to search for help flags - * @api private - */ + /** + * Output help information if help flags specified + * + * @param {Array} args - array of options to search for help flags + * @private + */ -function outputHelpIfRequested(cmd, args) { - const helpOption = cmd._hasHelpOption && args.find(arg => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag); - if (helpOption) { - cmd.outputHelp(); - // (Do not have all displayed text available so only passing placeholder.) - cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)'); + _outputHelpIfRequested(args) { + const helpOption = this._getHelpOption(); + const helpRequested = helpOption && args.find(arg => helpOption.is(arg)); + if (helpRequested) { + this.outputHelp(); + // (Do not have all displayed text available so only passing placeholder.) + this._exit(0, 'commander.helpDisplayed', '(outputHelp)'); + } } } @@ -45826,7 +45944,7 @@ function outputHelpIfRequested(cmd, args) { * * @param {string[]} args - array of arguments from node.execArgv * @returns {string[]} - * @api private + * @private */ function incrementNodeInspectorPort(args) { @@ -45954,13 +46072,8 @@ class Help { visibleCommands(cmd) { const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden); - if (cmd._hasImplicitHelpCommand()) { - // Create a command matching the implicit help command. - const [, helpName, helpArgs] = cmd._helpCommandnameAndArgs.match(/([^ ]+) *(.*)/); - const helpCommand = cmd.createCommand(helpName) - .helpOption(false); - helpCommand.description(cmd._helpCommandDescription); - if (helpArgs) helpCommand.arguments(helpArgs); + const helpCommand = cmd._getHelpCommand(); + if (helpCommand && !helpCommand._hidden) { visibleCommands.push(helpCommand); } if (this.sortSubcommands) { @@ -45996,19 +46109,19 @@ class Help { visibleOptions(cmd) { const visibleOptions = cmd.options.filter((option) => !option.hidden); - // Implicit help - const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag); - const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag); - if (showShortHelpFlag || showLongHelpFlag) { - let helpOption; - if (!showShortHelpFlag) { - helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription); - } else if (!showLongHelpFlag) { - helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription); - } else { - helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription); + // Built-in help option. + const helpOption = cmd._getHelpOption(); + if (helpOption && !helpOption.hidden) { + // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs. + const removeShort = helpOption.short && cmd._findOption(helpOption.short); + const removeLong = helpOption.long && cmd._findOption(helpOption.long); + if (!removeShort && !removeLong) { + visibleOptions.push(helpOption); // no changes needed + } else if (helpOption.long && !removeLong) { + visibleOptions.push(cmd.createOption(helpOption.long, helpOption.description)); + } else if (helpOption.short && !removeShort) { + visibleOptions.push(cmd.createOption(helpOption.short, helpOption.description)); } - visibleOptions.push(helpOption); } if (this.sortOptions) { visibleOptions.sort(this.compareOptions); @@ -46471,7 +46584,7 @@ class Option { * new Option('--rgb').conflicts('cmyk'); * new Option('--js').conflicts(['ts', 'jsx']); * - * @param {string | string[]} names + * @param {(string | string[])} names * @return {Option} */ @@ -46555,7 +46668,7 @@ class Option { } /** - * @api private + * @package internal use only */ _concatValue(value, previous) { @@ -46605,7 +46718,6 @@ class Option { * as a object attribute key. * * @return {string} - * @api private */ attributeName() { @@ -46617,7 +46729,7 @@ class Option { * * @param {string} arg * @return {boolean} - * @api private + * @package internal use only */ is(arg) { @@ -46630,7 +46742,7 @@ class Option { * Options are one of boolean, negated, required argument, or optional argument. * * @return {boolean} - * @api private + * @package internal use only */ isBoolean() { @@ -46690,7 +46802,7 @@ class DualOptions { * * @param {string} str * @return {string} - * @api private + * @private */ function camelcase(str) { @@ -46702,7 +46814,7 @@ function camelcase(str) { /** * Split the short and long flag out of something like '-m,--mixed ' * - * @api private + * @private */ function splitOptionFlags(flags) { @@ -46722,7 +46834,6 @@ function splitOptionFlags(flags) { } exports.Option = Option; -exports.splitOptionFlags = splitOptionFlags; exports.DualOptions = DualOptions; diff --git a/lib/precommit/index.js b/lib/precommit/index.js index d00e239..1c44141 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -43486,7 +43486,7 @@ module.exports = parseParams /***/ }), /***/ 4379: -/***/ ((module, exports, __nccwpck_require__) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { const { Argument } = __nccwpck_require__(9414); const { Command } = __nccwpck_require__(552); @@ -43494,13 +43494,11 @@ const { CommanderError, InvalidArgumentError } = __nccwpck_require__(2625); const { Help } = __nccwpck_require__(5153); const { Option } = __nccwpck_require__(6558); -/** - * Expose the root command. - */ +exports.program = new Command(); -exports = module.exports = new Command(); -exports.program = exports; // More explicit access to global command. -// createArgument, createCommand, and createOption are implicitly available as they are methods on program. +exports.createCommand = (name) => new Command(name); +exports.createOption = (flags, description) => new Option(flags, description); +exports.createArgument = (name, description) => new Argument(name, description); /** * Expose classes @@ -43573,7 +43571,7 @@ class Argument { } /** - * @api private + * @package internal use only */ _concatValue(value, previous) { @@ -43653,7 +43651,7 @@ class Argument { * * @param {Argument} arg * @return {string} - * @api private + * @private */ function humanReadableArgName(arg) { @@ -43682,7 +43680,7 @@ const process = __nccwpck_require__(7282); const { Argument, humanReadableArgName } = __nccwpck_require__(9414); const { CommanderError } = __nccwpck_require__(2625); const { Help } = __nccwpck_require__(5153); -const { Option, splitOptionFlags, DualOptions } = __nccwpck_require__(6558); +const { Option, DualOptions } = __nccwpck_require__(6558); const { suggestSimilar } = __nccwpck_require__(7592); class Command extends EventEmitter { @@ -43727,7 +43725,7 @@ class Command extends EventEmitter { this._enablePositionalOptions = false; this._passThroughOptions = false; this._lifeCycleHooks = {}; // a hash of arrays - /** @type {boolean | string} */ + /** @type {(boolean | string)} */ this._showHelpAfterError = false; this._showSuggestionAfterError = true; @@ -43741,15 +43739,11 @@ class Command extends EventEmitter { }; this._hidden = false; - this._hasHelpOption = true; - this._helpFlags = '-h, --help'; - this._helpDescription = 'display help for command'; - this._helpShortFlag = '-h'; - this._helpLongFlag = '--help'; - this._addImplicitHelpCommand = undefined; // Deliberately undefined, not decided whether true or false - this._helpCommandName = 'help'; - this._helpCommandnameAndArgs = 'help [command]'; - this._helpCommandDescription = 'display help for command'; + /** @type {(Option | null | undefined)} */ + this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled. + this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited + /** @type {Command} */ + this._helpCommand = undefined; // lazy initialised, inherited this._helpConfiguration = {}; } @@ -43763,14 +43757,8 @@ class Command extends EventEmitter { */ copyInheritedSettings(sourceCommand) { this._outputConfiguration = sourceCommand._outputConfiguration; - this._hasHelpOption = sourceCommand._hasHelpOption; - this._helpFlags = sourceCommand._helpFlags; - this._helpDescription = sourceCommand._helpDescription; - this._helpShortFlag = sourceCommand._helpShortFlag; - this._helpLongFlag = sourceCommand._helpLongFlag; - this._helpCommandName = sourceCommand._helpCommandName; - this._helpCommandnameAndArgs = sourceCommand._helpCommandnameAndArgs; - this._helpCommandDescription = sourceCommand._helpCommandDescription; + this._helpOption = sourceCommand._helpOption; + this._helpCommand = sourceCommand._helpCommand; this._helpConfiguration = sourceCommand._helpConfiguration; this._exitCallback = sourceCommand._exitCallback; this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties; @@ -43785,7 +43773,7 @@ class Command extends EventEmitter { /** * @returns {Command[]} - * @api private + * @private */ _getCommandAndAncestors() { @@ -43816,7 +43804,7 @@ class Command extends EventEmitter { * .command('stop [service]', 'stop named service, or all if no name supplied'); * * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {(Object|string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) * @param {Object} [execOpts] - configuration options (for executable) * @return {Command} returns new command for action handler, or `this` for executable command */ @@ -43840,7 +43828,7 @@ class Command extends EventEmitter { cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor if (args) cmd.arguments(args); - this.commands.push(cmd); + this._registerCommand(cmd); cmd.parent = this; cmd.copyInheritedSettings(this); @@ -43878,7 +43866,7 @@ class Command extends EventEmitter { * or with a subclass of Help by overriding createHelp(). * * @param {Object} [configuration] - configuration options - * @return {Command|Object} `this` command for chaining, or stored configuration + * @return {(Command|Object)} `this` command for chaining, or stored configuration */ configureHelp(configuration) { @@ -43904,7 +43892,7 @@ class Command extends EventEmitter { * outputError(str, write) // used for displaying errors, and not used for displaying help * * @param {Object} [configuration] - configuration options - * @return {Command|Object} `this` command for chaining, or stored configuration + * @return {(Command|Object)} `this` command for chaining, or stored configuration */ configureOutput(configuration) { @@ -43917,7 +43905,7 @@ class Command extends EventEmitter { /** * Display the help or a custom message after an error occurs. * - * @param {boolean|string} [displayHelp] + * @param {(boolean|string)} [displayHelp] * @return {Command} `this` command for chaining */ showHelpAfterError(displayHelp = true) { @@ -43957,8 +43945,10 @@ class Command extends EventEmitter { if (opts.isDefault) this._defaultCommandName = cmd._name; if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation - this.commands.push(cmd); + this._registerCommand(cmd); cmd.parent = this; + cmd._checkForBrokenPassThrough(); + return this; } @@ -43989,7 +43979,7 @@ class Command extends EventEmitter { * * @param {string} name * @param {string} [description] - * @param {Function|*} [fn] - custom argument processing function + * @param {(Function|*)} [fn] - custom argument processing function * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ @@ -44042,39 +44032,76 @@ class Command extends EventEmitter { } /** - * Override default decision whether to add implicit help command. + * Customise or override default help command. By default a help command is automatically added if your command has subcommands. * - * addHelpCommand() // force on - * addHelpCommand(false); // force off - * addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details + * program.helpCommand('help [cmd]'); + * program.helpCommand('help [cmd]', 'show help'); + * program.helpCommand(false); // suppress default help command + * program.helpCommand(true); // add help command even if no subcommands * + * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added + * @param {string} [description] - custom description * @return {Command} `this` command for chaining */ - addHelpCommand(enableOrNameAndArgs, description) { - if (enableOrNameAndArgs === false) { - this._addImplicitHelpCommand = false; - } else { - this._addImplicitHelpCommand = true; - if (typeof enableOrNameAndArgs === 'string') { - this._helpCommandName = enableOrNameAndArgs.split(' ')[0]; - this._helpCommandnameAndArgs = enableOrNameAndArgs; - } - this._helpCommandDescription = description || this._helpCommandDescription; + helpCommand(enableOrNameAndArgs, description) { + if (typeof enableOrNameAndArgs === 'boolean') { + this._addImplicitHelpCommand = enableOrNameAndArgs; + return this; } + + enableOrNameAndArgs = enableOrNameAndArgs ?? 'help [command]'; + const [, helpName, helpArgs] = enableOrNameAndArgs.match(/([^ ]+) *(.*)/); + const helpDescription = description ?? 'display help for command'; + + const helpCommand = this.createCommand(helpName); + helpCommand.helpOption(false); + if (helpArgs) helpCommand.arguments(helpArgs); + if (helpDescription) helpCommand.description(helpDescription); + + this._addImplicitHelpCommand = true; + this._helpCommand = helpCommand; + return this; } /** - * @return {boolean} - * @api private + * Add prepared custom help command. + * + * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()` + * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only + * @return {Command} `this` command for chaining */ + addHelpCommand(helpCommand, deprecatedDescription) { + // If not passed an object, call through to helpCommand for backwards compatibility, + // as addHelpCommand was originally used like helpCommand is now. + if (typeof helpCommand !== 'object') { + this.helpCommand(helpCommand, deprecatedDescription); + return this; + } - _hasImplicitHelpCommand() { - if (this._addImplicitHelpCommand === undefined) { - return this.commands.length && !this._actionHandler && !this._findCommand('help'); + this._addImplicitHelpCommand = true; + this._helpCommand = helpCommand; + return this; + } + + /** + * Lazy create help command. + * + * @return {(Command|null)} + * @package + */ + _getHelpCommand() { + const hasImplicitHelpCommand = this._addImplicitHelpCommand ?? + (this.commands.length && !this._actionHandler && !this._findCommand('help')); + + if (hasImplicitHelpCommand) { + if (this._helpCommand === undefined) { + this.helpCommand(undefined, undefined); // use default name and description + } + return this._helpCommand; } - return this._addImplicitHelpCommand; + return null; } /** @@ -44128,7 +44155,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * @param {string} code an id string representing the error * @param {string} message human-readable description of the error * @return never - * @api private + * @private */ _exit(exitCode, code, message) { @@ -44190,11 +44217,11 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Wrap parseArgs to catch 'commander.invalidArgument'. * - * @param {Option | Argument} target + * @param {(Option | Argument)} target * @param {string} value * @param {*} previous * @param {string} invalidArgumentMessage - * @api private + * @private */ _callParseArg(target, value, previous, invalidArgumentMessage) { @@ -44209,6 +44236,49 @@ Expecting one of '${allowedValues.join("', '")}'`); } } + /** + * Check for option flag conflicts. + * Register option if no conflicts found, or throw on conflict. + * + * @param {Option} option + * @api private + */ + + _registerOption(option) { + const matchingOption = (option.short && this._findOption(option.short)) || + (option.long && this._findOption(option.long)); + if (matchingOption) { + const matchingFlag = (option.long && this._findOption(option.long)) ? option.long : option.short; + throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}' +- already used by option '${matchingOption.flags}'`); + } + + this.options.push(option); + } + + /** + * Check for command name and alias conflicts with existing commands. + * Register command if no conflicts found, or throw on conflict. + * + * @param {Command} command + * @api private + */ + + _registerCommand(command) { + const knownBy = (cmd) => { + return [cmd.name()].concat(cmd.aliases()); + }; + + const alreadyUsed = knownBy(command).find((name) => this._findCommand(name)); + if (alreadyUsed) { + const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|'); + const newCmd = knownBy(command).join('|'); + throw new Error(`cannot add command '${newCmd}' as already have command '${existingCmd}'`); + } + + this.commands.push(command); + } + /** * Add an option. * @@ -44216,6 +44286,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * @return {Command} `this` command for chaining */ addOption(option) { + this._registerOption(option); + const oname = option.name(); const name = option.attributeName(); @@ -44230,9 +44302,6 @@ Expecting one of '${allowedValues.join("', '")}'`); this.setOptionValueWithSource(name, option.defaultValue, 'default'); } - // register the option - this.options.push(option); - // handler for cli and env supplied values const handleOptionValue = (val, invalidValueMessage, valueSource) => { // val is null for optional option used without an optional-argument. @@ -44280,7 +44349,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Internal implementation shared by .option() and .requiredOption() * - * @api private + * @private */ _optionEx(config, flags, description, fn, defaultValue) { if (typeof flags === 'object' && flags instanceof Option) { @@ -44322,7 +44391,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} flags * @param {string} [description] - * @param {Function|*} [parseArg] - custom option processing function or default value + * @param {(Function|*)} [parseArg] - custom option processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ @@ -44339,7 +44408,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} flags * @param {string} [description] - * @param {Function|*} [parseArg] - custom option processing function or default value + * @param {(Function|*)} [parseArg] - custom option processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ @@ -44356,7 +44425,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` * - * @param {Boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. + * @param {boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. */ combineFlagAndOptionalValue(combine = true) { this._combineFlagAndOptionalValue = !!combine; @@ -44366,7 +44435,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow unknown options on the command line. * - * @param {Boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown + * @param {boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown * for unknown options. */ allowUnknownOption(allowUnknown = true) { @@ -44377,7 +44446,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow excess command-arguments on the command line. Pass false to make excess arguments an error. * - * @param {Boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown + * @param {boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown * for excess arguments. */ allowExcessArguments(allowExcess = true) { @@ -44390,7 +44459,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions. * The default behaviour is non-positional and global options may appear anywhere on the command line. * - * @param {Boolean} [positional=true] + * @param {boolean} [positional=true] */ enablePositionalOptions(positional = true) { this._enablePositionalOptions = !!positional; @@ -44403,17 +44472,25 @@ Expecting one of '${allowedValues.join("', '")}'`); * positional options to have been enabled on the program (parent commands). * The default behaviour is non-positional and options may appear before or after command-arguments. * - * @param {Boolean} [passThrough=true] + * @param {boolean} [passThrough=true] * for unknown options. */ passThroughOptions(passThrough = true) { this._passThroughOptions = !!passThrough; - if (!!this.parent && passThrough && !this.parent._enablePositionalOptions) { - throw new Error('passThroughOptions can not be used without turning on enablePositionalOptions for parent command(s)'); - } + this._checkForBrokenPassThrough(); return this; } + /** + * @private + */ + + _checkForBrokenPassThrough() { + if (this.parent && this._passThroughOptions && !this.parent._enablePositionalOptions) { + throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`); + } + } + /** * Whether to store option values as properties on command object, * or store separately (specify false). In both cases the option values can be accessed using .opts(). @@ -44426,9 +44503,9 @@ Expecting one of '${allowedValues.join("', '")}'`); if (this.options.length) { throw new Error('call .storeOptionsAsProperties() before adding options'); } - // if (Object.keys(this._optionValues).length) { - // throw new Error('call .storeOptionsAsProperties() before setting option values'); - // } + if (Object.keys(this._optionValues).length) { + throw new Error('call .storeOptionsAsProperties() before setting option values'); + } this._storeOptionsAsProperties = !!storeAsProperties; return this; } @@ -44513,7 +44590,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Get user arguments from implied or explicit arguments. * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches. * - * @api private + * @private */ _prepareUserArgs(argv, parseOptions) { @@ -44616,7 +44693,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Execute a sub-command executable. * - * @api private + * @private */ _executeSubCommand(subcommand, args) { @@ -44703,15 +44780,15 @@ Expecting one of '${allowedValues.join("', '")}'`); } // By default terminate process when spawned process terminates. - // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running! const exitCallback = this._exitCallback; - if (!exitCallback) { - proc.on('close', process.exit.bind(process)); - } else { - proc.on('close', () => { - exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)')); - }); - } + proc.on('close', (code, _signal) => { + code = code ?? 1; // code is null if spawned process terminated due to a signal + if (!exitCallback) { + process.exit(code); + } else { + exitCallback(new CommanderError(code, 'commander.executeSubCommandAsync', '(close)')); + } + }); proc.on('error', (err) => { // @ts-ignore if (err.code === 'ENOENT') { @@ -44741,7 +44818,7 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * @api private + * @private */ _dispatchSubcommand(commandName, operands, unknown) { @@ -44764,7 +44841,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Invoke help directly if possible, or dispatch if necessary. * e.g. help foo * - * @api private + * @private */ _dispatchHelpCommand(subcommandName) { @@ -44778,14 +44855,14 @@ Expecting one of '${allowedValues.join("', '")}'`); // Fallback to parsing the help flag to invoke the help. return this._dispatchSubcommand(subcommandName, [], [ - this._helpLongFlag || this._helpShortFlag + this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help' ]); } /** * Check this.args against expected this.registeredArguments. * - * @api private + * @private */ _checkNumberOfArguments() { @@ -44807,7 +44884,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Process this.args using this.registeredArguments and save as this.processedArgs! * - * @api private + * @private */ _processArguments() { @@ -44852,10 +44929,10 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Once we have a promise we chain, but call synchronously until then. * - * @param {Promise|undefined} promise + * @param {(Promise|undefined)} promise * @param {Function} fn - * @return {Promise|undefined} - * @api private + * @return {(Promise|undefined)} + * @private */ _chainOrCall(promise, fn) { @@ -44870,10 +44947,10 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * - * @param {Promise|undefined} promise + * @param {(Promise|undefined)} promise * @param {string} event - * @return {Promise|undefined} - * @api private + * @return {(Promise|undefined)} + * @private */ _chainOrCallHooks(promise, event) { @@ -44901,11 +44978,11 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * - * @param {Promise|undefined} promise + * @param {(Promise|undefined)} promise * @param {Command} subCommand * @param {string} event - * @return {Promise|undefined} - * @api private + * @return {(Promise|undefined)} + * @private */ _chainOrCallSubCommandHook(promise, subCommand, event) { @@ -44924,7 +45001,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Process arguments in context of this command. * Returns action result, in case it is a promise. * - * @api private + * @private */ _parseCommand(operands, unknown) { @@ -44938,11 +45015,11 @@ Expecting one of '${allowedValues.join("', '")}'`); if (operands && this._findCommand(operands[0])) { return this._dispatchSubcommand(operands[0], operands.slice(1), unknown); } - if (this._hasImplicitHelpCommand() && operands[0] === this._helpCommandName) { + if (this._getHelpCommand() && operands[0] === this._getHelpCommand().name()) { return this._dispatchHelpCommand(operands[1]); } if (this._defaultCommandName) { - outputHelpIfRequested(this, unknown); // Run the help for default command from parent rather than passing to default command + this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command return this._dispatchSubcommand(this._defaultCommandName, operands, unknown); } if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { @@ -44950,7 +45027,7 @@ Expecting one of '${allowedValues.join("', '")}'`); this.help({ error: true }); } - outputHelpIfRequested(this, parsed.unknown); + this._outputHelpIfRequested(parsed.unknown); this._checkForMissingMandatoryOptions(); this._checkForConflictingOptions(); @@ -45008,7 +45085,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Find matching command. * - * @api private + * @private */ _findCommand(name) { if (!name) return undefined; @@ -45020,7 +45097,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} arg * @return {Option} - * @api private + * @package internal use only */ _findOption(arg) { @@ -45031,7 +45108,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Display an error message if a mandatory option does not have a value. * Called after checking for help flags in leaf subcommand. * - * @api private + * @private */ _checkForMissingMandatoryOptions() { @@ -45048,7 +45125,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Display an error message if conflicting options are used together in this. * - * @api private + * @private */ _checkForConflictingLocalOptions() { const definedNonDefaultOptions = this.options.filter( @@ -45079,7 +45156,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Display an error message if conflicting options are used together. * Called after checking for help flags in leaf subcommand. * - * @api private + * @private */ _checkForConflictingOptions() { // Walk up hierarchy so can call in subcommand after checking for displaying help. @@ -45100,8 +45177,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * sub --unknown uuu op => [sub], [--unknown uuu op] * sub -- --unknown uuu op => [sub --unknown uuu op], [] * - * @param {String[]} argv - * @return {{operands: String[], unknown: String[]}} + * @param {string[]} argv + * @return {{operands: string[], unknown: string[]}} */ parseOptions(argv) { @@ -45195,7 +45272,7 @@ Expecting one of '${allowedValues.join("', '")}'`); operands.push(arg); if (args.length > 0) unknown.push(...args); break; - } else if (arg === this._helpCommandName && this._hasImplicitHelpCommand()) { + } else if (this._getHelpCommand() && arg === this._getHelpCommand().name()) { operands.push(arg); if (args.length > 0) operands.push(...args); break; @@ -45283,7 +45360,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Apply any option related environment variables, if option does * not have a value from cli or client code. * - * @api private + * @private */ _parseOptionsEnv() { this.options.forEach((option) => { @@ -45306,7 +45383,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Apply any implied option values, if option is undefined or default value. * - * @api private + * @private */ _parseOptionsImplied() { const dualHelper = new DualOptions(this.options); @@ -45330,7 +45407,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Argument `name` is missing. * * @param {string} name - * @api private + * @private */ missingArgument(name) { @@ -45342,7 +45419,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * `Option` is missing an argument. * * @param {Option} option - * @api private + * @private */ optionMissingArgument(option) { @@ -45354,7 +45431,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * `Option` does not have a value, and is a mandatory option. * * @param {Option} option - * @api private + * @private */ missingMandatoryOptionValue(option) { @@ -45367,7 +45444,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {Option} option * @param {Option} conflictingOption - * @api private + * @private */ _conflictingOption(option, conflictingOption) { // The calling code does not know whether a negated option is the source of the @@ -45404,7 +45481,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Unknown option `flag`. * * @param {string} flag - * @api private + * @private */ unknownOption(flag) { @@ -45433,7 +45510,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Excess arguments, more than expected. * * @param {string[]} receivedArgs - * @api private + * @private */ _excessArguments(receivedArgs) { @@ -45449,7 +45526,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Unknown command. * - * @api private + * @private */ unknownCommand() { @@ -45480,7 +45557,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * @param {string} [str] * @param {string} [flags] * @param {string} [description] - * @return {this | string | undefined} `this` command for chaining, or version string if no arguments + * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments */ version(str, flags, description) { @@ -45489,8 +45566,9 @@ Expecting one of '${allowedValues.join("', '")}'`); flags = flags || '-V, --version'; description = description || 'output the version number'; const versionOption = this.createOption(flags, description); - this._versionOptionName = versionOption.attributeName(); // [sic] not defined in constructor, partly legacy, partly only needed at root - this.options.push(versionOption); + this._versionOptionName = versionOption.attributeName(); + this._registerOption(versionOption); + this.on('option:' + versionOption.name(), () => { this._outputConfiguration.writeOut(`${str}\n`); this._exit(0, 'commander.version', str); @@ -45503,7 +45581,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} [str] * @param {Object} [argsDescription] - * @return {string|Command} + * @return {(string|Command)} */ description(str, argsDescription) { if (str === undefined && argsDescription === undefined) return this._description; @@ -45518,7 +45596,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Set the summary. Used when listed as subcommand of parent. * * @param {string} [str] - * @return {string|Command} + * @return {(string|Command)} */ summary(str) { if (str === undefined) return this._summary; @@ -45532,7 +45610,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help. * * @param {string} [alias] - * @return {string|Command} + * @return {(string|Command)} */ alias(alias) { @@ -45546,6 +45624,12 @@ Expecting one of '${allowedValues.join("', '")}'`); } if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); + const matchingCommand = this.parent?._findCommand(alias); + if (matchingCommand) { + // c.f. _registerCommand + const existingCmd = [matchingCommand.name()].concat(matchingCommand.aliases()).join('|'); + throw new Error(`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`); + } command._aliases.push(alias); return this; @@ -45557,7 +45641,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Only the first alias is shown in the auto-generated help. * * @param {string[]} [aliases] - * @return {string[]|Command} + * @return {(string[]|Command)} */ aliases(aliases) { @@ -45572,7 +45656,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Set / get the command usage `str`. * * @param {string} [str] - * @return {String|Command} + * @return {(string|Command)} */ usage(str) { @@ -45583,7 +45667,7 @@ Expecting one of '${allowedValues.join("', '")}'`); return humanReadableArgName(arg); }); return [].concat( - (this.options.length || this._hasHelpOption ? '[options]' : []), + (this.options.length || (this._helpOption !== null) ? '[options]' : []), (this.commands.length ? '[command]' : []), (this.registeredArguments.length ? args : []) ).join(' '); @@ -45597,7 +45681,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Get or set the name of the command. * * @param {string} [str] - * @return {string|Command} + * @return {(string|Command)} */ name(str) { @@ -45634,7 +45718,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * program.executableDir('subcommands'); * * @param {string} [path] - * @return {string|null|Command} + * @return {(string|null|Command)} */ executableDir(path) { @@ -45659,7 +45743,7 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * @api private + * @private */ _getHelpContext(contextOptions) { @@ -45704,38 +45788,72 @@ Expecting one of '${allowedValues.join("', '")}'`); } context.write(helpInformation); - if (this._helpLongFlag) { - this.emit(this._helpLongFlag); // deprecated + if (this._getHelpOption()?.long) { + this.emit(this._getHelpOption().long); // deprecated } this.emit('afterHelp', context); this._getCommandAndAncestors().forEach(command => command.emit('afterAllHelp', context)); } /** - * You can pass in flags and a description to override the help - * flags and help description for your command. Pass in false to - * disable the built-in help option. + * You can pass in flags and a description to customise the built-in help option. + * Pass in false to disable the built-in help option. + * + * @example + * program.helpOption('-?, --help' 'show help'); // customise + * program.helpOption(false); // disable * - * @param {string | boolean} [flags] + * @param {(string | boolean)} flags * @param {string} [description] * @return {Command} `this` command for chaining */ helpOption(flags, description) { + // Support disabling built-in help option. if (typeof flags === 'boolean') { - this._hasHelpOption = flags; + if (flags) { + this._helpOption = this._helpOption ?? undefined; // preserve existing option + } else { + this._helpOption = null; // disable + } return this; } - this._helpFlags = flags || this._helpFlags; - this._helpDescription = description || this._helpDescription; - const helpFlags = splitOptionFlags(this._helpFlags); - this._helpShortFlag = helpFlags.shortFlag; - this._helpLongFlag = helpFlags.longFlag; + // Customise flags and description. + flags = flags ?? '-h, --help'; + description = description ?? 'display help for command'; + this._helpOption = this.createOption(flags, description); return this; } + /** + * Lazy create help option. + * Returns null if has been disabled with .helpOption(false). + * + * @returns {(Option | null)} the help option + * @package internal use only + */ + _getHelpOption() { + // Lazy create help option on demand. + if (this._helpOption === undefined) { + this.helpOption(undefined, undefined); + } + return this._helpOption; + } + + /** + * Supply your own option to use for the built-in help option. + * This is an alternative to using helpOption() to customise the flags and description etc. + * + * @param {Option} option + * @return {Command} `this` command for chaining + */ + addHelpOption(option) { + this._helpOption = option; + return this; + } + /** * Output help information and exit. * @@ -45761,7 +45879,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands. * * @param {string} position - before or after built-in help - * @param {string | Function} text - string to add, or a function returning a string + * @param {(string | Function)} text - string to add, or a function returning a string * @return {Command} `this` command for chaining */ addHelpText(position, text) { @@ -45785,22 +45903,22 @@ Expecting one of '${allowedValues.join("', '")}'`); }); return this; } -} -/** - * Output help information if help flags specified - * - * @param {Command} cmd - command to output help for - * @param {Array} args - array of options to search for help flags - * @api private - */ + /** + * Output help information if help flags specified + * + * @param {Array} args - array of options to search for help flags + * @private + */ -function outputHelpIfRequested(cmd, args) { - const helpOption = cmd._hasHelpOption && args.find(arg => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag); - if (helpOption) { - cmd.outputHelp(); - // (Do not have all displayed text available so only passing placeholder.) - cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)'); + _outputHelpIfRequested(args) { + const helpOption = this._getHelpOption(); + const helpRequested = helpOption && args.find(arg => helpOption.is(arg)); + if (helpRequested) { + this.outputHelp(); + // (Do not have all displayed text available so only passing placeholder.) + this._exit(0, 'commander.helpDisplayed', '(outputHelp)'); + } } } @@ -45809,7 +45927,7 @@ function outputHelpIfRequested(cmd, args) { * * @param {string[]} args - array of arguments from node.execArgv * @returns {string[]} - * @api private + * @private */ function incrementNodeInspectorPort(args) { @@ -45937,13 +46055,8 @@ class Help { visibleCommands(cmd) { const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden); - if (cmd._hasImplicitHelpCommand()) { - // Create a command matching the implicit help command. - const [, helpName, helpArgs] = cmd._helpCommandnameAndArgs.match(/([^ ]+) *(.*)/); - const helpCommand = cmd.createCommand(helpName) - .helpOption(false); - helpCommand.description(cmd._helpCommandDescription); - if (helpArgs) helpCommand.arguments(helpArgs); + const helpCommand = cmd._getHelpCommand(); + if (helpCommand && !helpCommand._hidden) { visibleCommands.push(helpCommand); } if (this.sortSubcommands) { @@ -45979,19 +46092,19 @@ class Help { visibleOptions(cmd) { const visibleOptions = cmd.options.filter((option) => !option.hidden); - // Implicit help - const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag); - const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag); - if (showShortHelpFlag || showLongHelpFlag) { - let helpOption; - if (!showShortHelpFlag) { - helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription); - } else if (!showLongHelpFlag) { - helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription); - } else { - helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription); + // Built-in help option. + const helpOption = cmd._getHelpOption(); + if (helpOption && !helpOption.hidden) { + // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs. + const removeShort = helpOption.short && cmd._findOption(helpOption.short); + const removeLong = helpOption.long && cmd._findOption(helpOption.long); + if (!removeShort && !removeLong) { + visibleOptions.push(helpOption); // no changes needed + } else if (helpOption.long && !removeLong) { + visibleOptions.push(cmd.createOption(helpOption.long, helpOption.description)); + } else if (helpOption.short && !removeShort) { + visibleOptions.push(cmd.createOption(helpOption.short, helpOption.description)); } - visibleOptions.push(helpOption); } if (this.sortOptions) { visibleOptions.sort(this.compareOptions); @@ -46454,7 +46567,7 @@ class Option { * new Option('--rgb').conflicts('cmyk'); * new Option('--js').conflicts(['ts', 'jsx']); * - * @param {string | string[]} names + * @param {(string | string[])} names * @return {Option} */ @@ -46538,7 +46651,7 @@ class Option { } /** - * @api private + * @package internal use only */ _concatValue(value, previous) { @@ -46588,7 +46701,6 @@ class Option { * as a object attribute key. * * @return {string} - * @api private */ attributeName() { @@ -46600,7 +46712,7 @@ class Option { * * @param {string} arg * @return {boolean} - * @api private + * @package internal use only */ is(arg) { @@ -46613,7 +46725,7 @@ class Option { * Options are one of boolean, negated, required argument, or optional argument. * * @return {boolean} - * @api private + * @package internal use only */ isBoolean() { @@ -46673,7 +46785,7 @@ class DualOptions { * * @param {string} str * @return {string} - * @api private + * @private */ function camelcase(str) { @@ -46685,7 +46797,7 @@ function camelcase(str) { /** * Split the short and long flag out of something like '-m,--mixed ' * - * @api private + * @private */ function splitOptionFlags(flags) { @@ -46705,7 +46817,6 @@ function splitOptionFlags(flags) { } exports.Option = Option; -exports.splitOptionFlags = splitOptionFlags; exports.DualOptions = DualOptions; diff --git a/package-lock.json b/package-lock.json index 9378b67..ead9268 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@actions/github": "^6", "@dev-build-deploy/commit-it": "^2", "@dev-build-deploy/diagnose-it": "^1", - "commander": "^11", + "commander": "^12", "simple-git": "^3" }, "bin": { @@ -2477,11 +2477,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", + "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/concat-map": { diff --git a/package.json b/package.json index beed04c..847538d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@actions/github": "^6", "@dev-build-deploy/commit-it": "^2", "@dev-build-deploy/diagnose-it": "^1", - "commander": "^11", + "commander": "^12", "simple-git": "^3" }, "devDependencies": { From 38d4cb09a1bf468012516a3bfbfad325f3435915 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Tue, 2 Apr 2024 08:50:29 +0200 Subject: [PATCH 17/25] feat: extend supported "nouns" as part of the scope The Conventional Commits specification refers to "nouns" as supported in the Scope, however, the original implementation was limited to single words in lower case. With this commit we extend the definition to: > A noun is defined as a single word which can be capitalized or > contain hyphens --- lib/action/index.js | 1637 ++++++++++++++++++++++++++++++---------- lib/cli/index.js | 1637 ++++++++++++++++++++++++++++++---------- lib/precommit/index.js | 1637 ++++++++++++++++++++++++++++++---------- package-lock.json | 1386 +++++++++++++++++----------------- test/validator.test.ts | 5 + 5 files changed, 4393 insertions(+), 1909 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index e1dee17..3dd1620 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -1843,7 +1843,7 @@ class HttpClient { if (this._keepAlive && useProxy) { agent = this._proxyAgent; } - if (this._keepAlive && !useProxy) { + if (!useProxy) { agent = this._agent; } // if agent is already assigned use that agent. @@ -1875,16 +1875,12 @@ class HttpClient { agent = tunnelAgent(agentOptions); this._proxyAgent = agent; } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { + // if tunneling agent isn't assigned create a new agent + if (!agent) { const options = { keepAlive: this._keepAlive, maxSockets }; agent = usingSsl ? new https.Agent(options) : new http.Agent(options); this._agent = agent; } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } if (usingSsl && this._ignoreSslError) { // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options @@ -2777,7 +2773,29 @@ exports.commitRules = void 0; const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); const commit_1 = __nccwpck_require__(8065); +/** + * Checks whether the provided string is a noun. + * A noun is defined as a single word which can be capitalized or contain hyphens, therefore + * it will not support multi-word nouns (i.e. New York). + * + * @param str String to check + * @returns True if the string is a noun, false otherwise. + * + * @internal + */ function isNoun(str) { + return /^[A-Za-z][a-z]*(-[A-Za-z][a-z]*)*$/.test(str); +} +/** + * Validates whether the provided type valid. + * A valid type is defined as a single word, all lowercase, no spaces, and no special characters. + * + * @param str String to check + * @returns True if the string is a valid type, false otherwise. + * + * @internal + */ +function isValidType(str) { return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); } function highlightString(str, substring) { @@ -2829,9 +2847,10 @@ class CC01 { // Validated with EC-02 } else { - // Ensure that we have a noun - if (!isNoun(commit.type.value)) + // Ensure that we have a valid type (single word, no spaces, no special characters) + if (!isValidType(commit.type.value)) { errors.push(createDiagnosticsMessage(commit, this.description, "which consists of a noun", "type")); + } // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { if (commit.scope.value) { @@ -2992,7 +3011,7 @@ class EC02 { const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; this.description = `Commits ${uniqueAddedTypes.size > 0 ? "MUST" : "MAY"} be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; if (commit.type.value === undefined || - !isNoun(commit.type.value) || + !isValidType(commit.type.value) || expectedTypes.includes(commit.type.value.toLowerCase().trimEnd())) { return []; } @@ -4488,7 +4507,7 @@ var import_graphql = __nccwpck_require__(8467); var import_auth_token = __nccwpck_require__(334); // pkg/dist-src/version.js -var VERSION = "5.0.2"; +var VERSION = "5.1.0"; // pkg/dist-src/index.js var noop = () => { @@ -5197,7 +5216,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "9.1.5"; +var VERSION = "9.2.1"; // pkg/dist-src/normalize-paginated-list-response.js function normalizePaginatedListResponse(response) { @@ -5358,6 +5377,8 @@ var paginatingEndpoints = [ "GET /orgs/{org}/members/{username}/codespaces", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", + "GET /orgs/{org}/organization-roles/{role_id}/teams", + "GET /orgs/{org}/organization-roles/{role_id}/users", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", @@ -5594,7 +5615,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "10.2.0"; +var VERSION = "10.4.1"; // pkg/dist-src/generated/endpoints.js var Endpoints = { @@ -5721,6 +5742,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" ], getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomOidcSubClaimForRepo: [ + "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], getEnvironmentPublicKey: [ "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key" ], @@ -5873,6 +5897,9 @@ var Endpoints = { setCustomLabelsForSelfHostedRunnerForRepo: [ "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" ], + setCustomOidcSubClaimForRepo: [ + "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], setGithubActionsDefaultWorkflowPermissionsOrganization: [ "PUT /orgs/{org}/actions/permissions/workflow" ], @@ -5942,6 +5969,7 @@ var Endpoints = { listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], markNotificationsAsRead: ["PUT /notifications"], markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], setThreadSubscription: [ @@ -6218,10 +6246,10 @@ var Endpoints = { updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] }, copilot: { - addCopilotForBusinessSeatsForTeams: [ + addCopilotSeatsForTeams: [ "POST /orgs/{org}/copilot/billing/selected_teams" ], - addCopilotForBusinessSeatsForUsers: [ + addCopilotSeatsForUsers: [ "POST /orgs/{org}/copilot/billing/selected_users" ], cancelCopilotSeatAssignmentForTeams: [ @@ -6534,10 +6562,24 @@ var Endpoints = { } ] }, + oidc: { + getOidcCustomSubTemplateForOrg: [ + "GET /orgs/{org}/actions/oidc/customization/sub" + ], + updateOidcCustomSubTemplateForOrg: [ + "PUT /orgs/{org}/actions/oidc/customization/sub" + ] + }, orgs: { addSecurityManagerTeam: [ "PUT /orgs/{org}/security-managers/teams/{team_slug}" ], + assignTeamToOrgRole: [ + "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + assignUserToOrgRole: [ + "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], blockUser: ["PUT /orgs/{org}/blocks/{username}"], cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], @@ -6546,6 +6588,7 @@ var Endpoints = { convertMemberToOutsideCollaborator: [ "PUT /orgs/{org}/outside_collaborators/{username}" ], + createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], createInvitation: ["POST /orgs/{org}/invitations"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomPropertiesValuesForRepos: [ @@ -6556,6 +6599,9 @@ var Endpoints = { ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], + deleteCustomOrganizationRole: [ + "DELETE /orgs/{org}/organization-roles/{role_id}" + ], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], enableOrDisableSecurityProductOnAllOrgRepos: [ "POST /orgs/{org}/{security_product}/{enablement}" @@ -6567,6 +6613,7 @@ var Endpoints = { ], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], getWebhookDelivery: [ @@ -6582,6 +6629,12 @@ var Endpoints = { listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], listMembers: ["GET /orgs/{org}/members"], listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], listPatGrantRepositories: [ "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" @@ -6596,6 +6649,9 @@ var Endpoints = { listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], listWebhooks: ["GET /orgs/{org}/hooks"], + patchCustomOrganizationRole: [ + "PATCH /orgs/{org}/organization-roles/{role_id}" + ], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" @@ -6620,6 +6676,18 @@ var Endpoints = { reviewPatGrantRequestsInBulk: [ "POST /orgs/{org}/personal-access-token-requests" ], + revokeAllOrgRolesTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" + ], + revokeAllOrgRolesUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}" + ], + revokeOrgRoleTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + revokeOrgRoleUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], setPublicMembershipForAuthenticatedUser: [ "PUT /orgs/{org}/public_members/{username}" @@ -6910,6 +6978,9 @@ var Endpoints = { {}, { mapToData: "users" } ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], checkAutomatedSecurityFixes: [ "GET /repos/{owner}/{repo}/automated-security-fixes" ], @@ -6945,12 +7016,15 @@ var Endpoints = { createForAuthenticatedUser: ["POST /user/repos"], createFork: ["POST /repos/{owner}/{repo}/forks"], createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateCustomPropertiesValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], createOrUpdateEnvironment: [ "PUT /repos/{owner}/{repo}/environments/{environment_name}" ], createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], createOrgRuleset: ["POST /orgs/{org}/rulesets"], - createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], createPagesSite: ["POST /repos/{owner}/{repo}/pages"], createRelease: ["POST /repos/{owner}/{repo}/releases"], createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], @@ -7103,6 +7177,9 @@ var Endpoints = { getOrgRulesets: ["GET /orgs/{org}/rulesets"], getPages: ["GET /repos/{owner}/{repo}/pages"], getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: [ + "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" + ], getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], getPullRequestReviewProtection: [ @@ -7313,6 +7390,9 @@ var Endpoints = { ] }, securityAdvisories: { + createFork: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" + ], createPrivateVulnerabilityReport: [ "POST /repos/{owner}/{repo}/security-advisories/reports" ], @@ -7804,7 +7884,7 @@ var import_endpoint = __nccwpck_require__(9440); var import_universal_user_agent = __nccwpck_require__(5030); // pkg/dist-src/version.js -var VERSION = "8.1.6"; +var VERSION = "8.2.0"; // pkg/dist-src/is-plain-object.js function isPlainObject(value) { @@ -7948,11 +8028,17 @@ async function getResponseData(response) { function toErrorMessage(data) { if (typeof data === "string") return data; + let suffix; + if ("documentation_url" in data) { + suffix = ` - ${data.documentation_url}`; + } else { + suffix = ""; + } if ("message" in data) { if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`; } - return data.message; + return `${data.message}${suffix}`; } return `Unknown error: ${JSON.stringify(data)}`; } @@ -11007,6 +11093,8 @@ Diff.prototype = { /*istanbul ignore end*/ diff: function diff(oldString, newString) { /*istanbul ignore start*/ + var _options$timeout; + var /*istanbul ignore end*/ options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; @@ -11045,68 +11133,104 @@ Diff.prototype = { maxEditLength = Math.min(maxEditLength, options.maxEditLength); } + var maxExecutionTime = + /*istanbul ignore start*/ + (_options$timeout = + /*istanbul ignore end*/ + options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : Infinity; + var abortAfterTimestamp = Date.now() + maxExecutionTime; var bestPath = [{ - newPos: -1, - components: [] + oldPos: -1, + lastComponent: undefined }]; // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + var newPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) { // Identity per the equality and tokenizer return done([{ value: this.join(newString), count: newString.length }]); - } // Main worker method. checks all permutations of a given edit length for acceptance. - + } // Once we hit the right edge of the edit graph on some diagonal k, we can + // definitely reach the end of the edit graph in no more than k edits, so + // there's no point in considering any moves to diagonal k+1 any more (from + // which we're guaranteed to need at least k+1 more edits). + // Similarly, once we've reached the bottom of the edit graph, there's no + // point considering moves to lower diagonals. + // We record this fact by setting minDiagonalToConsider and + // maxDiagonalToConsider to some finite value once we've hit the edge of + // the edit graph. + // This optimization is not faithful to the original algorithm presented in + // Myers's paper, which instead pointlessly extends D-paths off the end of + // the edit graph - see page 7 of Myers's paper which notes this point + // explicitly and illustrates it with a diagram. This has major performance + // implications for some common scenarios. For instance, to compute a diff + // where the new text simply appends d characters on the end of the + // original text of length n, the true Myers algorithm will take O(n+d^2) + // time while this optimization needs only O(n+d) time. + + + var minDiagonalToConsider = -Infinity, + maxDiagonalToConsider = Infinity; // Main worker method. checks all permutations of a given edit length for acceptance. function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + for (var diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) { var basePath = /*istanbul ignore start*/ void 0 /*istanbul ignore end*/ ; + var removePath = bestPath[diagonalPath - 1], + addPath = bestPath[diagonalPath + 1]; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - - if (addPath) { + if (removePath) { // No one else is going to attempt to use this value, clear it bestPath[diagonalPath - 1] = undefined; } - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + var canAdd = false; + + if (addPath) { + // what newPos will be after we do an insertion: + var addPathNewPos = addPath.oldPos - diagonalPath; + canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen; + } + + var canRemove = removePath && removePath.oldPos + 1 < oldLen; if (!canAdd && !canRemove) { // If this path is a terminal then prune bestPath[diagonalPath] = undefined; continue; } // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin + // path whose position in the old string is the farthest from the origin // and does not pass the bounds of the diff graph + // TODO: Remove the `+ 1` here to make behavior match Myers algorithm + // and prefer to order removals before insertions. - if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); + if (!canRemove || canAdd && removePath.oldPos + 1 < addPath.oldPos) { + basePath = self.addToPath(addPath, true, undefined, 0); } else { - basePath = addPath; // No need to clone, we've pulled it from the list - - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); + basePath = self.addToPath(removePath, undefined, true, 1); } - _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done + newPos = self.extractCommon(basePath, newString, oldString, diagonalPath); - if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { - return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) { + // If we have hit the end of both strings, then we are done + return done(buildValues(self, basePath.lastComponent, newString, oldString, self.useLongestToken)); } else { - // Otherwise track this path as a potential candidate and continue. bestPath[diagonalPath] = basePath; + + if (basePath.oldPos + 1 >= oldLen) { + maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1); + } + + if (newPos + 1 >= newLen) { + minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1); + } } } @@ -11120,7 +11244,7 @@ Diff.prototype = { if (callback) { (function exec() { setTimeout(function () { - if (editLength > maxEditLength) { + if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) { return callback(); } @@ -11130,7 +11254,7 @@ Diff.prototype = { }, 0); })(); } else { - while (editLength <= maxEditLength) { + while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) { var ret = execEditLength(); if (ret) { @@ -11143,23 +11267,29 @@ Diff.prototype = { /*istanbul ignore start*/ /*istanbul ignore end*/ - pushComponent: function pushComponent(components, added, removed) { - var last = components[components.length - 1]; + addToPath: function addToPath(path, added, removed, oldPosInc) { + var last = path.lastComponent; if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = { - count: last.count + 1, - added: added, - removed: removed + return { + oldPos: path.oldPos + oldPosInc, + lastComponent: { + count: last.count + 1, + added: added, + removed: removed, + previousComponent: last.previousComponent + } }; } else { - components.push({ - count: 1, - added: added, - removed: removed - }); + return { + oldPos: path.oldPos + oldPosInc, + lastComponent: { + count: 1, + added: added, + removed: removed, + previousComponent: last + } + }; } }, @@ -11169,8 +11299,8 @@ Diff.prototype = { extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { var newLen = newString.length, oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, + oldPos = basePath.oldPos, + newPos = oldPos - diagonalPath, commonCount = 0; while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { @@ -11180,13 +11310,14 @@ Diff.prototype = { } if (commonCount) { - basePath.components.push({ - count: commonCount - }); + basePath.lastComponent = { + count: commonCount, + previousComponent: basePath.lastComponent + }; } - basePath.newPos = newPos; - return oldPos; + basePath.oldPos = oldPos; + return newPos; }, /*istanbul ignore start*/ @@ -11237,7 +11368,20 @@ Diff.prototype = { } }; -function buildValues(diff, components, newString, oldString, useLongestToken) { +function buildValues(diff, lastComponent, newString, oldString, useLongestToken) { + // First we convert our linked list of components in reverse order to an + // array in the right order: + var components = []; + var nextComponent; + + while (lastComponent) { + components.push(lastComponent); + nextComponent = lastComponent.previousComponent; + delete lastComponent.previousComponent; + lastComponent = nextComponent; + } + + components.reverse(); var componentPos = 0, componentLen = components.length, newPos = 0, @@ -11280,23 +11424,16 @@ function buildValues(diff, components, newString, oldString, useLongestToken) { // This is only available for string mode. - var lastComponent = components[componentLen - 1]; + var finalComponent = components[componentLen - 1]; - if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { - components[componentLen - 2].value += lastComponent.value; + if (componentLen > 1 && typeof finalComponent.value === 'string' && (finalComponent.added || finalComponent.removed) && diff.equals('', finalComponent.value)) { + components[componentLen - 2].value += finalComponent.value; components.pop(); } return components; } - -function clonePath(path) { - return { - newPos: path.newPos, - components: path.components.slice(0) - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJiZXN0UGF0aCIsIm5ld1BvcyIsImNvbXBvbmVudHMiLCJvbGRQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJiYXNlUGF0aCIsImFkZFBhdGgiLCJyZW1vdmVQYXRoIiwiY2FuQWRkIiwiY2FuUmVtb3ZlIiwiY2xvbmVQYXRoIiwicHVzaENvbXBvbmVudCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsImFkZGVkIiwicmVtb3ZlZCIsImxhc3QiLCJwdXNoIiwiY29tbW9uQ291bnQiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjb21wYXJhdG9yIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiYXJyYXkiLCJpIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBvbmVudCIsInNsaWNlIiwibWFwIiwib2xkVmFsdWUiLCJ0bXAiLCJsYXN0Q29tcG9uZW50IiwicG9wIiwicGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsSUFBSSxDQUFDQyxTQUFMLEdBQWlCO0FBQUE7O0FBQUE7QUFDZkMsRUFBQUEsSUFEZSxnQkFDVkMsU0FEVSxFQUNDQyxTQURELEVBQzBCO0FBQUE7QUFB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R0FBMkJNLEdBQTNCO0FBQ0Q7QUFDRjtBQUNGLEdBdkMyRSxDQXlDNUU7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQyxhQUFhLEdBQUd4QyxVQUFVLENBQUNrQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBOUI7O0FBQ0EsTUFBSUEsWUFBWSxHQUFHLENBQWYsSUFDRyxPQUFPTSxhQUFhLENBQUN2RCxLQUFyQixLQUErQixRQURsQyxLQUVJdUQsYUFBYSxDQUFDdEIsS0FBZCxJQUF1QnNCLGFBQWEsQ0FBQ3JCLE9BRnpDLEtBR0d6QyxJQUFJLENBQUM2QyxNQUFMLENBQVksRUFBWixFQUFnQmlCLGFBQWEsQ0FBQ3ZELEtBQTlCLENBSFAsRUFHNkM7QUFDM0NlLElBQUFBLFVBQVUsQ0FBQ2tDLFlBQVksR0FBRyxDQUFoQixDQUFWLENBQTZCakQsS0FBN0IsSUFBc0N1RCxhQUFhLENBQUN2RCxLQUFwRDtBQUNBZSxJQUFBQSxVQUFVLENBQUN5QyxHQUFYO0FBQ0Q7O0FBRUQsU0FBT3pDLFVBQVA7QUFDRDs7QUFFRCxTQUFTWSxTQUFULENBQW1COEIsSUFBbkIsRUFBeUI7QUFDdkIsU0FBTztBQUFFM0MsSUFBQUEsTUFBTSxFQUFFMkMsSUFBSSxDQUFDM0MsTUFBZjtBQUF1QkMsSUFBQUEsVUFBVSxFQUFFMEMsSUFBSSxDQUFDMUMsVUFBTCxDQUFnQm9DLEtBQWhCLENBQXNCLENBQXRCO0FBQW5DLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBuZXdQb3M6IC0xLCBjb21wb25lbnRzOiBbXSB9XTtcblxuICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbGV0IG9sZFBvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICByZXR1cm4gZG9uZShbe3ZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGh9XSk7XG4gICAgfVxuXG4gICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgbGV0IGJhc2VQYXRoO1xuICAgICAgICBsZXQgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gb2xkUG9zICYmIG9sZFBvcyA8IG9sZExlbjtcbiAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcbiAgICAgICAgaWYgKCFjYW5BZGQgfHwgKGNhblJlbW92ZSAmJiBhZGRQYXRoLm5ld1BvcyA8IHJlbW92ZVBhdGgubmV3UG9zKSkge1xuICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGguY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyYWNrIHRoaXMgcGF0aCBhcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZGl0TGVuZ3RoKys7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICBsZXQgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHVzaENvbXBvbmVudChjb21wb25lbnRzLCBhZGRlZCwgcmVtb3ZlZCkge1xuICAgIGxldCBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSBoZXJlIGFzIHRoZSBjb21wb25lbnQgY2xvbmUgb3BlcmF0aW9uIGlzIGp1c3RcbiAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXSA9IHtjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe2NvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfSk7XG4gICAgfVxuICB9LFxuICBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1BvcyxcbiAgICAgICAgb2xkUG9zID0gbmV3UG9zIC0gZGlhZ29uYWxQYXRoLFxuXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcbiAgICB3aGlsZSAobmV3UG9zICsgMSA8IG5ld0xlbiAmJiBvbGRQb3MgKyAxIDwgb2xkTGVuICYmIHRoaXMuZXF1YWxzKG5ld1N0cmluZ1tuZXdQb3MgKyAxXSwgb2xkU3RyaW5nW29sZFBvcyArIDFdKSkge1xuICAgICAgbmV3UG9zKys7XG4gICAgICBvbGRQb3MrKztcbiAgICAgIGNvbW1vbkNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICBiYXNlUGF0aC5jb21wb25lbnRzLnB1c2goe2NvdW50OiBjb21tb25Db3VudH0pO1xuICAgIH1cblxuICAgIGJhc2VQYXRoLm5ld1BvcyA9IG5ld1BvcztcbiAgICByZXR1cm4gb2xkUG9zO1xuICB9LFxuXG4gIGVxdWFscyhsZWZ0LCByaWdodCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gICAgICAgIHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJyk7XG4gIH0sXG4gIGpvaW4oY2hhcnMpIHtcbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcbiAgbGV0IGNvbXBvbmVudFBvcyA9IDAsXG4gICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgIG5ld1BvcyA9IDAsXG4gICAgICBvbGRQb3MgPSAwO1xuXG4gIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgbGV0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24odmFsdWUsIGkpIHtcbiAgICAgICAgICBsZXQgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG4gICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBDb21tb24gY2FzZVxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICBsZXQgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cbiAgbGV0IGxhc3RDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAmJiAobGFzdENvbXBvbmVudC5hZGRlZCB8fCBsYXN0Q29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGxhc3RDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICByZXR1cm4geyBuZXdQb3M6IHBhdGgubmV3UG9zLCBjb21wb25lbnRzOiBwYXRoLmNvbXBvbmVudHMuc2xpY2UoMCkgfTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJtYXhFeGVjdXRpb25UaW1lIiwidGltZW91dCIsIkluZmluaXR5IiwiYWJvcnRBZnRlclRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJiZXN0UGF0aCIsIm9sZFBvcyIsImxhc3RDb21wb25lbnQiLCJuZXdQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwibWluRGlhZ29uYWxUb0NvbnNpZGVyIiwibWF4RGlhZ29uYWxUb0NvbnNpZGVyIiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJtYXgiLCJiYXNlUGF0aCIsInJlbW92ZVBhdGgiLCJhZGRQYXRoIiwiY2FuQWRkIiwiYWRkUGF0aE5ld1BvcyIsImNhblJlbW92ZSIsImFkZFRvUGF0aCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsInBhdGgiLCJhZGRlZCIsInJlbW92ZWQiLCJvbGRQb3NJbmMiLCJsYXN0IiwicHJldmlvdXNDb21wb25lbnQiLCJjb21tb25Db3VudCIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNvbXBhcmF0b3IiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJhcnJheSIsImkiLCJwdXNoIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudHMiLCJuZXh0Q29tcG9uZW50IiwicmV2ZXJzZSIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBv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IERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgbWF4RXhlY3V0aW9uVGltZSA9IG9wdGlvbnMudGltZW91dCA/PyBJbmZpbml0eTtcbiAgICBjb25zdCBhYm9ydEFmdGVyVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIG1heEV4ZWN1dGlvblRpbWU7XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBvbGRQb3M6IC0xLCBsYXN0Q29tcG9uZW50OiB1bmRlZmluZWQgfV07XG5cbiAgICAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgIGxldCBuZXdQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmVzdFBhdGhbMF0sIG5ld1N0cmluZywgb2xkU3RyaW5nLCAwKTtcbiAgICBpZiAoYmVzdFBhdGhbMF0ub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgcmV0dXJuIGRvbmUoW3t2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksIGNvdW50OiBuZXdTdHJpbmcubGVuZ3RofV0pO1xuICAgIH1cblxuICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBlZGl0IGdyYXBoIG9uIHNvbWUgZGlhZ29uYWwgaywgd2UgY2FuXG4gICAgLy8gZGVmaW5pdGVseSByZWFjaCB0aGUgZW5kIG9mIHRoZSBlZGl0IGdyYXBoIGluIG5vIG1vcmUgdGhhbiBrIGVkaXRzLCBzb1xuICAgIC8vIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY29uc2lkZXJpbmcgYW55IG1vdmVzIHRvIGRpYWdvbmFsIGsrMSBhbnkgbW9yZSAoZnJvbVxuICAgIC8vIHdoaWNoIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbmVlZCBhdCBsZWFzdCBrKzEgbW9yZSBlZGl0cykuXG4gICAgLy8gU2ltaWxhcmx5LCBvbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdCBncmFwaCwgdGhlcmUncyBub1xuICAgIC8vIHBvaW50IGNvbnNpZGVyaW5nIG1vdmVzIHRvIGxvd2VyIGRpYWdvbmFscy5cbiAgICAvLyBXZSByZWNvcmQgdGhpcyBmYWN0IGJ5IHNldHRpbmcgbWluRGlhZ29uYWxUb0NvbnNpZGVyIGFuZFxuICAgIC8vIG1heERpYWdvbmFsVG9Db25zaWRlciB0byBzb21lIGZpbml0ZSB2YWx1ZSBvbmNlIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZlxuICAgIC8vIHRoZSBlZGl0IGdyYXBoLlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIG5vdCBmYWl0aGZ1bCB0byB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHByZXNlbnRlZCBpblxuICAgIC8vIE15ZXJzJ3MgcGFwZXIsIHdoaWNoIGluc3RlYWQgcG9pbnRsZXNzbHkgZXh0ZW5kcyBELXBhdGhzIG9mZiB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGVkaXQgZ3JhcGggLSBzZWUgcGFnZSA3IG9mIE15ZXJzJ3MgcGFwZXIgd2hpY2ggbm90ZXMgdGhpcyBwb2ludFxuICAgIC8vIGV4cGxpY2l0bHkgYW5kIGlsbHVzdHJhdGVzIGl0IHdpdGggYSBkaWFncmFtLiBUaGlzIGhhcyBtYWpvciBwZXJmb3JtYW5jZVxuICAgIC8vIGltcGxpY2F0aW9ucyBmb3Igc29tZSBjb21tb24gc2NlbmFyaW9zLiBGb3IgaW5zdGFuY2UsIHRvIGNvbXB1dGUgYSBkaWZmXG4gICAgLy8gd2hlcmUgdGhlIG5ldyB0ZXh0IHNpbXBseSBhcHBlbmRzIGQgY2hhcmFjdGVycyBvbiB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIG9yaWdpbmFsIHRleHQgb2YgbGVuZ3RoIG4sIHRoZSB0cnVlIE15ZXJzIGFsZ29yaXRobSB3aWxsIHRha2UgTyhuK2ReMilcbiAgICAvLyB0aW1lIHdoaWxlIHRoaXMgb3B0aW1pemF0aW9uIG5lZWRzIG9ubHkgTyhuK2QpIHRpbWUuXG4gICAgbGV0IG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IC1JbmZpbml0eSwgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gSW5maW5pdHk7XG5cbiAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7XG4gICAgICAgIGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpO1xuICAgICAgICBkaWFnb25hbFBhdGggKz0gMlxuICAgICAgKSB7XG4gICAgICAgIGxldCBiYXNlUGF0aDtcbiAgICAgICAgbGV0IHJlbW92ZVBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSxcbiAgICAgICAgICAgIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXTtcbiAgICAgICAgaWYgKHJlbW92ZVBhdGgpIHtcbiAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNhbkFkZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIHdoYXQgbmV3UG9zIHdpbGwgYmUgYWZ0ZXIgd2UgZG8gYW4gaW5zZXJ0aW9uOlxuICAgICAgICAgIGNvbnN0IGFkZFBhdGhOZXdQb3MgPSBhZGRQYXRoLm9sZFBvcyAtIGRpYWdvbmFsUGF0aDtcbiAgICAgICAgICBjYW5BZGQgPSBhZGRQYXRoICYmIDAgPD0gYWRkUGF0aE5ld1BvcyAmJiBhZGRQYXRoTmV3UG9zIDwgbmV3TGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGArIDFgIGhlcmUgdG8gbWFrZSBiZWhhdmlvciBtYXRjaCBNeWVycyBhbGdvcml0aG1cbiAgICAgICAgLy8gICAgICAgYW5kIHByZWZlciB0byBvcmRlciByZW1vdmFscyBiZWZvcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgaWYgKCFjYW5SZW1vdmUgfHwgKGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyArIDEgPCBhZGRQYXRoLm9sZFBvcykpIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IHNlbGYuYWRkVG9QYXRoKGFkZFBhdGgsIHRydWUsIHVuZGVmaW5lZCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBzZWxmLmFkZFRvUGF0aChyZW1vdmVQYXRoLCB1bmRlZmluZWQsIHRydWUsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3UG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTtcblxuICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgICAgICAgIG1heERpYWdvbmFsVG9Db25zaWRlciA9IE1hdGgubWluKG1heERpYWdvbmFsVG9Db25zaWRlciwgZGlhZ29uYWxQYXRoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLCBvciB1bnRpbCB0aGUgZWRpdCBsZW5ndGggZXhjZWVkcyBvcHRpb25zLm1heEVkaXRMZW5ndGggKGlmIGdpdmVuKSxcbiAgICAvLyBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCB8fCBEYXRlLm5vdygpID4gYWJvcnRBZnRlclRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICBleGVjKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgIH0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGggJiYgRGF0ZS5ub3coKSA8PSBhYm9ydEFmdGVyVGltZXN0YW1wKSB7XG4gICAgICAgIGxldCByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhZGRUb1BhdGgocGF0aCwgYWRkZWQsIHJlbW92ZWQsIG9sZFBvc0luYykge1xuICAgIGxldCBsYXN0ID0gcGF0aC5sYXN0Q29tcG9uZW50O1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2xkUG9zOiBwYXRoLm9sZFBvcyArIG9sZFBvc0luYyxcbiAgICAgICAgbGFzdENvbXBvbmVudDoge2NvdW50OiBsYXN0LmNvdW50ICsgMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkLCBwcmV2aW91c0NvbXBvbmVudDogbGFzdC5wcmV2aW91c0NvbXBvbmVudCB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICBsYXN0Q29tcG9uZW50OiB7Y291bnQ6IDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCwgcHJldmlvdXNDb21wb25lbnQ6IGxhc3QgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkUG9zID0gYmFzZVBhdGgub2xkUG9zLFxuICAgICAgICBuZXdQb3MgPSBvbGRQb3MgLSBkaWFnb25hbFBhdGgsXG5cbiAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICBuZXdQb3MrKztcbiAgICAgIG9sZFBvcysrO1xuICAgICAgY29tbW9uQ291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY29tbW9uQ291bnQpIHtcbiAgICAgIGJhc2VQYXRoLmxhc3RDb21wb25lbnQgPSB7Y291bnQ6IGNvbW1vbkNvdW50LCBwcmV2aW91c0NvbXBvbmVudDogYmFzZVBhdGgubGFzdENvbXBvbmVudH07XG4gICAgfVxuXG4gICAgYmFzZVBhdGgub2xkUG9zID0gb2xkUG9zO1xuICAgIHJldHVybiBuZXdQb3M7XG4gIH0sXG5cbiAgZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHRcbiAgICAgICAgfHwgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlICYmIGxlZnQudG9Mb3dlckNhc2UoKSA9PT0gcmlnaHQudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmVFbXB0eShhcnJheSkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBjYXN0SW5wdXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIHRva2VuaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgfSxcbiAgam9pbihjaGFycykge1xuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgbGFzdENvbXBvbmVudCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICAvLyBGaXJzdCB3ZSBjb252ZXJ0IG91ciBsaW5rZWQgbGlzdCBvZiBjb21wb25lbnRzIGluIHJldmVyc2Ugb3JkZXIgdG8gYW5cbiAgLy8gYXJyYXkgaW4gdGhlIHJpZ2h0IG9yZGVyOlxuICBjb25zdCBjb21wb25lbnRzID0gW107XG4gIGxldCBuZXh0Q29tcG9uZW50O1xuICB3aGlsZSAobGFzdENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudHMucHVzaChsYXN0Q29tcG9uZW50KTtcbiAgICBuZXh0Q29tcG9uZW50ID0gbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBkZWxldGUgbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBsYXN0Q29tcG9uZW50ID0gbmV4dENvbXBvbmVudDtcbiAgfVxuICBjb21wb25lbnRzLnJldmVyc2UoKTtcblxuICBsZXQgY29tcG9uZW50UG9zID0gMCxcbiAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuICAgICAgbmV3UG9zID0gMCxcbiAgICAgIG9sZFBvcyA9IDA7XG5cbiAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkICYmIHVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICBsZXQgdmFsdWUgPSBuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbih2YWx1ZSwgaSkge1xuICAgICAgICAgIGxldCBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIH1cbiAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7XG5cbiAgICAgIC8vIENvbW1vbiBjYXNlXG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCkge1xuICAgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4ob2xkU3RyaW5nLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBSZXZlcnNlIGFkZCBhbmQgcmVtb3ZlIHNvIHJlbW92ZXMgYXJlIG91dHB1dCBmaXJzdCB0byBtYXRjaCBjb21tb24gY29udmVudGlvblxuICAgICAgLy8gVGhlIGRpZmZpbmcgYWxnb3JpdGhtIGlzIHRpZWQgdG8gYWRkIHRoZW4gcmVtb3ZlIG91dHB1dCBhbmQgdGhpcyBpcyB0aGUgc2ltcGxlc3RcbiAgICAgIC8vIHJvdXRlIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgd2l0aCBtaW5pbWFsIG92ZXJoZWFkLlxuICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG4gICAgICAgIGxldCB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsZSBmb3Igd2hlbiBvbmUgdGVybWluYWwgaXMgaWdub3JlZCAoaS5lLiB3aGl0ZXNwYWNlKS5cbiAgLy8gRm9yIHRoaXMgY2FzZSB3ZSBtZXJnZSB0aGUgdGVybWluYWwgaW50byB0aGUgcHJpb3Igc3RyaW5nIGFuZCBkcm9wIHRoZSBjaGFuZ2UuXG4gIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuICBsZXQgZmluYWxDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGZpbmFsQ29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgJiYgKGZpbmFsQ29tcG9uZW50LmFkZGVkIHx8IGZpbmFsQ29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgZmluYWxDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBmaW5hbENvbXBvbmVudC52YWx1ZTtcbiAgICBjb21wb25lbnRzLnBvcCgpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0= /***/ }), @@ -11611,6 +11748,11 @@ exports.lineDiff = lineDiff; /*istanbul ignore end*/ lineDiff.tokenize = function (value) { + if (this.options.stripTrailingCr) { + // remove one \r before \n to match GNU diff's --strip-trailing-cr behavior + value = value.replace(/\r\n/g, '\n'); + } + var retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line @@ -11658,7 +11800,7 @@ function diffTrimmedLines(oldStr, newStr, callback) { }); return lineDiff.diff(oldStr, newStr, options); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJkaWZmTGluZXMiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiLCJkaWZmVHJpbW1lZExpbmVzIiwiZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFqQjs7Ozs7O0FBQ1BELFFBQVEsQ0FBQ0UsUUFBVCxHQUFvQixVQUFTQyxLQUFULEVBQWdCO0FBQ2xDLE1BQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsTUFDSUMsZ0JBQWdCLEdBQUdGLEtBQUssQ0FBQ0csS0FBTixDQUFZLFdBQVosQ0FEdkIsQ0FEa0MsQ0FJbEM7O0FBQ0EsTUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUNFLE1BQWpCLEdBQTBCLENBQTNCLENBQXJCLEVBQW9EO0FBQ2xERixJQUFBQSxnQkFBZ0IsQ0FBQ0csR0FBakI7QUFDRCxHQVBpQyxDQVNsQzs7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixnQkFBZ0IsQ0FBQ0UsTUFBckMsRUFBNkNFLENBQUMsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBSUMsSUFBSSxHQUFHTCxnQkFBZ0IsQ0FBQ0ksQ0FBRCxDQUEzQjs7QUFFQSxRQUFJQSxDQUFDLEdBQUcsQ0FBSixJQUFTLENBQUMsS0FBS0UsT0FBTCxDQUFhQyxjQUEzQixFQUEyQztBQUN6Q1IsTUFBQUEsUUFBUSxDQUFDQSxRQUFRLENBQUNHLE1BQVQsR0FBa0IsQ0FBbkIsQ0FBUixJQUFpQ0csSUFBakM7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJLEtBQUtDLE9BQUwsQ0FBYUUsZ0JBQWpCLEVBQW1DO0FBQ2pDSCxRQUFBQSxJQUFJLEdBQUdBLElBQUksQ0FBQ0ksSUFBTCxFQUFQO0FBQ0Q7O0FBQ0RWLE1BQUFBLFFBQVEsQ0FBQ1csSUFBVCxDQUFjTCxJQUFkO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPTixRQUFQO0FBQ0QsQ0F4QkQ7O0FBMEJPLFNBQVNZLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsUUFBbkMsRUFBNkM7QUFBRSxTQUFPbkIsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDs7QUFDaEcsU0FBU0UsZ0JBQVQsQ0FBMEJKLE1BQTFCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsUUFBMUMsRUFBb0Q7QUFDekQsTUFBSVIsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQVc7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2IsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QlAsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbmV4cG9ydCBjb25zdCBsaW5lRGlmZiA9IG5ldyBEaWZmKCk7XG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGxldCByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9XG5cbiAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG4gICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXRMaW5lcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7IHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICBsZXQgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhjYWxsYmFjaywge2lnbm9yZVdoaXRlc3BhY2U6IHRydWV9KTtcbiAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzdHJpcFRyYWlsaW5nQ3IiLCJyZXBsYWNlIiwicmV0TGluZXMiLCJsaW5lc0FuZE5ld2xpbmVzIiwic3BsaXQiLCJsZW5ndGgiLCJwb3AiLCJpIiwibGluZSIsIm5ld2xpbmVJc1Rva2VuIiwiaWdub3JlV2hpdGVzcGFjZSIsInRyaW0iLCJwdXNoIiwiZGlmZkxpbmVzIiwib2xkU3RyIiwibmV3U3RyIiwiY2FsbGJhY2siLCJkaWZmIiwiZGlmZlRyaW1tZWRMaW5lcyIsImdlbmVyYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O0FBRU8sSUFBTUEsUUFBUSxHQUFHO0FBQUlDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBLENBQUosRUFBakI7Ozs7OztBQUNQRCxRQUFRLENBQUNFLFFBQVQsR0FBb0IsVUFBU0MsS0FBVCxFQUFnQjtBQUNsQyxNQUFHLEtBQUtDLE9BQUwsQ0FBYUMsZUFBaEIsRUFBaUM7QUFDL0I7QUFDQUYsSUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNHLE9BQU4sQ0FBYyxPQUFkLEVBQXVCLElBQXZCLENBQVI7QUFDRDs7QUFFRCxNQUFJQyxRQUFRLEdBQUcsRUFBZjtBQUFBLE1BQ0lDLGdCQUFnQixHQUFHTCxLQUFLLENBQUNNLEtBQU4sQ0FBWSxXQUFaLENBRHZCLENBTmtDLENBU2xDOztBQUNBLE1BQUksQ0FBQ0QsZ0JBQWdCLENBQUNBLGdCQUFnQixDQUFDRSxNQUFqQixHQUEwQixDQUEzQixDQUFyQixFQUFvRDtBQUNsREYsSUFBQUEsZ0JBQWdCLENBQUNHLEdBQWpCO0FBQ0QsR0FaaUMsQ0FjbEM7OztBQUNBLE9BQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0osZ0JBQWdCLENBQUNFLE1BQXJDLEVBQTZDRSxDQUFDLEVBQTlDLEVBQWtEO0FBQ2hELFFBQUlDLElBQUksR0FBR0wsZ0JBQWdCLENBQUNJLENBQUQsQ0FBM0I7O0FBRUEsUUFBSUEsQ0FBQyxHQUFHLENBQUosSUFBUyxDQUFDLEtBQUtSLE9BQUwsQ0FBYVUsY0FBM0IsRUFBMkM7QUFDekNQLE1BQUFBLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDRyxNQUFULEdBQWtCLENBQW5CLENBQVIsSUFBaUNHLElBQWpDO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsVUFBSSxLQUFLVCxPQUFMLENBQWFXLGdCQUFqQixFQUFtQztBQUNqQ0YsUUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNHLElBQUwsRUFBUDtBQUNEOztBQUNEVCxNQUFBQSxRQUFRLENBQUNVLElBQVQsQ0FBY0osSUFBZDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT04sUUFBUDtBQUNELENBN0JEOztBQStCTyxTQUFTVyxTQUFULENBQW1CQyxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLFFBQW5DLEVBQTZDO0FBQUUsU0FBT3JCLFFBQVEsQ0FBQ3NCLElBQVQsQ0FBY0gsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJDLFFBQTlCLENBQVA7QUFBaUQ7O0FBQ2hHLFNBQVNFLGdCQUFULENBQTBCSixNQUExQixFQUFrQ0MsTUFBbEMsRUFBMENDLFFBQTFDLEVBQW9EO0FBQ3pELE1BQUlqQixPQUFPO0FBQUc7QUFBQTtBQUFBOztBQUFBb0I7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2YsUUFBUSxDQUFDc0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmhCLE9BQTlCLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge2dlbmVyYXRlT3B0aW9uc30gZnJvbSAnLi4vdXRpbC9wYXJhbXMnO1xuXG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgRGlmZigpO1xubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZih0aGlzLm9wdGlvbnMuc3RyaXBUcmFpbGluZ0NyKSB7XG4gICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIH1cblxuICBsZXQgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cbiAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgbGV0IG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiJdfQ== /***/ }), @@ -11928,6 +12070,12 @@ Object.defineProperty(exports, "merge", ({ return _merge.merge; } })); +Object.defineProperty(exports, "reversePatch", ({ + enumerable: true, + get: function get() { + return _reverse.reversePatch; + } +})); Object.defineProperty(exports, "structuredPatch", ({ enumerable: true, get: function get() { @@ -11946,6 +12094,12 @@ Object.defineProperty(exports, "createPatch", ({ return _create.createPatch; } })); +Object.defineProperty(exports, "formatPatch", ({ + enumerable: true, + get: function get() { + return _create.formatPatch; + } +})); Object.defineProperty(exports, "convertChangesToDMP", ({ enumerable: true, get: function get() { @@ -12026,6 +12180,12 @@ _merge = __nccwpck_require__(2640) /*istanbul ignore end*/ ; +var +/*istanbul ignore start*/ +_reverse = __nccwpck_require__(1794) +/*istanbul ignore end*/ +; + var /*istanbul ignore start*/ _create = __nccwpck_require__(4543) @@ -12047,7 +12207,7 @@ _xml = __nccwpck_require__(6982) /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /*istanbul ignore end*/ -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuLypcbiAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElTOlxuICogSnNEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2VcbiAqIEpzRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuICpcbiAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsIGNyZWF0ZVBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGFwcGx5UGF0Y2gsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgcGFyc2VQYXRjaCxcbiAgbWVyZ2UsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIFNlZSBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zIG9mIHVzZSAqL1xuXG4vKlxuICogVGV4dCBkaWZmIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEFQSXM6XG4gKiBEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG4gKiBEaWZmLmRpZmZMaW5lczogTGluZSBiYXNlZCBkaWZmXG4gKlxuICogRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtyZXZlcnNlUGF0Y2h9IGZyb20gJy4vcGF0Y2gvcmV2ZXJzZSc7XG5pbXBvcnQge3N0cnVjdHVyZWRQYXRjaCwgY3JlYXRlVHdvRmlsZXNQYXRjaCwgY3JlYXRlUGF0Y2gsIGZvcm1hdFBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGZvcm1hdFBhdGNoLFxuICBhcHBseVBhdGNoLFxuICBhcHBseVBhdGNoZXMsXG4gIHBhcnNlUGF0Y2gsXG4gIG1lcmdlLFxuICByZXZlcnNlUGF0Y2gsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ== /***/ }), @@ -12206,7 +12366,7 @@ function applyPatch(source, uniDiff) { var line = _hunk.lines[j], operation = line.length > 0 ? line[0] : ' ', content = line.length > 0 ? line.substr(1) : line, - delimiter = _hunk.linedelimiters[j]; + delimiter = _hunk.linedelimiters && _hunk.linedelimiters[j] || '\n'; if (operation === ' ') { _toPos++; @@ -12293,7 +12453,7 @@ function applyPatches(uniDiff, options) { processIndex(); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7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QUNEOztBQUVELE1BQUlnRCxZQUFZLEdBQUcsQ0FBbkI7O0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxLQUFLLEdBQUdsRCxPQUFPLENBQUNnRCxZQUFZLEVBQWIsQ0FBbkI7O0FBQ0EsUUFBSSxDQUFDRSxLQUFMLEVBQVk7QUFDVixhQUFPakQsT0FBTyxDQUFDa0QsUUFBUixFQUFQO0FBQ0Q7O0FBRURsRCxJQUFBQSxPQUFPLENBQUNtRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFRCxVQUFJRSxjQUFjLEdBQUd6RCxVQUFVLENBQUN3RCxJQUFELEVBQU9KLEtBQVAsRUFBY2pELE9BQWQsQ0FBL0I7QUFDQUEsTUFBQUEsT0FBTyxDQUFDdUQsT0FBUixDQUFnQk4sS0FBaEIsRUFBdUJLLGNBQXZCLEVBQXVDLFVBQVNGLEdBQVQsRUFBYztBQUNuRCxZQUFJQSxHQUFKLEVBQVM7QUFDUCxpQkFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFREosUUFBQUEsWUFBWTtBQUNiLE9BTkQ7QUFPRCxLQWJEO0FBY0Q7O0FBQ0RBLEVBQUFBLFlBQVk7QUFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7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QUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFXRixPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJZ0QsWUFBWSxHQUFHLENBQW5COztBQUNBLFdBQVNDLFlBQVQsR0FBd0I7QUFDdEIsUUFBSUMsS0FBSyxHQUFHbEQsT0FBTyxDQUFDZ0QsWUFBWSxFQUFiLENBQW5COztBQUNBLFFBQUksQ0FBQ0UsS0FBTCxFQUFZO0FBQ1YsYUFBT2pELE9BQU8sQ0FBQ2tELFFBQVIsRUFBUDtBQUNEOztBQUVEbEQsSUFBQUEsT0FBTyxDQUFDbUQsUUFBUixDQUFpQkYsS0FBakIsRUFBd0IsVUFBU0csR0FBVCxFQUFjQyxJQUFkLEVBQW9CO0FBQzFDLFVBQUlELEdBQUosRUFBUztBQUNQLGVBQU9wRCxPQUFPLENBQUNrRCxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUUsY0FBYyxHQUFHekQsVUFBVSxDQUFDd0QsSUFBRCxFQUFPSixLQUFQLEVBQWNqRCxPQUFkLENBQS9CO0FBQ0FBLE1BQUFBLE9BQU8sQ0FBQ3VELE9BQVIsQ0FBZ0JOLEtBQWhCLEVBQXVCSyxjQUF2QixFQUF1QyxVQUFTRixHQUFULEVBQWM7QUFDbkQsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9wRCxPQUFPLENBQUNrRCxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRURKLFFBQUFBLFlBQVk7QUFDYixPQU5EO0FBT0QsS0FiRDtBQWNEOztBQUNEQSxFQUFBQSxZQUFZO0FBQ2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3BhcnNlUGF0Y2h9IGZyb20gJy4vcGFyc2UnO1xuaW1wb3J0IGRpc3RhbmNlSXRlcmF0b3IgZnJvbSAnLi4vdXRpbC9kaXN0YW5jZS1pdGVyYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZiwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHVuaURpZmYpKSB7XG4gICAgaWYgKHVuaURpZmYubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcHBseVBhdGNoIG9ubHkgd29ya3Mgd2l0aCBhIHNpbmdsZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICB1bmlEaWZmID0gdW5pRGlmZlswXTtcbiAgfVxuXG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBpbnB1dFxuICBsZXQgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcblxuICAgICAgY29tcGFyZUxpbmUgPSBvcHRpb25zLmNvbXBhcmVMaW5lIHx8ICgobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpID0+IGxpbmUgPT09IHBhdGNoQ29udGVudCksXG4gICAgICBlcnJvckNvdW50ID0gMCxcbiAgICAgIGZ1enpGYWN0b3IgPSBvcHRpb25zLmZ1enpGYWN0b3IgfHwgMCxcbiAgICAgIG1pbkxpbmUgPSAwLFxuICAgICAgb2Zmc2V0ID0gMCxcblxuICAgICAgcmVtb3ZlRU9GTkwsXG4gICAgICBhZGRFT0ZOTDtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGh1bmtGaXRzKGh1bmssIHRvUG9zKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBodW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBsZXQgbGluZSA9IGh1bmsubGluZXNbal0sXG4gICAgICAgICAgb3BlcmF0aW9uID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcpLFxuICAgICAgICAgIGNvbnRlbnQgPSAobGluZS5sZW5ndGggPiAwID8gbGluZS5zdWJzdHIoMSkgOiBsaW5lKTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG4gICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG9Qb3MrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIG1heExpbmUgPSBsaW5lcy5sZW5ndGggLSBodW5rLm9sZExpbmVzLFxuICAgICAgICBsb2NhbE9mZnNldCA9IDAsXG4gICAgICAgIHRvUG9zID0gb2Zmc2V0ICsgaHVuay5vbGRTdGFydCAtIDE7XG5cbiAgICBsZXQgaXRlcmF0b3IgPSBkaXN0YW5jZUl0ZXJhdG9yKHRvUG9zLCBtaW5MaW5lLCBtYXhMaW5lKTtcblxuICAgIGZvciAoOyBsb2NhbE9mZnNldCAhPT0gdW5kZWZpbmVkOyBsb2NhbE9mZnNldCA9IGl0ZXJhdG9yKCkpIHtcbiAgICAgIGlmIChodW5rRml0cyhodW5rLCB0b1BvcyArIGxvY2FsT2Zmc2V0KSkge1xuICAgICAgICBodW5rLm9mZnNldCA9IG9mZnNldCArPSBsb2NhbE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxvY2FsT2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG4gICAgbWluTGluZSA9IGh1bmsub2Zmc2V0ICsgaHVuay5vbGRTdGFydCArIGh1bmsub2xkTGluZXM7XG4gIH1cblxuICAvLyBBcHBseSBwYXRjaCBodW5rc1xuICBsZXQgZGlmZk9mZnNldCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICB0b1BvcyA9IGh1bmsub2xkU3RhcnQgKyBodW5rLm9mZnNldCArIGRpZmZPZmZzZXQgLSAxO1xuICAgIGRpZmZPZmZzZXQgKz0gaHVuay5uZXdMaW5lcyAtIGh1bmsub2xkTGluZXM7XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpLFxuICAgICAgICAgIGRlbGltaXRlciA9IGh1bmsubGluZWRlbGltaXRlcnMgJiYgaHVuay5saW5lZGVsaW1pdGVyc1tqXSB8fCAnXFxuJztcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 /***/ }), @@ -12536,6 +12696,10 @@ function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, ne } function formatPatch(diff) { + if (Array.isArray(diff)) { + return diff.map(formatPatch).join('\n'); + } + var ret = []; if (diff.oldFileName == diff.newFileName) { @@ -12573,7 +12737,7 @@ function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsInJldCIsImFwcGx5Iiwiam9pbiIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtBQTJCLFdBQS9CLEVBQTRDO0FB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IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJyZXQiLCJhcHBseSIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtB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QUNuRixTQUFPNEMsbUJBQW1CLENBQUNFLFFBQUQsRUFBV0EsUUFBWCxFQUFxQmxELE1BQXJCLEVBQTZCQyxNQUE3QixFQUFxQ0MsU0FBckMsRUFBZ0RDLFNBQWhELEVBQTJEQyxPQUEzRCxDQUExQjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRpZmYpKSB7XG4gICAgcmV0dXJuIGRpZmYubWFwKGZvcm1hdFBhdGNoKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ== /***/ }), @@ -13372,6 +13536,77 @@ function parsePatch(uniDiff) { //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJO0FBQ2hELE1BQUlDLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLFVBQVUsR0FBR0osT0FBTyxDQUFDSyxLQUFSLENBQWMsc0JBQWQsS0FBeUMsRUFEMUQ7QUFBQSxNQUVJQyxJQUFJLEdBQUcsRUFGWDtBQUFBLE1BR0lDLENBQUMsR0FBRyxDQUhSOztBQUtBLFdBQVNDLFVBQVQsR0FBc0I7QUFDcEIsUUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQUgsSUFBQUEsSUFBSSxDQUFDSSxJQUFMLENBQVVELEtBQVYsRUFGb0IsQ0FJcEI7O0FB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QUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLE1BQUFBLElBQUksQ0FBQ0ksUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsSUFBSSxDQUFDRSxRQUFMLEtBQWtCLENBQXRDLEVBQXlDO0FBQ3ZDRixNQUFBQSxJQUFJLENBQUNFLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRCxLQTVEa0IsQ0E4RG5COzs7QUFDQSxRQUFJbEMsT0FBTyxDQUFDa0IsTUFBWixFQUFvQjtBQUNsQixVQUFJcUIsUUFBUSxLQUFLUCxJQUFJLENBQUNJLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSWpCLEtBQUosQ0FBVSxzREFBc0RVLGdCQUFnQixHQUFHLENBQXpFLENBQVYsQ0FBTjtBQUNEOztBQUNELFVBQUlXLFdBQVcsS0FBS1IsSUFBSSxDQUFDRSxRQUF6QixFQUFtQztBQUNqQyxjQUFNLElBQUlmLEtBQUosQ0FBVSx3REFBd0RVLGdCQUFnQixHQUFHLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekJILElBQUFBLFVBQVU7QUFDWDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvKS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmIGluZGV4XG4gICAgICBsZXQgaGVhZGVyID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLykuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuICAgIC8vIFBhcnNlIGh1bmtzXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKCgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8pLnRlc3QobGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKCgvXkBALykudGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKCgvXlwiLipcIiQvKS50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIH1cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIGxldCBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcblxuICAgIGxldCBodW5rID0ge1xuICAgICAgb2xkU3RhcnQ6ICtjaHVua0hlYWRlclsxXSxcbiAgICAgIG9sZExpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbMl0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlclsyXSxcbiAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG4gICAgICBuZXdMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzRdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbNF0sXG4gICAgICBsaW5lczogW10sXG4gICAgICBsaW5lZGVsaW1pdGVyczogW11cbiAgICB9O1xuXG4gICAgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBsZXQgYWRkQ291bnQgPSAwLFxuICAgICAgICByZW1vdmVDb3VudCA9IDA7XG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwXG4gICAgICAgICAgICAmJiAoaSArIDIgPCBkaWZmc3RyLmxlbmd0aClcbiAgICAgICAgICAgICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMFxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IG9wZXJhdGlvbiA9IChkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gKGRpZmZzdHIubGVuZ3RoIC0gMSkpID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaHVuaztcbiAgfVxuXG4gIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICBwYXJzZUluZGV4KCk7XG4gIH1cblxuICByZXR1cm4gbGlzdDtcbn1cbiJdfQ== +/***/ }), + +/***/ 1794: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; +/*istanbul ignore start*/ + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.reversePatch = reversePatch; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/*istanbul ignore end*/ +function reversePatch(structuredPatch) { + if (Array.isArray(structuredPatch)) { + return structuredPatch.map(reversePatch).reverse(); + } + + return ( + /*istanbul ignore start*/ + _objectSpread(_objectSpread({}, + /*istanbul ignore end*/ + structuredPatch), {}, { + oldFileName: structuredPatch.newFileName, + oldHeader: structuredPatch.newHeader, + newFileName: structuredPatch.oldFileName, + newHeader: structuredPatch.oldHeader, + hunks: structuredPatch.hunks.map(function (hunk) { + return { + oldLines: hunk.newLines, + oldStart: hunk.newStart, + newLines: hunk.oldLines, + newStart: hunk.oldStart, + linedelimiters: hunk.linedelimiters, + lines: hunk.lines.map(function (l) { + if (l.startsWith('-')) { + return ( + /*istanbul ignore start*/ + "+".concat( + /*istanbul ignore end*/ + l.slice(1)) + ); + } + + if (l.startsWith('+')) { + return ( + /*istanbul ignore start*/ + "-".concat( + /*istanbul ignore end*/ + l.slice(1)) + ); + } + + return l; + }) + }; + }) + }) + ); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9yZXZlcnNlLmpzIl0sIm5hbWVzIjpbInJldmVyc2VQYXRjaCIsInN0cnVjdHVyZWRQYXRjaCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsInJldmVyc2UiLCJvbGRGaWxlTmFtZSIsIm5ld0ZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwiaHVua3MiLCJodW5rIiwib2xkTGluZXMiLCJuZXdMaW5lcyIsIm9sZFN0YXJ0IiwibmV3U3RhcnQiLCJsaW5lZGVsaW1pdGVycyIsImxpbmVzIiwibCIsInN0YXJ0c1dpdGgiLCJzbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sU0FBU0EsWUFBVCxDQUFzQkMsZUFBdEIsRUFBdUM7QUFDNUMsTUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNGLGVBQWQsQ0FBSixFQUFvQztBQUNsQyxXQUFPQSxlQUFlLENBQUNHLEdBQWhCLENBQW9CSixZQUFwQixFQUFrQ0ssT0FBbEMsRUFBUDtBQUNEOztBQUVEO0FBQUE7QUFBQTtBQUFBO0FBQ0tKLElBQUFBLGVBREw7QUFFRUssTUFBQUEsV0FBVyxFQUFFTCxlQUFlLENBQUNNLFdBRi9CO0FBR0VDLE1BQUFBLFNBQVMsRUFBRVAsZUFBZSxDQUFDUSxTQUg3QjtBQUlFRixNQUFBQSxXQUFXLEVBQUVOLGVBQWUsQ0FBQ0ssV0FKL0I7QUFLRUcsTUFBQUEsU0FBUyxFQUFFUixlQUFlLENBQUNPLFNBTDdCO0FBTUVFLE1BQUFBLEtBQUssRUFBRVQsZUFBZSxDQUFDUyxLQUFoQixDQUFzQk4sR0FBdEIsQ0FBMEIsVUFBQU8sSUFBSSxFQUFJO0FBQ3ZDLGVBQU87QUFDTEMsVUFBQUEsUUFBUSxFQUFFRCxJQUFJLENBQUNFLFFBRFY7QUFFTEMsVUFBQUEsUUFBUSxFQUFFSCxJQUFJLENBQUNJLFFBRlY7QUFHTEYsVUFBQUEsUUFBUSxFQUFFRixJQUFJLENBQUNDLFFBSFY7QUFJTEcsVUFBQUEsUUFBUSxFQUFFSixJQUFJLENBQUNHLFFBSlY7QUFLTEUsVUFBQUEsY0FBYyxFQUFFTCxJQUFJLENBQUNLLGNBTGhCO0FBTUxDLFVBQUFBLEtBQUssRUFBRU4sSUFBSSxDQUFDTSxLQUFMLENBQVdiLEdBQVgsQ0FBZSxVQUFBYyxDQUFDLEVBQUk7QUFDekIsZ0JBQUlBLENBQUMsQ0FBQ0MsVUFBRixDQUFhLEdBQWIsQ0FBSixFQUF1QjtBQUFFO0FBQUE7QUFBQTtBQUFBO0FBQVdELGdCQUFBQSxDQUFDLENBQUNFLEtBQUYsQ0FBUSxDQUFSLENBQVg7QUFBQTtBQUEwQjs7QUFDbkQsZ0JBQUlGLENBQUMsQ0FBQ0MsVUFBRixDQUFhLEdBQWIsQ0FBSixFQUF1QjtBQUFFO0FBQUE7QUFBQTtBQUFBO0FBQVdELGdCQUFBQSxDQUFDLENBQUNFLEtBQUYsQ0FBUSxDQUFSLENBQVg7QUFBQTtBQUEwQjs7QUFDbkQsbUJBQU9GLENBQVA7QUFDRCxXQUpNO0FBTkYsU0FBUDtBQVlELE9BYk07QUFOVDtBQUFBO0FBcUJEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2VQYXRjaChzdHJ1Y3R1cmVkUGF0Y2gpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RydWN0dXJlZFBhdGNoKSkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2gubWFwKHJldmVyc2VQYXRjaCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdHJ1Y3R1cmVkUGF0Y2gsXG4gICAgb2xkRmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5uZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5uZXdIZWFkZXIsXG4gICAgbmV3RmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5vbGRGaWxlTmFtZSxcbiAgICBuZXdIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5vbGRIZWFkZXIsXG4gICAgaHVua3M6IHN0cnVjdHVyZWRQYXRjaC5odW5rcy5tYXAoaHVuayA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgICAgb2xkU3RhcnQ6IGh1bmsubmV3U3RhcnQsXG4gICAgICAgIG5ld0xpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgICAgICBuZXdTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgICAgbGluZWRlbGltaXRlcnM6IGh1bmsubGluZWRlbGltaXRlcnMsXG4gICAgICAgIGxpbmVzOiBodW5rLmxpbmVzLm1hcChsID0+IHtcbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCctJykpIHsgcmV0dXJuIGArJHtsLnNsaWNlKDEpfWA7IH1cbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCcrJykpIHsgcmV0dXJuIGAtJHtsLnNsaWNlKDEpfWA7IH1cbiAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSlcbiAgfTtcbn1cbiJdfQ== + + /***/ }), /***/ 8935: @@ -13748,6 +13983,8 @@ function onceStrict (fn) { /***/ 9103: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; + var __create = Object.create; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; @@ -13771,7 +14008,6 @@ var __spreadValues = (a, b) => { return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); -var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; @@ -13782,22 +14018,19 @@ var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; -var __reExport = (target, module2, copyDefault, desc) => { - if (module2 && typeof module2 === "object" || typeof module2 === "function") { - for (let key of __getOwnPropNames(module2)) - if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default")) - __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } - return target; -}; -var __toESM = (module2, isNodeMode) => { - return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); + return to; }; -var __toCommonJS = /* @__PURE__ */ ((cache2) => { - return (module2, temp) => { - return cache2 && cache2.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache2 && cache2.set(module2, temp), temp); - }; -})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0); +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { @@ -13823,6 +14056,7 @@ var __async = (__this, __arguments, generator) => { var GitError; var init_git_error = __esm({ "src/lib/errors/git-error.ts"() { + "use strict"; GitError = class extends Error { constructor(task, message) { super(message); @@ -13837,6 +14071,7 @@ var init_git_error = __esm({ var GitResponseError; var init_git_response_error = __esm({ "src/lib/errors/git-response-error.ts"() { + "use strict"; init_git_error(); GitResponseError = class extends GitError { constructor(git, message) { @@ -13862,6 +14097,7 @@ function toPaths(pathSpec) { var cache; var init_pathspec = __esm({ "src/lib/args/pathspec.ts"() { + "use strict"; cache = /* @__PURE__ */ new WeakMap(); } }); @@ -13870,6 +14106,7 @@ var init_pathspec = __esm({ var GitConstructError; var init_git_construct_error = __esm({ "src/lib/errors/git-construct-error.ts"() { + "use strict"; init_git_error(); GitConstructError = class extends GitError { constructor(config, message) { @@ -13884,6 +14121,7 @@ var init_git_construct_error = __esm({ var GitPluginError; var init_git_plugin_error = __esm({ "src/lib/errors/git-plugin-error.ts"() { + "use strict"; init_git_error(); GitPluginError = class extends GitError { constructor(task, plugin, message) { @@ -13900,6 +14138,7 @@ var init_git_plugin_error = __esm({ var TaskConfigurationError; var init_task_configuration_error = __esm({ "src/lib/errors/task-configuration-error.ts"() { + "use strict"; init_git_error(); TaskConfigurationError = class extends GitError { constructor(message) { @@ -14000,7 +14239,10 @@ function bufferToString(input) { return (Array.isArray(input) ? Buffer.concat(input) : input).toString("utf-8"); } function pick(source, properties) { - return Object.assign({}, ...properties.map((property) => property in source ? { [property]: source[property] } : {})); + return Object.assign( + {}, + ...properties.map((property) => property in source ? { [property]: source[property] } : {}) + ); } function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); @@ -14014,6 +14256,7 @@ function orVoid(input) { var import_file_exists, NULL, NOOP, objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { + "use strict"; import_file_exists = __nccwpck_require__(4751); NULL = "\0"; NOOP = () => { @@ -14042,6 +14285,7 @@ function filterFunction(input) { var filterArray, filterString, filterStringArray, filterStringOrStringArray, filterHasLength; var init_argument_filters = __esm({ "src/lib/utils/argument-filters.ts"() { + "use strict"; init_util(); init_pathspec(); filterArray = (input) => { @@ -14069,6 +14313,7 @@ var init_argument_filters = __esm({ var ExitCodes; var init_exit_codes = __esm({ "src/lib/utils/exit-codes.ts"() { + "use strict"; ExitCodes = /* @__PURE__ */ ((ExitCodes2) => { ExitCodes2[ExitCodes2["SUCCESS"] = 0] = "SUCCESS"; ExitCodes2[ExitCodes2["ERROR"] = 1] = "ERROR"; @@ -14083,6 +14328,7 @@ var init_exit_codes = __esm({ var GitOutputStreams; var init_git_output_streams = __esm({ "src/lib/utils/git-output-streams.ts"() { + "use strict"; GitOutputStreams = class { constructor(stdOut, stdErr) { this.stdOut = stdOut; @@ -14099,6 +14345,7 @@ var init_git_output_streams = __esm({ var LineParser, RemoteLineParser; var init_line_parser = __esm({ "src/lib/utils/line-parser.ts"() { + "use strict"; LineParser = class { constructor(regExp, useMatches) { this.matches = []; @@ -14150,7 +14397,10 @@ var init_line_parser = __esm({ // src/lib/utils/simple-git-options.ts function createInstanceConfig(...options) { const baseDir = process.cwd(); - const config = Object.assign(__spreadValues({ baseDir }, defaultOptions), ...options.filter((o) => typeof o === "object" && o)); + const config = Object.assign( + __spreadValues({ baseDir }, defaultOptions), + ...options.filter((o) => typeof o === "object" && o) + ); config.baseDir = config.baseDir || baseDir; config.trimmed = config.trimmed === true; return config; @@ -14158,6 +14408,7 @@ function createInstanceConfig(...options) { var defaultOptions; var init_simple_git_options = __esm({ "src/lib/utils/simple-git-options.ts"() { + "use strict"; defaultOptions = { binary: "git", maxConcurrentProcesses: 5, @@ -14211,6 +14462,7 @@ function trailingFunctionArgument(args, includeNoop = true) { } var init_task_options = __esm({ "src/lib/utils/task-options.ts"() { + "use strict"; init_argument_filters(); init_util(); init_pathspec(); @@ -14237,6 +14489,7 @@ function parseStringResponse(result, parsers12, texts, trim = true) { } var init_task_parser = __esm({ "src/lib/utils/task-parser.ts"() { + "use strict"; init_util(); } }); @@ -14289,6 +14542,7 @@ __export(utils_exports, { }); var init_utils = __esm({ "src/lib/utils/index.ts"() { + "use strict"; init_argument_filters(); init_exit_codes(); init_git_output_streams(); @@ -14349,6 +14603,7 @@ function isNotRepoMessage(error) { var CheckRepoActions, onError, parser; var init_check_is_repo = __esm({ "src/lib/tasks/check-is-repo.ts"() { + "use strict"; init_utils(); CheckRepoActions = /* @__PURE__ */ ((CheckRepoActions2) => { CheckRepoActions2["BARE"] = "bare"; @@ -14382,6 +14637,7 @@ function cleanSummaryParser(dryRun, text) { var CleanResponse, removalRegexp, dryRunRemovalRegexp, isFolderRegexp; var init_CleanSummary = __esm({ "src/lib/responses/CleanSummary.ts"() { + "use strict"; init_utils(); CleanResponse = class { constructor(dryRun) { @@ -14451,6 +14707,7 @@ function isEmptyTask(task) { var EMPTY_COMMANDS; var init_task = __esm({ "src/lib/tasks/task.ts"() { + "use strict"; init_task_configuration_error(); EMPTY_COMMANDS = []; } @@ -14527,6 +14784,7 @@ function isInteractiveMode(option) { var CONFIG_ERROR_INTERACTIVE_MODE, CONFIG_ERROR_MODE_REQUIRED, CONFIG_ERROR_UNKNOWN_OPTION, CleanOptions, CleanOptionValues; var init_clean = __esm({ "src/lib/tasks/clean.ts"() { + "use strict"; init_CleanSummary(); init_utils(); init_task(); @@ -14600,6 +14858,7 @@ function* configParser(text, requestedKey = null) { var ConfigList; var init_ConfigList = __esm({ "src/lib/responses/ConfigList.ts"() { + "use strict"; init_utils(); ConfigList = class { constructor() { @@ -14687,19 +14946,34 @@ function listConfigTask(scope) { function config_default() { return { addConfig(key, value, ...rest) { - return this._runTask(addConfigTask(key, value, rest[0] === true, asConfigScope(rest[1], "local" /* local */)), trailingFunctionArgument(arguments)); + return this._runTask( + addConfigTask( + key, + value, + rest[0] === true, + asConfigScope(rest[1], "local" /* local */) + ), + trailingFunctionArgument(arguments) + ); }, getConfig(key, scope) { - return this._runTask(getConfigTask(key, asConfigScope(scope, void 0)), trailingFunctionArgument(arguments)); + return this._runTask( + getConfigTask(key, asConfigScope(scope, void 0)), + trailingFunctionArgument(arguments) + ); }, listConfig(...rest) { - return this._runTask(listConfigTask(asConfigScope(rest[0], void 0)), trailingFunctionArgument(arguments)); + return this._runTask( + listConfigTask(asConfigScope(rest[0], void 0)), + trailingFunctionArgument(arguments) + ); } }; } var GitConfigScope; var init_config = __esm({ "src/lib/tasks/config.ts"() { + "use strict"; init_ConfigList(); init_utils(); GitConfigScope = /* @__PURE__ */ ((GitConfigScope2) => { @@ -14719,6 +14993,7 @@ function isDiffNameStatus(input) { var DiffNameStatus, diffNameStatus; var init_diff_name_status = __esm({ "src/lib/tasks/diff-name-status.ts"() { + "use strict"; DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus2) => { DiffNameStatus2["ADDED"] = "A"; DiffNameStatus2["COPIED"] = "C"; @@ -14763,26 +15038,33 @@ function grep_default() { const options = getTrailingOptions(arguments); for (const option of disallowedOptions) { if (options.includes(option)) { - return this._runTask(configurationErrorTask(`git.grep: use of "${option}" is not supported.`), then); + return this._runTask( + configurationErrorTask(`git.grep: use of "${option}" is not supported.`), + then + ); } } if (typeof searchTerm === "string") { searchTerm = grepQueryBuilder().param(searchTerm); } const commands = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; - return this._runTask({ - commands, - format: "utf-8", - parser(stdOut) { - return parseGrep(stdOut); - } - }, then); + return this._runTask( + { + commands, + format: "utf-8", + parser(stdOut) { + return parseGrep(stdOut); + } + }, + then + ); } }; } var disallowedOptions, Query, _a, GrepQuery; var init_grep = __esm({ "src/lib/tasks/grep.ts"() { + "use strict"; init_utils(); init_task(); disallowedOptions = ["-h"]; @@ -14840,6 +15122,7 @@ function isValidResetMode(mode) { var ResetMode, ResetModes; var init_reset = __esm({ "src/lib/tasks/reset.ts"() { + "use strict"; init_task(); ResetMode = /* @__PURE__ */ ((ResetMode2) => { ResetMode2["MIXED"] = "mixed"; @@ -14871,6 +15154,7 @@ __export(api_exports, { }); var init_api = __esm({ "src/lib/api.ts"() { + "use strict"; init_pathspec(); init_git_construct_error(); init_git_error(); @@ -14913,6 +15197,7 @@ function abortPlugin(signal) { } var init_abort_plugin = __esm({ "src/lib/plugins/abort-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -14928,17 +15213,33 @@ function preventProtocolOverride(arg, next) { if (!/^\s*protocol(.[a-z]+)?.allow/.test(next)) { return; } - throw new GitPluginError(void 0, "unsafe", "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol"); + throw new GitPluginError( + void 0, + "unsafe", + "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol" + ); } function preventUploadPack(arg, method) { if (/^\s*--(upload|receive)-pack/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack` + ); } if (method === "clone" && /^\s*-u\b/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of clone with option -u is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of clone with option -u is not permitted without enabling allowUnsafePack` + ); } if (method === "push" && /^\s*--exec\b/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of push with option --exec is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of push with option --exec is not permitted without enabling allowUnsafePack` + ); } } function blockUnsafeOperationsPlugin({ @@ -14959,6 +15260,7 @@ function blockUnsafeOperationsPlugin({ } var init_block_unsafe_operations_plugin = __esm({ "src/lib/plugins/block-unsafe-operations-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -14975,6 +15277,7 @@ function commandConfigPrefixingPlugin(configuration) { } var init_command_config_prefixing_plugin = __esm({ "src/lib/plugins/command-config-prefixing-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15023,11 +15326,11 @@ function completionDetectionPlugin({ type: "spawn.after", action(_0, _1) { return __async(this, arguments, function* (_data, { spawned, close }) { - var _a2, _b; + var _a3, _b; const events = createEvents(); let deferClose = true; let quickClose = () => void (deferClose = false); - (_a2 = spawned.stdout) == null ? void 0 : _a2.on("data", quickClose); + (_a3 = spawned.stdout) == null ? void 0 : _a3.on("data", quickClose); (_b = spawned.stderr) == null ? void 0 : _b.on("data", quickClose); spawned.on("error", quickClose); spawned.on("close", (code) => events.close(code)); @@ -15048,12 +15351,58 @@ function completionDetectionPlugin({ var import_promise_deferred, never; var init_completion_detection_plugin = __esm({ "src/lib/plugins/completion-detection.plugin.ts"() { + "use strict"; import_promise_deferred = __nccwpck_require__(9819); init_utils(); never = (0, import_promise_deferred.deferred)().promise; } }); +// src/lib/plugins/custom-binary.plugin.ts +function isBadArgument(arg) { + return !arg || !/^([a-z]:)?([a-z0-9/.\\_-]+)$/i.test(arg); +} +function toBinaryConfig(input, allowUnsafe) { + if (input.length < 1 || input.length > 2) { + throw new GitPluginError(void 0, "binary", WRONG_NUMBER_ERR); + } + const isBad = input.some(isBadArgument); + if (isBad) { + if (allowUnsafe) { + console.warn(WRONG_CHARS_ERR); + } else { + throw new GitPluginError(void 0, "binary", WRONG_CHARS_ERR); + } + } + const [binary, prefix] = input; + return { + binary, + prefix + }; +} +function customBinaryPlugin(plugins, input = ["git"], allowUnsafe = false) { + let config = toBinaryConfig(asArray(input), allowUnsafe); + plugins.on("binary", (input2) => { + config = toBinaryConfig(asArray(input2), allowUnsafe); + }); + plugins.append("spawn.binary", () => { + return config.binary; + }); + plugins.append("spawn.args", (data) => { + return config.prefix ? [config.prefix, ...data] : data; + }); +} +var WRONG_NUMBER_ERR, WRONG_CHARS_ERR; +var init_custom_binary_plugin = __esm({ + "src/lib/plugins/custom-binary.plugin.ts"() { + "use strict"; + init_git_plugin_error(); + init_utils(); + WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`; + WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`; + } +}); + // src/lib/plugins/error-detection.plugin.ts function isTaskError(result) { return !!(result.exitCode && result.stdErr.length); @@ -15089,18 +15438,32 @@ function errorDetectionPlugin(config) { } var init_error_detection_plugin = __esm({ "src/lib/plugins/error-detection.plugin.ts"() { + "use strict"; init_git_error(); } }); // src/lib/plugins/plugin-store.ts -var PluginStore; +var import_node_events, PluginStore; var init_plugin_store = __esm({ "src/lib/plugins/plugin-store.ts"() { + "use strict"; + import_node_events = __nccwpck_require__(5673); init_utils(); PluginStore = class { constructor() { this.plugins = /* @__PURE__ */ new Set(); + this.events = new import_node_events.EventEmitter(); + } + on(type, listener) { + this.events.on(type, listener); + } + reconfigure(type, data) { + this.events.emit(type, data); + } + append(type, action) { + const plugin = append(this.plugins, { type, action }); + return () => this.plugins.delete(plugin); } add(plugin) { const plugins = []; @@ -15165,6 +15528,7 @@ function progressEventStage(input) { } var init_progress_monitor_plugin = __esm({ "src/lib/plugins/progress-monitor-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15172,6 +15536,7 @@ var init_progress_monitor_plugin = __esm({ // src/lib/plugins/simple-git-plugin.ts var init_simple_git_plugin = __esm({ "src/lib/plugins/simple-git-plugin.ts"() { + "use strict"; } }); @@ -15187,6 +15552,7 @@ function spawnOptionsPlugin(spawnOptions) { } var init_spawn_options_plugin = __esm({ "src/lib/plugins/spawn-options-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15230,6 +15596,7 @@ function timeoutPlugin({ } var init_timout_plugin = __esm({ "src/lib/plugins/timout-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -15237,10 +15604,12 @@ var init_timout_plugin = __esm({ // src/lib/plugins/index.ts var init_plugins = __esm({ "src/lib/plugins/index.ts"() { + "use strict"; init_abort_plugin(); init_block_unsafe_operations_plugin(); init_command_config_prefixing_plugin(); init_completion_detection_plugin(); + init_custom_binary_plugin(); init_error_detection_plugin(); init_plugin_store(); init_progress_monitor_plugin(); @@ -15267,7 +15636,9 @@ function suffixPathsPlugin() { continue; } if (param === "--") { - append2(data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item)); + append2( + data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item) + ); break; } prefix.push(param); @@ -15278,6 +15649,7 @@ function suffixPathsPlugin() { } var init_suffix_paths_plugin = __esm({ "src/lib/plugins/suffix-paths.plugin.ts"() { + "use strict"; init_pathspec(); } }); @@ -15317,7 +15689,10 @@ function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger); return step(initialStep); function sibling(name, initial) { - return append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); + return append( + spawned, + createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger) + ); } function step(phase) { const stepPrefix = phase && `[${phase}]` || ""; @@ -15334,6 +15709,7 @@ function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { var import_debug; var init_git_logger = __esm({ "src/lib/git-logger.ts"() { + "use strict"; import_debug = __toESM(__nccwpck_require__(8237)); init_utils(); import_debug.default.formatters.L = (value) => String(filterHasLength(value) ? value.length : "-"); @@ -15350,6 +15726,7 @@ var init_git_logger = __esm({ var _TasksPendingQueue, TasksPendingQueue; var init_tasks_pending_queue = __esm({ "src/lib/runners/tasks-pending-queue.ts"() { + "use strict"; init_git_error(); init_git_logger(); _TasksPendingQueue = class { @@ -15379,9 +15756,14 @@ var init_tasks_pending_queue = __esm({ for (const [task, { logger }] of Array.from(this._queue.entries())) { if (task === err.task) { logger.info(`Failed %o`, err); - logger(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); + logger( + `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted` + ); } else { - logger.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); + logger.info( + `A fatal exception occurred in a previous task, the queue has been purged: %o`, + err.message + ); } this.complete(task); } @@ -15435,6 +15817,7 @@ function onDataReceived(target, name, logger, output) { var import_child_process, GitExecutorChain; var init_git_executor_chain = __esm({ "src/lib/runners/git-executor-chain.ts"() { + "use strict"; import_child_process = __nccwpck_require__(8493); init_git_error(); init_task(); @@ -15448,9 +15831,6 @@ var init_git_executor_chain = __esm({ this._chain = Promise.resolve(); this._queue = new TasksPendingQueue(); } - get binary() { - return this._executor.binary; - } get cwd() { return this._cwd || this._executor.cwd; } @@ -15493,8 +15873,19 @@ var init_git_executor_chain = __esm({ } attemptRemoteTask(task, logger) { return __async(this, null, function* () { - const args = this._plugins.exec("spawn.args", [...task.commands], pluginContext(task, task.commands)); - const raw = yield this.gitResponse(task, this.binary, args, this.outputHandler, logger.step("SPAWN")); + const binary = this._plugins.exec("spawn.binary", "", pluginContext(task, task.commands)); + const args = this._plugins.exec( + "spawn.args", + [...task.commands], + pluginContext(task, task.commands) + ); + const raw = yield this.gitResponse( + task, + binary, + args, + this.outputHandler, + logger.step("SPAWN") + ); const outputStreams = yield this.handleTaskData(task, args, raw, logger.step("HANDLE")); logger(`passing response to task's parser as a %s`, task.format); if (isBufferTask(task)) { @@ -15513,17 +15904,36 @@ var init_git_executor_chain = __esm({ const { exitCode, rejection, stdOut, stdErr } = result; return new Promise((done, fail) => { logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); - const { error } = this._plugins.exec("task.error", { error: rejection }, __spreadValues(__spreadValues({}, pluginContext(task, args)), result)); + const { error } = this._plugins.exec( + "task.error", + { error: rejection }, + __spreadValues(__spreadValues({}, pluginContext(task, args)), result) + ); if (error && task.onError) { logger.info(`exitCode=%s handling with custom error handler`); - return task.onError(result, error, (newStdOut) => { - logger.info(`custom error handler treated as success`); - logger(`custom error returned a %s`, objectToString(newStdOut)); - done(new GitOutputStreams(Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, Buffer.concat(stdErr))); - }, fail); + return task.onError( + result, + error, + (newStdOut) => { + logger.info(`custom error handler treated as success`); + logger(`custom error returned a %s`, objectToString(newStdOut)); + done( + new GitOutputStreams( + Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, + Buffer.concat(stdErr) + ) + ); + }, + fail + ); } if (error) { - logger.info(`handling as error: exitCode=%s stdErr=%s rejection=%o`, exitCode, stdErr.length, rejection); + logger.info( + `handling as error: exitCode=%s stdErr=%s rejection=%o`, + exitCode, + stdErr.length, + rejection + ); return fail(error); } logger.info(`retrieving task output complete`); @@ -15533,11 +15943,15 @@ var init_git_executor_chain = __esm({ gitResponse(task, command, args, outputHandler, logger) { return __async(this, null, function* () { const outputLogger = logger.sibling("output"); - const spawnOptions = this._plugins.exec("spawn.options", { - cwd: this.cwd, - env: this.env, - windowsHide: true - }, pluginContext(task, task.commands)); + const spawnOptions = this._plugins.exec( + "spawn.options", + { + cwd: this.cwd, + env: this.env, + windowsHide: true + }, + pluginContext(task, task.commands) + ); return new Promise((done) => { const stdOut = []; const stdErr = []; @@ -15558,8 +15972,14 @@ var init_git_executor_chain = __esm({ } })); const spawned = (0, import_child_process.spawn)(command, args, spawnOptions); - spawned.stdout.on("data", onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut"))); - spawned.stderr.on("data", onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr"))); + spawned.stdout.on( + "data", + onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut")) + ); + spawned.stderr.on( + "data", + onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr")) + ); spawned.on("error", onErrorReceived(stdErr, logger)); if (outputHandler) { logger(`Passing child process stdOut/stdErr to custom outputHandler`); @@ -15607,10 +16027,10 @@ __export(git_executor_exports, { var GitExecutor; var init_git_executor = __esm({ "src/lib/runners/git-executor.ts"() { + "use strict"; init_git_executor_chain(); GitExecutor = class { - constructor(binary = "git", cwd, _scheduler, _plugins) { - this.binary = binary; + constructor(cwd, _scheduler, _plugins) { this.cwd = cwd; this._scheduler = _scheduler; this._plugins = _plugins; @@ -15633,14 +16053,19 @@ function taskCallback(task, response, callback = NOOP) { }; const onError2 = (err) => { if ((err == null ? void 0 : err.task) === task) { - callback(err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, void 0); + callback( + err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, + void 0 + ); } }; response.then(onSuccess, onError2); } function addDeprecationNoticeToError(err) { let log = (name) => { - console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); + console.warn( + `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3` + ); log = NOOP; }; return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); @@ -15661,6 +16086,7 @@ function addDeprecationNoticeToError(err) { } var init_task_callback = __esm({ "src/lib/task-callback.ts"() { + "use strict"; init_git_response_error(); init_utils(); } @@ -15677,6 +16103,7 @@ function changeWorkingDirectoryTask(directory, root) { } var init_change_working_directory = __esm({ "src/lib/tasks/change-working-directory.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15693,18 +16120,28 @@ function checkoutTask(args) { function checkout_default() { return { checkout() { - return this._runTask(checkoutTask(getTrailingOptions(arguments, 1)), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(getTrailingOptions(arguments, 1)), + trailingFunctionArgument(arguments) + ); }, checkoutBranch(branchName, startPoint) { - return this._runTask(checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); }, checkoutLocalBranch(branchName) { - return this._runTask(checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); } }; } var init_checkout = __esm({ "src/lib/tasks/checkout.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15728,6 +16165,7 @@ function parseCommitResult(stdOut) { var parsers; var init_parse_commit = __esm({ "src/lib/parsers/parse-commit.ts"() { + "use strict"; init_utils(); parsers = [ new LineParser(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { @@ -15746,20 +16184,26 @@ var init_parse_commit = __esm({ name: parts.join("<").trim() }; }), - new LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { - result.summary.changes = parseInt(changes, 10) || 0; - result.summary.insertions = parseInt(insertions, 10) || 0; - result.summary.deletions = parseInt(deletions, 10) || 0; - }), - new LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { - result.summary.changes = parseInt(changes, 10) || 0; - const count = parseInt(lines, 10) || 0; - if (direction === "-") { - result.summary.deletions = count; - } else if (direction === "+") { - result.summary.insertions = count; + new LineParser( + /(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, + (result, [changes, insertions, deletions]) => { + result.summary.changes = parseInt(changes, 10) || 0; + result.summary.insertions = parseInt(insertions, 10) || 0; + result.summary.deletions = parseInt(deletions, 10) || 0; + } + ), + new LineParser( + /^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, + (result, [changes, lines, direction]) => { + result.summary.changes = parseInt(changes, 10) || 0; + const count = parseInt(lines, 10) || 0; + if (direction === "-") { + result.summary.deletions = count; + } else if (direction === "+") { + result.summary.insertions = count; + } } - }) + ) ]; } }); @@ -15784,16 +16228,23 @@ function commit_default() { return { commit(message, ...rest) { const next = trailingFunctionArgument(arguments); - const task = rejectDeprecatedSignatures(message) || commitTask(asArray(message), asArray(filterType(rest[0], filterStringOrStringArray, [])), [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)]); + const task = rejectDeprecatedSignatures(message) || commitTask( + asArray(message), + asArray(filterType(rest[0], filterStringOrStringArray, [])), + [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)] + ); return this._runTask(task, next); } }; function rejectDeprecatedSignatures(message) { - return !filterStringOrStringArray(message) && configurationErrorTask(`git.commit: requires the commit message to be supplied as a string/string[]`); + return !filterStringOrStringArray(message) && configurationErrorTask( + `git.commit: requires the commit message to be supplied as a string/string[]` + ); } } var init_commit = __esm({ "src/lib/tasks/commit.ts"() { + "use strict"; init_parse_commit(); init_utils(); init_task(); @@ -15804,12 +16255,16 @@ var init_commit = __esm({ function first_commit_default() { return { firstCommit() { - return this._runTask(straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), + trailingFunctionArgument(arguments) + ); } }; } var init_first_commit = __esm({ "src/lib/tasks/first-commit.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15825,6 +16280,7 @@ function hashObjectTask(filePath, write) { } var init_hash_object = __esm({ "src/lib/tasks/hash-object.ts"() { + "use strict"; init_task(); } }); @@ -15853,6 +16309,7 @@ function parseInit(bare, path, text) { var InitSummary, initResponseRegex, reInitResponseRegex; var init_InitSummary = __esm({ "src/lib/responses/InitSummary.ts"() { + "use strict"; InitSummary = class { constructor(bare, path, existing, gitDir) { this.bare = bare; @@ -15886,6 +16343,7 @@ function initTask(bare = false, path, customArgs) { var bareCommand; var init_init = __esm({ "src/lib/tasks/init.ts"() { + "use strict"; init_InitSummary(); bareCommand = "--bare"; } @@ -15907,6 +16365,7 @@ function isLogFormat(customArg) { var logFormatRegex; var init_log_format = __esm({ "src/lib/args/log-format.ts"() { + "use strict"; logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/; } }); @@ -15915,6 +16374,7 @@ var init_log_format = __esm({ var DiffSummary; var init_DiffSummary = __esm({ "src/lib/responses/DiffSummary.ts"() { + "use strict"; DiffSummary = class { constructor() { this.changed = 0; @@ -15934,51 +16394,64 @@ function getDiffParser(format = "" /* NONE */) { var statParser, numStatParser, nameOnlyParser, nameStatusParser, diffSummaryParsers; var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { + "use strict"; init_log_format(); init_DiffSummary(); init_diff_name_status(); init_utils(); statParser = [ - new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { - result.files.push({ - file: file.trim(), - changes: asNumber(changes), - insertions: alterations.replace(/[^+]/g, "").length, - deletions: alterations.replace(/[^-]/g, "").length, - binary: false - }); - }), - new LineParser(/(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, (result, [file, before, after]) => { - result.files.push({ - file: file.trim(), - before: asNumber(before), - after: asNumber(after), - binary: true - }); - }), - new LineParser(/(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, (result, [changed, summary]) => { - const inserted = /(\d+) i/.exec(summary); - const deleted = /(\d+) d/.exec(summary); - result.changed = asNumber(changed); - result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); - result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); - }) + new LineParser( + /^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, + (result, [file, changes, alterations = ""]) => { + result.files.push({ + file: file.trim(), + changes: asNumber(changes), + insertions: alterations.replace(/[^+]/g, "").length, + deletions: alterations.replace(/[^-]/g, "").length, + binary: false + }); + } + ), + new LineParser( + /^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, + (result, [file, before, after]) => { + result.files.push({ + file: file.trim(), + before: asNumber(before), + after: asNumber(after), + binary: true + }); + } + ), + new LineParser( + /(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, + (result, [changed, summary]) => { + const inserted = /(\d+) i/.exec(summary); + const deleted = /(\d+) d/.exec(summary); + result.changed = asNumber(changed); + result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); + result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); + } + ) ]; numStatParser = [ - new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { - const insertions = asNumber(changesInsert); - const deletions = asNumber(changesDelete); - result.changed++; - result.insertions += insertions; - result.deletions += deletions; - result.files.push({ - file, - changes: insertions + deletions, - insertions, - deletions, - binary: false - }); - }), + new LineParser( + /(\d+)\t(\d+)\t(.+)$/, + (result, [changesInsert, changesDelete, file]) => { + const insertions = asNumber(changesInsert); + const deletions = asNumber(changesDelete); + result.changed++; + result.insertions += insertions; + result.deletions += deletions; + result.files.push({ + file, + changes: insertions + deletions, + insertions, + deletions, + binary: false + }); + } + ), new LineParser(/-\t-\t(.+)$/, (result, [file]) => { result.changed++; result.files.push({ @@ -16002,17 +16475,20 @@ var init_parse_diff_summary = __esm({ }) ]; nameStatusParser = [ - new LineParser(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, (result, [status, _similarity, from, _to, to]) => { - result.changed++; - result.files.push({ - file: to != null ? to : from, - changes: 0, - status: orVoid(isDiffNameStatus(status) && status), - insertions: 0, - deletions: 0, - binary: false - }); - }) + new LineParser( + /([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, + (result, [status, _similarity, from, _to, to]) => { + result.changed++; + result.files.push({ + file: to != null ? to : from, + changes: 0, + status: orVoid(isDiffNameStatus(status) && status), + insertions: 0, + deletions: 0, + binary: false + }); + } + ) ]; diffSummaryParsers = { ["" /* NONE */]: statParser, @@ -16026,17 +16502,27 @@ var init_parse_diff_summary = __esm({ // src/lib/parsers/parse-list-log-summary.ts function lineBuilder(tokens, fields) { - return fields.reduce((line, field, index) => { - line[field] = tokens[index] || ""; - return line; - }, /* @__PURE__ */ Object.create({ diff: null })); + return fields.reduce( + (line, field, index) => { + line[field] = tokens[index] || ""; + return line; + }, + /* @__PURE__ */ Object.create({ diff: null }) + ); } function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNames, logFormat = "" /* NONE */) { const parseDiffResult = getDiffParser(logFormat); return function(stdOut) { - const all = toLinesWithContent(stdOut, true, START_BOUNDARY).map(function(item) { + const all = toLinesWithContent( + stdOut, + true, + START_BOUNDARY + ).map(function(item) { const lineDetail = item.trim().split(COMMIT_BOUNDARY); - const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); + const listLogLine = lineBuilder( + lineDetail[0].trim().split(splitter), + fields + ); if (lineDetail.length > 1 && !!lineDetail[1].trim()) { listLogLine.diff = parseDiffResult(lineDetail[1]); } @@ -16052,6 +16538,7 @@ function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNa var START_BOUNDARY, COMMIT_BOUNDARY, SPLITTER, defaultFieldNames; var init_parse_list_log_summary = __esm({ "src/lib/parsers/parse-list-log-summary.ts"() { + "use strict"; init_utils(); init_parse_diff_summary(); init_log_format(); @@ -16085,14 +16572,19 @@ function diffSummaryTask(customArgs) { function validateLogFormatConfig(customArgs) { const flags = customArgs.filter(isLogFormat); if (flags.length > 1) { - return configurationErrorTask(`Summary flags are mutually exclusive - pick one of ${flags.join(",")}`); + return configurationErrorTask( + `Summary flags are mutually exclusive - pick one of ${flags.join(",")}` + ); } if (flags.length && customArgs.includes("-z")) { - return configurationErrorTask(`Summary flag ${flags} parsing is not compatible with null termination option '-z'`); + return configurationErrorTask( + `Summary flag ${flags} parsing is not compatible with null termination option '-z'` + ); } } var init_diff = __esm({ "src/lib/tasks/diff.ts"() { + "use strict"; init_log_format(); init_parse_diff_summary(); init_task(); @@ -16164,7 +16656,10 @@ function log_default() { return { log(...rest) { const next = trailingFunctionArgument(arguments); - const options = parseLogOptions(trailingOptionsArgument(arguments), filterType(arguments[0], filterArray)); + const options = parseLogOptions( + trailingOptionsArgument(arguments), + filterType(arguments[0], filterArray) + ); const task = rejectDeprecatedSignatures(...rest) || validateLogFormatConfig(options.commands) || createLogTask(options); return this._runTask(task, next); } @@ -16173,12 +16668,15 @@ function log_default() { return logTask(options.splitter, options.fields, options.commands); } function rejectDeprecatedSignatures(from, to) { - return filterString(from) && filterString(to) && configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`); + return filterString(from) && filterString(to) && configurationErrorTask( + `git.log(string, string) should be replaced with git.log({ from: string, to: string })` + ); } } var excludeOptions; var init_log = __esm({ "src/lib/tasks/log.ts"() { + "use strict"; init_log_format(); init_pathspec(); init_parse_list_log_summary(); @@ -16208,6 +16706,7 @@ var init_log = __esm({ var MergeSummaryConflict, MergeSummaryDetail; var init_MergeSummary = __esm({ "src/lib/responses/MergeSummary.ts"() { + "use strict"; MergeSummaryConflict = class { constructor(reason, file = null, meta) { this.reason = reason; @@ -16244,6 +16743,7 @@ var init_MergeSummary = __esm({ var PullSummary, PullFailedSummary; var init_PullSummary = __esm({ "src/lib/responses/PullSummary.ts"() { + "use strict"; PullSummary = class { constructor() { this.remoteMessages = { @@ -16303,24 +16803,34 @@ function asObjectCount(source) { var remoteMessagesObjectParsers; var init_parse_remote_objects = __esm({ "src/lib/parsers/parse-remote-objects.ts"() { + "use strict"; init_utils(); remoteMessagesObjectParsers = [ - new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - }), - new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - }), - new RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { - const objects = objectEnumerationResult(result.remoteMessages); - objects.total = asObjectCount(total); - objects.reused = asObjectCount(reused); - objects.packReused = asNumber(packReused); - }) + new RemoteLineParser( + /^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber(count) }); + } + ), + new RemoteLineParser( + /^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber(count) }); + } + ), + new RemoteLineParser( + /total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, + (result, [total, reused, packReused]) => { + const objects = objectEnumerationResult(result.remoteMessages); + objects.total = asObjectCount(total); + objects.reused = asObjectCount(reused); + objects.packReused = asNumber(packReused); + } + ) ]; } }); @@ -16332,6 +16842,7 @@ function parseRemoteMessages(_stdOut, stdErr) { var parsers2, RemoteMessageSummary; var init_parse_remote_messages = __esm({ "src/lib/parsers/parse-remote-messages.ts"() { + "use strict"; init_utils(); init_parse_remote_objects(); parsers2 = [ @@ -16340,16 +16851,22 @@ var init_parse_remote_messages = __esm({ return false; }), ...remoteMessagesObjectParsers, - new RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { - result.remoteMessages.pullRequestUrl = pullRequestUrl; - }), - new RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { - result.remoteMessages.vulnerabilities = { - count: asNumber(count), - summary, - url - }; - }) + new RemoteLineParser( + [/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], + (result, [pullRequestUrl]) => { + result.remoteMessages.pullRequestUrl = pullRequestUrl; + } + ), + new RemoteLineParser( + [/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], + (result, [count, summary, url]) => { + result.remoteMessages.vulnerabilities = { + count: asNumber(count), + summary, + url + }; + } + ) ]; RemoteMessageSummary = class { constructor() { @@ -16367,6 +16884,7 @@ function parsePullErrorResult(stdOut, stdErr) { var FILE_UPDATE_REGEX, SUMMARY_REGEX, ACTION_REGEX, parsers3, errorParsers, parsePullDetail, parsePullResult; var init_parse_pull = __esm({ "src/lib/parsers/parse-pull.ts"() { + "use strict"; init_PullSummary(); init_utils(); init_parse_remote_messages(); @@ -16400,18 +16918,25 @@ var init_parse_pull = __esm({ errorParsers = [ new LineParser(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), new LineParser(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), - new LineParser(/([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { - result.branch.local = branchLocal; - result.hash.local = hashLocal; - result.branch.remote = branchRemote; - result.hash.remote = hashRemote; - }) + new LineParser( + /([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, + (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { + result.branch.local = branchLocal; + result.hash.local = hashLocal; + result.branch.remote = branchRemote; + result.hash.remote = hashRemote; + } + ) ]; parsePullDetail = (stdOut, stdErr) => { return parseStringResponse(new PullSummary(), parsers3, [stdOut, stdErr]); }; parsePullResult = (stdOut, stdErr) => { - return Object.assign(new PullSummary(), parsePullDetail(stdOut, stdErr), parseRemoteMessages(stdOut, stdErr)); + return Object.assign( + new PullSummary(), + parsePullDetail(stdOut, stdErr), + parseRemoteMessages(stdOut, stdErr) + ); }; } }); @@ -16420,6 +16945,7 @@ var init_parse_pull = __esm({ var parsers4, parseMergeResult, parseMergeDetail; var init_parse_merge = __esm({ "src/lib/parsers/parse-merge.ts"() { + "use strict"; init_MergeSummary(); init_utils(); init_parse_pull(); @@ -16430,9 +16956,12 @@ var init_parse_merge = __esm({ new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { summary.conflicts.push(new MergeSummaryConflict(reason, file)); }), - new LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); - }), + new LineParser( + /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, + (summary, [reason, file, deleteRef]) => { + summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); + } + ), new LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { summary.conflicts.push(new MergeSummaryConflict(reason, null)); }), @@ -16468,6 +16997,7 @@ function mergeTask(customArgs) { } var init_merge = __esm({ "src/lib/tasks/merge.ts"() { + "use strict"; init_git_response_error(); init_parse_merge(); init_task(); @@ -16492,6 +17022,7 @@ function pushResultPushedItem(local, remote, status) { var parsers5, parsePushResult, parsePushDetail; var init_parse_push = __esm({ "src/lib/parsers/parse-push.ts"() { + "use strict"; init_utils(); init_parse_remote_messages(); parsers5 = [ @@ -16506,25 +17037,31 @@ var init_parse_push = __esm({ new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { result.pushed.push(pushResultPushedItem(local, remote, type)); }), - new LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { - result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { - local, - remote, - remoteName - }); - }), - new LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { - result.update = { - head: { + new LineParser( + /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, + (result, [local, remote, remoteName]) => { + result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { local, - remote - }, - hash: { - from, - to - } - }; - }) + remote, + remoteName + }); + } + ), + new LineParser( + /^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, + (result, [local, remote, from, to]) => { + result.update = { + head: { + local, + remote + }, + hash: { + from, + to + } + }; + } + ) ]; parsePushResult = (stdOut, stdErr) => { const pushDetail = parsePushDetail(stdOut, stdErr); @@ -16566,6 +17103,7 @@ function pushTask(ref = {}, customArgs) { } var init_push = __esm({ "src/lib/tasks/push.ts"() { + "use strict"; init_parse_push(); init_utils(); } @@ -16579,16 +17117,23 @@ function show_default() { if (!commands.includes("--binary")) { commands.splice(1, 0, "--binary"); } - return this._runTask(straightThroughBufferTask(commands), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughBufferTask(commands), + trailingFunctionArgument(arguments) + ); }, show() { const commands = ["show", ...getTrailingOptions(arguments, 1)]; - return this._runTask(straightThroughStringTask(commands), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(commands), + trailingFunctionArgument(arguments) + ); } }; } var init_show = __esm({ "src/lib/tasks/show.ts"() { + "use strict"; init_utils(); init_task(); } @@ -16598,13 +17143,14 @@ var init_show = __esm({ var fromPathRegex, FileStatusSummary; var init_FileStatusSummary = __esm({ "src/lib/responses/FileStatusSummary.ts"() { + "use strict"; fromPathRegex = /^(.+) -> (.+)$/; FileStatusSummary = class { constructor(path, index, working_dir) { this.path = path; this.index = index; this.working_dir = working_dir; - if (index + working_dir === "R") { + if ("R" === index + working_dir) { const detail = fromPathRegex.exec(path) || [null, path, path]; this.from = detail[1] || ""; this.path = detail[2] || ""; @@ -16652,6 +17198,7 @@ function splitLine(result, lineStr) { var StatusSummary, parsers6, parseStatusSummary; var init_StatusSummary = __esm({ "src/lib/responses/StatusSummary.ts"() { + "use strict"; init_utils(); init_FileStatusSummary(); StatusSummary = class { @@ -16676,14 +17223,46 @@ var init_StatusSummary = __esm({ } }; parsers6 = new Map([ - parser2(" " /* NONE */, "A" /* ADDED */, (result, file) => append(result.created, file)), - parser2(" " /* NONE */, "D" /* DELETED */, (result, file) => append(result.deleted, file)), - parser2(" " /* NONE */, "M" /* MODIFIED */, (result, file) => append(result.modified, file)), - parser2("A" /* ADDED */, " " /* NONE */, (result, file) => append(result.created, file) && append(result.staged, file)), - parser2("A" /* ADDED */, "M" /* MODIFIED */, (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file)), - parser2("D" /* DELETED */, " " /* NONE */, (result, file) => append(result.deleted, file) && append(result.staged, file)), - parser2("M" /* MODIFIED */, " " /* NONE */, (result, file) => append(result.modified, file) && append(result.staged, file)), - parser2("M" /* MODIFIED */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) && append(result.staged, file)), + parser2( + " " /* NONE */, + "A" /* ADDED */, + (result, file) => append(result.created, file) + ), + parser2( + " " /* NONE */, + "D" /* DELETED */, + (result, file) => append(result.deleted, file) + ), + parser2( + " " /* NONE */, + "M" /* MODIFIED */, + (result, file) => append(result.modified, file) + ), + parser2( + "A" /* ADDED */, + " " /* NONE */, + (result, file) => append(result.created, file) && append(result.staged, file) + ), + parser2( + "A" /* ADDED */, + "M" /* MODIFIED */, + (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file) + ), + parser2( + "D" /* DELETED */, + " " /* NONE */, + (result, file) => append(result.deleted, file) && append(result.staged, file) + ), + parser2( + "M" /* MODIFIED */, + " " /* NONE */, + (result, file) => append(result.modified, file) && append(result.staged, file) + ), + parser2( + "M" /* MODIFIED */, + "M" /* MODIFIED */, + (result, file) => append(result.modified, file) && append(result.staged, file) + ), parser2("R" /* RENAMED */, " " /* NONE */, (result, file) => { append(result.renamed, renamedFile(file)); }), @@ -16695,10 +17274,23 @@ var init_StatusSummary = __esm({ parser2("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2("?" /* UNTRACKED */, "?" /* UNTRACKED */, (result, file) => append(result.not_added, file)), + parser2( + "?" /* UNTRACKED */, + "?" /* UNTRACKED */, + (result, file) => append(result.not_added, file) + ), ...conflicts("A" /* ADDED */, "A" /* ADDED */, "U" /* UNMERGED */), - ...conflicts("D" /* DELETED */, "D" /* DELETED */, "U" /* UNMERGED */), - ...conflicts("U" /* UNMERGED */, "A" /* ADDED */, "D" /* DELETED */, "U" /* UNMERGED */), + ...conflicts( + "D" /* DELETED */, + "D" /* DELETED */, + "U" /* UNMERGED */ + ), + ...conflicts( + "U" /* UNMERGED */, + "A" /* ADDED */, + "D" /* DELETED */, + "U" /* UNMERGED */ + ), [ "##", (result, line) => { @@ -16761,6 +17353,7 @@ function statusTask(customArgs) { var ignoredOptions; var init_status = __esm({ "src/lib/tasks/status.ts"() { + "use strict"; init_StatusSummary(); ignoredOptions = ["--null", "-z"]; } @@ -16768,19 +17361,23 @@ var init_status = __esm({ // src/lib/tasks/version.ts function versionResponse(major = 0, minor = 0, patch = 0, agent = "", installed = true) { - return Object.defineProperty({ - major, - minor, - patch, - agent, - installed - }, "toString", { - value() { - return `${this.major}.${this.minor}.${this.patch}`; + return Object.defineProperty( + { + major, + minor, + patch, + agent, + installed }, - configurable: false, - enumerable: false - }); + "toString", + { + value() { + return `${this.major}.${this.minor}.${this.patch}`; + }, + configurable: false, + enumerable: false + } + ); } function notInstalledResponse() { return versionResponse(0, 0, 0, "", false); @@ -16811,15 +17408,25 @@ function versionParser(stdOut) { var NOT_INSTALLED, parsers7; var init_version = __esm({ "src/lib/tasks/version.ts"() { + "use strict"; init_utils(); NOT_INSTALLED = "installed=false"; parsers7 = [ - new LineParser(/version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)); - }), - new LineParser(/version (\d+)\.(\d+)\.(\D+)(.+)?$/, (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); - }) + new LineParser( + /version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign( + result, + versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent) + ); + } + ), + new LineParser( + /version (\d+)\.(\d+)\.(\D+)(.+)?$/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); + } + ) ]; } }); @@ -16832,6 +17439,7 @@ __export(simple_git_api_exports, { var SimpleGitApi; var init_simple_git_api = __esm({ "src/lib/simple-git-api.ts"() { + "use strict"; init_task_callback(); init_change_working_directory(); init_checkout(); @@ -16866,7 +17474,10 @@ var init_simple_git_api = __esm({ }); } add(files) { - return this._runTask(straightThroughStringTask(["add", ...asArray(files)]), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["add", ...asArray(files)]), + trailingFunctionArgument(arguments) + ); } cwd(directory) { const next = trailingFunctionArgument(arguments); @@ -16874,44 +17485,88 @@ var init_simple_git_api = __esm({ return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next); } if (typeof (directory == null ? void 0 : directory.path) === "string") { - return this._runTask(changeWorkingDirectoryTask(directory.path, directory.root && this._executor || void 0), next); + return this._runTask( + changeWorkingDirectoryTask( + directory.path, + directory.root && this._executor || void 0 + ), + next + ); } - return this._runTask(configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), next); + return this._runTask( + configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), + next + ); } hashObject(path, write) { - return this._runTask(hashObjectTask(path, write === true), trailingFunctionArgument(arguments)); + return this._runTask( + hashObjectTask(path, write === true), + trailingFunctionArgument(arguments) + ); } init(bare) { - return this._runTask(initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } merge() { - return this._runTask(mergeTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + mergeTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } mergeFromTo(remote, branch) { if (!(filterString(remote) && filterString(branch))) { - return this._runTask(configurationErrorTask(`Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`)); + return this._runTask( + configurationErrorTask( + `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings` + ) + ); } - return this._runTask(mergeTask([remote, branch, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments, false)); + return this._runTask( + mergeTask([remote, branch, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments, false) + ); } outputHandler(handler) { this._executor.outputHandler = handler; return this; } push() { - const task = pushTask({ - remote: filterType(arguments[0], filterString), - branch: filterType(arguments[1], filterString) - }, getTrailingOptions(arguments)); + const task = pushTask( + { + remote: filterType(arguments[0], filterString), + branch: filterType(arguments[1], filterString) + }, + getTrailingOptions(arguments) + ); return this._runTask(task, trailingFunctionArgument(arguments)); } stash() { - return this._runTask(straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); } status() { - return this._runTask(statusTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + statusTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } }; - Object.assign(SimpleGitApi.prototype, checkout_default(), commit_default(), config_default(), first_commit_default(), grep_default(), log_default(), show_default(), version_default()); + Object.assign( + SimpleGitApi.prototype, + checkout_default(), + commit_default(), + config_default(), + first_commit_default(), + grep_default(), + log_default(), + show_default(), + version_default() + ); } }); @@ -16923,6 +17578,7 @@ __export(scheduler_exports, { var import_promise_deferred2, createScheduledTask, Scheduler; var init_scheduler = __esm({ "src/lib/runners/scheduler.ts"() { + "use strict"; init_utils(); import_promise_deferred2 = __nccwpck_require__(9819); init_git_logger(); @@ -16948,7 +17604,12 @@ var init_scheduler = __esm({ } schedule() { if (!this.pending.length || this.running.length >= this.concurrency) { - this.logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); + this.logger( + `Schedule attempt ignored, pending=%s running=%s concurrency=%s`, + this.pending.length, + this.running.length, + this.concurrency + ); return; } const task = append(this.running, this.pending.shift()); @@ -16979,6 +17640,7 @@ function applyPatchTask(patches, customArgs) { } var init_apply_patch = __esm({ "src/lib/tasks/apply-patch.ts"() { + "use strict"; init_task(); } }); @@ -17001,6 +17663,7 @@ function branchDeletionFailure(branch) { var BranchDeletionBatch; var init_BranchDeleteSummary = __esm({ "src/lib/responses/BranchDeleteSummary.ts"() { + "use strict"; BranchDeletionBatch = class { constructor() { this.all = []; @@ -17021,6 +17684,7 @@ function hasBranchDeletionError(data, processExitCode) { var deleteSuccessRegex, deleteErrorRegex, parsers8, parseBranchDeletions; var init_parse_branch_delete = __esm({ "src/lib/parsers/parse-branch-delete.ts"() { + "use strict"; init_BranchDeleteSummary(); init_utils(); deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; @@ -17048,6 +17712,7 @@ var init_parse_branch_delete = __esm({ var BranchSummaryResult; var init_BranchSummary = __esm({ "src/lib/responses/BranchSummary.ts"() { + "use strict"; BranchSummaryResult = class { constructor() { this.all = []; @@ -17083,15 +17748,22 @@ function parseBranchSummary(stdOut) { var parsers9; var init_parse_branch = __esm({ "src/lib/parsers/parse-branch.ts"() { + "use strict"; init_BranchSummary(); init_utils(); parsers9 = [ - new LineParser(/^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { - result.push(branchStatus(current), true, name, commit, label); - }), - new LineParser(/^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, (result, [current, name, commit, label]) => { - result.push(branchStatus(current), false, name, commit, label); - }) + new LineParser( + /^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, + (result, [current, name, commit, label]) => { + result.push(branchStatus(current), true, name, commit, label); + } + ), + new LineParser( + new RegExp("^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$", "s"), + (result, [current, name, commit, label]) => { + result.push(branchStatus(current), false, name, commit, label); + } + ) ]; } }); @@ -17163,13 +17835,17 @@ function deleteBranchTask(branch, forceDelete = false) { if (!hasBranchDeletionError(String(error), exitCode)) { return fail(error); } - throw new GitResponseError(task.parser(bufferToString(stdOut), bufferToString(stdErr)), String(error)); + throw new GitResponseError( + task.parser(bufferToString(stdOut), bufferToString(stdErr)), + String(error) + ); } }; return task; } var init_branch = __esm({ "src/lib/tasks/branch.ts"() { + "use strict"; init_git_response_error(); init_parse_branch_delete(); init_parse_branch(); @@ -17181,6 +17857,7 @@ var init_branch = __esm({ var parseCheckIgnore; var init_CheckIgnore = __esm({ "src/lib/responses/CheckIgnore.ts"() { + "use strict"; parseCheckIgnore = (text) => { return text.split(/\n/g).map((line) => line.trim()).filter((file) => !!file); }; @@ -17201,6 +17878,7 @@ function checkIgnoreTask(paths) { } var init_check_ignore = __esm({ "src/lib/tasks/check-ignore.ts"() { + "use strict"; init_CheckIgnore(); } }); @@ -17230,6 +17908,7 @@ function cloneMirrorTask(repo, directory, customArgs) { } var init_clone = __esm({ "src/lib/tasks/clone.ts"() { + "use strict"; init_task(); init_utils(); } @@ -17250,6 +17929,7 @@ function parseFetchResult(stdOut, stdErr) { var parsers10; var init_parse_fetch = __esm({ "src/lib/parsers/parse-fetch.ts"() { + "use strict"; init_utils(); parsers10 = [ new LineParser(/From (.+)$/, (result, [remote]) => { @@ -17272,14 +17952,17 @@ var init_parse_fetch = __esm({ tracking }); }), - new LineParser(/\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, (result, [from, to, name, tracking]) => { - result.updated.push({ - name, - tracking, - to, - from - }); - }) + new LineParser( + /\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, + (result, [from, to, name, tracking]) => { + result.updated.push({ + name, + tracking, + to, + from + }); + } + ) ]; } }); @@ -17309,6 +17992,7 @@ function fetchTask(remote, branch, customArgs) { } var init_fetch = __esm({ "src/lib/tasks/fetch.ts"() { + "use strict"; init_parse_fetch(); init_task(); } @@ -17321,6 +18005,7 @@ function parseMoveResult(stdOut) { var parsers11; var init_parse_move = __esm({ "src/lib/parsers/parse-move.ts"() { + "use strict"; init_utils(); parsers11 = [ new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { @@ -17344,6 +18029,7 @@ function moveTask(from, to) { } var init_move = __esm({ "src/lib/tasks/move.ts"() { + "use strict"; init_parse_move(); init_utils(); } @@ -17366,7 +18052,10 @@ function pullTask(remote, branch, customArgs) { return parsePullResult(stdOut, stdErr); }, onError(result, _error, _done, fail) { - const pullError = parsePullErrorResult(bufferToString(result.stdOut), bufferToString(result.stdErr)); + const pullError = parsePullErrorResult( + bufferToString(result.stdOut), + bufferToString(result.stdErr) + ); if (pullError) { return fail(new GitResponseError(pullError)); } @@ -17376,6 +18065,7 @@ function pullTask(remote, branch, customArgs) { } var init_pull = __esm({ "src/lib/tasks/pull.ts"() { + "use strict"; init_git_response_error(); init_parse_pull(); init_utils(); @@ -17408,6 +18098,7 @@ function forEach(text, handler) { } var init_GetRemoteSummary = __esm({ "src/lib/responses/GetRemoteSummary.ts"() { + "use strict"; init_utils(); } }); @@ -17421,7 +18112,7 @@ __export(remote_exports, { remoteTask: () => remoteTask, removeRemoteTask: () => removeRemoteTask }); -function addRemoteTask(remoteName, remoteRepo, customArgs = []) { +function addRemoteTask(remoteName, remoteRepo, customArgs) { return straightThroughStringTask(["remote", "add", ...customArgs, remoteName, remoteRepo]); } function getRemotesTask(verbose) { @@ -17435,14 +18126,14 @@ function getRemotesTask(verbose) { parser: verbose ? parseGetRemotesVerbose : parseGetRemotes }; } -function listRemotesTask(customArgs = []) { +function listRemotesTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "ls-remote") { commands.unshift("ls-remote"); } return straightThroughStringTask(commands); } -function remoteTask(customArgs = []) { +function remoteTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "remote") { commands.unshift("remote"); @@ -17454,6 +18145,7 @@ function removeRemoteTask(remoteName) { } var init_remote = __esm({ "src/lib/tasks/remote.ts"() { + "use strict"; init_GetRemoteSummary(); init_task(); } @@ -17467,7 +18159,11 @@ __export(stash_list_exports, { function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; - const parser3 = createListLogSummaryParser(options.splitter, options.fields, logFormatFromCommand(commands)); + const parser3 = createListLogSummaryParser( + options.splitter, + options.fields, + logFormatFromCommand(commands) + ); return validateLogFormatConfig(commands) || { commands, format: "utf-8", @@ -17476,6 +18172,7 @@ function stashListTask(opt = {}, customArgs) { } var init_stash_list = __esm({ "src/lib/tasks/stash-list.ts"() { + "use strict"; init_log_format(); init_parse_list_log_summary(); init_diff(); @@ -17509,6 +18206,7 @@ function updateSubModuleTask(customArgs) { } var init_sub_module = __esm({ "src/lib/tasks/sub-module.ts"() { + "use strict"; init_task(); } }); @@ -17537,6 +18235,7 @@ function toNumber(input) { var TagList, parseTagList; var init_TagList = __esm({ "src/lib/responses/TagList.ts"() { + "use strict"; TagList = class { constructor(all, latest) { this.all = all; @@ -17604,6 +18303,7 @@ function addAnnotatedTagTask(name, tagMessage) { } var init_tag = __esm({ "src/lib/tasks/tag.ts"() { + "use strict"; init_TagList(); } }); @@ -17611,6 +18311,7 @@ var init_tag = __esm({ // src/git.js var require_git = __commonJS({ "src/git.js"(exports2, module2) { + "use strict"; var { GitExecutor: GitExecutor2 } = (init_git_executor(), __toCommonJS(git_executor_exports)); var { SimpleGitApi: SimpleGitApi2 } = (init_simple_git_api(), __toCommonJS(simple_git_api_exports)); var { Scheduler: Scheduler2 } = (init_scheduler(), __toCommonJS(scheduler_exports)); @@ -17660,12 +18361,17 @@ var require_git = __commonJS({ var { addAnnotatedTagTask: addAnnotatedTagTask2, addTagTask: addTagTask2, tagListTask: tagListTask2 } = (init_tag(), __toCommonJS(tag_exports)); var { straightThroughBufferTask: straightThroughBufferTask2, straightThroughStringTask: straightThroughStringTask2 } = (init_task(), __toCommonJS(task_exports)); function Git2(options, plugins) { - this._executor = new GitExecutor2(options.binary, options.baseDir, new Scheduler2(options.maxConcurrentProcesses), plugins); + this._plugins = plugins; + this._executor = new GitExecutor2( + options.baseDir, + new Scheduler2(options.maxConcurrentProcesses), + plugins + ); this._trimmed = options.trimmed; } (Git2.prototype = Object.create(SimpleGitApi2.prototype)).constructor = Git2; Git2.prototype.customBinary = function(command) { - this._executor.binary = command; + this._plugins.reconfigure("binary", command); return this; }; Git2.prototype.env = function(name, value) { @@ -17677,7 +18383,13 @@ var require_git = __commonJS({ return this; }; Git2.prototype.stashList = function(options) { - return this._runTask(stashListTask2(trailingOptionsArgument2(arguments) || {}, filterArray2(options) && options || []), trailingFunctionArgument2(arguments)); + return this._runTask( + stashListTask2( + trailingOptionsArgument2(arguments) || {}, + filterArray2(options) && options || [] + ), + trailingFunctionArgument2(arguments) + ); }; function createCloneTask(api, task, repoPath, localPath) { if (typeof repoPath !== "string") { @@ -17686,10 +18398,16 @@ var require_git = __commonJS({ return task(repoPath, filterType2(localPath, filterString2), getTrailingOptions2(arguments)); } Git2.prototype.clone = function() { - return this._runTask(createCloneTask("clone", cloneTask2, ...arguments), trailingFunctionArgument2(arguments)); + return this._runTask( + createCloneTask("clone", cloneTask2, ...arguments), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.mirror = function() { - return this._runTask(createCloneTask("mirror", cloneMirrorTask2, ...arguments), trailingFunctionArgument2(arguments)); + return this._runTask( + createCloneTask("mirror", cloneMirrorTask2, ...arguments), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.mv = function(from, to) { return this._runTask(moveTask2(from, to), trailingFunctionArgument2(arguments)); @@ -17703,46 +18421,86 @@ var require_git = __commonJS({ }); }; Git2.prototype.pull = function(remote, branch, options, then) { - return this._runTask(pullTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + pullTask2( + filterType2(remote, filterString2), + filterType2(branch, filterString2), + getTrailingOptions2(arguments) + ), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.fetch = function(remote, branch) { - return this._runTask(fetchTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + fetchTask2( + filterType2(remote, filterString2), + filterType2(branch, filterString2), + getTrailingOptions2(arguments) + ), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.silent = function(silence) { - console.warn("simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3"); + console.warn( + "simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3" + ); return this; }; Git2.prototype.tags = function(options, then) { - return this._runTask(tagListTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + tagListTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.rebase = function() { - return this._runTask(straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.reset = function(mode) { - return this._runTask(resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.revert = function(commit) { const next = trailingFunctionArgument2(arguments); if (typeof commit !== "string") { return this._runTask(configurationErrorTask2("Commit must be a string"), next); } - return this._runTask(straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), next); + return this._runTask( + straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), + next + ); }; Git2.prototype.addTag = function(name) { const task = typeof name === "string" ? addTagTask2(name) : configurationErrorTask2("Git.addTag requires a tag name"); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.addAnnotatedTag = function(tagName, tagMessage) { - return this._runTask(addAnnotatedTagTask2(tagName, tagMessage), trailingFunctionArgument2(arguments)); + return this._runTask( + addAnnotatedTagTask2(tagName, tagMessage), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.deleteLocalBranch = function(branchName, forceDelete, then) { - return this._runTask(deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); + return this._runTask( + deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.deleteLocalBranches = function(branchNames, forceDelete, then) { - return this._runTask(deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); + return this._runTask( + deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.branch = function(options, then) { - return this._runTask(branchTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + branchTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.branchLocal = function(then) { return this._runTask(branchLocalTask2(), trailingFunctionArgument2(arguments)); @@ -17759,7 +18517,10 @@ var require_git = __commonJS({ command.push(...getTrailingOptions2(arguments, 0, true)); var next = trailingFunctionArgument2(arguments); if (!command.length) { - return this._runTask(configurationErrorTask2("Raw: must supply one or more command to execute"), next); + return this._runTask( + configurationErrorTask2("Raw: must supply one or more command to execute"), + next + ); } return this._runTask(straightThroughStringTask2(command, this._trimmed), next); }; @@ -17767,19 +18528,34 @@ var require_git = __commonJS({ return this._runTask(addSubModuleTask2(repo, path), trailingFunctionArgument2(arguments)); }; Git2.prototype.submoduleUpdate = function(args, then) { - return this._runTask(updateSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); + return this._runTask( + updateSubModuleTask2(getTrailingOptions2(arguments, true)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.submoduleInit = function(args, then) { - return this._runTask(initSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); + return this._runTask( + initSubModuleTask2(getTrailingOptions2(arguments, true)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.subModule = function(options, then) { - return this._runTask(subModuleTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + subModuleTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.listRemote = function() { - return this._runTask(listRemotesTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + listRemotesTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.addRemote = function(remoteName, remoteRepo, then) { - return this._runTask(addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.removeRemote = function(remoteName, then) { return this._runTask(removeRemoteTask2(remoteName), trailingFunctionArgument2(arguments)); @@ -17788,7 +18564,10 @@ var require_git = __commonJS({ return this._runTask(getRemotesTask2(verbose === true), trailingFunctionArgument2(arguments)); }; Git2.prototype.remote = function(options, then) { - return this._runTask(remoteTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + remoteTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.tag = function(options, then) { const command = getTrailingOptions2(arguments); @@ -17798,17 +18577,29 @@ var require_git = __commonJS({ return this._runTask(straightThroughStringTask2(command), trailingFunctionArgument2(arguments)); }; Git2.prototype.updateServerInfo = function(then) { - return this._runTask(straightThroughStringTask2(["update-server-info"]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["update-server-info"]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.pushTags = function(remote, then) { - const task = pushTagsTask2({ remote: filterType2(remote, filterString2) }, getTrailingOptions2(arguments)); + const task = pushTagsTask2( + { remote: filterType2(remote, filterString2) }, + getTrailingOptions2(arguments) + ); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.rm = function(files) { - return this._runTask(straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.rmKeepLocal = function(files) { - return this._runTask(straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.catFile = function(options, then) { return this._catFile("utf-8", arguments); @@ -17821,7 +18612,10 @@ var require_git = __commonJS({ var command = ["cat-file"]; var options = args[0]; if (typeof options === "string") { - return this._runTask(configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), handler); + return this._runTask( + configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), + handler + ); } if (Array.isArray(options)) { command.push.apply(command, options); @@ -17830,25 +18624,38 @@ var require_git = __commonJS({ return this._runTask(task, handler); }; Git2.prototype.diff = function(options, then) { - const task = filterString2(options) ? configurationErrorTask2("git.diff: supplying options as a single string is no longer supported, switch to an array of strings") : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); + const task = filterString2(options) ? configurationErrorTask2( + "git.diff: supplying options as a single string is no longer supported, switch to an array of strings" + ) : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.diffSummary = function() { - return this._runTask(diffSummaryTask2(getTrailingOptions2(arguments, 1)), trailingFunctionArgument2(arguments)); + return this._runTask( + diffSummaryTask2(getTrailingOptions2(arguments, 1)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.applyPatch = function(patches) { - const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2(`git.applyPatch requires one or more string patches as the first argument`) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); + const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2( + `git.applyPatch requires one or more string patches as the first argument` + ) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.revparse = function() { const commands = ["rev-parse", ...getTrailingOptions2(arguments, true)]; - return this._runTask(straightThroughStringTask2(commands, true), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(commands, true), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.clean = function(mode, options, then) { const usingCleanOptionsArray = isCleanOptionsArray2(mode); const cleanMode = usingCleanOptionsArray && mode.join("") || filterType2(mode, filterString2) || ""; const customArgs = getTrailingOptions2([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); - return this._runTask(cleanWithOptionsTask2(cleanMode, customArgs), trailingFunctionArgument2(arguments)); + return this._runTask( + cleanWithOptionsTask2(cleanMode, customArgs), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.exec = function(then) { const task = { @@ -17866,10 +18673,16 @@ var require_git = __commonJS({ return this; }; Git2.prototype.checkIgnore = function(pathnames, then) { - return this._runTask(checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), trailingFunctionArgument2(arguments)); + return this._runTask( + checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.checkIsRepo = function(checkType, then) { - return this._runTask(checkIsRepoTask2(filterType2(checkType, filterString2)), trailingFunctionArgument2(arguments)); + return this._runTask( + checkIsRepoTask2(filterType2(checkType, filterString2)), + trailingFunctionArgument2(arguments) + ); }; module2.exports = Git2; } @@ -17892,10 +18705,17 @@ function gitExportFactory(factory) { return Object.assign(factory.bind(null), api_exports); } function gitInstanceFactory(baseDir, options) { + var _a2; const plugins = new PluginStore(); - const config = createInstanceConfig(baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, options); + const config = createInstanceConfig( + baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, + options + ); if (!folderExists(config.baseDir)) { - throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); + throw new GitConstructError( + config, + `Cannot use simple-git on a directory that does not exist` + ); } if (Array.isArray(config.config)) { plugins.add(commandConfigPrefixingPlugin(config.config)); @@ -17909,11 +18729,13 @@ function gitInstanceFactory(baseDir, options) { config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); config.errors && plugins.add(errorDetectionPlugin(config.errors)); + customBinaryPlugin(plugins, config.binary, (_a2 = config.unsafe) == null ? void 0 : _a2.allowUnsafeCustomBinary); return new Git(config, plugins); } var Git; var init_git_factory = __esm({ "src/lib/git-factory.ts"() { + "use strict"; init_api(); init_plugins(); init_suffix_paths_plugin(); @@ -17941,22 +18763,27 @@ function gitP(...args) { function chainReturn() { return chain; } - const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce((api, name) => { - const isAsync = functionNamesPromiseApi.includes(name); - const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); - const alternative = isAsync ? chainReturn : builderReturn; - Object.defineProperty(api, name, { - enumerable: false, - configurable: false, - value: git ? valid : alternative - }); - return api; - }, {}); + const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce( + (api, name) => { + const isAsync = functionNamesPromiseApi.includes(name); + const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); + const alternative = isAsync ? chainReturn : builderReturn; + Object.defineProperty(api, name, { + enumerable: false, + configurable: false, + value: git ? valid : alternative + }); + return api; + }, + {} + ); return promiseApi; function asyncWrapper(fn, git2) { return function(...args2) { if (typeof args2[args2.length] === "function") { - throw new TypeError("Promise interface requires that handlers are not supplied inline, trailing function not allowed in call to " + fn); + throw new TypeError( + "Promise interface requires that handlers are not supplied inline, trailing function not allowed in call to " + fn + ); } return chain.then(function() { return new Promise(function(resolve, reject) { @@ -17991,6 +18818,7 @@ function toError(error) { var functionNamesBuilderApi, functionNamesPromiseApi; var init_promise_wrapped = __esm({ "src/lib/runners/promise-wrapped.ts"() { + "use strict"; init_git_response_error(); init_git_factory(); functionNamesBuilderApi = ["customBinary", "env", "outputHandler", "silent"]; @@ -30270,6 +31098,9 @@ function httpRedirectFetch (fetchParams, response) { // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name request.headersList.delete('authorization') + // https://fetch.spec.whatwg.org/#authentication-entries + request.headersList.delete('proxy-authorization', true) + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. request.headersList.delete('cookie') request.headersList.delete('host') @@ -42124,7 +42955,7 @@ Dicer.prototype._write = function (data, encoding, cb) { if (this._headerFirst && this._isPreamble) { if (!this._part) { this._part = new PartStream(this._partOpts) - if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() } + if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() } } const r = this._hparser.push(data) if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() } @@ -42181,7 +43012,7 @@ Dicer.prototype._oninfo = function (isMatch, data, start, end) { } } if (this._dashes === 2) { - if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) } + if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) } this.reset() this._finished = true // no more parts will be added @@ -42199,7 +43030,13 @@ Dicer.prototype._oninfo = function (isMatch, data, start, end) { this._part._read = function (n) { self._unpause() } - if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() } + if (this._isPreamble && this.listenerCount('preamble') !== 0) { + this.emit('preamble', this._part) + } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) { + this.emit('part', this._part) + } else { + this._ignore() + } if (!this._isPreamble) { this._inHeader = true } } if (data && start < end && !this._ignoreData) { @@ -42882,7 +43719,7 @@ function Multipart (boy, cfg) { ++nfiles - if (!boy._events.file) { + if (boy.listenerCount('file') === 0) { self.parser._ignore() return } @@ -43411,7 +44248,7 @@ const decoders = { if (textDecoders.has(this.toString())) { try { return textDecoders.get(this).decode(data) - } catch (e) { } + } catch {} } return typeof data === 'string' ? data diff --git a/lib/cli/index.js b/lib/cli/index.js index 864a109..be5b8ba 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -1844,7 +1844,7 @@ class HttpClient { if (this._keepAlive && useProxy) { agent = this._proxyAgent; } - if (this._keepAlive && !useProxy) { + if (!useProxy) { agent = this._agent; } // if agent is already assigned use that agent. @@ -1876,16 +1876,12 @@ class HttpClient { agent = tunnelAgent(agentOptions); this._proxyAgent = agent; } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { + // if tunneling agent isn't assigned create a new agent + if (!agent) { const options = { keepAlive: this._keepAlive, maxSockets }; agent = usingSsl ? new https.Agent(options) : new http.Agent(options); this._agent = agent; } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } if (usingSsl && this._ignoreSslError) { // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options @@ -2778,7 +2774,29 @@ exports.commitRules = void 0; const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); const commit_1 = __nccwpck_require__(8065); +/** + * Checks whether the provided string is a noun. + * A noun is defined as a single word which can be capitalized or contain hyphens, therefore + * it will not support multi-word nouns (i.e. New York). + * + * @param str String to check + * @returns True if the string is a noun, false otherwise. + * + * @internal + */ function isNoun(str) { + return /^[A-Za-z][a-z]*(-[A-Za-z][a-z]*)*$/.test(str); +} +/** + * Validates whether the provided type valid. + * A valid type is defined as a single word, all lowercase, no spaces, and no special characters. + * + * @param str String to check + * @returns True if the string is a valid type, false otherwise. + * + * @internal + */ +function isValidType(str) { return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); } function highlightString(str, substring) { @@ -2830,9 +2848,10 @@ class CC01 { // Validated with EC-02 } else { - // Ensure that we have a noun - if (!isNoun(commit.type.value)) + // Ensure that we have a valid type (single word, no spaces, no special characters) + if (!isValidType(commit.type.value)) { errors.push(createDiagnosticsMessage(commit, this.description, "which consists of a noun", "type")); + } // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { if (commit.scope.value) { @@ -2993,7 +3012,7 @@ class EC02 { const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; this.description = `Commits ${uniqueAddedTypes.size > 0 ? "MUST" : "MAY"} be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; if (commit.type.value === undefined || - !isNoun(commit.type.value) || + !isValidType(commit.type.value) || expectedTypes.includes(commit.type.value.toLowerCase().trimEnd())) { return []; } @@ -4489,7 +4508,7 @@ var import_graphql = __nccwpck_require__(8467); var import_auth_token = __nccwpck_require__(334); // pkg/dist-src/version.js -var VERSION = "5.0.2"; +var VERSION = "5.1.0"; // pkg/dist-src/index.js var noop = () => { @@ -5198,7 +5217,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "9.1.5"; +var VERSION = "9.2.1"; // pkg/dist-src/normalize-paginated-list-response.js function normalizePaginatedListResponse(response) { @@ -5359,6 +5378,8 @@ var paginatingEndpoints = [ "GET /orgs/{org}/members/{username}/codespaces", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", + "GET /orgs/{org}/organization-roles/{role_id}/teams", + "GET /orgs/{org}/organization-roles/{role_id}/users", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", @@ -5595,7 +5616,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "10.2.0"; +var VERSION = "10.4.1"; // pkg/dist-src/generated/endpoints.js var Endpoints = { @@ -5722,6 +5743,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" ], getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomOidcSubClaimForRepo: [ + "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], getEnvironmentPublicKey: [ "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key" ], @@ -5874,6 +5898,9 @@ var Endpoints = { setCustomLabelsForSelfHostedRunnerForRepo: [ "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" ], + setCustomOidcSubClaimForRepo: [ + "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], setGithubActionsDefaultWorkflowPermissionsOrganization: [ "PUT /orgs/{org}/actions/permissions/workflow" ], @@ -5943,6 +5970,7 @@ var Endpoints = { listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], markNotificationsAsRead: ["PUT /notifications"], markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], setThreadSubscription: [ @@ -6219,10 +6247,10 @@ var Endpoints = { updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] }, copilot: { - addCopilotForBusinessSeatsForTeams: [ + addCopilotSeatsForTeams: [ "POST /orgs/{org}/copilot/billing/selected_teams" ], - addCopilotForBusinessSeatsForUsers: [ + addCopilotSeatsForUsers: [ "POST /orgs/{org}/copilot/billing/selected_users" ], cancelCopilotSeatAssignmentForTeams: [ @@ -6535,10 +6563,24 @@ var Endpoints = { } ] }, + oidc: { + getOidcCustomSubTemplateForOrg: [ + "GET /orgs/{org}/actions/oidc/customization/sub" + ], + updateOidcCustomSubTemplateForOrg: [ + "PUT /orgs/{org}/actions/oidc/customization/sub" + ] + }, orgs: { addSecurityManagerTeam: [ "PUT /orgs/{org}/security-managers/teams/{team_slug}" ], + assignTeamToOrgRole: [ + "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + assignUserToOrgRole: [ + "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], blockUser: ["PUT /orgs/{org}/blocks/{username}"], cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], @@ -6547,6 +6589,7 @@ var Endpoints = { convertMemberToOutsideCollaborator: [ "PUT /orgs/{org}/outside_collaborators/{username}" ], + createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], createInvitation: ["POST /orgs/{org}/invitations"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomPropertiesValuesForRepos: [ @@ -6557,6 +6600,9 @@ var Endpoints = { ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], + deleteCustomOrganizationRole: [ + "DELETE /orgs/{org}/organization-roles/{role_id}" + ], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], enableOrDisableSecurityProductOnAllOrgRepos: [ "POST /orgs/{org}/{security_product}/{enablement}" @@ -6568,6 +6614,7 @@ var Endpoints = { ], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], getWebhookDelivery: [ @@ -6583,6 +6630,12 @@ var Endpoints = { listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], listMembers: ["GET /orgs/{org}/members"], listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], listPatGrantRepositories: [ "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" @@ -6597,6 +6650,9 @@ var Endpoints = { listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], listWebhooks: ["GET /orgs/{org}/hooks"], + patchCustomOrganizationRole: [ + "PATCH /orgs/{org}/organization-roles/{role_id}" + ], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" @@ -6621,6 +6677,18 @@ var Endpoints = { reviewPatGrantRequestsInBulk: [ "POST /orgs/{org}/personal-access-token-requests" ], + revokeAllOrgRolesTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" + ], + revokeAllOrgRolesUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}" + ], + revokeOrgRoleTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + revokeOrgRoleUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], setPublicMembershipForAuthenticatedUser: [ "PUT /orgs/{org}/public_members/{username}" @@ -6911,6 +6979,9 @@ var Endpoints = { {}, { mapToData: "users" } ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], checkAutomatedSecurityFixes: [ "GET /repos/{owner}/{repo}/automated-security-fixes" ], @@ -6946,12 +7017,15 @@ var Endpoints = { createForAuthenticatedUser: ["POST /user/repos"], createFork: ["POST /repos/{owner}/{repo}/forks"], createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateCustomPropertiesValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], createOrUpdateEnvironment: [ "PUT /repos/{owner}/{repo}/environments/{environment_name}" ], createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], createOrgRuleset: ["POST /orgs/{org}/rulesets"], - createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], createPagesSite: ["POST /repos/{owner}/{repo}/pages"], createRelease: ["POST /repos/{owner}/{repo}/releases"], createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], @@ -7104,6 +7178,9 @@ var Endpoints = { getOrgRulesets: ["GET /orgs/{org}/rulesets"], getPages: ["GET /repos/{owner}/{repo}/pages"], getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: [ + "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" + ], getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], getPullRequestReviewProtection: [ @@ -7314,6 +7391,9 @@ var Endpoints = { ] }, securityAdvisories: { + createFork: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" + ], createPrivateVulnerabilityReport: [ "POST /repos/{owner}/{repo}/security-advisories/reports" ], @@ -7805,7 +7885,7 @@ var import_endpoint = __nccwpck_require__(9440); var import_universal_user_agent = __nccwpck_require__(5030); // pkg/dist-src/version.js -var VERSION = "8.1.6"; +var VERSION = "8.2.0"; // pkg/dist-src/is-plain-object.js function isPlainObject(value) { @@ -7949,11 +8029,17 @@ async function getResponseData(response) { function toErrorMessage(data) { if (typeof data === "string") return data; + let suffix; + if ("documentation_url" in data) { + suffix = ` - ${data.documentation_url}`; + } else { + suffix = ""; + } if ("message" in data) { if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`; } - return data.message; + return `${data.message}${suffix}`; } return `Unknown error: ${JSON.stringify(data)}`; } @@ -11008,6 +11094,8 @@ Diff.prototype = { /*istanbul ignore end*/ diff: function diff(oldString, newString) { /*istanbul ignore start*/ + var _options$timeout; + var /*istanbul ignore end*/ options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; @@ -11046,68 +11134,104 @@ Diff.prototype = { maxEditLength = Math.min(maxEditLength, options.maxEditLength); } + var maxExecutionTime = + /*istanbul ignore start*/ + (_options$timeout = + /*istanbul ignore end*/ + options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : Infinity; + var abortAfterTimestamp = Date.now() + maxExecutionTime; var bestPath = [{ - newPos: -1, - components: [] + oldPos: -1, + lastComponent: undefined }]; // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + var newPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) { // Identity per the equality and tokenizer return done([{ value: this.join(newString), count: newString.length }]); - } // Main worker method. checks all permutations of a given edit length for acceptance. - + } // Once we hit the right edge of the edit graph on some diagonal k, we can + // definitely reach the end of the edit graph in no more than k edits, so + // there's no point in considering any moves to diagonal k+1 any more (from + // which we're guaranteed to need at least k+1 more edits). + // Similarly, once we've reached the bottom of the edit graph, there's no + // point considering moves to lower diagonals. + // We record this fact by setting minDiagonalToConsider and + // maxDiagonalToConsider to some finite value once we've hit the edge of + // the edit graph. + // This optimization is not faithful to the original algorithm presented in + // Myers's paper, which instead pointlessly extends D-paths off the end of + // the edit graph - see page 7 of Myers's paper which notes this point + // explicitly and illustrates it with a diagram. This has major performance + // implications for some common scenarios. For instance, to compute a diff + // where the new text simply appends d characters on the end of the + // original text of length n, the true Myers algorithm will take O(n+d^2) + // time while this optimization needs only O(n+d) time. + + + var minDiagonalToConsider = -Infinity, + maxDiagonalToConsider = Infinity; // Main worker method. checks all permutations of a given edit length for acceptance. function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + for (var diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) { var basePath = /*istanbul ignore start*/ void 0 /*istanbul ignore end*/ ; + var removePath = bestPath[diagonalPath - 1], + addPath = bestPath[diagonalPath + 1]; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - - if (addPath) { + if (removePath) { // No one else is going to attempt to use this value, clear it bestPath[diagonalPath - 1] = undefined; } - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + var canAdd = false; + + if (addPath) { + // what newPos will be after we do an insertion: + var addPathNewPos = addPath.oldPos - diagonalPath; + canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen; + } + + var canRemove = removePath && removePath.oldPos + 1 < oldLen; if (!canAdd && !canRemove) { // If this path is a terminal then prune bestPath[diagonalPath] = undefined; continue; } // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin + // path whose position in the old string is the farthest from the origin // and does not pass the bounds of the diff graph + // TODO: Remove the `+ 1` here to make behavior match Myers algorithm + // and prefer to order removals before insertions. - if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); + if (!canRemove || canAdd && removePath.oldPos + 1 < addPath.oldPos) { + basePath = self.addToPath(addPath, true, undefined, 0); } else { - basePath = addPath; // No need to clone, we've pulled it from the list - - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); + basePath = self.addToPath(removePath, undefined, true, 1); } - _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done + newPos = self.extractCommon(basePath, newString, oldString, diagonalPath); - if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { - return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) { + // If we have hit the end of both strings, then we are done + return done(buildValues(self, basePath.lastComponent, newString, oldString, self.useLongestToken)); } else { - // Otherwise track this path as a potential candidate and continue. bestPath[diagonalPath] = basePath; + + if (basePath.oldPos + 1 >= oldLen) { + maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1); + } + + if (newPos + 1 >= newLen) { + minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1); + } } } @@ -11121,7 +11245,7 @@ Diff.prototype = { if (callback) { (function exec() { setTimeout(function () { - if (editLength > maxEditLength) { + if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) { return callback(); } @@ -11131,7 +11255,7 @@ Diff.prototype = { }, 0); })(); } else { - while (editLength <= maxEditLength) { + while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) { var ret = execEditLength(); if (ret) { @@ -11144,23 +11268,29 @@ Diff.prototype = { /*istanbul ignore start*/ /*istanbul ignore end*/ - pushComponent: function pushComponent(components, added, removed) { - var last = components[components.length - 1]; + addToPath: function addToPath(path, added, removed, oldPosInc) { + var last = path.lastComponent; if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = { - count: last.count + 1, - added: added, - removed: removed + return { + oldPos: path.oldPos + oldPosInc, + lastComponent: { + count: last.count + 1, + added: added, + removed: removed, + previousComponent: last.previousComponent + } }; } else { - components.push({ - count: 1, - added: added, - removed: removed - }); + return { + oldPos: path.oldPos + oldPosInc, + lastComponent: { + count: 1, + added: added, + removed: removed, + previousComponent: last + } + }; } }, @@ -11170,8 +11300,8 @@ Diff.prototype = { extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { var newLen = newString.length, oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, + oldPos = basePath.oldPos, + newPos = oldPos - diagonalPath, commonCount = 0; while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { @@ -11181,13 +11311,14 @@ Diff.prototype = { } if (commonCount) { - basePath.components.push({ - count: commonCount - }); + basePath.lastComponent = { + count: commonCount, + previousComponent: basePath.lastComponent + }; } - basePath.newPos = newPos; - return oldPos; + basePath.oldPos = oldPos; + return newPos; }, /*istanbul ignore start*/ @@ -11238,7 +11369,20 @@ Diff.prototype = { } }; -function buildValues(diff, components, newString, oldString, useLongestToken) { +function buildValues(diff, lastComponent, newString, oldString, useLongestToken) { + // First we convert our linked list of components in reverse order to an + // array in the right order: + var components = []; + var nextComponent; + + while (lastComponent) { + components.push(lastComponent); + nextComponent = lastComponent.previousComponent; + delete lastComponent.previousComponent; + lastComponent = nextComponent; + } + + components.reverse(); var componentPos = 0, componentLen = components.length, newPos = 0, @@ -11281,23 +11425,16 @@ function buildValues(diff, components, newString, oldString, useLongestToken) { // This is only available for string mode. - var lastComponent = components[componentLen - 1]; + var finalComponent = components[componentLen - 1]; - if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { - components[componentLen - 2].value += lastComponent.value; + if (componentLen > 1 && typeof finalComponent.value === 'string' && (finalComponent.added || finalComponent.removed) && diff.equals('', finalComponent.value)) { + components[componentLen - 2].value += finalComponent.value; components.pop(); } return components; } - -function clonePath(path) { - return { - newPos: path.newPos, - components: path.components.slice(0) - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJiZXN0UGF0aCIsIm5ld1BvcyIsImNvbXBvbmVudHMiLCJvbGRQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJiYXNlUGF0aCIsImFkZFBhdGgiLCJyZW1vdmVQYXRoIiwiY2FuQWRkIiwiY2FuUmVtb3ZlIiwiY2xvbmVQYXRoIiwicHVzaENvbXBvbmVudCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsImFkZGVkIiwicmVtb3ZlZCIsImxhc3QiLCJwdXNoIiwiY29tbW9uQ291bnQiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjb21wYXJhdG9yIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiYXJyYXkiLCJpIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBvbmVudCIsInNsaWNlIiwibWFwIiwib2xkVmFsdWUiLCJ0bXAiLCJsYXN0Q29tcG9uZW50IiwicG9wIiwicGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsSUFBSSxDQUFDQyxTQUFMLEdBQWlCO0FBQUE7O0FBQUE7QUFDZkMsRUFBQUEsSUFEZSxnQkFDVkMsU0FEVSxFQUNDQyxTQURELEVBQzBCO0FBQUE7QUFB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R0FBMkJNLEdBQTNCO0FBQ0Q7QUFDRjtBQUNGLEdBdkMyRSxDQXlDNUU7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQyxhQUFhLEdBQUd4QyxVQUFVLENBQUNrQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBOUI7O0FBQ0EsTUFBSUEsWUFBWSxHQUFHLENBQWYsSUFDRyxPQUFPTSxhQUFhLENBQUN2RCxLQUFyQixLQUErQixRQURsQyxLQUVJdUQsYUFBYSxDQUFDdEIsS0FBZCxJQUF1QnNCLGFBQWEsQ0FBQ3JCLE9BRnpDLEtBR0d6QyxJQUFJLENBQUM2QyxNQUFMLENBQVksRUFBWixFQUFnQmlCLGFBQWEsQ0FBQ3ZELEtBQTlCLENBSFAsRUFHNkM7QUFDM0NlLElBQUFBLFVBQVUsQ0FBQ2tDLFlBQVksR0FBRyxDQUFoQixDQUFWLENBQTZCakQsS0FBN0IsSUFBc0N1RCxhQUFhLENBQUN2RCxLQUFwRDtBQUNBZSxJQUFBQSxVQUFVLENBQUN5QyxHQUFYO0FBQ0Q7O0FBRUQsU0FBT3pDLFVBQVA7QUFDRDs7QUFFRCxTQUFTWSxTQUFULENBQW1COEIsSUFBbkIsRUFBeUI7QUFDdkIsU0FBTztBQUFFM0MsSUFBQUEsTUFBTSxFQUFFMkMsSUFBSSxDQUFDM0MsTUFBZjtBQUF1QkMsSUFBQUEsVUFBVSxFQUFFMEMsSUFBSSxDQUFDMUMsVUFBTCxDQUFnQm9DLEtBQWhCLENBQXNCLENBQXRCO0FBQW5DLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBuZXdQb3M6IC0xLCBjb21wb25lbnRzOiBbXSB9XTtcblxuICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbGV0IG9sZFBvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICByZXR1cm4gZG9uZShbe3ZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGh9XSk7XG4gICAgfVxuXG4gICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgbGV0IGJhc2VQYXRoO1xuICAgICAgICBsZXQgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gb2xkUG9zICYmIG9sZFBvcyA8IG9sZExlbjtcbiAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcbiAgICAgICAgaWYgKCFjYW5BZGQgfHwgKGNhblJlbW92ZSAmJiBhZGRQYXRoLm5ld1BvcyA8IHJlbW92ZVBhdGgubmV3UG9zKSkge1xuICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGguY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyYWNrIHRoaXMgcGF0aCBhcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZGl0TGVuZ3RoKys7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICBsZXQgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHVzaENvbXBvbmVudChjb21wb25lbnRzLCBhZGRlZCwgcmVtb3ZlZCkge1xuICAgIGxldCBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSBoZXJlIGFzIHRoZSBjb21wb25lbnQgY2xvbmUgb3BlcmF0aW9uIGlzIGp1c3RcbiAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXSA9IHtjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe2NvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfSk7XG4gICAgfVxuICB9LFxuICBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1BvcyxcbiAgICAgICAgb2xkUG9zID0gbmV3UG9zIC0gZGlhZ29uYWxQYXRoLFxuXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcbiAgICB3aGlsZSAobmV3UG9zICsgMSA8IG5ld0xlbiAmJiBvbGRQb3MgKyAxIDwgb2xkTGVuICYmIHRoaXMuZXF1YWxzKG5ld1N0cmluZ1tuZXdQb3MgKyAxXSwgb2xkU3RyaW5nW29sZFBvcyArIDFdKSkge1xuICAgICAgbmV3UG9zKys7XG4gICAgICBvbGRQb3MrKztcbiAgICAgIGNvbW1vbkNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICBiYXNlUGF0aC5jb21wb25lbnRzLnB1c2goe2NvdW50OiBjb21tb25Db3VudH0pO1xuICAgIH1cblxuICAgIGJhc2VQYXRoLm5ld1BvcyA9IG5ld1BvcztcbiAgICByZXR1cm4gb2xkUG9zO1xuICB9LFxuXG4gIGVxdWFscyhsZWZ0LCByaWdodCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gICAgICAgIHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJyk7XG4gIH0sXG4gIGpvaW4oY2hhcnMpIHtcbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcbiAgbGV0IGNvbXBvbmVudFBvcyA9IDAsXG4gICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgIG5ld1BvcyA9IDAsXG4gICAgICBvbGRQb3MgPSAwO1xuXG4gIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgbGV0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24odmFsdWUsIGkpIHtcbiAgICAgICAgICBsZXQgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG4gICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBDb21tb24gY2FzZVxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICBsZXQgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cbiAgbGV0IGxhc3RDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAmJiAobGFzdENvbXBvbmVudC5hZGRlZCB8fCBsYXN0Q29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGxhc3RDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICByZXR1cm4geyBuZXdQb3M6IHBhdGgubmV3UG9zLCBjb21wb25lbnRzOiBwYXRoLmNvbXBvbmVudHMuc2xpY2UoMCkgfTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJtYXhFeGVjdXRpb25UaW1lIiwidGltZW91dCIsIkluZmluaXR5IiwiYWJvcnRBZnRlclRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJiZXN0UGF0aCIsIm9sZFBvcyIsImxhc3RDb21wb25lbnQiLCJuZXdQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwibWluRGlhZ29uYWxUb0NvbnNpZGVyIiwibWF4RGlhZ29uYWxUb0NvbnNpZGVyIiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJtYXgiLCJiYXNlUGF0aCIsInJlbW92ZVBhdGgiLCJhZGRQYXRoIiwiY2FuQWRkIiwiYWRkUGF0aE5ld1BvcyIsImNhblJlbW92ZSIsImFkZFRvUGF0aCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsInBhdGgiLCJhZGRlZCIsInJlbW92ZWQiLCJvbGRQb3NJbmMiLCJsYXN0IiwicHJldmlvdXNDb21wb25lbnQiLCJjb21tb25Db3VudCIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNvbXBhcmF0b3IiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJhcnJheSIsImkiLCJwdXNoIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudHMiLCJuZXh0Q29tcG9uZW50IiwicmV2ZXJzZSIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBvbmVudCIsInNsaWNlIiwibWFwIiwib2xkVmFsdWUiLCJ0bXAiLCJmaW5hbENvbXBvbmVudCIsInBvcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsSUFBSSxDQUFDQyxTQUFMLEdBQWlCO0FBQUE7O0FBQUE7QUFDZkMsRUFBQUEsSUFEZSxnQkFDVkMsU0FEVSxFQUNDQyxTQURELEVBQzBCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQWRDLElBQUFBLE9BQWMsdUVBQUosRUFBSTtBQUN2QyxRQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQ0MsUUFBdkI7O0FBQ0EsUUFBSSxPQUFPRCxPQUFQLEtBQW1CLFVBQXZCLEVBQW1DO0FBQ2pDQyxNQUFBQSxRQUFRLEdBQUdELE9BQVg7QUFDQUEsTUFBQUEsT0FBTyxHQUFHLEVBQVY7QUFDRDs7QUFDRCxTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFFQSxRQUFJRSxJQUFJLEdBQUcsSUFBWDs7QUFFQSxhQUFTQyxJQUFULENBQWNDLEtBQWQsRUFBcUI7QUFDbkIsVUFBSUgsUUFBSixFQUFjO0FBQ1pJLFFBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQUVKLFVBQUFBLFFBQVEsQ0FBQ0ssU0FBRCxFQUFZRixLQUFaLENBQVI7QUFBNkIsU0FBM0MsRUFBNkMsQ0FBN0MsQ0FBVjtBQUNBLGVBQU8sSUFBUDtBQUNELE9BSEQsTUFHTztBQUNMLGVBQU9BLEtBQVA7QUFDRDtBQUNGLEtBakJzQyxDQW1CdkM7OztBQUNBTixJQUFBQSxTQUFTLEdBQUcsS0FBS1MsU0FBTCxDQUFlVCxTQUFmLENBQVo7QUFDQUMsSUFBQUEsU0FBUyxHQUFHLEtBQUtRLFNBQUwsQ0FBZVIsU0FBZixDQUFaO0FBRUFELElBQUFBLFNBQVMsR0FBRyxLQUFLVSxXQUFMLENBQWlCLEtBQUtDLFFBQUwsQ0FBY1gsU0FBZCxDQUFqQixDQUFaO0FBQ0FDLElBQUFBLFNBQVMsR0FBRyxLQUFLUyxXQUFMLENBQWlCLEtBQUtDLFFBQUwsQ0FBY1YsU0FBZCxDQUFqQixDQUFaO0FBRUEsUUFBSVcsTUFBTSxHQUFHWCxTQUFTLENBQUNZLE1BQXZCO0FBQUEsUUFBK0JDLE1BQU0sR0FBR2QsU0FBUyxDQUFDYSxNQUFsRDtBQUNBLFFBQUlFLFVBQVUsR0FBRyxDQUFqQjtBQUNBLFFBQUlDLGFBQWEsR0FBR0osTUFBTSxHQUFHRSxNQUE3Qjs7QUFDQSxRQUFHWixPQUFPLENBQUNjLGFBQVgsRUFBMEI7QUFDeEJBLE1BQUFBLGFBQWEsR0FBR0MsSUFBSSxDQUFDQyxHQUFMLENBQVNGLGFBQVQsRUFBd0JkLE9BQU8sQ0FBQ2MsYUFBaEMsQ0FBaEI7QUFDRDs7QUFDRCxRQUFNRyxnQkFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBR2pCLElBQUFBLE9BQU8sQ0FBQ2tCLE9BQVgsK0RBQXNCQyxRQUE1QztBQUNBLFFBQU1DLG1CQUFtQixHQUFHQyxJQUFJLENBQUNDLEdBQUwsS0FBYUwsZ0JBQXpDO0FBRUEsUUFBSU0sUUFBUSxHQUFHLENBQUM7QUFBRUMsTUFBQUEsTUFBTSxFQUFFLENBQUMsQ0FBWDtBQUFjQyxNQUFBQSxhQUFhLEVBQUVuQjtBQUE3QixLQUFELENBQWYsQ0FuQ3VDLENBcUN2Qzs7QUFDQSxRQUFJb0IsTUFBTSxHQUFHLEtBQUtDLGFBQUwsQ0FBbUJKLFFBQVEsQ0FBQyxDQUFELENBQTNCLEVBQWdDeEIsU0FBaEMsRUFBMkNELFNBQTNDLEVBQXNELENBQXRELENBQWI7O0FBQ0EsUUFBSXlCLFFBQVEsQ0FBQyxDQUFELENBQVIsQ0FBWUMsTUFBWixHQUFxQixDQUFyQixJQUEwQlosTUFBMUIsSUFBb0NjLE1BQU0sR0FBRyxDQUFULElBQWNoQixNQUF0RCxFQUE4RDtBQUM1RDtBQUNBLGFBQU9QLElBQUksQ0FBQyxDQUFDO0FBQUNDLFFBQUFBLEtBQUssRUFBRSxLQUFLd0IsSUFBTCxDQUFVN0IsU0FBVixDQUFSO0FBQThCOEIsUUFBQUEsS0FBSyxFQUFFOUIsU0FBUyxDQUFDWTtBQUEvQyxPQUFELENBQUQsQ0FBWDtBQUNELEtBMUNzQyxDQTRDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsUUFBSW1CLHFCQUFxQixHQUFHLENBQUNYLFFBQTdCO0FBQUEsUUFBdUNZLHFCQUFxQixHQUFHWixRQUEvRCxDQTdEdUMsQ0ErRHZDOztBQUNBLGFBQVNhLGNBQVQsR0FBMEI7QUFDeEIsV0FDRSxJQUFJQyxZQUFZLEdBQUdsQixJQUFJLENBQUNtQixHQUFMLENBQVNKLHFCQUFULEVBQWdDLENBQUNqQixVQUFqQyxDQURyQixFQUVFb0IsWUFBWSxJQUFJbEIsSUFBSSxDQUFDQyxHQUFMLENBQVNlLHFCQUFULEVBQWdDbEIsVUFBaEMsQ0FGbEIsRUFHRW9CLFlBQVksSUFBSSxDQUhsQixFQUlFO0FBQ0EsWUFBSUUsUUFBUTtBQUFBO0FBQUE7QUFBWjtBQUFBO0FBQ0EsWUFBSUMsVUFBVSxHQUFHYixRQUFRLENBQUNVLFlBQVksR0FBRyxDQUFoQixDQUF6QjtBQUFBLFlBQ0lJLE9BQU8sR0FBR2QsUUFBUSxDQUFDVSxZQUFZLEdBQUcsQ0FBaEIsQ0FEdEI7O0FBRUEsWUFBSUcsVUFBSixFQUFnQjtBQUNkO0FBQ0FiLFVBQUFBLFFBQVEsQ0FBQ1UsWUFBWSxHQUFHLENBQWhCLENBQVIsR0FBNkIzQixTQUE3QjtBQUNEOztBQUVELFlBQUlnQyxNQUFNLEdBQUcsS0FBYjs7QUFDQSxZQUFJRCxPQUFKLEVBQWE7QUFDWDtBQUNBLGNBQU1FLGFBQWEsR0FBR0YsT0FBTyxDQUFDYixNQUFSLEdBQWlCUyxZQUF2QztBQUNBSyxVQUFBQSxNQUFNLEdBQUdELE9BQU8sSUFBSSxLQUFLRSxhQUFoQixJQUFpQ0EsYUFBYSxHQUFHN0IsTUFBMUQ7QUFDRDs7QUFFRCxZQUFJOEIsU0FBUyxHQUFHSixVQUFVLElBQUlBLFVBQVUsQ0FBQ1osTUFBWCxHQUFvQixDQUFwQixHQUF3QlosTUFBdEQ7O0FBQ0EsWUFBSSxDQUFDMEIsTUFBRCxJQUFXLENBQUNFLFNBQWhCLEVBQTJCO0FBQ3pCO0FBQ0FqQixVQUFBQSxRQUFRLENBQUNVLFlBQUQsQ0FBUixHQUF5QjNCLFNBQXpCO0FBQ0E7QUFDRCxTQXJCRCxDQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxZQUFJLENBQUNrQyxTQUFELElBQWVGLE1BQU0sSUFBSUYsVUFBVSxDQUFDWixNQUFYLEdBQW9CLENBQXBCLEdBQXdCYSxPQUFPLENBQUNiLE1BQTdELEVBQXNFO0FBQ3BFVyxVQUFBQSxRQUFRLEdBQUdqQyxJQUFJLENBQUN1QyxTQUFMLENBQWVKLE9BQWYsRUFBd0IsSUFBeEIsRUFBOEIvQixTQUE5QixFQUF5QyxDQUF6QyxDQUFYO0FBQ0QsU0FGRCxNQUVPO0FBQ0w2QixVQUFBQSxRQUFRLEdBQUdqQyxJQUFJLENBQUN1QyxTQUFMLENBQWVMLFVBQWYsRUFBMkI5QixTQUEzQixFQUFzQyxJQUF0QyxFQUE0QyxDQUE1QyxDQUFYO0FBQ0Q7O0FBRURvQixRQUFBQSxNQUFNLEdBQUd4QixJQUFJLENBQUN5QixhQUFMLENBQW1CUSxRQUFuQixFQUE2QnBDLFNBQTdCLEVBQXdDRCxTQUF4QyxFQUFtRG1DLFlBQW5ELENBQVQ7O0FBRUEsWUFBSUUsUUFBUSxDQUFDWCxNQUFULEdBQWtCLENBQWxCLElBQXVCWixNQUF2QixJQUFpQ2MsTUFBTSxHQUFHLENBQVQsSUFBY2hCLE1BQW5ELEVBQTJEO0FBQ3pEO0FBQ0EsaUJBQU9QLElBQUksQ0FBQ3VDLFdBQVcsQ0FBQ3hDLElBQUQsRUFBT2lDLFFBQVEsQ0FBQ1YsYUFBaEIsRUFBK0IxQixTQUEvQixFQUEwQ0QsU0FBMUMsRUFBcURJLElBQUksQ0FBQ3lDLGVBQTFELENBQVosQ0FBWDtBQUNELFNBSEQsTUFHTztBQUNMcEIsVUFBQUEsUUFBUSxDQUFDVSxZQUFELENBQVIsR0FBeUJFLFFBQXpCOztBQUNBLGNBQUlBLFFBQVEsQ0FBQ1gsTUFBVCxHQUFrQixDQUFsQixJQUF1QlosTUFBM0IsRUFBbUM7QUFDakNtQixZQUFBQSxxQkFBcUIsR0FBR2hCLElBQUksQ0FBQ0MsR0FBTCxDQUFTZSxxQkFBVCxFQUFnQ0UsWUFBWSxHQUFHLENBQS9DLENBQXhCO0FBQ0Q7O0FBQ0QsY0FBSVAsTUFBTSxHQUFHLENBQVQsSUFBY2hCLE1BQWxCLEVBQTBCO0FBQ3hCb0IsWUFBQUEscUJBQXFCLEdBQUdmLElBQUksQ0FBQ21CLEdBQUwsQ0FBU0oscUJBQVQsRUFBZ0NHLFlBQVksR0FBRyxDQUEvQyxDQUF4QjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRHBCLE1BQUFBLFVBQVU7QUFDWCxLQXhIc0MsQ0EwSHZDO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxRQUFJWixRQUFKLEVBQWM7QUFDWCxnQkFBUzJDLElBQVQsR0FBZ0I7QUFDZnZDLFFBQUFBLFVBQVUsQ0FBQyxZQUFXO0FBQ3BCLGNBQUlRLFVBQVUsR0FBR0MsYUFBYixJQUE4Qk8sSUFBSSxDQUFDQyxHQUFMLEtBQWFGLG1CQUEvQyxFQUFvRTtBQUNsRSxtQkFBT25CLFFBQVEsRUFBZjtBQUNEOztBQUVELGNBQUksQ0FBQytCLGNBQWMsRUFBbkIsRUFBdUI7QUFDckJZLFlBQUFBLElBQUk7QUFDTDtBQUNGLFNBUlMsRUFRUCxDQVJPLENBQVY7QUFTRCxPQVZBLEdBQUQ7QUFXRCxLQVpELE1BWU87QUFDTCxhQUFPL0IsVUFBVSxJQUFJQyxhQUFkLElBQStCTyxJQUFJLENBQUNDLEdBQUwsTUFBY0YsbUJBQXBELEVBQXlFO0FBQ3ZFLFlBQUl5QixHQUFHLEdBQUdiLGNBQWMsRUFBeEI7O0FBQ0EsWUFBSWEsR0FBSixFQUFTO0FBQ1AsaUJBQU9BLEdBQVA7QUFDRDtBQUNGO0FBQ0Y7QUFDRixHQW5KYzs7QUFBQTs7QUFBQTtBQXFKZkosRUFBQUEsU0FySmUscUJBcUpMSyxJQXJKSyxFQXFKQ0MsS0FySkQsRUFxSlFDLE9BckpSLEVBcUppQkMsU0FySmpCLEVBcUo0QjtBQUN6QyxRQUFJQyxJQUFJLEdBQUdKLElBQUksQ0FBQ3JCLGFBQWhCOztBQUNBLFFBQUl5QixJQUFJLElBQUlBLElBQUksQ0FBQ0gsS0FBTCxLQUFlQSxLQUF2QixJQUFnQ0csSUFBSSxDQUFDRixPQUFMLEtBQWlCQSxPQUFyRCxFQUE4RDtBQUM1RCxhQUFPO0FBQ0x4QixRQUFBQSxNQUFNLEVBQUVzQixJQUFJLENBQUN0QixNQUFMLEdBQWN5QixTQURqQjtBQUVMeEIsUUFBQUEsYUFBYSxFQUFFO0FBQUNJLFVBQUFBLEtBQUssRUFBRXFCLElBQUksQ0FBQ3JCLEtBQUwsR0FBYSxDQUFyQjtBQUF3QmtCLFVBQUFBLEtBQUssRUFBRUEsS0FBL0I7QUFBc0NDLFVBQUFBLE9BQU8sRUFBRUEsT0FBL0M7QUFBd0RHLFVBQUFBLGlCQUFpQixFQUFFRCxJQUFJLENBQUNDO0FBQWhGO0FBRlYsT0FBUDtBQUlELEtBTEQsTUFLTztBQUNMLGFBQU87QUFDTDNCLFFBQUFBLE1BQU0sRUFBRXNCLElBQUksQ0FBQ3RCLE1BQUwsR0FBY3lCLFNBRGpCO0FBRUx4QixRQUFBQSxhQUFhLEVBQUU7QUFBQ0ksVUFBQUEsS0FBSyxFQUFFLENBQVI7QUFBV2tCLFVBQUFBLEtBQUssRUFBRUEsS0FBbEI7QUFBeUJDLFVBQUFBLE9BQU8sRUFBRUEsT0FBbEM7QUFBMkNHLFVBQUFBLGlCQUFpQixFQUFFRDtBQUE5RDtBQUZWLE9BQVA7QUFJRDtBQUNGLEdBbEtjOztBQUFBOztBQUFBO0FBbUtmdkIsRUFBQUEsYUFuS2UseUJBbUtEUSxRQW5LQyxFQW1LU3BDLFNBbktULEVBbUtvQkQsU0FuS3BCLEVBbUsrQm1DLFlBbksvQixFQW1LNkM7QUFDMUQsUUFBSXZCLE1BQU0sR0FBR1gsU0FBUyxDQUFDWSxNQUF2QjtBQUFBLFFBQ0lDLE1BQU0sR0FBR2QsU0FBUyxDQUFDYSxNQUR2QjtBQUFBLFFBRUlhLE1BQU0sR0FBR1csUUFBUSxDQUFDWCxNQUZ0QjtBQUFBLFFBR0lFLE1BQU0sR0FBR0YsTUFBTSxHQUFHUyxZQUh0QjtBQUFBLFFBS0ltQixXQUFXLEdBQUcsQ0FMbEI7O0FBTUEsV0FBTzFCLE1BQU0sR0FBRyxDQUFULEdBQWFoQixNQUFiLElBQXVCYyxNQUFNLEdBQUcsQ0FBVCxHQUFhWixNQUFwQyxJQUE4QyxLQUFLeUMsTUFBTCxDQUFZdEQsU0FBUyxDQUFDMkIsTUFBTSxHQUFHLENBQVYsQ0FBckIsRUFBbUM1QixTQUFTLENBQUMwQixNQUFNLEdBQUcsQ0FBVixDQUE1QyxDQUFyRCxFQUFnSDtBQUM5R0UsTUFBQUEsTUFBTTtBQUNORixNQUFBQSxNQUFNO0FBQ040QixNQUFBQSxXQUFXO0FBQ1o7O0FBRUQsUUFBSUEsV0FBSixFQUFpQjtBQUNmakIsTUFBQUEsUUFBUSxDQUFDVixhQUFULEdBQXlCO0FBQUNJLFFBQUFBLEtBQUssRUFBRXVCLFdBQVI7QUFBcUJELFFBQUFBLGlCQUFpQixFQUFFaEIsUUFBUSxDQUFDVjtBQUFqRCxPQUF6QjtBQUNEOztBQUVEVSxJQUFBQSxRQUFRLENBQUNYLE1BQVQsR0FBa0JBLE1BQWxCO0FBQ0EsV0FBT0UsTUFBUDtBQUNELEdBdExjOztBQUFBOztBQUFBO0FBd0xmMkIsRUFBQUEsTUF4TGUsa0JBd0xSQyxJQXhMUSxFQXdMRkMsS0F4TEUsRUF3TEs7QUFDbEIsUUFBSSxLQUFLdkQsT0FBTCxDQUFhd0QsVUFBakIsRUFBNkI7QUFDM0IsYUFBTyxLQUFLeEQsT0FBTCxDQUFhd0QsVUFBYixDQUF3QkYsSUFBeEIsRUFBOEJDLEtBQTlCLENBQVA7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPRCxJQUFJLEtBQUtDLEtBQVQsSUFDRCxLQUFLdkQsT0FBTCxDQUFheUQsVUFBYixJQUEyQkgsSUFBSSxDQUFDSSxXQUFMLE9BQXVCSCxLQUFLLENBQUNHLFdBQU4sRUFEeEQ7QUFFRDtBQUNGLEdBL0xjOztBQUFBOztBQUFBO0FBZ01mbEQsRUFBQUEsV0FoTWUsdUJBZ01IbUQsS0FoTUcsRUFnTUk7QUFDakIsUUFBSWQsR0FBRyxHQUFHLEVBQVY7O0FBQ0EsU0FBSyxJQUFJZSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRCxLQUFLLENBQUNoRCxNQUExQixFQUFrQ2lELENBQUMsRUFBbkMsRUFBdUM7QUFDckMsVUFBSUQsS0FBSyxDQUFDQyxDQUFELENBQVQsRUFBYztBQUNaZixRQUFBQSxHQUFHLENBQUNnQixJQUFKLENBQVNGLEtBQUssQ0FBQ0MsQ0FBRCxDQUFkO0FBQ0Q7QUFDRjs7QUFDRCxXQUFPZixHQUFQO0FBQ0QsR0F4TWM7O0FBQUE7O0FBQUE7QUF5TWZ0QyxFQUFBQSxTQXpNZSxxQkF5TUxILEtBek1LLEVBeU1FO0FBQ2YsV0FBT0EsS0FBUDtBQUNELEdBM01jOztBQUFBOztBQUFBO0FBNE1mSyxFQUFBQSxRQTVNZSxvQkE0TU5MLEtBNU1NLEVBNE1DO0FBQ2QsV0FBT0EsS0FBSyxDQUFDMEQsS0FBTixDQUFZLEVBQVosQ0FBUDtBQUNELEdBOU1jOztBQUFBOztBQUFBO0FBK01mbEMsRUFBQUEsSUEvTWUsZ0JBK01WbUMsS0EvTVUsRUErTUg7QUFDVixXQUFPQSxLQUFLLENBQUNuQyxJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0Q7QUFqTmMsQ0FBakI7O0FBb05BLFNBQVNjLFdBQVQsQ0FBcUI3QyxJQUFyQixFQUEyQjRCLGFBQTNCLEVBQTBDMUIsU0FBMUMsRUFBcURELFNBQXJELEVBQWdFNkMsZUFBaEUsRUFBaUY7QUFDL0U7QUFDQTtBQUNBLE1BQU1xQixVQUFVLEdBQUcsRUFBbkI7QUFDQSxNQUFJQyxhQUFKOztBQUNBLFNBQU94QyxhQUFQLEVBQXNCO0FBQ3BCdUMsSUFBQUEsVUFBVSxDQUFDSCxJQUFYLENBQWdCcEMsYUFBaEI7QUFDQXdDLElBQUFBLGFBQWEsR0FBR3hDLGFBQWEsQ0FBQzBCLGlCQUE5QjtBQUNBLFdBQU8xQixhQUFhLENBQUMwQixpQkFBckI7QUFDQTFCLElBQUFBLGFBQWEsR0FBR3dDLGFBQWhCO0FBQ0Q7O0FBQ0RELEVBQUFBLFVBQVUsQ0FBQ0UsT0FBWDtBQUVBLE1BQUlDLFlBQVksR0FBRyxDQUFuQjtBQUFBLE1BQ0lDLFlBQVksR0FBR0osVUFBVSxDQUFDckQsTUFEOUI7QUFBQSxNQUVJZSxNQUFNLEdBQUcsQ0FGYjtBQUFBLE1BR0lGLE1BQU0sR0FBRyxDQUhiOztBQUtBLFNBQU8yQyxZQUFZLEdBQUdDLFlBQXRCLEVBQW9DRCxZQUFZLEVBQWhELEVBQW9EO0FBQ2xELFFBQUlFLFNBQVMsR0FBR0wsVUFBVSxDQUFDRyxZQUFELENBQTFCOztBQUNBLFFBQUksQ0FBQ0UsU0FBUyxDQUFDckIsT0FBZixFQUF3QjtBQUN0QixVQUFJLENBQUNxQixTQUFTLENBQUN0QixLQUFYLElBQW9CSixlQUF4QixFQUF5QztBQUN2QyxZQUFJdkMsS0FBSyxHQUFHTCxTQUFTLENBQUN1RSxLQUFWLENBQWdCNUMsTUFBaEIsRUFBd0JBLE1BQU0sR0FBRzJDLFNBQVMsQ0FBQ3hDLEtBQTNDLENBQVo7QUFDQXpCLFFBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDbUUsR0FBTixDQUFVLFVBQVNuRSxLQUFULEVBQWdCd0QsQ0FBaEIsRUFBbUI7QUFDbkMsY0FBSVksUUFBUSxHQUFHMUUsU0FBUyxDQUFDMEIsTUFBTSxHQUFHb0MsQ0FBVixDQUF4QjtBQUNBLGlCQUFPWSxRQUFRLENBQUM3RCxNQUFULEdBQWtCUCxLQUFLLENBQUNPLE1BQXhCLEdBQWlDNkQsUUFBakMsR0FBNENwRSxLQUFuRDtBQUNELFNBSE8sQ0FBUjtBQUtBaUUsUUFBQUEsU0FBUyxDQUFDakUsS0FBVixHQUFrQlAsSUFBSSxDQUFDK0IsSUFBTCxDQUFVeEIsS0FBVixDQUFsQjtBQUNELE9BUkQsTUFRTztBQUNMaUUsUUFBQUEsU0FBUyxDQUFDakUsS0FBVixHQUFrQlAsSUFBSSxDQUFDK0IsSUFBTCxDQUFVN0IsU0FBUyxDQUFDdUUsS0FBVixDQUFnQjVDLE1BQWhCLEVBQXdCQSxNQUFNLEdBQUcyQyxTQUFTLENBQUN4QyxLQUEzQyxDQUFWLENBQWxCO0FBQ0Q7O0FBQ0RILE1BQUFBLE1BQU0sSUFBSTJDLFNBQVMsQ0FBQ3hDLEtBQXBCLENBWnNCLENBY3RCOztBQUNBLFVBQUksQ0FBQ3dDLFNBQVMsQ0FBQ3RCLEtBQWYsRUFBc0I7QUFDcEJ2QixRQUFBQSxNQUFNLElBQUk2QyxTQUFTLENBQUN4QyxLQUFwQjtBQUNEO0FBQ0YsS0FsQkQsTUFrQk87QUFDTHdDLE1BQUFBLFNBQVMsQ0FBQ2pFLEtBQVYsR0FBa0JQLElBQUksQ0FBQytCLElBQUwsQ0FBVTlCLFNBQVMsQ0FBQ3dFLEtBQVYsQ0FBZ0I5QyxNQUFoQixFQUF3QkEsTUFBTSxHQUFHNkMsU0FBUyxDQUFDeEMsS0FBM0MsQ0FBVixDQUFsQjtBQUNBTCxNQUFBQSxNQUFNLElBQUk2QyxTQUFTLENBQUN4QyxLQUFwQixDQUZLLENBSUw7QUFDQTtBQUNBOztBQUNBLFVBQUlzQyxZQUFZLElBQUlILFVBQVUsQ0FBQ0csWUFBWSxHQUFHLENBQWhCLENBQVYsQ0FBNkJwQixLQUFqRCxFQUF3RDtBQUN0RCxZQUFJMEIsR0FBRyxHQUFHVCxVQUFVLENBQUNHLFlBQVksR0FBRyxDQUFoQixDQUFwQjtBQUNBSCxRQUFBQSxVQUFVLENBQUNHLFlBQVksR0FBRyxDQUFoQixDQUFWLEdBQStCSCxVQUFVLENBQUNHLFlBQUQsQ0FBekM7QUFDQUgsUUFBQUEsVUFBVSxDQUFDRyxZQUFELENBQVYsR0FBMkJNLEdBQTNCO0FBQ0Q7QUFDRjtBQUNGLEdBbkQ4RSxDQXFEL0U7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQyxjQUFjLEdBQUdWLFVBQVUsQ0FBQ0ksWUFBWSxHQUFHLENBQWhCLENBQS9COztBQUNBLE1BQUlBLFlBQVksR0FBRyxDQUFmLElBQ0csT0FBT00sY0FBYyxDQUFDdEUsS0FBdEIsS0FBZ0MsUUFEbkMsS0FFSXNFLGNBQWMsQ0FBQzNCLEtBQWYsSUFBd0IyQixjQUFjLENBQUMxQixPQUYzQyxLQUdHbkQsSUFBSSxDQUFDd0QsTUFBTCxDQUFZLEVBQVosRUFBZ0JxQixjQUFjLENBQUN0RSxLQUEvQixDQUhQLEVBRzhDO0FBQzVDNEQsSUFBQUEsVUFBVSxDQUFDSSxZQUFZLEdBQUcsQ0FBaEIsQ0FBVixDQUE2QmhFLEtBQTdCLElBQXNDc0UsY0FBYyxDQUFDdEUsS0FBckQ7QUFDQTRELElBQUFBLFVBQVUsQ0FBQ1csR0FBWDtBQUNEOztBQUVELFNBQU9YLFVBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgbWF4RXhlY3V0aW9uVGltZSA9IG9wdGlvbnMudGltZW91dCA/PyBJbmZpbml0eTtcbiAgICBjb25zdCBhYm9ydEFmdGVyVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIG1heEV4ZWN1dGlvblRpbWU7XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBvbGRQb3M6IC0xLCBsYXN0Q29tcG9uZW50OiB1bmRlZmluZWQgfV07XG5cbiAgICAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgIGxldCBuZXdQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmVzdFBhdGhbMF0sIG5ld1N0cmluZywgb2xkU3RyaW5nLCAwKTtcbiAgICBpZiAoYmVzdFBhdGhbMF0ub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgcmV0dXJuIGRvbmUoW3t2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksIGNvdW50OiBuZXdTdHJpbmcubGVuZ3RofV0pO1xuICAgIH1cblxuICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBlZGl0IGdyYXBoIG9uIHNvbWUgZGlhZ29uYWwgaywgd2UgY2FuXG4gICAgLy8gZGVmaW5pdGVseSByZWFjaCB0aGUgZW5kIG9mIHRoZSBlZGl0IGdyYXBoIGluIG5vIG1vcmUgdGhhbiBrIGVkaXRzLCBzb1xuICAgIC8vIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY29uc2lkZXJpbmcgYW55IG1vdmVzIHRvIGRpYWdvbmFsIGsrMSBhbnkgbW9yZSAoZnJvbVxuICAgIC8vIHdoaWNoIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbmVlZCBhdCBsZWFzdCBrKzEgbW9yZSBlZGl0cykuXG4gICAgLy8gU2ltaWxhcmx5LCBvbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdCBncmFwaCwgdGhlcmUncyBub1xuICAgIC8vIHBvaW50IGNvbnNpZGVyaW5nIG1vdmVzIHRvIGxvd2VyIGRpYWdvbmFscy5cbiAgICAvLyBXZSByZWNvcmQgdGhpcyBmYWN0IGJ5IHNldHRpbmcgbWluRGlhZ29uYWxUb0NvbnNpZGVyIGFuZFxuICAgIC8vIG1heERpYWdvbmFsVG9Db25zaWRlciB0byBzb21lIGZpbml0ZSB2YWx1ZSBvbmNlIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZlxuICAgIC8vIHRoZSBlZGl0IGdyYXBoLlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIG5vdCBmYWl0aGZ1bCB0byB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHByZXNlbnRlZCBpblxuICAgIC8vIE15ZXJzJ3MgcGFwZXIsIHdoaWNoIGluc3RlYWQgcG9pbnRsZXNzbHkgZXh0ZW5kcyBELXBhdGhzIG9mZiB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGVkaXQgZ3JhcGggLSBzZWUgcGFnZSA3IG9mIE15ZXJzJ3MgcGFwZXIgd2hpY2ggbm90ZXMgdGhpcyBwb2ludFxuICAgIC8vIGV4cGxpY2l0bHkgYW5kIGlsbHVzdHJhdGVzIGl0IHdpdGggYSBkaWFncmFtLiBUaGlzIGhhcyBtYWpvciBwZXJmb3JtYW5jZVxuICAgIC8vIGltcGxpY2F0aW9ucyBmb3Igc29tZSBjb21tb24gc2NlbmFyaW9zLiBGb3IgaW5zdGFuY2UsIHRvIGNvbXB1dGUgYSBkaWZmXG4gICAgLy8gd2hlcmUgdGhlIG5ldyB0ZXh0IHNpbXBseSBhcHBlbmRzIGQgY2hhcmFjdGVycyBvbiB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIG9yaWdpbmFsIHRleHQgb2YgbGVuZ3RoIG4sIHRoZSB0cnVlIE15ZXJzIGFsZ29yaXRobSB3aWxsIHRha2UgTyhuK2ReMilcbiAgICAvLyB0aW1lIHdoaWxlIHRoaXMgb3B0aW1pemF0aW9uIG5lZWRzIG9ubHkgTyhuK2QpIHRpbWUuXG4gICAgbGV0IG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IC1JbmZpbml0eSwgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gSW5maW5pdHk7XG5cbiAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7XG4gICAgICAgIGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpO1xuICAgICAgICBkaWFnb25hbFBhdGggKz0gMlxuICAgICAgKSB7XG4gICAgICAgIGxldCBiYXNlUGF0aDtcbiAgICAgICAgbGV0IHJlbW92ZVBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSxcbiAgICAgICAgICAgIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXTtcbiAgICAgICAgaWYgKHJlbW92ZVBhdGgpIHtcbiAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNhbkFkZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIHdoYXQgbmV3UG9zIHdpbGwgYmUgYWZ0ZXIgd2UgZG8gYW4gaW5zZXJ0aW9uOlxuICAgICAgICAgIGNvbnN0IGFkZFBhdGhOZXdQb3MgPSBhZGRQYXRoLm9sZFBvcyAtIGRpYWdvbmFsUGF0aDtcbiAgICAgICAgICBjYW5BZGQgPSBhZGRQYXRoICYmIDAgPD0gYWRkUGF0aE5ld1BvcyAmJiBhZGRQYXRoTmV3UG9zIDwgbmV3TGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGArIDFgIGhlcmUgdG8gbWFrZSBiZWhhdmlvciBtYXRjaCBNeWVycyBhbGdvcml0aG1cbiAgICAgICAgLy8gICAgICAgYW5kIHByZWZlciB0byBvcmRlciByZW1vdmFscyBiZWZvcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgaWYgKCFjYW5SZW1vdmUgfHwgKGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyArIDEgPCBhZGRQYXRoLm9sZFBvcykpIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IHNlbGYuYWRkVG9QYXRoKGFkZFBhdGgsIHRydWUsIHVuZGVmaW5lZCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBzZWxmLmFkZFRvUGF0aChyZW1vdmVQYXRoLCB1bmRlZmluZWQsIHRydWUsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3UG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTtcblxuICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgICAgICAgIG1heERpYWdvbmFsVG9Db25zaWRlciA9IE1hdGgubWluKG1heERpYWdvbmFsVG9Db25zaWRlciwgZGlhZ29uYWxQYXRoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLCBvciB1bnRpbCB0aGUgZWRpdCBsZW5ndGggZXhjZWVkcyBvcHRpb25zLm1heEVkaXRMZW5ndGggKGlmIGdpdmVuKSxcbiAgICAvLyBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCB8fCBEYXRlLm5vdygpID4gYWJvcnRBZnRlclRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICBleGVjKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgIH0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGggJiYgRGF0ZS5ub3coKSA8PSBhYm9ydEFmdGVyVGltZXN0YW1wKSB7XG4gICAgICAgIGxldCByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhZGRUb1BhdGgocGF0aCwgYWRkZWQsIHJlbW92ZWQsIG9sZFBvc0luYykge1xuICAgIGxldCBsYXN0ID0gcGF0aC5sYXN0Q29tcG9uZW50O1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2xkUG9zOiBwYXRoLm9sZFBvcyArIG9sZFBvc0luYyxcbiAgICAgICAgbGFzdENvbXBvbmVudDoge2NvdW50OiBsYXN0LmNvdW50ICsgMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkLCBwcmV2aW91c0NvbXBvbmVudDogbGFzdC5wcmV2aW91c0NvbXBvbmVudCB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICBsYXN0Q29tcG9uZW50OiB7Y291bnQ6IDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCwgcHJldmlvdXNDb21wb25lbnQ6IGxhc3QgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkUG9zID0gYmFzZVBhdGgub2xkUG9zLFxuICAgICAgICBuZXdQb3MgPSBvbGRQb3MgLSBkaWFnb25hbFBhdGgsXG5cbiAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICBuZXdQb3MrKztcbiAgICAgIG9sZFBvcysrO1xuICAgICAgY29tbW9uQ291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY29tbW9uQ291bnQpIHtcbiAgICAgIGJhc2VQYXRoLmxhc3RDb21wb25lbnQgPSB7Y291bnQ6IGNvbW1vbkNvdW50LCBwcmV2aW91c0NvbXBvbmVudDogYmFzZVBhdGgubGFzdENvbXBvbmVudH07XG4gICAgfVxuXG4gICAgYmFzZVBhdGgub2xkUG9zID0gb2xkUG9zO1xuICAgIHJldHVybiBuZXdQb3M7XG4gIH0sXG5cbiAgZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHRcbiAgICAgICAgfHwgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlICYmIGxlZnQudG9Mb3dlckNhc2UoKSA9PT0gcmlnaHQudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmVFbXB0eShhcnJheSkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBjYXN0SW5wdXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIHRva2VuaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgfSxcbiAgam9pbihjaGFycykge1xuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgbGFzdENvbXBvbmVudCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICAvLyBGaXJzdCB3ZSBjb252ZXJ0IG91ciBsaW5rZWQgbGlzdCBvZiBjb21wb25lbnRzIGluIHJldmVyc2Ugb3JkZXIgdG8gYW5cbiAgLy8gYXJyYXkgaW4gdGhlIHJpZ2h0IG9yZGVyOlxuICBjb25zdCBjb21wb25lbnRzID0gW107XG4gIGxldCBuZXh0Q29tcG9uZW50O1xuICB3aGlsZSAobGFzdENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudHMucHVzaChsYXN0Q29tcG9uZW50KTtcbiAgICBuZXh0Q29tcG9uZW50ID0gbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBkZWxldGUgbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBsYXN0Q29tcG9uZW50ID0gbmV4dENvbXBvbmVudDtcbiAgfVxuICBjb21wb25lbnRzLnJldmVyc2UoKTtcblxuICBsZXQgY29tcG9uZW50UG9zID0gMCxcbiAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuICAgICAgbmV3UG9zID0gMCxcbiAgICAgIG9sZFBvcyA9IDA7XG5cbiAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkICYmIHVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICBsZXQgdmFsdWUgPSBuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbih2YWx1ZSwgaSkge1xuICAgICAgICAgIGxldCBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIH1cbiAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7XG5cbiAgICAgIC8vIENvbW1vbiBjYXNlXG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCkge1xuICAgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4ob2xkU3RyaW5nLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBSZXZlcnNlIGFkZCBhbmQgcmVtb3ZlIHNvIHJlbW92ZXMgYXJlIG91dHB1dCBmaXJzdCB0byBtYXRjaCBjb21tb24gY29udmVudGlvblxuICAgICAgLy8gVGhlIGRpZmZpbmcgYWxnb3JpdGhtIGlzIHRpZWQgdG8gYWRkIHRoZW4gcmVtb3ZlIG91dHB1dCBhbmQgdGhpcyBpcyB0aGUgc2ltcGxlc3RcbiAgICAgIC8vIHJvdXRlIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgd2l0aCBtaW5pbWFsIG92ZXJoZWFkLlxuICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG4gICAgICAgIGxldCB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsZSBmb3Igd2hlbiBvbmUgdGVybWluYWwgaXMgaWdub3JlZCAoaS5lLiB3aGl0ZXNwYWNlKS5cbiAgLy8gRm9yIHRoaXMgY2FzZSB3ZSBtZXJnZSB0aGUgdGVybWluYWwgaW50byB0aGUgcHJpb3Igc3RyaW5nIGFuZCBkcm9wIHRoZSBjaGFuZ2UuXG4gIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuICBsZXQgZmluYWxDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGZpbmFsQ29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgJiYgKGZpbmFsQ29tcG9uZW50LmFkZGVkIHx8IGZpbmFsQ29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgZmluYWxDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBmaW5hbENvbXBvbmVudC52YWx1ZTtcbiAgICBjb21wb25lbnRzLnBvcCgpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0= /***/ }), @@ -11612,6 +11749,11 @@ exports.lineDiff = lineDiff; /*istanbul ignore end*/ lineDiff.tokenize = function (value) { + if (this.options.stripTrailingCr) { + // remove one \r before \n to match GNU diff's --strip-trailing-cr behavior + value = value.replace(/\r\n/g, '\n'); + } + var retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line @@ -11659,7 +11801,7 @@ function diffTrimmedLines(oldStr, newStr, callback) { }); return lineDiff.diff(oldStr, newStr, options); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJkaWZmTGluZXMiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiLCJkaWZmVHJpbW1lZExpbmVzIiwiZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFqQjs7Ozs7O0FBQ1BELFFBQVEsQ0FBQ0UsUUFBVCxHQUFvQixVQUFTQyxLQUFULEVBQWdCO0FBQ2xDLE1BQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsTUFDSUMsZ0JBQWdCLEdBQUdGLEtBQUssQ0FBQ0csS0FBTixDQUFZLFdBQVosQ0FEdkIsQ0FEa0MsQ0FJbEM7O0FBQ0EsTUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUNFLE1BQWpCLEdBQTBCLENBQTNCLENBQXJCLEVBQW9EO0FBQ2xERixJQUFBQSxnQkFBZ0IsQ0FBQ0csR0FBakI7QUFDRCxHQVBpQyxDQVNsQzs7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixnQkFBZ0IsQ0FBQ0UsTUFBckMsRUFBNkNFLENBQUMsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBSUMsSUFBSSxHQUFHTCxnQkFBZ0IsQ0FBQ0ksQ0FBRCxDQUEzQjs7QUFFQSxRQUFJQSxDQUFDLEdBQUcsQ0FBSixJQUFTLENBQUMsS0FBS0UsT0FBTCxDQUFhQyxjQUEzQixFQUEyQztBQUN6Q1IsTUFBQUEsUUFBUSxDQUFDQSxRQUFRLENBQUNHLE1BQVQsR0FBa0IsQ0FBbkIsQ0FBUixJQUFpQ0csSUFBakM7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJLEtBQUtDLE9BQUwsQ0FBYUUsZ0JBQWpCLEVBQW1DO0FBQ2pDSCxRQUFBQSxJQUFJLEdBQUdBLElBQUksQ0FBQ0ksSUFBTCxFQUFQO0FBQ0Q7O0FBQ0RWLE1BQUFBLFFBQVEsQ0FBQ1csSUFBVCxDQUFjTCxJQUFkO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPTixRQUFQO0FBQ0QsQ0F4QkQ7O0FBMEJPLFNBQVNZLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsUUFBbkMsRUFBNkM7QUFBRSxTQUFPbkIsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDs7QUFDaEcsU0FBU0UsZ0JBQVQsQ0FBMEJKLE1BQTFCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsUUFBMUMsRUFBb0Q7QUFDekQsTUFBSVIsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQVc7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2IsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QlAsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbmV4cG9ydCBjb25zdCBsaW5lRGlmZiA9IG5ldyBEaWZmKCk7XG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGxldCByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9XG5cbiAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG4gICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXRMaW5lcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7IHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICBsZXQgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhjYWxsYmFjaywge2lnbm9yZVdoaXRlc3BhY2U6IHRydWV9KTtcbiAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzdHJpcFRyYWlsaW5nQ3IiLCJyZXBsYWNlIiwicmV0TGluZXMiLCJsaW5lc0FuZE5ld2xpbmVzIiwic3BsaXQiLCJsZW5ndGgiLCJwb3AiLCJpIiwibGluZSIsIm5ld2xpbmVJc1Rva2VuIiwiaWdub3JlV2hpdGVzcGFjZSIsInRyaW0iLCJwdXNoIiwiZGlmZkxpbmVzIiwib2xkU3RyIiwibmV3U3RyIiwiY2FsbGJhY2siLCJkaWZmIiwiZGlmZlRyaW1tZWRMaW5lcyIsImdlbmVyYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O0FBRU8sSUFBTUEsUUFBUSxHQUFHO0FBQUlDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBLENBQUosRUFBakI7Ozs7OztBQUNQRCxRQUFRLENBQUNFLFFBQVQsR0FBb0IsVUFBU0MsS0FBVCxFQUFnQjtBQUNsQyxNQUFHLEtBQUtDLE9BQUwsQ0FBYUMsZUFBaEIsRUFBaUM7QUFDL0I7QUFDQUYsSUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNHLE9BQU4sQ0FBYyxPQUFkLEVBQXVCLElBQXZCLENBQVI7QUFDRDs7QUFFRCxNQUFJQyxRQUFRLEdBQUcsRUFBZjtBQUFBLE1BQ0lDLGdCQUFnQixHQUFHTCxLQUFLLENBQUNNLEtBQU4sQ0FBWSxXQUFaLENBRHZCLENBTmtDLENBU2xDOztBQUNBLE1BQUksQ0FBQ0QsZ0JBQWdCLENBQUNBLGdCQUFnQixDQUFDRSxNQUFqQixHQUEwQixDQUEzQixDQUFyQixFQUFvRDtBQUNsREYsSUFBQUEsZ0JBQWdCLENBQUNHLEdBQWpCO0FBQ0QsR0FaaUMsQ0FjbEM7OztBQUNBLE9BQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0osZ0JBQWdCLENBQUNFLE1BQXJDLEVBQTZDRSxDQUFDLEVBQTlDLEVBQWtEO0FBQ2hELFFBQUlDLElBQUksR0FBR0wsZ0JBQWdCLENBQUNJLENBQUQsQ0FBM0I7O0FBRUEsUUFBSUEsQ0FBQyxHQUFHLENBQUosSUFBUyxDQUFDLEtBQUtSLE9BQUwsQ0FBYVUsY0FBM0IsRUFBMkM7QUFDekNQLE1BQUFBLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDRyxNQUFULEdBQWtCLENBQW5CLENBQVIsSUFBaUNHLElBQWpDO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsVUFBSSxLQUFLVCxPQUFMLENBQWFXLGdCQUFqQixFQUFtQztBQUNqQ0YsUUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNHLElBQUwsRUFBUDtBQUNEOztBQUNEVCxNQUFBQSxRQUFRLENBQUNVLElBQVQsQ0FBY0osSUFBZDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT04sUUFBUDtBQUNELENBN0JEOztBQStCTyxTQUFTVyxTQUFULENBQW1CQyxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLFFBQW5DLEVBQTZDO0FBQUUsU0FBT3JCLFFBQVEsQ0FBQ3NCLElBQVQsQ0FBY0gsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJDLFFBQTlCLENBQVA7QUFBaUQ7O0FBQ2hHLFNBQVNFLGdCQUFULENBQTBCSixNQUExQixFQUFrQ0MsTUFBbEMsRUFBMENDLFFBQTFDLEVBQW9EO0FBQ3pELE1BQUlqQixPQUFPO0FBQUc7QUFBQTtBQUFBOztBQUFBb0I7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2YsUUFBUSxDQUFDc0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmhCLE9BQTlCLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge2dlbmVyYXRlT3B0aW9uc30gZnJvbSAnLi4vdXRpbC9wYXJhbXMnO1xuXG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgRGlmZigpO1xubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZih0aGlzLm9wdGlvbnMuc3RyaXBUcmFpbGluZ0NyKSB7XG4gICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIH1cblxuICBsZXQgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cbiAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgbGV0IG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiJdfQ== /***/ }), @@ -11929,6 +12071,12 @@ Object.defineProperty(exports, "merge", ({ return _merge.merge; } })); +Object.defineProperty(exports, "reversePatch", ({ + enumerable: true, + get: function get() { + return _reverse.reversePatch; + } +})); Object.defineProperty(exports, "structuredPatch", ({ enumerable: true, get: function get() { @@ -11947,6 +12095,12 @@ Object.defineProperty(exports, "createPatch", ({ return _create.createPatch; } })); +Object.defineProperty(exports, "formatPatch", ({ + enumerable: true, + get: function get() { + return _create.formatPatch; + } +})); Object.defineProperty(exports, "convertChangesToDMP", ({ enumerable: true, get: function get() { @@ -12027,6 +12181,12 @@ _merge = __nccwpck_require__(2640) /*istanbul ignore end*/ ; +var +/*istanbul ignore start*/ +_reverse = __nccwpck_require__(1794) +/*istanbul ignore end*/ +; + var /*istanbul ignore start*/ _create = __nccwpck_require__(4543) @@ -12048,7 +12208,7 @@ _xml = __nccwpck_require__(6982) /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /*istanbul ignore end*/ -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuLypcbiAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElTOlxuICogSnNEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2VcbiAqIEpzRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuICpcbiAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsIGNyZWF0ZVBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGFwcGx5UGF0Y2gsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgcGFyc2VQYXRjaCxcbiAgbWVyZ2UsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIFNlZSBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zIG9mIHVzZSAqL1xuXG4vKlxuICogVGV4dCBkaWZmIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEFQSXM6XG4gKiBEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG4gKiBEaWZmLmRpZmZMaW5lczogTGluZSBiYXNlZCBkaWZmXG4gKlxuICogRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtyZXZlcnNlUGF0Y2h9IGZyb20gJy4vcGF0Y2gvcmV2ZXJzZSc7XG5pbXBvcnQge3N0cnVjdHVyZWRQYXRjaCwgY3JlYXRlVHdvRmlsZXNQYXRjaCwgY3JlYXRlUGF0Y2gsIGZvcm1hdFBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGZvcm1hdFBhdGNoLFxuICBhcHBseVBhdGNoLFxuICBhcHBseVBhdGNoZXMsXG4gIHBhcnNlUGF0Y2gsXG4gIG1lcmdlLFxuICByZXZlcnNlUGF0Y2gsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ== /***/ }), @@ -12207,7 +12367,7 @@ function applyPatch(source, uniDiff) { var line = _hunk.lines[j], operation = line.length > 0 ? line[0] : ' ', content = line.length > 0 ? line.substr(1) : line, - delimiter = _hunk.linedelimiters[j]; + delimiter = _hunk.linedelimiters && _hunk.linedelimiters[j] || '\n'; if (operation === ' ') { _toPos++; @@ -12294,7 +12454,7 @@ function applyPatches(uniDiff, options) { processIndex(); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7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QUNEOztBQUVELE1BQUlnRCxZQUFZLEdBQUcsQ0FBbkI7O0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxLQUFLLEdBQUdsRCxPQUFPLENBQUNnRCxZQUFZLEVBQWIsQ0FBbkI7O0FBQ0EsUUFBSSxDQUFDRSxLQUFMLEVBQVk7QUFDVixhQUFPakQsT0FBTyxDQUFDa0QsUUFBUixFQUFQO0FBQ0Q7O0FBRURsRCxJQUFBQSxPQUFPLENBQUNtRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFRCxVQUFJRSxjQUFjLEdBQUd6RCxVQUFVLENBQUN3RCxJQUFELEVBQU9KLEtBQVAsRUFBY2pELE9BQWQsQ0FBL0I7QUFDQUEsTUFBQUEsT0FBTyxDQUFDdUQsT0FBUixDQUFnQk4sS0FBaEIsRUFBdUJLLGNBQXZCLEVBQXVDLFVBQVNGLEdBQVQsRUFBYztBQUNuRCxZQUFJQSxHQUFKLEVBQVM7QUFDUCxpQkFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFREosUUFBQUEsWUFBWTtBQUNiLE9BTkQ7QUFPRCxLQWJEO0FBY0Q7O0FBQ0RBLEVBQUFBLFlBQVk7QUFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7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QUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFXRixPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJZ0QsWUFBWSxHQUFHLENBQW5COztBQUNBLFdBQVNDLFlBQVQsR0FBd0I7QUFDdEIsUUFBSUMsS0FBSyxHQUFHbEQsT0FBTyxDQUFDZ0QsWUFBWSxFQUFiLENBQW5COztBQUNBLFFBQUksQ0FBQ0UsS0FBTCxFQUFZO0FBQ1YsYUFBT2pELE9BQU8sQ0FBQ2tELFFBQVIsRUFBUDtBQUNEOztBQUVEbEQsSUFBQUEsT0FBTyxDQUFDbUQsUUFBUixDQUFpQkYsS0FBakIsRUFBd0IsVUFBU0csR0FBVCxFQUFjQyxJQUFkLEVBQW9CO0FBQzFDLFVBQUlELEdBQUosRUFBUztBQUNQLGVBQU9wRCxPQUFPLENBQUNrRCxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUUsY0FBYyxHQUFHekQsVUFBVSxDQUFDd0QsSUFBRCxFQUFPSixLQUFQLEVBQWNqRCxPQUFkLENBQS9CO0FBQ0FBLE1BQUFBLE9BQU8sQ0FBQ3VELE9BQVIsQ0FBZ0JOLEtBQWhCLEVBQXVCSyxjQUF2QixFQUF1QyxVQUFTRixHQUFULEVBQWM7QUFDbkQsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9wRCxPQUFPLENBQUNrRCxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRURKLFFBQUFBLFlBQVk7QUFDYixPQU5EO0FBT0QsS0FiRDtBQWNEOztBQUNEQSxFQUFBQSxZQUFZO0FBQ2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3BhcnNlUGF0Y2h9IGZyb20gJy4vcGFyc2UnO1xuaW1wb3J0IGRpc3RhbmNlSXRlcmF0b3IgZnJvbSAnLi4vdXRpbC9kaXN0YW5jZS1pdGVyYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZiwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHVuaURpZmYpKSB7XG4gICAgaWYgKHVuaURpZmYubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcHBseVBhdGNoIG9ubHkgd29ya3Mgd2l0aCBhIHNpbmdsZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICB1bmlEaWZmID0gdW5pRGlmZlswXTtcbiAgfVxuXG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBpbnB1dFxuICBsZXQgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcblxuICAgICAgY29tcGFyZUxpbmUgPSBvcHRpb25zLmNvbXBhcmVMaW5lIHx8ICgobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpID0+IGxpbmUgPT09IHBhdGNoQ29udGVudCksXG4gICAgICBlcnJvckNvdW50ID0gMCxcbiAgICAgIGZ1enpGYWN0b3IgPSBvcHRpb25zLmZ1enpGYWN0b3IgfHwgMCxcbiAgICAgIG1pbkxpbmUgPSAwLFxuICAgICAgb2Zmc2V0ID0gMCxcblxuICAgICAgcmVtb3ZlRU9GTkwsXG4gICAgICBhZGRFT0ZOTDtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGh1bmtGaXRzKGh1bmssIHRvUG9zKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBodW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBsZXQgbGluZSA9IGh1bmsubGluZXNbal0sXG4gICAgICAgICAgb3BlcmF0aW9uID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcpLFxuICAgICAgICAgIGNvbnRlbnQgPSAobGluZS5sZW5ndGggPiAwID8gbGluZS5zdWJzdHIoMSkgOiBsaW5lKTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG4gICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG9Qb3MrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIG1heExpbmUgPSBsaW5lcy5sZW5ndGggLSBodW5rLm9sZExpbmVzLFxuICAgICAgICBsb2NhbE9mZnNldCA9IDAsXG4gICAgICAgIHRvUG9zID0gb2Zmc2V0ICsgaHVuay5vbGRTdGFydCAtIDE7XG5cbiAgICBsZXQgaXRlcmF0b3IgPSBkaXN0YW5jZUl0ZXJhdG9yKHRvUG9zLCBtaW5MaW5lLCBtYXhMaW5lKTtcblxuICAgIGZvciAoOyBsb2NhbE9mZnNldCAhPT0gdW5kZWZpbmVkOyBsb2NhbE9mZnNldCA9IGl0ZXJhdG9yKCkpIHtcbiAgICAgIGlmIChodW5rRml0cyhodW5rLCB0b1BvcyArIGxvY2FsT2Zmc2V0KSkge1xuICAgICAgICBodW5rLm9mZnNldCA9IG9mZnNldCArPSBsb2NhbE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxvY2FsT2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG4gICAgbWluTGluZSA9IGh1bmsub2Zmc2V0ICsgaHVuay5vbGRTdGFydCArIGh1bmsub2xkTGluZXM7XG4gIH1cblxuICAvLyBBcHBseSBwYXRjaCBodW5rc1xuICBsZXQgZGlmZk9mZnNldCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICB0b1BvcyA9IGh1bmsub2xkU3RhcnQgKyBodW5rLm9mZnNldCArIGRpZmZPZmZzZXQgLSAxO1xuICAgIGRpZmZPZmZzZXQgKz0gaHVuay5uZXdMaW5lcyAtIGh1bmsub2xkTGluZXM7XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpLFxuICAgICAgICAgIGRlbGltaXRlciA9IGh1bmsubGluZWRlbGltaXRlcnMgJiYgaHVuay5saW5lZGVsaW1pdGVyc1tqXSB8fCAnXFxuJztcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 /***/ }), @@ -12537,6 +12697,10 @@ function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, ne } function formatPatch(diff) { + if (Array.isArray(diff)) { + return diff.map(formatPatch).join('\n'); + } + var ret = []; if (diff.oldFileName == diff.newFileName) { @@ -12574,7 +12738,7 @@ function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsInJldCIsImFwcGx5Iiwiam9pbiIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtBQTJCLFdBQS9CLEVBQTRDO0FB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IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJyZXQiLCJhcHBseSIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtB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QUNuRixTQUFPNEMsbUJBQW1CLENBQUNFLFFBQUQsRUFBV0EsUUFBWCxFQUFxQmxELE1BQXJCLEVBQTZCQyxNQUE3QixFQUFxQ0MsU0FBckMsRUFBZ0RDLFNBQWhELEVBQTJEQyxPQUEzRCxDQUExQjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRpZmYpKSB7XG4gICAgcmV0dXJuIGRpZmYubWFwKGZvcm1hdFBhdGNoKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ== /***/ }), @@ -13373,6 +13537,77 @@ function parsePatch(uniDiff) { //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJO0FBQ2hELE1BQUlDLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLFVBQVUsR0FBR0osT0FBTyxDQUFDSyxLQUFSLENBQWMsc0JBQWQsS0FBeUMsRUFEMUQ7QUFBQSxNQUVJQyxJQUFJLEdBQUcsRUFGWDtBQUFBLE1BR0lDLENBQUMsR0FBRyxDQUhSOztBQUtBLFdBQVNDLFVBQVQsR0FBc0I7QUFDcEIsUUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQUgsSUFBQUEsSUFBSSxDQUFDSSxJQUFMLENBQVVELEtBQVYsRUFGb0IsQ0FJcEI7O0FB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QUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLE1BQUFBLElBQUksQ0FBQ0ksUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsSUFBSSxDQUFDRSxRQUFMLEtBQWtCLENBQXRDLEVBQXlDO0FBQ3ZDRixNQUFBQSxJQUFJLENBQUNFLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRCxLQTVEa0IsQ0E4RG5COzs7QUFDQSxRQUFJbEMsT0FBTyxDQUFDa0IsTUFBWixFQUFvQjtBQUNsQixVQUFJcUIsUUFBUSxLQUFLUCxJQUFJLENBQUNJLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSWpCLEtBQUosQ0FBVSxzREFBc0RVLGdCQUFnQixHQUFHLENBQXpFLENBQVYsQ0FBTjtBQUNEOztBQUNELFVBQUlXLFdBQVcsS0FBS1IsSUFBSSxDQUFDRSxRQUF6QixFQUFtQztBQUNqQyxjQUFNLElBQUlmLEtBQUosQ0FBVSx3REFBd0RVLGdCQUFnQixHQUFHLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekJILElBQUFBLFVBQVU7QUFDWDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvKS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmIGluZGV4XG4gICAgICBsZXQgaGVhZGVyID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLykuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuICAgIC8vIFBhcnNlIGh1bmtzXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKCgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8pLnRlc3QobGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKCgvXkBALykudGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKCgvXlwiLipcIiQvKS50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIH1cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIGxldCBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcblxuICAgIGxldCBodW5rID0ge1xuICAgICAgb2xkU3RhcnQ6ICtjaHVua0hlYWRlclsxXSxcbiAgICAgIG9sZExpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbMl0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlclsyXSxcbiAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG4gICAgICBuZXdMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzRdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbNF0sXG4gICAgICBsaW5lczogW10sXG4gICAgICBsaW5lZGVsaW1pdGVyczogW11cbiAgICB9O1xuXG4gICAgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBsZXQgYWRkQ291bnQgPSAwLFxuICAgICAgICByZW1vdmVDb3VudCA9IDA7XG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwXG4gICAgICAgICAgICAmJiAoaSArIDIgPCBkaWZmc3RyLmxlbmd0aClcbiAgICAgICAgICAgICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMFxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IG9wZXJhdGlvbiA9IChkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gKGRpZmZzdHIubGVuZ3RoIC0gMSkpID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaHVuaztcbiAgfVxuXG4gIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICBwYXJzZUluZGV4KCk7XG4gIH1cblxuICByZXR1cm4gbGlzdDtcbn1cbiJdfQ== +/***/ }), + +/***/ 1794: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; +/*istanbul ignore start*/ + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.reversePatch = reversePatch; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/*istanbul ignore end*/ +function reversePatch(structuredPatch) { + if (Array.isArray(structuredPatch)) { + return structuredPatch.map(reversePatch).reverse(); + } + + return ( + /*istanbul ignore start*/ + _objectSpread(_objectSpread({}, + /*istanbul ignore end*/ + structuredPatch), {}, { + oldFileName: structuredPatch.newFileName, + oldHeader: structuredPatch.newHeader, + newFileName: structuredPatch.oldFileName, + newHeader: structuredPatch.oldHeader, + hunks: structuredPatch.hunks.map(function (hunk) { + return { + oldLines: hunk.newLines, + oldStart: hunk.newStart, + newLines: hunk.oldLines, + newStart: hunk.oldStart, + linedelimiters: hunk.linedelimiters, + lines: hunk.lines.map(function (l) { + if (l.startsWith('-')) { + return ( + /*istanbul ignore start*/ + "+".concat( + /*istanbul ignore end*/ + l.slice(1)) + ); + } + + if (l.startsWith('+')) { + return ( + /*istanbul ignore start*/ + "-".concat( + /*istanbul ignore end*/ + l.slice(1)) + ); + } + + return l; + }) + }; + }) + }) + ); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9yZXZlcnNlLmpzIl0sIm5hbWVzIjpbInJldmVyc2VQYXRjaCIsInN0cnVjdHVyZWRQYXRjaCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsInJldmVyc2UiLCJvbGRGaWxlTmFtZSIsIm5ld0ZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwiaHVua3MiLCJodW5rIiwib2xkTGluZXMiLCJuZXdMaW5lcyIsIm9sZFN0YXJ0IiwibmV3U3RhcnQiLCJsaW5lZGVsaW1pdGVycyIsImxpbmVzIiwibCIsInN0YXJ0c1dpdGgiLCJzbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sU0FBU0EsWUFBVCxDQUFzQkMsZUFBdEIsRUFBdUM7QUFDNUMsTUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNGLGVBQWQsQ0FBSixFQUFvQztBQUNsQyxXQUFPQSxlQUFlLENBQUNHLEdBQWhCLENBQW9CSixZQUFwQixFQUFrQ0ssT0FBbEMsRUFBUDtBQUNEOztBQUVEO0FBQUE7QUFBQTtBQUFBO0FBQ0tKLElBQUFBLGVBREw7QUFFRUssTUFBQUEsV0FBVyxFQUFFTCxlQUFlLENBQUNNLFdBRi9CO0FBR0VDLE1BQUFBLFNBQVMsRUFBRVAsZUFBZSxDQUFDUSxTQUg3QjtBQUlFRixNQUFBQSxXQUFXLEVBQUVOLGVBQWUsQ0FBQ0ssV0FKL0I7QUFLRUcsTUFBQUEsU0FBUyxFQUFFUixlQUFlLENBQUNPLFNBTDdCO0FBTUVFLE1BQUFBLEtBQUssRUFBRVQsZUFBZSxDQUFDUyxLQUFoQixDQUFzQk4sR0FBdEIsQ0FBMEIsVUFBQU8sSUFBSSxFQUFJO0FBQ3ZDLGVBQU87QUFDTEMsVUFBQUEsUUFBUSxFQUFFRCxJQUFJLENBQUNFLFFBRFY7QUFFTEMsVUFBQUEsUUFBUSxFQUFFSCxJQUFJLENBQUNJLFFBRlY7QUFHTEYsVUFBQUEsUUFBUSxFQUFFRixJQUFJLENBQUNDLFFBSFY7QUFJTEcsVUFBQUEsUUFBUSxFQUFFSixJQUFJLENBQUNHLFFBSlY7QUFLTEUsVUFBQUEsY0FBYyxFQUFFTCxJQUFJLENBQUNLLGNBTGhCO0FBTUxDLFVBQUFBLEtBQUssRUFBRU4sSUFBSSxDQUFDTSxLQUFMLENBQVdiLEdBQVgsQ0FBZSxVQUFBYyxDQUFDLEVBQUk7QUFDekIsZ0JBQUlBLENBQUMsQ0FBQ0MsVUFBRixDQUFhLEdBQWIsQ0FBSixFQUF1QjtBQUFFO0FBQUE7QUFBQTtBQUFBO0FBQVdELGdCQUFBQSxDQUFDLENBQUNFLEtBQUYsQ0FBUSxDQUFSLENBQVg7QUFBQTtBQUEwQjs7QUFDbkQsZ0JBQUlGLENBQUMsQ0FBQ0MsVUFBRixDQUFhLEdBQWIsQ0FBSixFQUF1QjtBQUFFO0FBQUE7QUFBQTtBQUFBO0FBQVdELGdCQUFBQSxDQUFDLENBQUNFLEtBQUYsQ0FBUSxDQUFSLENBQVg7QUFBQTtBQUEwQjs7QUFDbkQsbUJBQU9GLENBQVA7QUFDRCxXQUpNO0FBTkYsU0FBUDtBQVlELE9BYk07QUFOVDtBQUFBO0FBcUJEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2VQYXRjaChzdHJ1Y3R1cmVkUGF0Y2gpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RydWN0dXJlZFBhdGNoKSkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2gubWFwKHJldmVyc2VQYXRjaCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdHJ1Y3R1cmVkUGF0Y2gsXG4gICAgb2xkRmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5uZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5uZXdIZWFkZXIsXG4gICAgbmV3RmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5vbGRGaWxlTmFtZSxcbiAgICBuZXdIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5vbGRIZWFkZXIsXG4gICAgaHVua3M6IHN0cnVjdHVyZWRQYXRjaC5odW5rcy5tYXAoaHVuayA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgICAgb2xkU3RhcnQ6IGh1bmsubmV3U3RhcnQsXG4gICAgICAgIG5ld0xpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgICAgICBuZXdTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgICAgbGluZWRlbGltaXRlcnM6IGh1bmsubGluZWRlbGltaXRlcnMsXG4gICAgICAgIGxpbmVzOiBodW5rLmxpbmVzLm1hcChsID0+IHtcbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCctJykpIHsgcmV0dXJuIGArJHtsLnNsaWNlKDEpfWA7IH1cbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCcrJykpIHsgcmV0dXJuIGAtJHtsLnNsaWNlKDEpfWA7IH1cbiAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSlcbiAgfTtcbn1cbiJdfQ== + + /***/ }), /***/ 8935: @@ -13749,6 +13984,8 @@ function onceStrict (fn) { /***/ 9103: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; + var __create = Object.create; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; @@ -13772,7 +14009,6 @@ var __spreadValues = (a, b) => { return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); -var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; @@ -13783,22 +14019,19 @@ var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; -var __reExport = (target, module2, copyDefault, desc) => { - if (module2 && typeof module2 === "object" || typeof module2 === "function") { - for (let key of __getOwnPropNames(module2)) - if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default")) - __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } - return target; -}; -var __toESM = (module2, isNodeMode) => { - return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); + return to; }; -var __toCommonJS = /* @__PURE__ */ ((cache2) => { - return (module2, temp) => { - return cache2 && cache2.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache2 && cache2.set(module2, temp), temp); - }; -})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0); +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { @@ -13824,6 +14057,7 @@ var __async = (__this, __arguments, generator) => { var GitError; var init_git_error = __esm({ "src/lib/errors/git-error.ts"() { + "use strict"; GitError = class extends Error { constructor(task, message) { super(message); @@ -13838,6 +14072,7 @@ var init_git_error = __esm({ var GitResponseError; var init_git_response_error = __esm({ "src/lib/errors/git-response-error.ts"() { + "use strict"; init_git_error(); GitResponseError = class extends GitError { constructor(git, message) { @@ -13863,6 +14098,7 @@ function toPaths(pathSpec) { var cache; var init_pathspec = __esm({ "src/lib/args/pathspec.ts"() { + "use strict"; cache = /* @__PURE__ */ new WeakMap(); } }); @@ -13871,6 +14107,7 @@ var init_pathspec = __esm({ var GitConstructError; var init_git_construct_error = __esm({ "src/lib/errors/git-construct-error.ts"() { + "use strict"; init_git_error(); GitConstructError = class extends GitError { constructor(config, message) { @@ -13885,6 +14122,7 @@ var init_git_construct_error = __esm({ var GitPluginError; var init_git_plugin_error = __esm({ "src/lib/errors/git-plugin-error.ts"() { + "use strict"; init_git_error(); GitPluginError = class extends GitError { constructor(task, plugin, message) { @@ -13901,6 +14139,7 @@ var init_git_plugin_error = __esm({ var TaskConfigurationError; var init_task_configuration_error = __esm({ "src/lib/errors/task-configuration-error.ts"() { + "use strict"; init_git_error(); TaskConfigurationError = class extends GitError { constructor(message) { @@ -14001,7 +14240,10 @@ function bufferToString(input) { return (Array.isArray(input) ? Buffer.concat(input) : input).toString("utf-8"); } function pick(source, properties) { - return Object.assign({}, ...properties.map((property) => property in source ? { [property]: source[property] } : {})); + return Object.assign( + {}, + ...properties.map((property) => property in source ? { [property]: source[property] } : {}) + ); } function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); @@ -14015,6 +14257,7 @@ function orVoid(input) { var import_file_exists, NULL, NOOP, objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { + "use strict"; import_file_exists = __nccwpck_require__(4751); NULL = "\0"; NOOP = () => { @@ -14043,6 +14286,7 @@ function filterFunction(input) { var filterArray, filterString, filterStringArray, filterStringOrStringArray, filterHasLength; var init_argument_filters = __esm({ "src/lib/utils/argument-filters.ts"() { + "use strict"; init_util(); init_pathspec(); filterArray = (input) => { @@ -14070,6 +14314,7 @@ var init_argument_filters = __esm({ var ExitCodes; var init_exit_codes = __esm({ "src/lib/utils/exit-codes.ts"() { + "use strict"; ExitCodes = /* @__PURE__ */ ((ExitCodes2) => { ExitCodes2[ExitCodes2["SUCCESS"] = 0] = "SUCCESS"; ExitCodes2[ExitCodes2["ERROR"] = 1] = "ERROR"; @@ -14084,6 +14329,7 @@ var init_exit_codes = __esm({ var GitOutputStreams; var init_git_output_streams = __esm({ "src/lib/utils/git-output-streams.ts"() { + "use strict"; GitOutputStreams = class { constructor(stdOut, stdErr) { this.stdOut = stdOut; @@ -14100,6 +14346,7 @@ var init_git_output_streams = __esm({ var LineParser, RemoteLineParser; var init_line_parser = __esm({ "src/lib/utils/line-parser.ts"() { + "use strict"; LineParser = class { constructor(regExp, useMatches) { this.matches = []; @@ -14151,7 +14398,10 @@ var init_line_parser = __esm({ // src/lib/utils/simple-git-options.ts function createInstanceConfig(...options) { const baseDir = process.cwd(); - const config = Object.assign(__spreadValues({ baseDir }, defaultOptions), ...options.filter((o) => typeof o === "object" && o)); + const config = Object.assign( + __spreadValues({ baseDir }, defaultOptions), + ...options.filter((o) => typeof o === "object" && o) + ); config.baseDir = config.baseDir || baseDir; config.trimmed = config.trimmed === true; return config; @@ -14159,6 +14409,7 @@ function createInstanceConfig(...options) { var defaultOptions; var init_simple_git_options = __esm({ "src/lib/utils/simple-git-options.ts"() { + "use strict"; defaultOptions = { binary: "git", maxConcurrentProcesses: 5, @@ -14212,6 +14463,7 @@ function trailingFunctionArgument(args, includeNoop = true) { } var init_task_options = __esm({ "src/lib/utils/task-options.ts"() { + "use strict"; init_argument_filters(); init_util(); init_pathspec(); @@ -14238,6 +14490,7 @@ function parseStringResponse(result, parsers12, texts, trim = true) { } var init_task_parser = __esm({ "src/lib/utils/task-parser.ts"() { + "use strict"; init_util(); } }); @@ -14290,6 +14543,7 @@ __export(utils_exports, { }); var init_utils = __esm({ "src/lib/utils/index.ts"() { + "use strict"; init_argument_filters(); init_exit_codes(); init_git_output_streams(); @@ -14350,6 +14604,7 @@ function isNotRepoMessage(error) { var CheckRepoActions, onError, parser; var init_check_is_repo = __esm({ "src/lib/tasks/check-is-repo.ts"() { + "use strict"; init_utils(); CheckRepoActions = /* @__PURE__ */ ((CheckRepoActions2) => { CheckRepoActions2["BARE"] = "bare"; @@ -14383,6 +14638,7 @@ function cleanSummaryParser(dryRun, text) { var CleanResponse, removalRegexp, dryRunRemovalRegexp, isFolderRegexp; var init_CleanSummary = __esm({ "src/lib/responses/CleanSummary.ts"() { + "use strict"; init_utils(); CleanResponse = class { constructor(dryRun) { @@ -14452,6 +14708,7 @@ function isEmptyTask(task) { var EMPTY_COMMANDS; var init_task = __esm({ "src/lib/tasks/task.ts"() { + "use strict"; init_task_configuration_error(); EMPTY_COMMANDS = []; } @@ -14528,6 +14785,7 @@ function isInteractiveMode(option) { var CONFIG_ERROR_INTERACTIVE_MODE, CONFIG_ERROR_MODE_REQUIRED, CONFIG_ERROR_UNKNOWN_OPTION, CleanOptions, CleanOptionValues; var init_clean = __esm({ "src/lib/tasks/clean.ts"() { + "use strict"; init_CleanSummary(); init_utils(); init_task(); @@ -14601,6 +14859,7 @@ function* configParser(text, requestedKey = null) { var ConfigList; var init_ConfigList = __esm({ "src/lib/responses/ConfigList.ts"() { + "use strict"; init_utils(); ConfigList = class { constructor() { @@ -14688,19 +14947,34 @@ function listConfigTask(scope) { function config_default() { return { addConfig(key, value, ...rest) { - return this._runTask(addConfigTask(key, value, rest[0] === true, asConfigScope(rest[1], "local" /* local */)), trailingFunctionArgument(arguments)); + return this._runTask( + addConfigTask( + key, + value, + rest[0] === true, + asConfigScope(rest[1], "local" /* local */) + ), + trailingFunctionArgument(arguments) + ); }, getConfig(key, scope) { - return this._runTask(getConfigTask(key, asConfigScope(scope, void 0)), trailingFunctionArgument(arguments)); + return this._runTask( + getConfigTask(key, asConfigScope(scope, void 0)), + trailingFunctionArgument(arguments) + ); }, listConfig(...rest) { - return this._runTask(listConfigTask(asConfigScope(rest[0], void 0)), trailingFunctionArgument(arguments)); + return this._runTask( + listConfigTask(asConfigScope(rest[0], void 0)), + trailingFunctionArgument(arguments) + ); } }; } var GitConfigScope; var init_config = __esm({ "src/lib/tasks/config.ts"() { + "use strict"; init_ConfigList(); init_utils(); GitConfigScope = /* @__PURE__ */ ((GitConfigScope2) => { @@ -14720,6 +14994,7 @@ function isDiffNameStatus(input) { var DiffNameStatus, diffNameStatus; var init_diff_name_status = __esm({ "src/lib/tasks/diff-name-status.ts"() { + "use strict"; DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus2) => { DiffNameStatus2["ADDED"] = "A"; DiffNameStatus2["COPIED"] = "C"; @@ -14764,26 +15039,33 @@ function grep_default() { const options = getTrailingOptions(arguments); for (const option of disallowedOptions) { if (options.includes(option)) { - return this._runTask(configurationErrorTask(`git.grep: use of "${option}" is not supported.`), then); + return this._runTask( + configurationErrorTask(`git.grep: use of "${option}" is not supported.`), + then + ); } } if (typeof searchTerm === "string") { searchTerm = grepQueryBuilder().param(searchTerm); } const commands = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; - return this._runTask({ - commands, - format: "utf-8", - parser(stdOut) { - return parseGrep(stdOut); - } - }, then); + return this._runTask( + { + commands, + format: "utf-8", + parser(stdOut) { + return parseGrep(stdOut); + } + }, + then + ); } }; } var disallowedOptions, Query, _a, GrepQuery; var init_grep = __esm({ "src/lib/tasks/grep.ts"() { + "use strict"; init_utils(); init_task(); disallowedOptions = ["-h"]; @@ -14841,6 +15123,7 @@ function isValidResetMode(mode) { var ResetMode, ResetModes; var init_reset = __esm({ "src/lib/tasks/reset.ts"() { + "use strict"; init_task(); ResetMode = /* @__PURE__ */ ((ResetMode2) => { ResetMode2["MIXED"] = "mixed"; @@ -14872,6 +15155,7 @@ __export(api_exports, { }); var init_api = __esm({ "src/lib/api.ts"() { + "use strict"; init_pathspec(); init_git_construct_error(); init_git_error(); @@ -14914,6 +15198,7 @@ function abortPlugin(signal) { } var init_abort_plugin = __esm({ "src/lib/plugins/abort-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -14929,17 +15214,33 @@ function preventProtocolOverride(arg, next) { if (!/^\s*protocol(.[a-z]+)?.allow/.test(next)) { return; } - throw new GitPluginError(void 0, "unsafe", "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol"); + throw new GitPluginError( + void 0, + "unsafe", + "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol" + ); } function preventUploadPack(arg, method) { if (/^\s*--(upload|receive)-pack/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack` + ); } if (method === "clone" && /^\s*-u\b/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of clone with option -u is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of clone with option -u is not permitted without enabling allowUnsafePack` + ); } if (method === "push" && /^\s*--exec\b/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of push with option --exec is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of push with option --exec is not permitted without enabling allowUnsafePack` + ); } } function blockUnsafeOperationsPlugin({ @@ -14960,6 +15261,7 @@ function blockUnsafeOperationsPlugin({ } var init_block_unsafe_operations_plugin = __esm({ "src/lib/plugins/block-unsafe-operations-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -14976,6 +15278,7 @@ function commandConfigPrefixingPlugin(configuration) { } var init_command_config_prefixing_plugin = __esm({ "src/lib/plugins/command-config-prefixing-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15024,11 +15327,11 @@ function completionDetectionPlugin({ type: "spawn.after", action(_0, _1) { return __async(this, arguments, function* (_data, { spawned, close }) { - var _a2, _b; + var _a3, _b; const events = createEvents(); let deferClose = true; let quickClose = () => void (deferClose = false); - (_a2 = spawned.stdout) == null ? void 0 : _a2.on("data", quickClose); + (_a3 = spawned.stdout) == null ? void 0 : _a3.on("data", quickClose); (_b = spawned.stderr) == null ? void 0 : _b.on("data", quickClose); spawned.on("error", quickClose); spawned.on("close", (code) => events.close(code)); @@ -15049,12 +15352,58 @@ function completionDetectionPlugin({ var import_promise_deferred, never; var init_completion_detection_plugin = __esm({ "src/lib/plugins/completion-detection.plugin.ts"() { + "use strict"; import_promise_deferred = __nccwpck_require__(9819); init_utils(); never = (0, import_promise_deferred.deferred)().promise; } }); +// src/lib/plugins/custom-binary.plugin.ts +function isBadArgument(arg) { + return !arg || !/^([a-z]:)?([a-z0-9/.\\_-]+)$/i.test(arg); +} +function toBinaryConfig(input, allowUnsafe) { + if (input.length < 1 || input.length > 2) { + throw new GitPluginError(void 0, "binary", WRONG_NUMBER_ERR); + } + const isBad = input.some(isBadArgument); + if (isBad) { + if (allowUnsafe) { + console.warn(WRONG_CHARS_ERR); + } else { + throw new GitPluginError(void 0, "binary", WRONG_CHARS_ERR); + } + } + const [binary, prefix] = input; + return { + binary, + prefix + }; +} +function customBinaryPlugin(plugins, input = ["git"], allowUnsafe = false) { + let config = toBinaryConfig(asArray(input), allowUnsafe); + plugins.on("binary", (input2) => { + config = toBinaryConfig(asArray(input2), allowUnsafe); + }); + plugins.append("spawn.binary", () => { + return config.binary; + }); + plugins.append("spawn.args", (data) => { + return config.prefix ? [config.prefix, ...data] : data; + }); +} +var WRONG_NUMBER_ERR, WRONG_CHARS_ERR; +var init_custom_binary_plugin = __esm({ + "src/lib/plugins/custom-binary.plugin.ts"() { + "use strict"; + init_git_plugin_error(); + init_utils(); + WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`; + WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`; + } +}); + // src/lib/plugins/error-detection.plugin.ts function isTaskError(result) { return !!(result.exitCode && result.stdErr.length); @@ -15090,18 +15439,32 @@ function errorDetectionPlugin(config) { } var init_error_detection_plugin = __esm({ "src/lib/plugins/error-detection.plugin.ts"() { + "use strict"; init_git_error(); } }); // src/lib/plugins/plugin-store.ts -var PluginStore; +var import_node_events, PluginStore; var init_plugin_store = __esm({ "src/lib/plugins/plugin-store.ts"() { + "use strict"; + import_node_events = __nccwpck_require__(5673); init_utils(); PluginStore = class { constructor() { this.plugins = /* @__PURE__ */ new Set(); + this.events = new import_node_events.EventEmitter(); + } + on(type, listener) { + this.events.on(type, listener); + } + reconfigure(type, data) { + this.events.emit(type, data); + } + append(type, action) { + const plugin = append(this.plugins, { type, action }); + return () => this.plugins.delete(plugin); } add(plugin) { const plugins = []; @@ -15166,6 +15529,7 @@ function progressEventStage(input) { } var init_progress_monitor_plugin = __esm({ "src/lib/plugins/progress-monitor-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15173,6 +15537,7 @@ var init_progress_monitor_plugin = __esm({ // src/lib/plugins/simple-git-plugin.ts var init_simple_git_plugin = __esm({ "src/lib/plugins/simple-git-plugin.ts"() { + "use strict"; } }); @@ -15188,6 +15553,7 @@ function spawnOptionsPlugin(spawnOptions) { } var init_spawn_options_plugin = __esm({ "src/lib/plugins/spawn-options-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15231,6 +15597,7 @@ function timeoutPlugin({ } var init_timout_plugin = __esm({ "src/lib/plugins/timout-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -15238,10 +15605,12 @@ var init_timout_plugin = __esm({ // src/lib/plugins/index.ts var init_plugins = __esm({ "src/lib/plugins/index.ts"() { + "use strict"; init_abort_plugin(); init_block_unsafe_operations_plugin(); init_command_config_prefixing_plugin(); init_completion_detection_plugin(); + init_custom_binary_plugin(); init_error_detection_plugin(); init_plugin_store(); init_progress_monitor_plugin(); @@ -15268,7 +15637,9 @@ function suffixPathsPlugin() { continue; } if (param === "--") { - append2(data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item)); + append2( + data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item) + ); break; } prefix.push(param); @@ -15279,6 +15650,7 @@ function suffixPathsPlugin() { } var init_suffix_paths_plugin = __esm({ "src/lib/plugins/suffix-paths.plugin.ts"() { + "use strict"; init_pathspec(); } }); @@ -15318,7 +15690,10 @@ function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger); return step(initialStep); function sibling(name, initial) { - return append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); + return append( + spawned, + createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger) + ); } function step(phase) { const stepPrefix = phase && `[${phase}]` || ""; @@ -15335,6 +15710,7 @@ function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { var import_debug; var init_git_logger = __esm({ "src/lib/git-logger.ts"() { + "use strict"; import_debug = __toESM(__nccwpck_require__(8237)); init_utils(); import_debug.default.formatters.L = (value) => String(filterHasLength(value) ? value.length : "-"); @@ -15351,6 +15727,7 @@ var init_git_logger = __esm({ var _TasksPendingQueue, TasksPendingQueue; var init_tasks_pending_queue = __esm({ "src/lib/runners/tasks-pending-queue.ts"() { + "use strict"; init_git_error(); init_git_logger(); _TasksPendingQueue = class { @@ -15380,9 +15757,14 @@ var init_tasks_pending_queue = __esm({ for (const [task, { logger }] of Array.from(this._queue.entries())) { if (task === err.task) { logger.info(`Failed %o`, err); - logger(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); + logger( + `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted` + ); } else { - logger.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); + logger.info( + `A fatal exception occurred in a previous task, the queue has been purged: %o`, + err.message + ); } this.complete(task); } @@ -15436,6 +15818,7 @@ function onDataReceived(target, name, logger, output) { var import_child_process, GitExecutorChain; var init_git_executor_chain = __esm({ "src/lib/runners/git-executor-chain.ts"() { + "use strict"; import_child_process = __nccwpck_require__(2081); init_git_error(); init_task(); @@ -15449,9 +15832,6 @@ var init_git_executor_chain = __esm({ this._chain = Promise.resolve(); this._queue = new TasksPendingQueue(); } - get binary() { - return this._executor.binary; - } get cwd() { return this._cwd || this._executor.cwd; } @@ -15494,8 +15874,19 @@ var init_git_executor_chain = __esm({ } attemptRemoteTask(task, logger) { return __async(this, null, function* () { - const args = this._plugins.exec("spawn.args", [...task.commands], pluginContext(task, task.commands)); - const raw = yield this.gitResponse(task, this.binary, args, this.outputHandler, logger.step("SPAWN")); + const binary = this._plugins.exec("spawn.binary", "", pluginContext(task, task.commands)); + const args = this._plugins.exec( + "spawn.args", + [...task.commands], + pluginContext(task, task.commands) + ); + const raw = yield this.gitResponse( + task, + binary, + args, + this.outputHandler, + logger.step("SPAWN") + ); const outputStreams = yield this.handleTaskData(task, args, raw, logger.step("HANDLE")); logger(`passing response to task's parser as a %s`, task.format); if (isBufferTask(task)) { @@ -15514,17 +15905,36 @@ var init_git_executor_chain = __esm({ const { exitCode, rejection, stdOut, stdErr } = result; return new Promise((done, fail) => { logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); - const { error } = this._plugins.exec("task.error", { error: rejection }, __spreadValues(__spreadValues({}, pluginContext(task, args)), result)); + const { error } = this._plugins.exec( + "task.error", + { error: rejection }, + __spreadValues(__spreadValues({}, pluginContext(task, args)), result) + ); if (error && task.onError) { logger.info(`exitCode=%s handling with custom error handler`); - return task.onError(result, error, (newStdOut) => { - logger.info(`custom error handler treated as success`); - logger(`custom error returned a %s`, objectToString(newStdOut)); - done(new GitOutputStreams(Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, Buffer.concat(stdErr))); - }, fail); + return task.onError( + result, + error, + (newStdOut) => { + logger.info(`custom error handler treated as success`); + logger(`custom error returned a %s`, objectToString(newStdOut)); + done( + new GitOutputStreams( + Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, + Buffer.concat(stdErr) + ) + ); + }, + fail + ); } if (error) { - logger.info(`handling as error: exitCode=%s stdErr=%s rejection=%o`, exitCode, stdErr.length, rejection); + logger.info( + `handling as error: exitCode=%s stdErr=%s rejection=%o`, + exitCode, + stdErr.length, + rejection + ); return fail(error); } logger.info(`retrieving task output complete`); @@ -15534,11 +15944,15 @@ var init_git_executor_chain = __esm({ gitResponse(task, command, args, outputHandler, logger) { return __async(this, null, function* () { const outputLogger = logger.sibling("output"); - const spawnOptions = this._plugins.exec("spawn.options", { - cwd: this.cwd, - env: this.env, - windowsHide: true - }, pluginContext(task, task.commands)); + const spawnOptions = this._plugins.exec( + "spawn.options", + { + cwd: this.cwd, + env: this.env, + windowsHide: true + }, + pluginContext(task, task.commands) + ); return new Promise((done) => { const stdOut = []; const stdErr = []; @@ -15559,8 +15973,14 @@ var init_git_executor_chain = __esm({ } })); const spawned = (0, import_child_process.spawn)(command, args, spawnOptions); - spawned.stdout.on("data", onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut"))); - spawned.stderr.on("data", onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr"))); + spawned.stdout.on( + "data", + onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut")) + ); + spawned.stderr.on( + "data", + onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr")) + ); spawned.on("error", onErrorReceived(stdErr, logger)); if (outputHandler) { logger(`Passing child process stdOut/stdErr to custom outputHandler`); @@ -15608,10 +16028,10 @@ __export(git_executor_exports, { var GitExecutor; var init_git_executor = __esm({ "src/lib/runners/git-executor.ts"() { + "use strict"; init_git_executor_chain(); GitExecutor = class { - constructor(binary = "git", cwd, _scheduler, _plugins) { - this.binary = binary; + constructor(cwd, _scheduler, _plugins) { this.cwd = cwd; this._scheduler = _scheduler; this._plugins = _plugins; @@ -15634,14 +16054,19 @@ function taskCallback(task, response, callback = NOOP) { }; const onError2 = (err) => { if ((err == null ? void 0 : err.task) === task) { - callback(err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, void 0); + callback( + err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, + void 0 + ); } }; response.then(onSuccess, onError2); } function addDeprecationNoticeToError(err) { let log = (name) => { - console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); + console.warn( + `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3` + ); log = NOOP; }; return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); @@ -15662,6 +16087,7 @@ function addDeprecationNoticeToError(err) { } var init_task_callback = __esm({ "src/lib/task-callback.ts"() { + "use strict"; init_git_response_error(); init_utils(); } @@ -15678,6 +16104,7 @@ function changeWorkingDirectoryTask(directory, root) { } var init_change_working_directory = __esm({ "src/lib/tasks/change-working-directory.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15694,18 +16121,28 @@ function checkoutTask(args) { function checkout_default() { return { checkout() { - return this._runTask(checkoutTask(getTrailingOptions(arguments, 1)), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(getTrailingOptions(arguments, 1)), + trailingFunctionArgument(arguments) + ); }, checkoutBranch(branchName, startPoint) { - return this._runTask(checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); }, checkoutLocalBranch(branchName) { - return this._runTask(checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); } }; } var init_checkout = __esm({ "src/lib/tasks/checkout.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15729,6 +16166,7 @@ function parseCommitResult(stdOut) { var parsers; var init_parse_commit = __esm({ "src/lib/parsers/parse-commit.ts"() { + "use strict"; init_utils(); parsers = [ new LineParser(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { @@ -15747,20 +16185,26 @@ var init_parse_commit = __esm({ name: parts.join("<").trim() }; }), - new LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { - result.summary.changes = parseInt(changes, 10) || 0; - result.summary.insertions = parseInt(insertions, 10) || 0; - result.summary.deletions = parseInt(deletions, 10) || 0; - }), - new LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { - result.summary.changes = parseInt(changes, 10) || 0; - const count = parseInt(lines, 10) || 0; - if (direction === "-") { - result.summary.deletions = count; - } else if (direction === "+") { - result.summary.insertions = count; + new LineParser( + /(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, + (result, [changes, insertions, deletions]) => { + result.summary.changes = parseInt(changes, 10) || 0; + result.summary.insertions = parseInt(insertions, 10) || 0; + result.summary.deletions = parseInt(deletions, 10) || 0; + } + ), + new LineParser( + /^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, + (result, [changes, lines, direction]) => { + result.summary.changes = parseInt(changes, 10) || 0; + const count = parseInt(lines, 10) || 0; + if (direction === "-") { + result.summary.deletions = count; + } else if (direction === "+") { + result.summary.insertions = count; + } } - }) + ) ]; } }); @@ -15785,16 +16229,23 @@ function commit_default() { return { commit(message, ...rest) { const next = trailingFunctionArgument(arguments); - const task = rejectDeprecatedSignatures(message) || commitTask(asArray(message), asArray(filterType(rest[0], filterStringOrStringArray, [])), [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)]); + const task = rejectDeprecatedSignatures(message) || commitTask( + asArray(message), + asArray(filterType(rest[0], filterStringOrStringArray, [])), + [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)] + ); return this._runTask(task, next); } }; function rejectDeprecatedSignatures(message) { - return !filterStringOrStringArray(message) && configurationErrorTask(`git.commit: requires the commit message to be supplied as a string/string[]`); + return !filterStringOrStringArray(message) && configurationErrorTask( + `git.commit: requires the commit message to be supplied as a string/string[]` + ); } } var init_commit = __esm({ "src/lib/tasks/commit.ts"() { + "use strict"; init_parse_commit(); init_utils(); init_task(); @@ -15805,12 +16256,16 @@ var init_commit = __esm({ function first_commit_default() { return { firstCommit() { - return this._runTask(straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), + trailingFunctionArgument(arguments) + ); } }; } var init_first_commit = __esm({ "src/lib/tasks/first-commit.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15826,6 +16281,7 @@ function hashObjectTask(filePath, write) { } var init_hash_object = __esm({ "src/lib/tasks/hash-object.ts"() { + "use strict"; init_task(); } }); @@ -15854,6 +16310,7 @@ function parseInit(bare, path, text) { var InitSummary, initResponseRegex, reInitResponseRegex; var init_InitSummary = __esm({ "src/lib/responses/InitSummary.ts"() { + "use strict"; InitSummary = class { constructor(bare, path, existing, gitDir) { this.bare = bare; @@ -15887,6 +16344,7 @@ function initTask(bare = false, path, customArgs) { var bareCommand; var init_init = __esm({ "src/lib/tasks/init.ts"() { + "use strict"; init_InitSummary(); bareCommand = "--bare"; } @@ -15908,6 +16366,7 @@ function isLogFormat(customArg) { var logFormatRegex; var init_log_format = __esm({ "src/lib/args/log-format.ts"() { + "use strict"; logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/; } }); @@ -15916,6 +16375,7 @@ var init_log_format = __esm({ var DiffSummary; var init_DiffSummary = __esm({ "src/lib/responses/DiffSummary.ts"() { + "use strict"; DiffSummary = class { constructor() { this.changed = 0; @@ -15935,51 +16395,64 @@ function getDiffParser(format = "" /* NONE */) { var statParser, numStatParser, nameOnlyParser, nameStatusParser, diffSummaryParsers; var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { + "use strict"; init_log_format(); init_DiffSummary(); init_diff_name_status(); init_utils(); statParser = [ - new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { - result.files.push({ - file: file.trim(), - changes: asNumber(changes), - insertions: alterations.replace(/[^+]/g, "").length, - deletions: alterations.replace(/[^-]/g, "").length, - binary: false - }); - }), - new LineParser(/(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, (result, [file, before, after]) => { - result.files.push({ - file: file.trim(), - before: asNumber(before), - after: asNumber(after), - binary: true - }); - }), - new LineParser(/(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, (result, [changed, summary]) => { - const inserted = /(\d+) i/.exec(summary); - const deleted = /(\d+) d/.exec(summary); - result.changed = asNumber(changed); - result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); - result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); - }) + new LineParser( + /^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, + (result, [file, changes, alterations = ""]) => { + result.files.push({ + file: file.trim(), + changes: asNumber(changes), + insertions: alterations.replace(/[^+]/g, "").length, + deletions: alterations.replace(/[^-]/g, "").length, + binary: false + }); + } + ), + new LineParser( + /^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, + (result, [file, before, after]) => { + result.files.push({ + file: file.trim(), + before: asNumber(before), + after: asNumber(after), + binary: true + }); + } + ), + new LineParser( + /(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, + (result, [changed, summary]) => { + const inserted = /(\d+) i/.exec(summary); + const deleted = /(\d+) d/.exec(summary); + result.changed = asNumber(changed); + result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); + result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); + } + ) ]; numStatParser = [ - new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { - const insertions = asNumber(changesInsert); - const deletions = asNumber(changesDelete); - result.changed++; - result.insertions += insertions; - result.deletions += deletions; - result.files.push({ - file, - changes: insertions + deletions, - insertions, - deletions, - binary: false - }); - }), + new LineParser( + /(\d+)\t(\d+)\t(.+)$/, + (result, [changesInsert, changesDelete, file]) => { + const insertions = asNumber(changesInsert); + const deletions = asNumber(changesDelete); + result.changed++; + result.insertions += insertions; + result.deletions += deletions; + result.files.push({ + file, + changes: insertions + deletions, + insertions, + deletions, + binary: false + }); + } + ), new LineParser(/-\t-\t(.+)$/, (result, [file]) => { result.changed++; result.files.push({ @@ -16003,17 +16476,20 @@ var init_parse_diff_summary = __esm({ }) ]; nameStatusParser = [ - new LineParser(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, (result, [status, _similarity, from, _to, to]) => { - result.changed++; - result.files.push({ - file: to != null ? to : from, - changes: 0, - status: orVoid(isDiffNameStatus(status) && status), - insertions: 0, - deletions: 0, - binary: false - }); - }) + new LineParser( + /([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, + (result, [status, _similarity, from, _to, to]) => { + result.changed++; + result.files.push({ + file: to != null ? to : from, + changes: 0, + status: orVoid(isDiffNameStatus(status) && status), + insertions: 0, + deletions: 0, + binary: false + }); + } + ) ]; diffSummaryParsers = { ["" /* NONE */]: statParser, @@ -16027,17 +16503,27 @@ var init_parse_diff_summary = __esm({ // src/lib/parsers/parse-list-log-summary.ts function lineBuilder(tokens, fields) { - return fields.reduce((line, field, index) => { - line[field] = tokens[index] || ""; - return line; - }, /* @__PURE__ */ Object.create({ diff: null })); + return fields.reduce( + (line, field, index) => { + line[field] = tokens[index] || ""; + return line; + }, + /* @__PURE__ */ Object.create({ diff: null }) + ); } function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNames, logFormat = "" /* NONE */) { const parseDiffResult = getDiffParser(logFormat); return function(stdOut) { - const all = toLinesWithContent(stdOut, true, START_BOUNDARY).map(function(item) { + const all = toLinesWithContent( + stdOut, + true, + START_BOUNDARY + ).map(function(item) { const lineDetail = item.trim().split(COMMIT_BOUNDARY); - const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); + const listLogLine = lineBuilder( + lineDetail[0].trim().split(splitter), + fields + ); if (lineDetail.length > 1 && !!lineDetail[1].trim()) { listLogLine.diff = parseDiffResult(lineDetail[1]); } @@ -16053,6 +16539,7 @@ function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNa var START_BOUNDARY, COMMIT_BOUNDARY, SPLITTER, defaultFieldNames; var init_parse_list_log_summary = __esm({ "src/lib/parsers/parse-list-log-summary.ts"() { + "use strict"; init_utils(); init_parse_diff_summary(); init_log_format(); @@ -16086,14 +16573,19 @@ function diffSummaryTask(customArgs) { function validateLogFormatConfig(customArgs) { const flags = customArgs.filter(isLogFormat); if (flags.length > 1) { - return configurationErrorTask(`Summary flags are mutually exclusive - pick one of ${flags.join(",")}`); + return configurationErrorTask( + `Summary flags are mutually exclusive - pick one of ${flags.join(",")}` + ); } if (flags.length && customArgs.includes("-z")) { - return configurationErrorTask(`Summary flag ${flags} parsing is not compatible with null termination option '-z'`); + return configurationErrorTask( + `Summary flag ${flags} parsing is not compatible with null termination option '-z'` + ); } } var init_diff = __esm({ "src/lib/tasks/diff.ts"() { + "use strict"; init_log_format(); init_parse_diff_summary(); init_task(); @@ -16165,7 +16657,10 @@ function log_default() { return { log(...rest) { const next = trailingFunctionArgument(arguments); - const options = parseLogOptions(trailingOptionsArgument(arguments), filterType(arguments[0], filterArray)); + const options = parseLogOptions( + trailingOptionsArgument(arguments), + filterType(arguments[0], filterArray) + ); const task = rejectDeprecatedSignatures(...rest) || validateLogFormatConfig(options.commands) || createLogTask(options); return this._runTask(task, next); } @@ -16174,12 +16669,15 @@ function log_default() { return logTask(options.splitter, options.fields, options.commands); } function rejectDeprecatedSignatures(from, to) { - return filterString(from) && filterString(to) && configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`); + return filterString(from) && filterString(to) && configurationErrorTask( + `git.log(string, string) should be replaced with git.log({ from: string, to: string })` + ); } } var excludeOptions; var init_log = __esm({ "src/lib/tasks/log.ts"() { + "use strict"; init_log_format(); init_pathspec(); init_parse_list_log_summary(); @@ -16209,6 +16707,7 @@ var init_log = __esm({ var MergeSummaryConflict, MergeSummaryDetail; var init_MergeSummary = __esm({ "src/lib/responses/MergeSummary.ts"() { + "use strict"; MergeSummaryConflict = class { constructor(reason, file = null, meta) { this.reason = reason; @@ -16245,6 +16744,7 @@ var init_MergeSummary = __esm({ var PullSummary, PullFailedSummary; var init_PullSummary = __esm({ "src/lib/responses/PullSummary.ts"() { + "use strict"; PullSummary = class { constructor() { this.remoteMessages = { @@ -16304,24 +16804,34 @@ function asObjectCount(source) { var remoteMessagesObjectParsers; var init_parse_remote_objects = __esm({ "src/lib/parsers/parse-remote-objects.ts"() { + "use strict"; init_utils(); remoteMessagesObjectParsers = [ - new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - }), - new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - }), - new RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { - const objects = objectEnumerationResult(result.remoteMessages); - objects.total = asObjectCount(total); - objects.reused = asObjectCount(reused); - objects.packReused = asNumber(packReused); - }) + new RemoteLineParser( + /^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber(count) }); + } + ), + new RemoteLineParser( + /^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber(count) }); + } + ), + new RemoteLineParser( + /total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, + (result, [total, reused, packReused]) => { + const objects = objectEnumerationResult(result.remoteMessages); + objects.total = asObjectCount(total); + objects.reused = asObjectCount(reused); + objects.packReused = asNumber(packReused); + } + ) ]; } }); @@ -16333,6 +16843,7 @@ function parseRemoteMessages(_stdOut, stdErr) { var parsers2, RemoteMessageSummary; var init_parse_remote_messages = __esm({ "src/lib/parsers/parse-remote-messages.ts"() { + "use strict"; init_utils(); init_parse_remote_objects(); parsers2 = [ @@ -16341,16 +16852,22 @@ var init_parse_remote_messages = __esm({ return false; }), ...remoteMessagesObjectParsers, - new RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { - result.remoteMessages.pullRequestUrl = pullRequestUrl; - }), - new RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { - result.remoteMessages.vulnerabilities = { - count: asNumber(count), - summary, - url - }; - }) + new RemoteLineParser( + [/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], + (result, [pullRequestUrl]) => { + result.remoteMessages.pullRequestUrl = pullRequestUrl; + } + ), + new RemoteLineParser( + [/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], + (result, [count, summary, url]) => { + result.remoteMessages.vulnerabilities = { + count: asNumber(count), + summary, + url + }; + } + ) ]; RemoteMessageSummary = class { constructor() { @@ -16368,6 +16885,7 @@ function parsePullErrorResult(stdOut, stdErr) { var FILE_UPDATE_REGEX, SUMMARY_REGEX, ACTION_REGEX, parsers3, errorParsers, parsePullDetail, parsePullResult; var init_parse_pull = __esm({ "src/lib/parsers/parse-pull.ts"() { + "use strict"; init_PullSummary(); init_utils(); init_parse_remote_messages(); @@ -16401,18 +16919,25 @@ var init_parse_pull = __esm({ errorParsers = [ new LineParser(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), new LineParser(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), - new LineParser(/([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { - result.branch.local = branchLocal; - result.hash.local = hashLocal; - result.branch.remote = branchRemote; - result.hash.remote = hashRemote; - }) + new LineParser( + /([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, + (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { + result.branch.local = branchLocal; + result.hash.local = hashLocal; + result.branch.remote = branchRemote; + result.hash.remote = hashRemote; + } + ) ]; parsePullDetail = (stdOut, stdErr) => { return parseStringResponse(new PullSummary(), parsers3, [stdOut, stdErr]); }; parsePullResult = (stdOut, stdErr) => { - return Object.assign(new PullSummary(), parsePullDetail(stdOut, stdErr), parseRemoteMessages(stdOut, stdErr)); + return Object.assign( + new PullSummary(), + parsePullDetail(stdOut, stdErr), + parseRemoteMessages(stdOut, stdErr) + ); }; } }); @@ -16421,6 +16946,7 @@ var init_parse_pull = __esm({ var parsers4, parseMergeResult, parseMergeDetail; var init_parse_merge = __esm({ "src/lib/parsers/parse-merge.ts"() { + "use strict"; init_MergeSummary(); init_utils(); init_parse_pull(); @@ -16431,9 +16957,12 @@ var init_parse_merge = __esm({ new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { summary.conflicts.push(new MergeSummaryConflict(reason, file)); }), - new LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); - }), + new LineParser( + /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, + (summary, [reason, file, deleteRef]) => { + summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); + } + ), new LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { summary.conflicts.push(new MergeSummaryConflict(reason, null)); }), @@ -16469,6 +16998,7 @@ function mergeTask(customArgs) { } var init_merge = __esm({ "src/lib/tasks/merge.ts"() { + "use strict"; init_git_response_error(); init_parse_merge(); init_task(); @@ -16493,6 +17023,7 @@ function pushResultPushedItem(local, remote, status) { var parsers5, parsePushResult, parsePushDetail; var init_parse_push = __esm({ "src/lib/parsers/parse-push.ts"() { + "use strict"; init_utils(); init_parse_remote_messages(); parsers5 = [ @@ -16507,25 +17038,31 @@ var init_parse_push = __esm({ new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { result.pushed.push(pushResultPushedItem(local, remote, type)); }), - new LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { - result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { - local, - remote, - remoteName - }); - }), - new LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { - result.update = { - head: { + new LineParser( + /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, + (result, [local, remote, remoteName]) => { + result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { local, - remote - }, - hash: { - from, - to - } - }; - }) + remote, + remoteName + }); + } + ), + new LineParser( + /^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, + (result, [local, remote, from, to]) => { + result.update = { + head: { + local, + remote + }, + hash: { + from, + to + } + }; + } + ) ]; parsePushResult = (stdOut, stdErr) => { const pushDetail = parsePushDetail(stdOut, stdErr); @@ -16567,6 +17104,7 @@ function pushTask(ref = {}, customArgs) { } var init_push = __esm({ "src/lib/tasks/push.ts"() { + "use strict"; init_parse_push(); init_utils(); } @@ -16580,16 +17118,23 @@ function show_default() { if (!commands.includes("--binary")) { commands.splice(1, 0, "--binary"); } - return this._runTask(straightThroughBufferTask(commands), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughBufferTask(commands), + trailingFunctionArgument(arguments) + ); }, show() { const commands = ["show", ...getTrailingOptions(arguments, 1)]; - return this._runTask(straightThroughStringTask(commands), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(commands), + trailingFunctionArgument(arguments) + ); } }; } var init_show = __esm({ "src/lib/tasks/show.ts"() { + "use strict"; init_utils(); init_task(); } @@ -16599,13 +17144,14 @@ var init_show = __esm({ var fromPathRegex, FileStatusSummary; var init_FileStatusSummary = __esm({ "src/lib/responses/FileStatusSummary.ts"() { + "use strict"; fromPathRegex = /^(.+) -> (.+)$/; FileStatusSummary = class { constructor(path, index, working_dir) { this.path = path; this.index = index; this.working_dir = working_dir; - if (index + working_dir === "R") { + if ("R" === index + working_dir) { const detail = fromPathRegex.exec(path) || [null, path, path]; this.from = detail[1] || ""; this.path = detail[2] || ""; @@ -16653,6 +17199,7 @@ function splitLine(result, lineStr) { var StatusSummary, parsers6, parseStatusSummary; var init_StatusSummary = __esm({ "src/lib/responses/StatusSummary.ts"() { + "use strict"; init_utils(); init_FileStatusSummary(); StatusSummary = class { @@ -16677,14 +17224,46 @@ var init_StatusSummary = __esm({ } }; parsers6 = new Map([ - parser2(" " /* NONE */, "A" /* ADDED */, (result, file) => append(result.created, file)), - parser2(" " /* NONE */, "D" /* DELETED */, (result, file) => append(result.deleted, file)), - parser2(" " /* NONE */, "M" /* MODIFIED */, (result, file) => append(result.modified, file)), - parser2("A" /* ADDED */, " " /* NONE */, (result, file) => append(result.created, file) && append(result.staged, file)), - parser2("A" /* ADDED */, "M" /* MODIFIED */, (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file)), - parser2("D" /* DELETED */, " " /* NONE */, (result, file) => append(result.deleted, file) && append(result.staged, file)), - parser2("M" /* MODIFIED */, " " /* NONE */, (result, file) => append(result.modified, file) && append(result.staged, file)), - parser2("M" /* MODIFIED */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) && append(result.staged, file)), + parser2( + " " /* NONE */, + "A" /* ADDED */, + (result, file) => append(result.created, file) + ), + parser2( + " " /* NONE */, + "D" /* DELETED */, + (result, file) => append(result.deleted, file) + ), + parser2( + " " /* NONE */, + "M" /* MODIFIED */, + (result, file) => append(result.modified, file) + ), + parser2( + "A" /* ADDED */, + " " /* NONE */, + (result, file) => append(result.created, file) && append(result.staged, file) + ), + parser2( + "A" /* ADDED */, + "M" /* MODIFIED */, + (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file) + ), + parser2( + "D" /* DELETED */, + " " /* NONE */, + (result, file) => append(result.deleted, file) && append(result.staged, file) + ), + parser2( + "M" /* MODIFIED */, + " " /* NONE */, + (result, file) => append(result.modified, file) && append(result.staged, file) + ), + parser2( + "M" /* MODIFIED */, + "M" /* MODIFIED */, + (result, file) => append(result.modified, file) && append(result.staged, file) + ), parser2("R" /* RENAMED */, " " /* NONE */, (result, file) => { append(result.renamed, renamedFile(file)); }), @@ -16696,10 +17275,23 @@ var init_StatusSummary = __esm({ parser2("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2("?" /* UNTRACKED */, "?" /* UNTRACKED */, (result, file) => append(result.not_added, file)), + parser2( + "?" /* UNTRACKED */, + "?" /* UNTRACKED */, + (result, file) => append(result.not_added, file) + ), ...conflicts("A" /* ADDED */, "A" /* ADDED */, "U" /* UNMERGED */), - ...conflicts("D" /* DELETED */, "D" /* DELETED */, "U" /* UNMERGED */), - ...conflicts("U" /* UNMERGED */, "A" /* ADDED */, "D" /* DELETED */, "U" /* UNMERGED */), + ...conflicts( + "D" /* DELETED */, + "D" /* DELETED */, + "U" /* UNMERGED */ + ), + ...conflicts( + "U" /* UNMERGED */, + "A" /* ADDED */, + "D" /* DELETED */, + "U" /* UNMERGED */ + ), [ "##", (result, line) => { @@ -16762,6 +17354,7 @@ function statusTask(customArgs) { var ignoredOptions; var init_status = __esm({ "src/lib/tasks/status.ts"() { + "use strict"; init_StatusSummary(); ignoredOptions = ["--null", "-z"]; } @@ -16769,19 +17362,23 @@ var init_status = __esm({ // src/lib/tasks/version.ts function versionResponse(major = 0, minor = 0, patch = 0, agent = "", installed = true) { - return Object.defineProperty({ - major, - minor, - patch, - agent, - installed - }, "toString", { - value() { - return `${this.major}.${this.minor}.${this.patch}`; + return Object.defineProperty( + { + major, + minor, + patch, + agent, + installed }, - configurable: false, - enumerable: false - }); + "toString", + { + value() { + return `${this.major}.${this.minor}.${this.patch}`; + }, + configurable: false, + enumerable: false + } + ); } function notInstalledResponse() { return versionResponse(0, 0, 0, "", false); @@ -16812,15 +17409,25 @@ function versionParser(stdOut) { var NOT_INSTALLED, parsers7; var init_version = __esm({ "src/lib/tasks/version.ts"() { + "use strict"; init_utils(); NOT_INSTALLED = "installed=false"; parsers7 = [ - new LineParser(/version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)); - }), - new LineParser(/version (\d+)\.(\d+)\.(\D+)(.+)?$/, (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); - }) + new LineParser( + /version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign( + result, + versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent) + ); + } + ), + new LineParser( + /version (\d+)\.(\d+)\.(\D+)(.+)?$/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); + } + ) ]; } }); @@ -16833,6 +17440,7 @@ __export(simple_git_api_exports, { var SimpleGitApi; var init_simple_git_api = __esm({ "src/lib/simple-git-api.ts"() { + "use strict"; init_task_callback(); init_change_working_directory(); init_checkout(); @@ -16867,7 +17475,10 @@ var init_simple_git_api = __esm({ }); } add(files) { - return this._runTask(straightThroughStringTask(["add", ...asArray(files)]), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["add", ...asArray(files)]), + trailingFunctionArgument(arguments) + ); } cwd(directory) { const next = trailingFunctionArgument(arguments); @@ -16875,44 +17486,88 @@ var init_simple_git_api = __esm({ return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next); } if (typeof (directory == null ? void 0 : directory.path) === "string") { - return this._runTask(changeWorkingDirectoryTask(directory.path, directory.root && this._executor || void 0), next); + return this._runTask( + changeWorkingDirectoryTask( + directory.path, + directory.root && this._executor || void 0 + ), + next + ); } - return this._runTask(configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), next); + return this._runTask( + configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), + next + ); } hashObject(path, write) { - return this._runTask(hashObjectTask(path, write === true), trailingFunctionArgument(arguments)); + return this._runTask( + hashObjectTask(path, write === true), + trailingFunctionArgument(arguments) + ); } init(bare) { - return this._runTask(initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } merge() { - return this._runTask(mergeTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + mergeTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } mergeFromTo(remote, branch) { if (!(filterString(remote) && filterString(branch))) { - return this._runTask(configurationErrorTask(`Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`)); + return this._runTask( + configurationErrorTask( + `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings` + ) + ); } - return this._runTask(mergeTask([remote, branch, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments, false)); + return this._runTask( + mergeTask([remote, branch, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments, false) + ); } outputHandler(handler) { this._executor.outputHandler = handler; return this; } push() { - const task = pushTask({ - remote: filterType(arguments[0], filterString), - branch: filterType(arguments[1], filterString) - }, getTrailingOptions(arguments)); + const task = pushTask( + { + remote: filterType(arguments[0], filterString), + branch: filterType(arguments[1], filterString) + }, + getTrailingOptions(arguments) + ); return this._runTask(task, trailingFunctionArgument(arguments)); } stash() { - return this._runTask(straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); } status() { - return this._runTask(statusTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + statusTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } }; - Object.assign(SimpleGitApi.prototype, checkout_default(), commit_default(), config_default(), first_commit_default(), grep_default(), log_default(), show_default(), version_default()); + Object.assign( + SimpleGitApi.prototype, + checkout_default(), + commit_default(), + config_default(), + first_commit_default(), + grep_default(), + log_default(), + show_default(), + version_default() + ); } }); @@ -16924,6 +17579,7 @@ __export(scheduler_exports, { var import_promise_deferred2, createScheduledTask, Scheduler; var init_scheduler = __esm({ "src/lib/runners/scheduler.ts"() { + "use strict"; init_utils(); import_promise_deferred2 = __nccwpck_require__(9819); init_git_logger(); @@ -16949,7 +17605,12 @@ var init_scheduler = __esm({ } schedule() { if (!this.pending.length || this.running.length >= this.concurrency) { - this.logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); + this.logger( + `Schedule attempt ignored, pending=%s running=%s concurrency=%s`, + this.pending.length, + this.running.length, + this.concurrency + ); return; } const task = append(this.running, this.pending.shift()); @@ -16980,6 +17641,7 @@ function applyPatchTask(patches, customArgs) { } var init_apply_patch = __esm({ "src/lib/tasks/apply-patch.ts"() { + "use strict"; init_task(); } }); @@ -17002,6 +17664,7 @@ function branchDeletionFailure(branch) { var BranchDeletionBatch; var init_BranchDeleteSummary = __esm({ "src/lib/responses/BranchDeleteSummary.ts"() { + "use strict"; BranchDeletionBatch = class { constructor() { this.all = []; @@ -17022,6 +17685,7 @@ function hasBranchDeletionError(data, processExitCode) { var deleteSuccessRegex, deleteErrorRegex, parsers8, parseBranchDeletions; var init_parse_branch_delete = __esm({ "src/lib/parsers/parse-branch-delete.ts"() { + "use strict"; init_BranchDeleteSummary(); init_utils(); deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; @@ -17049,6 +17713,7 @@ var init_parse_branch_delete = __esm({ var BranchSummaryResult; var init_BranchSummary = __esm({ "src/lib/responses/BranchSummary.ts"() { + "use strict"; BranchSummaryResult = class { constructor() { this.all = []; @@ -17084,15 +17749,22 @@ function parseBranchSummary(stdOut) { var parsers9; var init_parse_branch = __esm({ "src/lib/parsers/parse-branch.ts"() { + "use strict"; init_BranchSummary(); init_utils(); parsers9 = [ - new LineParser(/^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { - result.push(branchStatus(current), true, name, commit, label); - }), - new LineParser(/^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, (result, [current, name, commit, label]) => { - result.push(branchStatus(current), false, name, commit, label); - }) + new LineParser( + /^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, + (result, [current, name, commit, label]) => { + result.push(branchStatus(current), true, name, commit, label); + } + ), + new LineParser( + new RegExp("^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$", "s"), + (result, [current, name, commit, label]) => { + result.push(branchStatus(current), false, name, commit, label); + } + ) ]; } }); @@ -17164,13 +17836,17 @@ function deleteBranchTask(branch, forceDelete = false) { if (!hasBranchDeletionError(String(error), exitCode)) { return fail(error); } - throw new GitResponseError(task.parser(bufferToString(stdOut), bufferToString(stdErr)), String(error)); + throw new GitResponseError( + task.parser(bufferToString(stdOut), bufferToString(stdErr)), + String(error) + ); } }; return task; } var init_branch = __esm({ "src/lib/tasks/branch.ts"() { + "use strict"; init_git_response_error(); init_parse_branch_delete(); init_parse_branch(); @@ -17182,6 +17858,7 @@ var init_branch = __esm({ var parseCheckIgnore; var init_CheckIgnore = __esm({ "src/lib/responses/CheckIgnore.ts"() { + "use strict"; parseCheckIgnore = (text) => { return text.split(/\n/g).map((line) => line.trim()).filter((file) => !!file); }; @@ -17202,6 +17879,7 @@ function checkIgnoreTask(paths) { } var init_check_ignore = __esm({ "src/lib/tasks/check-ignore.ts"() { + "use strict"; init_CheckIgnore(); } }); @@ -17231,6 +17909,7 @@ function cloneMirrorTask(repo, directory, customArgs) { } var init_clone = __esm({ "src/lib/tasks/clone.ts"() { + "use strict"; init_task(); init_utils(); } @@ -17251,6 +17930,7 @@ function parseFetchResult(stdOut, stdErr) { var parsers10; var init_parse_fetch = __esm({ "src/lib/parsers/parse-fetch.ts"() { + "use strict"; init_utils(); parsers10 = [ new LineParser(/From (.+)$/, (result, [remote]) => { @@ -17273,14 +17953,17 @@ var init_parse_fetch = __esm({ tracking }); }), - new LineParser(/\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, (result, [from, to, name, tracking]) => { - result.updated.push({ - name, - tracking, - to, - from - }); - }) + new LineParser( + /\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, + (result, [from, to, name, tracking]) => { + result.updated.push({ + name, + tracking, + to, + from + }); + } + ) ]; } }); @@ -17310,6 +17993,7 @@ function fetchTask(remote, branch, customArgs) { } var init_fetch = __esm({ "src/lib/tasks/fetch.ts"() { + "use strict"; init_parse_fetch(); init_task(); } @@ -17322,6 +18006,7 @@ function parseMoveResult(stdOut) { var parsers11; var init_parse_move = __esm({ "src/lib/parsers/parse-move.ts"() { + "use strict"; init_utils(); parsers11 = [ new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { @@ -17345,6 +18030,7 @@ function moveTask(from, to) { } var init_move = __esm({ "src/lib/tasks/move.ts"() { + "use strict"; init_parse_move(); init_utils(); } @@ -17367,7 +18053,10 @@ function pullTask(remote, branch, customArgs) { return parsePullResult(stdOut, stdErr); }, onError(result, _error, _done, fail) { - const pullError = parsePullErrorResult(bufferToString(result.stdOut), bufferToString(result.stdErr)); + const pullError = parsePullErrorResult( + bufferToString(result.stdOut), + bufferToString(result.stdErr) + ); if (pullError) { return fail(new GitResponseError(pullError)); } @@ -17377,6 +18066,7 @@ function pullTask(remote, branch, customArgs) { } var init_pull = __esm({ "src/lib/tasks/pull.ts"() { + "use strict"; init_git_response_error(); init_parse_pull(); init_utils(); @@ -17409,6 +18099,7 @@ function forEach(text, handler) { } var init_GetRemoteSummary = __esm({ "src/lib/responses/GetRemoteSummary.ts"() { + "use strict"; init_utils(); } }); @@ -17422,7 +18113,7 @@ __export(remote_exports, { remoteTask: () => remoteTask, removeRemoteTask: () => removeRemoteTask }); -function addRemoteTask(remoteName, remoteRepo, customArgs = []) { +function addRemoteTask(remoteName, remoteRepo, customArgs) { return straightThroughStringTask(["remote", "add", ...customArgs, remoteName, remoteRepo]); } function getRemotesTask(verbose) { @@ -17436,14 +18127,14 @@ function getRemotesTask(verbose) { parser: verbose ? parseGetRemotesVerbose : parseGetRemotes }; } -function listRemotesTask(customArgs = []) { +function listRemotesTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "ls-remote") { commands.unshift("ls-remote"); } return straightThroughStringTask(commands); } -function remoteTask(customArgs = []) { +function remoteTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "remote") { commands.unshift("remote"); @@ -17455,6 +18146,7 @@ function removeRemoteTask(remoteName) { } var init_remote = __esm({ "src/lib/tasks/remote.ts"() { + "use strict"; init_GetRemoteSummary(); init_task(); } @@ -17468,7 +18160,11 @@ __export(stash_list_exports, { function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; - const parser3 = createListLogSummaryParser(options.splitter, options.fields, logFormatFromCommand(commands)); + const parser3 = createListLogSummaryParser( + options.splitter, + options.fields, + logFormatFromCommand(commands) + ); return validateLogFormatConfig(commands) || { commands, format: "utf-8", @@ -17477,6 +18173,7 @@ function stashListTask(opt = {}, customArgs) { } var init_stash_list = __esm({ "src/lib/tasks/stash-list.ts"() { + "use strict"; init_log_format(); init_parse_list_log_summary(); init_diff(); @@ -17510,6 +18207,7 @@ function updateSubModuleTask(customArgs) { } var init_sub_module = __esm({ "src/lib/tasks/sub-module.ts"() { + "use strict"; init_task(); } }); @@ -17538,6 +18236,7 @@ function toNumber(input) { var TagList, parseTagList; var init_TagList = __esm({ "src/lib/responses/TagList.ts"() { + "use strict"; TagList = class { constructor(all, latest) { this.all = all; @@ -17605,6 +18304,7 @@ function addAnnotatedTagTask(name, tagMessage) { } var init_tag = __esm({ "src/lib/tasks/tag.ts"() { + "use strict"; init_TagList(); } }); @@ -17612,6 +18312,7 @@ var init_tag = __esm({ // src/git.js var require_git = __commonJS({ "src/git.js"(exports2, module2) { + "use strict"; var { GitExecutor: GitExecutor2 } = (init_git_executor(), __toCommonJS(git_executor_exports)); var { SimpleGitApi: SimpleGitApi2 } = (init_simple_git_api(), __toCommonJS(simple_git_api_exports)); var { Scheduler: Scheduler2 } = (init_scheduler(), __toCommonJS(scheduler_exports)); @@ -17661,12 +18362,17 @@ var require_git = __commonJS({ var { addAnnotatedTagTask: addAnnotatedTagTask2, addTagTask: addTagTask2, tagListTask: tagListTask2 } = (init_tag(), __toCommonJS(tag_exports)); var { straightThroughBufferTask: straightThroughBufferTask2, straightThroughStringTask: straightThroughStringTask2 } = (init_task(), __toCommonJS(task_exports)); function Git2(options, plugins) { - this._executor = new GitExecutor2(options.binary, options.baseDir, new Scheduler2(options.maxConcurrentProcesses), plugins); + this._plugins = plugins; + this._executor = new GitExecutor2( + options.baseDir, + new Scheduler2(options.maxConcurrentProcesses), + plugins + ); this._trimmed = options.trimmed; } (Git2.prototype = Object.create(SimpleGitApi2.prototype)).constructor = Git2; Git2.prototype.customBinary = function(command) { - this._executor.binary = command; + this._plugins.reconfigure("binary", command); return this; }; Git2.prototype.env = function(name, value) { @@ -17678,7 +18384,13 @@ var require_git = __commonJS({ return this; }; Git2.prototype.stashList = function(options) { - return this._runTask(stashListTask2(trailingOptionsArgument2(arguments) || {}, filterArray2(options) && options || []), trailingFunctionArgument2(arguments)); + return this._runTask( + stashListTask2( + trailingOptionsArgument2(arguments) || {}, + filterArray2(options) && options || [] + ), + trailingFunctionArgument2(arguments) + ); }; function createCloneTask(api, task, repoPath, localPath) { if (typeof repoPath !== "string") { @@ -17687,10 +18399,16 @@ var require_git = __commonJS({ return task(repoPath, filterType2(localPath, filterString2), getTrailingOptions2(arguments)); } Git2.prototype.clone = function() { - return this._runTask(createCloneTask("clone", cloneTask2, ...arguments), trailingFunctionArgument2(arguments)); + return this._runTask( + createCloneTask("clone", cloneTask2, ...arguments), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.mirror = function() { - return this._runTask(createCloneTask("mirror", cloneMirrorTask2, ...arguments), trailingFunctionArgument2(arguments)); + return this._runTask( + createCloneTask("mirror", cloneMirrorTask2, ...arguments), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.mv = function(from, to) { return this._runTask(moveTask2(from, to), trailingFunctionArgument2(arguments)); @@ -17704,46 +18422,86 @@ var require_git = __commonJS({ }); }; Git2.prototype.pull = function(remote, branch, options, then) { - return this._runTask(pullTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + pullTask2( + filterType2(remote, filterString2), + filterType2(branch, filterString2), + getTrailingOptions2(arguments) + ), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.fetch = function(remote, branch) { - return this._runTask(fetchTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + fetchTask2( + filterType2(remote, filterString2), + filterType2(branch, filterString2), + getTrailingOptions2(arguments) + ), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.silent = function(silence) { - console.warn("simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3"); + console.warn( + "simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3" + ); return this; }; Git2.prototype.tags = function(options, then) { - return this._runTask(tagListTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + tagListTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.rebase = function() { - return this._runTask(straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.reset = function(mode) { - return this._runTask(resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.revert = function(commit) { const next = trailingFunctionArgument2(arguments); if (typeof commit !== "string") { return this._runTask(configurationErrorTask2("Commit must be a string"), next); } - return this._runTask(straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), next); + return this._runTask( + straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), + next + ); }; Git2.prototype.addTag = function(name) { const task = typeof name === "string" ? addTagTask2(name) : configurationErrorTask2("Git.addTag requires a tag name"); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.addAnnotatedTag = function(tagName, tagMessage) { - return this._runTask(addAnnotatedTagTask2(tagName, tagMessage), trailingFunctionArgument2(arguments)); + return this._runTask( + addAnnotatedTagTask2(tagName, tagMessage), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.deleteLocalBranch = function(branchName, forceDelete, then) { - return this._runTask(deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); + return this._runTask( + deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.deleteLocalBranches = function(branchNames, forceDelete, then) { - return this._runTask(deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); + return this._runTask( + deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.branch = function(options, then) { - return this._runTask(branchTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + branchTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.branchLocal = function(then) { return this._runTask(branchLocalTask2(), trailingFunctionArgument2(arguments)); @@ -17760,7 +18518,10 @@ var require_git = __commonJS({ command.push(...getTrailingOptions2(arguments, 0, true)); var next = trailingFunctionArgument2(arguments); if (!command.length) { - return this._runTask(configurationErrorTask2("Raw: must supply one or more command to execute"), next); + return this._runTask( + configurationErrorTask2("Raw: must supply one or more command to execute"), + next + ); } return this._runTask(straightThroughStringTask2(command, this._trimmed), next); }; @@ -17768,19 +18529,34 @@ var require_git = __commonJS({ return this._runTask(addSubModuleTask2(repo, path), trailingFunctionArgument2(arguments)); }; Git2.prototype.submoduleUpdate = function(args, then) { - return this._runTask(updateSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); + return this._runTask( + updateSubModuleTask2(getTrailingOptions2(arguments, true)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.submoduleInit = function(args, then) { - return this._runTask(initSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); + return this._runTask( + initSubModuleTask2(getTrailingOptions2(arguments, true)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.subModule = function(options, then) { - return this._runTask(subModuleTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + subModuleTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.listRemote = function() { - return this._runTask(listRemotesTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + listRemotesTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.addRemote = function(remoteName, remoteRepo, then) { - return this._runTask(addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.removeRemote = function(remoteName, then) { return this._runTask(removeRemoteTask2(remoteName), trailingFunctionArgument2(arguments)); @@ -17789,7 +18565,10 @@ var require_git = __commonJS({ return this._runTask(getRemotesTask2(verbose === true), trailingFunctionArgument2(arguments)); }; Git2.prototype.remote = function(options, then) { - return this._runTask(remoteTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + remoteTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.tag = function(options, then) { const command = getTrailingOptions2(arguments); @@ -17799,17 +18578,29 @@ var require_git = __commonJS({ return this._runTask(straightThroughStringTask2(command), trailingFunctionArgument2(arguments)); }; Git2.prototype.updateServerInfo = function(then) { - return this._runTask(straightThroughStringTask2(["update-server-info"]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["update-server-info"]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.pushTags = function(remote, then) { - const task = pushTagsTask2({ remote: filterType2(remote, filterString2) }, getTrailingOptions2(arguments)); + const task = pushTagsTask2( + { remote: filterType2(remote, filterString2) }, + getTrailingOptions2(arguments) + ); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.rm = function(files) { - return this._runTask(straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.rmKeepLocal = function(files) { - return this._runTask(straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.catFile = function(options, then) { return this._catFile("utf-8", arguments); @@ -17822,7 +18613,10 @@ var require_git = __commonJS({ var command = ["cat-file"]; var options = args[0]; if (typeof options === "string") { - return this._runTask(configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), handler); + return this._runTask( + configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), + handler + ); } if (Array.isArray(options)) { command.push.apply(command, options); @@ -17831,25 +18625,38 @@ var require_git = __commonJS({ return this._runTask(task, handler); }; Git2.prototype.diff = function(options, then) { - const task = filterString2(options) ? configurationErrorTask2("git.diff: supplying options as a single string is no longer supported, switch to an array of strings") : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); + const task = filterString2(options) ? configurationErrorTask2( + "git.diff: supplying options as a single string is no longer supported, switch to an array of strings" + ) : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.diffSummary = function() { - return this._runTask(diffSummaryTask2(getTrailingOptions2(arguments, 1)), trailingFunctionArgument2(arguments)); + return this._runTask( + diffSummaryTask2(getTrailingOptions2(arguments, 1)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.applyPatch = function(patches) { - const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2(`git.applyPatch requires one or more string patches as the first argument`) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); + const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2( + `git.applyPatch requires one or more string patches as the first argument` + ) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.revparse = function() { const commands = ["rev-parse", ...getTrailingOptions2(arguments, true)]; - return this._runTask(straightThroughStringTask2(commands, true), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(commands, true), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.clean = function(mode, options, then) { const usingCleanOptionsArray = isCleanOptionsArray2(mode); const cleanMode = usingCleanOptionsArray && mode.join("") || filterType2(mode, filterString2) || ""; const customArgs = getTrailingOptions2([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); - return this._runTask(cleanWithOptionsTask2(cleanMode, customArgs), trailingFunctionArgument2(arguments)); + return this._runTask( + cleanWithOptionsTask2(cleanMode, customArgs), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.exec = function(then) { const task = { @@ -17867,10 +18674,16 @@ var require_git = __commonJS({ return this; }; Git2.prototype.checkIgnore = function(pathnames, then) { - return this._runTask(checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), trailingFunctionArgument2(arguments)); + return this._runTask( + checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.checkIsRepo = function(checkType, then) { - return this._runTask(checkIsRepoTask2(filterType2(checkType, filterString2)), trailingFunctionArgument2(arguments)); + return this._runTask( + checkIsRepoTask2(filterType2(checkType, filterString2)), + trailingFunctionArgument2(arguments) + ); }; module2.exports = Git2; } @@ -17893,10 +18706,17 @@ function gitExportFactory(factory) { return Object.assign(factory.bind(null), api_exports); } function gitInstanceFactory(baseDir, options) { + var _a2; const plugins = new PluginStore(); - const config = createInstanceConfig(baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, options); + const config = createInstanceConfig( + baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, + options + ); if (!folderExists(config.baseDir)) { - throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); + throw new GitConstructError( + config, + `Cannot use simple-git on a directory that does not exist` + ); } if (Array.isArray(config.config)) { plugins.add(commandConfigPrefixingPlugin(config.config)); @@ -17910,11 +18730,13 @@ function gitInstanceFactory(baseDir, options) { config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); config.errors && plugins.add(errorDetectionPlugin(config.errors)); + customBinaryPlugin(plugins, config.binary, (_a2 = config.unsafe) == null ? void 0 : _a2.allowUnsafeCustomBinary); return new Git(config, plugins); } var Git; var init_git_factory = __esm({ "src/lib/git-factory.ts"() { + "use strict"; init_api(); init_plugins(); init_suffix_paths_plugin(); @@ -17942,22 +18764,27 @@ function gitP(...args) { function chainReturn() { return chain; } - const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce((api, name) => { - const isAsync = functionNamesPromiseApi.includes(name); - const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); - const alternative = isAsync ? chainReturn : builderReturn; - Object.defineProperty(api, name, { - enumerable: false, - configurable: false, - value: git ? valid : alternative - }); - return api; - }, {}); + const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce( + (api, name) => { + const isAsync = functionNamesPromiseApi.includes(name); + const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); + const alternative = isAsync ? chainReturn : builderReturn; + Object.defineProperty(api, name, { + enumerable: false, + configurable: false, + value: git ? valid : alternative + }); + return api; + }, + {} + ); return promiseApi; function asyncWrapper(fn, git2) { return function(...args2) { if (typeof args2[args2.length] === "function") { - throw new TypeError("Promise interface requires that handlers are not supplied inline, trailing function not allowed in call to " + fn); + throw new TypeError( + "Promise interface requires that handlers are not supplied inline, trailing function not allowed in call to " + fn + ); } return chain.then(function() { return new Promise(function(resolve, reject) { @@ -17992,6 +18819,7 @@ function toError(error) { var functionNamesBuilderApi, functionNamesPromiseApi; var init_promise_wrapped = __esm({ "src/lib/runners/promise-wrapped.ts"() { + "use strict"; init_git_response_error(); init_git_factory(); functionNamesBuilderApi = ["customBinary", "env", "outputHandler", "silent"]; @@ -30271,6 +31099,9 @@ function httpRedirectFetch (fetchParams, response) { // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name request.headersList.delete('authorization') + // https://fetch.spec.whatwg.org/#authentication-entries + request.headersList.delete('proxy-authorization', true) + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. request.headersList.delete('cookie') request.headersList.delete('host') @@ -41967,7 +42798,7 @@ Dicer.prototype._write = function (data, encoding, cb) { if (this._headerFirst && this._isPreamble) { if (!this._part) { this._part = new PartStream(this._partOpts) - if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() } + if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() } } const r = this._hparser.push(data) if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() } @@ -42024,7 +42855,7 @@ Dicer.prototype._oninfo = function (isMatch, data, start, end) { } } if (this._dashes === 2) { - if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) } + if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) } this.reset() this._finished = true // no more parts will be added @@ -42042,7 +42873,13 @@ Dicer.prototype._oninfo = function (isMatch, data, start, end) { this._part._read = function (n) { self._unpause() } - if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() } + if (this._isPreamble && this.listenerCount('preamble') !== 0) { + this.emit('preamble', this._part) + } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) { + this.emit('part', this._part) + } else { + this._ignore() + } if (!this._isPreamble) { this._inHeader = true } } if (data && start < end && !this._ignoreData) { @@ -42725,7 +43562,7 @@ function Multipart (boy, cfg) { ++nfiles - if (!boy._events.file) { + if (boy.listenerCount('file') === 0) { self.parser._ignore() return } @@ -43254,7 +44091,7 @@ const decoders = { if (textDecoders.has(this.toString())) { try { return textDecoders.get(this).decode(data) - } catch (e) { } + } catch {} } return typeof data === 'string' ? data diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 1c44141..20cd587 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -1844,7 +1844,7 @@ class HttpClient { if (this._keepAlive && useProxy) { agent = this._proxyAgent; } - if (this._keepAlive && !useProxy) { + if (!useProxy) { agent = this._agent; } // if agent is already assigned use that agent. @@ -1876,16 +1876,12 @@ class HttpClient { agent = tunnelAgent(agentOptions); this._proxyAgent = agent; } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { + // if tunneling agent isn't assigned create a new agent + if (!agent) { const options = { keepAlive: this._keepAlive, maxSockets }; agent = usingSsl ? new https.Agent(options) : new http.Agent(options); this._agent = agent; } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } if (usingSsl && this._ignoreSslError) { // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options @@ -2778,7 +2774,29 @@ exports.commitRules = void 0; const diagnose_it_1 = __nccwpck_require__(4657); const chalk_1 = __importDefault(__nccwpck_require__(8818)); const commit_1 = __nccwpck_require__(8065); +/** + * Checks whether the provided string is a noun. + * A noun is defined as a single word which can be capitalized or contain hyphens, therefore + * it will not support multi-word nouns (i.e. New York). + * + * @param str String to check + * @returns True if the string is a noun, false otherwise. + * + * @internal + */ function isNoun(str) { + return /^[A-Za-z][a-z]*(-[A-Za-z][a-z]*)*$/.test(str); +} +/** + * Validates whether the provided type valid. + * A valid type is defined as a single word, all lowercase, no spaces, and no special characters. + * + * @param str String to check + * @returns True if the string is a valid type, false otherwise. + * + * @internal + */ +function isValidType(str) { return !str.trim().includes(" ") && !/[^a-z]/i.test(str.trim()); } function highlightString(str, substring) { @@ -2830,9 +2848,10 @@ class CC01 { // Validated with EC-02 } else { - // Ensure that we have a noun - if (!isNoun(commit.type.value)) + // Ensure that we have a valid type (single word, no spaces, no special characters) + if (!isValidType(commit.type.value)) { errors.push(createDiagnosticsMessage(commit, this.description, "which consists of a noun", "type")); + } // Validate for spacing after the type if (commit.type.value.trim() !== commit.type.value) { if (commit.scope.value) { @@ -2993,7 +3012,7 @@ class EC02 { const expectedTypes = ["feat", "fix", ...Array.from(uniqueAddedTypes)]; this.description = `Commits ${uniqueAddedTypes.size > 0 ? "MUST" : "MAY"} be prefixed with a type, which consists of one of the configured values (${expectedTypes.join(", ")}).`; if (commit.type.value === undefined || - !isNoun(commit.type.value) || + !isValidType(commit.type.value) || expectedTypes.includes(commit.type.value.toLowerCase().trimEnd())) { return []; } @@ -4489,7 +4508,7 @@ var import_graphql = __nccwpck_require__(8467); var import_auth_token = __nccwpck_require__(334); // pkg/dist-src/version.js -var VERSION = "5.0.2"; +var VERSION = "5.1.0"; // pkg/dist-src/index.js var noop = () => { @@ -5198,7 +5217,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "9.1.5"; +var VERSION = "9.2.1"; // pkg/dist-src/normalize-paginated-list-response.js function normalizePaginatedListResponse(response) { @@ -5359,6 +5378,8 @@ var paginatingEndpoints = [ "GET /orgs/{org}/members/{username}/codespaces", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", + "GET /orgs/{org}/organization-roles/{role_id}/teams", + "GET /orgs/{org}/organization-roles/{role_id}/users", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", @@ -5595,7 +5616,7 @@ __export(dist_src_exports, { module.exports = __toCommonJS(dist_src_exports); // pkg/dist-src/version.js -var VERSION = "10.2.0"; +var VERSION = "10.4.1"; // pkg/dist-src/generated/endpoints.js var Endpoints = { @@ -5722,6 +5743,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" ], getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomOidcSubClaimForRepo: [ + "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], getEnvironmentPublicKey: [ "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key" ], @@ -5874,6 +5898,9 @@ var Endpoints = { setCustomLabelsForSelfHostedRunnerForRepo: [ "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" ], + setCustomOidcSubClaimForRepo: [ + "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], setGithubActionsDefaultWorkflowPermissionsOrganization: [ "PUT /orgs/{org}/actions/permissions/workflow" ], @@ -5943,6 +5970,7 @@ var Endpoints = { listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], markNotificationsAsRead: ["PUT /notifications"], markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], setThreadSubscription: [ @@ -6219,10 +6247,10 @@ var Endpoints = { updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] }, copilot: { - addCopilotForBusinessSeatsForTeams: [ + addCopilotSeatsForTeams: [ "POST /orgs/{org}/copilot/billing/selected_teams" ], - addCopilotForBusinessSeatsForUsers: [ + addCopilotSeatsForUsers: [ "POST /orgs/{org}/copilot/billing/selected_users" ], cancelCopilotSeatAssignmentForTeams: [ @@ -6535,10 +6563,24 @@ var Endpoints = { } ] }, + oidc: { + getOidcCustomSubTemplateForOrg: [ + "GET /orgs/{org}/actions/oidc/customization/sub" + ], + updateOidcCustomSubTemplateForOrg: [ + "PUT /orgs/{org}/actions/oidc/customization/sub" + ] + }, orgs: { addSecurityManagerTeam: [ "PUT /orgs/{org}/security-managers/teams/{team_slug}" ], + assignTeamToOrgRole: [ + "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + assignUserToOrgRole: [ + "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], blockUser: ["PUT /orgs/{org}/blocks/{username}"], cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], @@ -6547,6 +6589,7 @@ var Endpoints = { convertMemberToOutsideCollaborator: [ "PUT /orgs/{org}/outside_collaborators/{username}" ], + createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], createInvitation: ["POST /orgs/{org}/invitations"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomPropertiesValuesForRepos: [ @@ -6557,6 +6600,9 @@ var Endpoints = { ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], + deleteCustomOrganizationRole: [ + "DELETE /orgs/{org}/organization-roles/{role_id}" + ], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], enableOrDisableSecurityProductOnAllOrgRepos: [ "POST /orgs/{org}/{security_product}/{enablement}" @@ -6568,6 +6614,7 @@ var Endpoints = { ], getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], getWebhookDelivery: [ @@ -6583,6 +6630,12 @@ var Endpoints = { listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], listMembers: ["GET /orgs/{org}/members"], listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], listPatGrantRepositories: [ "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" @@ -6597,6 +6650,9 @@ var Endpoints = { listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], listWebhooks: ["GET /orgs/{org}/hooks"], + patchCustomOrganizationRole: [ + "PATCH /orgs/{org}/organization-roles/{role_id}" + ], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" @@ -6621,6 +6677,18 @@ var Endpoints = { reviewPatGrantRequestsInBulk: [ "POST /orgs/{org}/personal-access-token-requests" ], + revokeAllOrgRolesTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" + ], + revokeAllOrgRolesUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}" + ], + revokeOrgRoleTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + revokeOrgRoleUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], setPublicMembershipForAuthenticatedUser: [ "PUT /orgs/{org}/public_members/{username}" @@ -6911,6 +6979,9 @@ var Endpoints = { {}, { mapToData: "users" } ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], checkAutomatedSecurityFixes: [ "GET /repos/{owner}/{repo}/automated-security-fixes" ], @@ -6946,12 +7017,15 @@ var Endpoints = { createForAuthenticatedUser: ["POST /user/repos"], createFork: ["POST /repos/{owner}/{repo}/forks"], createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateCustomPropertiesValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], createOrUpdateEnvironment: [ "PUT /repos/{owner}/{repo}/environments/{environment_name}" ], createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], createOrgRuleset: ["POST /orgs/{org}/rulesets"], - createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], createPagesSite: ["POST /repos/{owner}/{repo}/pages"], createRelease: ["POST /repos/{owner}/{repo}/releases"], createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], @@ -7104,6 +7178,9 @@ var Endpoints = { getOrgRulesets: ["GET /orgs/{org}/rulesets"], getPages: ["GET /repos/{owner}/{repo}/pages"], getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: [ + "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" + ], getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], getPullRequestReviewProtection: [ @@ -7314,6 +7391,9 @@ var Endpoints = { ] }, securityAdvisories: { + createFork: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" + ], createPrivateVulnerabilityReport: [ "POST /repos/{owner}/{repo}/security-advisories/reports" ], @@ -7805,7 +7885,7 @@ var import_endpoint = __nccwpck_require__(9440); var import_universal_user_agent = __nccwpck_require__(5030); // pkg/dist-src/version.js -var VERSION = "8.1.6"; +var VERSION = "8.2.0"; // pkg/dist-src/is-plain-object.js function isPlainObject(value) { @@ -7949,11 +8029,17 @@ async function getResponseData(response) { function toErrorMessage(data) { if (typeof data === "string") return data; + let suffix; + if ("documentation_url" in data) { + suffix = ` - ${data.documentation_url}`; + } else { + suffix = ""; + } if ("message" in data) { if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`; } - return data.message; + return `${data.message}${suffix}`; } return `Unknown error: ${JSON.stringify(data)}`; } @@ -11008,6 +11094,8 @@ Diff.prototype = { /*istanbul ignore end*/ diff: function diff(oldString, newString) { /*istanbul ignore start*/ + var _options$timeout; + var /*istanbul ignore end*/ options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; @@ -11046,68 +11134,104 @@ Diff.prototype = { maxEditLength = Math.min(maxEditLength, options.maxEditLength); } + var maxExecutionTime = + /*istanbul ignore start*/ + (_options$timeout = + /*istanbul ignore end*/ + options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : Infinity; + var abortAfterTimestamp = Date.now() + maxExecutionTime; var bestPath = [{ - newPos: -1, - components: [] + oldPos: -1, + lastComponent: undefined }]; // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + var newPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) { // Identity per the equality and tokenizer return done([{ value: this.join(newString), count: newString.length }]); - } // Main worker method. checks all permutations of a given edit length for acceptance. - + } // Once we hit the right edge of the edit graph on some diagonal k, we can + // definitely reach the end of the edit graph in no more than k edits, so + // there's no point in considering any moves to diagonal k+1 any more (from + // which we're guaranteed to need at least k+1 more edits). + // Similarly, once we've reached the bottom of the edit graph, there's no + // point considering moves to lower diagonals. + // We record this fact by setting minDiagonalToConsider and + // maxDiagonalToConsider to some finite value once we've hit the edge of + // the edit graph. + // This optimization is not faithful to the original algorithm presented in + // Myers's paper, which instead pointlessly extends D-paths off the end of + // the edit graph - see page 7 of Myers's paper which notes this point + // explicitly and illustrates it with a diagram. This has major performance + // implications for some common scenarios. For instance, to compute a diff + // where the new text simply appends d characters on the end of the + // original text of length n, the true Myers algorithm will take O(n+d^2) + // time while this optimization needs only O(n+d) time. + + + var minDiagonalToConsider = -Infinity, + maxDiagonalToConsider = Infinity; // Main worker method. checks all permutations of a given edit length for acceptance. function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + for (var diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) { var basePath = /*istanbul ignore start*/ void 0 /*istanbul ignore end*/ ; + var removePath = bestPath[diagonalPath - 1], + addPath = bestPath[diagonalPath + 1]; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - - if (addPath) { + if (removePath) { // No one else is going to attempt to use this value, clear it bestPath[diagonalPath - 1] = undefined; } - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + var canAdd = false; + + if (addPath) { + // what newPos will be after we do an insertion: + var addPathNewPos = addPath.oldPos - diagonalPath; + canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen; + } + + var canRemove = removePath && removePath.oldPos + 1 < oldLen; if (!canAdd && !canRemove) { // If this path is a terminal then prune bestPath[diagonalPath] = undefined; continue; } // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin + // path whose position in the old string is the farthest from the origin // and does not pass the bounds of the diff graph + // TODO: Remove the `+ 1` here to make behavior match Myers algorithm + // and prefer to order removals before insertions. - if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); + if (!canRemove || canAdd && removePath.oldPos + 1 < addPath.oldPos) { + basePath = self.addToPath(addPath, true, undefined, 0); } else { - basePath = addPath; // No need to clone, we've pulled it from the list - - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); + basePath = self.addToPath(removePath, undefined, true, 1); } - _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done + newPos = self.extractCommon(basePath, newString, oldString, diagonalPath); - if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { - return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) { + // If we have hit the end of both strings, then we are done + return done(buildValues(self, basePath.lastComponent, newString, oldString, self.useLongestToken)); } else { - // Otherwise track this path as a potential candidate and continue. bestPath[diagonalPath] = basePath; + + if (basePath.oldPos + 1 >= oldLen) { + maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1); + } + + if (newPos + 1 >= newLen) { + minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1); + } } } @@ -11121,7 +11245,7 @@ Diff.prototype = { if (callback) { (function exec() { setTimeout(function () { - if (editLength > maxEditLength) { + if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) { return callback(); } @@ -11131,7 +11255,7 @@ Diff.prototype = { }, 0); })(); } else { - while (editLength <= maxEditLength) { + while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) { var ret = execEditLength(); if (ret) { @@ -11144,23 +11268,29 @@ Diff.prototype = { /*istanbul ignore start*/ /*istanbul ignore end*/ - pushComponent: function pushComponent(components, added, removed) { - var last = components[components.length - 1]; + addToPath: function addToPath(path, added, removed, oldPosInc) { + var last = path.lastComponent; if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = { - count: last.count + 1, - added: added, - removed: removed + return { + oldPos: path.oldPos + oldPosInc, + lastComponent: { + count: last.count + 1, + added: added, + removed: removed, + previousComponent: last.previousComponent + } }; } else { - components.push({ - count: 1, - added: added, - removed: removed - }); + return { + oldPos: path.oldPos + oldPosInc, + lastComponent: { + count: 1, + added: added, + removed: removed, + previousComponent: last + } + }; } }, @@ -11170,8 +11300,8 @@ Diff.prototype = { extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { var newLen = newString.length, oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, + oldPos = basePath.oldPos, + newPos = oldPos - diagonalPath, commonCount = 0; while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { @@ -11181,13 +11311,14 @@ Diff.prototype = { } if (commonCount) { - basePath.components.push({ - count: commonCount - }); + basePath.lastComponent = { + count: commonCount, + previousComponent: basePath.lastComponent + }; } - basePath.newPos = newPos; - return oldPos; + basePath.oldPos = oldPos; + return newPos; }, /*istanbul ignore start*/ @@ -11238,7 +11369,20 @@ Diff.prototype = { } }; -function buildValues(diff, components, newString, oldString, useLongestToken) { +function buildValues(diff, lastComponent, newString, oldString, useLongestToken) { + // First we convert our linked list of components in reverse order to an + // array in the right order: + var components = []; + var nextComponent; + + while (lastComponent) { + components.push(lastComponent); + nextComponent = lastComponent.previousComponent; + delete lastComponent.previousComponent; + lastComponent = nextComponent; + } + + components.reverse(); var componentPos = 0, componentLen = components.length, newPos = 0, @@ -11281,23 +11425,16 @@ function buildValues(diff, components, newString, oldString, useLongestToken) { // This is only available for string mode. - var lastComponent = components[componentLen - 1]; + var finalComponent = components[componentLen - 1]; - if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { - components[componentLen - 2].value += lastComponent.value; + if (componentLen > 1 && typeof finalComponent.value === 'string' && (finalComponent.added || finalComponent.removed) && diff.equals('', finalComponent.value)) { + components[componentLen - 2].value += finalComponent.value; components.pop(); } return components; } - -function clonePath(path) { - return { - newPos: path.newPos, - components: path.components.slice(0) - }; -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJiZXN0UGF0aCIsIm5ld1BvcyIsImNvbXBvbmVudHMiLCJvbGRQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJiYXNlUGF0aCIsImFkZFBhdGgiLCJyZW1vdmVQYXRoIiwiY2FuQWRkIiwiY2FuUmVtb3ZlIiwiY2xvbmVQYXRoIiwicHVzaENvbXBvbmVudCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsImFkZGVkIiwicmVtb3ZlZCIsImxhc3QiLCJwdXNoIiwiY29tbW9uQ291bnQiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjb21wYXJhdG9yIiwiaWdub3JlQ2FzZSIsInRvTG93ZXJDYXNlIiwiYXJyYXkiLCJpIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBvbmVudCIsInNsaWNlIiwibWFwIiwib2xkVmFsdWUiLCJ0bXAiLCJsYXN0Q29tcG9uZW50IiwicG9wIiwicGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQWUsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsSUFBSSxDQUFDQyxTQUFMLEdBQWlCO0FBQUE7O0FBQUE7QUFDZkMsRUFBQUEsSUFEZSxnQkFDVkMsU0FEVSxFQUNDQyxTQURELEVBQzBCO0FBQUE7QUFB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R0FBMkJNLEdBQTNCO0FBQ0Q7QUFDRjtBQUNGLEdBdkMyRSxDQXlDNUU7QUFDQTtBQUNBOzs7QUFDQSxNQUFJQyxhQUFhLEdBQUd4QyxVQUFVLENBQUNrQyxZQUFZLEdBQUcsQ0FBaEIsQ0FBOUI7O0FBQ0EsTUFBSUEsWUFBWSxHQUFHLENBQWYsSUFDRyxPQUFPTSxhQUFhLENBQUN2RCxLQUFyQixLQUErQixRQURsQyxLQUVJdUQsYUFBYSxDQUFDdEIsS0FBZCxJQUF1QnNCLGFBQWEsQ0FBQ3JCLE9BRnpDLEtBR0d6QyxJQUFJLENBQUM2QyxNQUFMLENBQVksRUFBWixFQUFnQmlCLGFBQWEsQ0FBQ3ZELEtBQTlCLENBSFAsRUFHNkM7QUFDM0NlLElBQUFBLFVBQVUsQ0FBQ2tDLFlBQVksR0FBRyxDQUFoQixDQUFWLENBQTZCakQsS0FBN0IsSUFBc0N1RCxhQUFhLENBQUN2RCxLQUFwRDtBQUNBZSxJQUFBQSxVQUFVLENBQUN5QyxHQUFYO0FBQ0Q7O0FBRUQsU0FBT3pDLFVBQVA7QUFDRDs7QUFFRCxTQUFTWSxTQUFULENBQW1COEIsSUFBbkIsRUFBeUI7QUFDdkIsU0FBTztBQUFFM0MsSUFBQUEsTUFBTSxFQUFFMkMsSUFBSSxDQUFDM0MsTUFBZjtBQUF1QkMsSUFBQUEsVUFBVSxFQUFFMEMsSUFBSSxDQUFDMUMsVUFBTCxDQUFnQm9DLEtBQWhCLENBQXNCLENBQXRCO0FBQW5DLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBuZXdQb3M6IC0xLCBjb21wb25lbnRzOiBbXSB9XTtcblxuICAgIC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbGV0IG9sZFBvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIDApO1xuICAgIGlmIChiZXN0UGF0aFswXS5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICByZXR1cm4gZG9uZShbe3ZhbHVlOiB0aGlzLmpvaW4obmV3U3RyaW5nKSwgY291bnQ6IG5ld1N0cmluZy5sZW5ndGh9XSk7XG4gICAgfVxuXG4gICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuICAgIGZ1bmN0aW9uIGV4ZWNFZGl0TGVuZ3RoKCkge1xuICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gLTEgKiBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggPD0gZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgbGV0IGJhc2VQYXRoO1xuICAgICAgICBsZXQgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgb2xkUG9zID0gKHJlbW92ZVBhdGggPyByZW1vdmVQYXRoLm5ld1BvcyA6IDApIC0gZGlhZ29uYWxQYXRoO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gb2xkUG9zICYmIG9sZFBvcyA8IG9sZExlbjtcbiAgICAgICAgaWYgKCFjYW5BZGQgJiYgIWNhblJlbW92ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgIC8vIGFuZCBkb2VzIG5vdCBwYXNzIHRoZSBib3VuZHMgb2YgdGhlIGRpZmYgZ3JhcGhcbiAgICAgICAgaWYgKCFjYW5BZGQgfHwgKGNhblJlbW92ZSAmJiBhZGRQYXRoLm5ld1BvcyA8IHJlbW92ZVBhdGgubmV3UG9zKSkge1xuICAgICAgICAgIGJhc2VQYXRoID0gY2xvbmVQYXRoKHJlbW92ZVBhdGgpO1xuICAgICAgICAgIHNlbGYucHVzaENvbXBvbmVudChiYXNlUGF0aC5jb21wb25lbnRzLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VQYXRoID0gYWRkUGF0aDsgLy8gTm8gbmVlZCB0byBjbG9uZSwgd2UndmUgcHVsbGVkIGl0IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9sZFBvcyA9IHNlbGYuZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgaWYgKGJhc2VQYXRoLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUoYnVpbGRWYWx1ZXMoc2VsZiwgYmFzZVBhdGguY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHNlbGYudXNlTG9uZ2VzdFRva2VuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIHRyYWNrIHRoaXMgcGF0aCBhcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZGl0TGVuZ3RoKys7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAvLyBzeW5jIGFuZCBhc3luYyBtb2RlIHdoaWNoIGlzIG5ldmVyIGZ1bi4gTG9vcHMgb3ZlciBleGVjRWRpdExlbmd0aCB1bnRpbCBhIHZhbHVlXG4gICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgICAgfSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICBsZXQgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHVzaENvbXBvbmVudChjb21wb25lbnRzLCBhZGRlZCwgcmVtb3ZlZCkge1xuICAgIGxldCBsYXN0ID0gY29tcG9uZW50c1tjb21wb25lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjbG9uZSBoZXJlIGFzIHRoZSBjb21wb25lbnQgY2xvbmUgb3BlcmF0aW9uIGlzIGp1c3RcbiAgICAgIC8vIGFzIHNoYWxsb3cgYXJyYXkgY2xvbmVcbiAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXSA9IHtjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe2NvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfSk7XG4gICAgfVxuICB9LFxuICBleHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKSB7XG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsXG4gICAgICAgIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGgsXG4gICAgICAgIG5ld1BvcyA9IGJhc2VQYXRoLm5ld1BvcyxcbiAgICAgICAgb2xkUG9zID0gbmV3UG9zIC0gZGlhZ29uYWxQYXRoLFxuXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcbiAgICB3aGlsZSAobmV3UG9zICsgMSA8IG5ld0xlbiAmJiBvbGRQb3MgKyAxIDwgb2xkTGVuICYmIHRoaXMuZXF1YWxzKG5ld1N0cmluZ1tuZXdQb3MgKyAxXSwgb2xkU3RyaW5nW29sZFBvcyArIDFdKSkge1xuICAgICAgbmV3UG9zKys7XG4gICAgICBvbGRQb3MrKztcbiAgICAgIGNvbW1vbkNvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNvbW1vbkNvdW50KSB7XG4gICAgICBiYXNlUGF0aC5jb21wb25lbnRzLnB1c2goe2NvdW50OiBjb21tb25Db3VudH0pO1xuICAgIH1cblxuICAgIGJhc2VQYXRoLm5ld1BvcyA9IG5ld1BvcztcbiAgICByZXR1cm4gb2xkUG9zO1xuICB9LFxuXG4gIGVxdWFscyhsZWZ0LCByaWdodCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gICAgICAgIHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHkoYXJyYXkpIHtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgY2FzdElucHV0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICB0b2tlbml6ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJyk7XG4gIH0sXG4gIGpvaW4oY2hhcnMpIHtcbiAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJ1aWxkVmFsdWVzKGRpZmYsIGNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCB1c2VMb25nZXN0VG9rZW4pIHtcbiAgbGV0IGNvbXBvbmVudFBvcyA9IDAsXG4gICAgICBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aCxcbiAgICAgIG5ld1BvcyA9IDAsXG4gICAgICBvbGRQb3MgPSAwO1xuXG4gIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgbGV0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB1c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gbmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24odmFsdWUsIGkpIHtcbiAgICAgICAgICBsZXQgb2xkVmFsdWUgPSBvbGRTdHJpbmdbb2xkUG9zICsgaV07XG4gICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG4gICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBDb21tb24gY2FzZVxuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG9sZFN0cmluZy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gUmV2ZXJzZSBhZGQgYW5kIHJlbW92ZSBzbyByZW1vdmVzIGFyZSBvdXRwdXQgZmlyc3QgdG8gbWF0Y2ggY29tbW9uIGNvbnZlbnRpb25cbiAgICAgIC8vIFRoZSBkaWZmaW5nIGFsZ29yaXRobSBpcyB0aWVkIHRvIGFkZCB0aGVuIHJlbW92ZSBvdXRwdXQgYW5kIHRoaXMgaXMgdGhlIHNpbXBsZXN0XG4gICAgICAvLyByb3V0ZSB0byBnZXQgdGhlIGRlc2lyZWQgb3V0cHV0IHdpdGggbWluaW1hbCBvdmVyaGVhZC5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICBsZXQgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZSBoYW5kbGUgZm9yIHdoZW4gb25lIHRlcm1pbmFsIGlzIGlnbm9yZWQgKGkuZS4gd2hpdGVzcGFjZSkuXG4gIC8vIEZvciB0aGlzIGNhc2Ugd2UgbWVyZ2UgdGhlIHRlcm1pbmFsIGludG8gdGhlIHByaW9yIHN0cmluZyBhbmQgZHJvcCB0aGUgY2hhbmdlLlxuICAvLyBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdHJpbmcgbW9kZS5cbiAgbGV0IGxhc3RDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAmJiAobGFzdENvbXBvbmVudC5hZGRlZCB8fCBsYXN0Q29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgbGFzdENvbXBvbmVudC52YWx1ZSkpIHtcbiAgICBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDJdLnZhbHVlICs9IGxhc3RDb21wb25lbnQudmFsdWU7XG4gICAgY29tcG9uZW50cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBjb21wb25lbnRzO1xufVxuXG5mdW5jdGlvbiBjbG9uZVBhdGgocGF0aCkge1xuICByZXR1cm4geyBuZXdQb3M6IHBhdGgubmV3UG9zLCBjb21wb25lbnRzOiBwYXRoLmNvbXBvbmVudHMuc2xpY2UoMCkgfTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsIk1hdGgiLCJtaW4iLCJtYXhFeGVjdXRpb25UaW1lIiwidGltZW91dCIsIkluZmluaXR5IiwiYWJvcnRBZnRlclRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJiZXN0UGF0aCIsIm9sZFBvcyIsImxhc3RDb21wb25lbnQiLCJuZXdQb3MiLCJleHRyYWN0Q29tbW9uIiwiam9pbiIsImNvdW50IiwibWluRGlhZ29uYWxUb0NvbnNpZGVyIiwibWF4RGlhZ29uYWxUb0NvbnNpZGVyIiwiZXhlY0VkaXRMZW5ndGgiLCJkaWFnb25hbFBhdGgiLCJtYXgiLCJiYXNlUGF0aCIsInJlbW92ZVBhdGgiLCJhZGRQYXRoIiwiY2FuQWRkIiwiYWRkUGF0aE5ld1BvcyIsImNhblJlbW92ZSIsImFkZFRvUGF0aCIsImJ1aWxkVmFsdWVzIiwidXNlTG9uZ2VzdFRva2VuIiwiZXhlYyIsInJldCIsInBhdGgiLCJhZGRlZCIsInJlbW92ZWQiLCJvbGRQb3NJbmMiLCJsYXN0IiwicHJldmlvdXNDb21wb25lbnQiLCJjb21tb25Db3VudCIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNvbXBhcmF0b3IiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJhcnJheSIsImkiLCJwdXNoIiwic3BsaXQiLCJjaGFycyIsImNvbXBvbmVudHMiLCJuZXh0Q29tcG9uZW50IiwicmV2ZXJzZSIsImNvbXBvbmVudFBvcyIsImNvbXBvbmVudExlbiIsImNvbXBv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IERpZmYoKSB7fVxuXG5EaWZmLnByb3RvdHlwZSA9IHtcbiAgZGlmZihvbGRTdHJpbmcsIG5ld1N0cmluZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTsgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcblxuICAgIG9sZFN0cmluZyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcpKTtcbiAgICBuZXdTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUobmV3U3RyaW5nKSk7XG5cbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCwgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aDtcbiAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgbGV0IG1heEVkaXRMZW5ndGggPSBuZXdMZW4gKyBvbGRMZW47XG4gICAgaWYob3B0aW9ucy5tYXhFZGl0TGVuZ3RoKSB7XG4gICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICB9XG4gICAgY29uc3QgbWF4RXhlY3V0aW9uVGltZSA9IG9wdGlvbnMudGltZW91dCA/PyBJbmZpbml0eTtcbiAgICBjb25zdCBhYm9ydEFmdGVyVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIG1heEV4ZWN1dGlvblRpbWU7XG5cbiAgICBsZXQgYmVzdFBhdGggPSBbeyBvbGRQb3M6IC0xLCBsYXN0Q29tcG9uZW50OiB1bmRlZmluZWQgfV07XG5cbiAgICAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgIGxldCBuZXdQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmVzdFBhdGhbMF0sIG5ld1N0cmluZywgb2xkU3RyaW5nLCAwKTtcbiAgICBpZiAoYmVzdFBhdGhbMF0ub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgcmV0dXJuIGRvbmUoW3t2YWx1ZTogdGhpcy5qb2luKG5ld1N0cmluZyksIGNvdW50OiBuZXdTdHJpbmcubGVuZ3RofV0pO1xuICAgIH1cblxuICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBlZGl0IGdyYXBoIG9uIHNvbWUgZGlhZ29uYWwgaywgd2UgY2FuXG4gICAgLy8gZGVmaW5pdGVseSByZWFjaCB0aGUgZW5kIG9mIHRoZSBlZGl0IGdyYXBoIGluIG5vIG1vcmUgdGhhbiBrIGVkaXRzLCBzb1xuICAgIC8vIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gY29uc2lkZXJpbmcgYW55IG1vdmVzIHRvIGRpYWdvbmFsIGsrMSBhbnkgbW9yZSAoZnJvbVxuICAgIC8vIHdoaWNoIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbmVlZCBhdCBsZWFzdCBrKzEgbW9yZSBlZGl0cykuXG4gICAgLy8gU2ltaWxhcmx5LCBvbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdCBncmFwaCwgdGhlcmUncyBub1xuICAgIC8vIHBvaW50IGNvbnNpZGVyaW5nIG1vdmVzIHRvIGxvd2VyIGRpYWdvbmFscy5cbiAgICAvLyBXZSByZWNvcmQgdGhpcyBmYWN0IGJ5IHNldHRpbmcgbWluRGlhZ29uYWxUb0NvbnNpZGVyIGFuZFxuICAgIC8vIG1heERpYWdvbmFsVG9Db25zaWRlciB0byBzb21lIGZpbml0ZSB2YWx1ZSBvbmNlIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZlxuICAgIC8vIHRoZSBlZGl0IGdyYXBoLlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIG5vdCBmYWl0aGZ1bCB0byB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHByZXNlbnRlZCBpblxuICAgIC8vIE15ZXJzJ3MgcGFwZXIsIHdoaWNoIGluc3RlYWQgcG9pbnRsZXNzbHkgZXh0ZW5kcyBELXBhdGhzIG9mZiB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGVkaXQgZ3JhcGggLSBzZWUgcGFnZSA3IG9mIE15ZXJzJ3MgcGFwZXIgd2hpY2ggbm90ZXMgdGhpcyBwb2ludFxuICAgIC8vIGV4cGxpY2l0bHkgYW5kIGlsbHVzdHJhdGVzIGl0IHdpdGggYSBkaWFncmFtLiBUaGlzIGhhcyBtYWpvciBwZXJmb3JtYW5jZVxuICAgIC8vIGltcGxpY2F0aW9ucyBmb3Igc29tZSBjb21tb24gc2NlbmFyaW9zLiBGb3IgaW5zdGFuY2UsIHRvIGNvbXB1dGUgYSBkaWZmXG4gICAgLy8gd2hlcmUgdGhlIG5ldyB0ZXh0IHNpbXBseSBhcHBlbmRzIGQgY2hhcmFjdGVycyBvbiB0aGUgZW5kIG9mIHRoZVxuICAgIC8vIG9yaWdpbmFsIHRleHQgb2YgbGVuZ3RoIG4sIHRoZSB0cnVlIE15ZXJzIGFsZ29yaXRobSB3aWxsIHRha2UgTyhuK2ReMilcbiAgICAvLyB0aW1lIHdoaWxlIHRoaXMgb3B0aW1pemF0aW9uIG5lZWRzIG9ubHkgTyhuK2QpIHRpbWUuXG4gICAgbGV0IG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IC1JbmZpbml0eSwgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gSW5maW5pdHk7XG5cbiAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7XG4gICAgICAgIGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpO1xuICAgICAgICBkaWFnb25hbFBhdGggKz0gMlxuICAgICAgKSB7XG4gICAgICAgIGxldCBiYXNlUGF0aDtcbiAgICAgICAgbGV0IHJlbW92ZVBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSxcbiAgICAgICAgICAgIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXTtcbiAgICAgICAgaWYgKHJlbW92ZVBhdGgpIHtcbiAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNhbkFkZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIHdoYXQgbmV3UG9zIHdpbGwgYmUgYWZ0ZXIgd2UgZG8gYW4gaW5zZXJ0aW9uOlxuICAgICAgICAgIGNvbnN0IGFkZFBhdGhOZXdQb3MgPSBhZGRQYXRoLm9sZFBvcyAtIGRpYWdvbmFsUGF0aDtcbiAgICAgICAgICBjYW5BZGQgPSBhZGRQYXRoICYmIDAgPD0gYWRkUGF0aE5ld1BvcyAmJiBhZGRQYXRoTmV3UG9zIDwgbmV3TGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhlIGArIDFgIGhlcmUgdG8gbWFrZSBiZWhhdmlvciBtYXRjaCBNeWVycyBhbGdvcml0aG1cbiAgICAgICAgLy8gICAgICAgYW5kIHByZWZlciB0byBvcmRlciByZW1vdmFscyBiZWZvcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgaWYgKCFjYW5SZW1vdmUgfHwgKGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyArIDEgPCBhZGRQYXRoLm9sZFBvcykpIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IHNlbGYuYWRkVG9QYXRoKGFkZFBhdGgsIHRydWUsIHVuZGVmaW5lZCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBzZWxmLmFkZFRvUGF0aChyZW1vdmVQYXRoLCB1bmRlZmluZWQsIHRydWUsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3UG9zID0gc2VsZi5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgZGlhZ29uYWxQYXRoKTtcblxuICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgICAgICAgIG1heERpYWdvbmFsVG9Db25zaWRlciA9IE1hdGgubWluKG1heERpYWdvbmFsVG9Db25zaWRlciwgZGlhZ29uYWxQYXRoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLCBvciB1bnRpbCB0aGUgZWRpdCBsZW5ndGggZXhjZWVkcyBvcHRpb25zLm1heEVkaXRMZW5ndGggKGlmIGdpdmVuKSxcbiAgICAvLyBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCB8fCBEYXRlLm5vdygpID4gYWJvcnRBZnRlclRpbWVzdGFtcCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICBleGVjKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgIH0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGggJiYgRGF0ZS5ub3coKSA8PSBhYm9ydEFmdGVyVGltZXN0YW1wKSB7XG4gICAgICAgIGxldCByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhZGRUb1BhdGgocGF0aCwgYWRkZWQsIHJlbW92ZWQsIG9sZFBvc0luYykge1xuICAgIGxldCBsYXN0ID0gcGF0aC5sYXN0Q29tcG9uZW50O1xuICAgIGlmIChsYXN0ICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb2xkUG9zOiBwYXRoLm9sZFBvcyArIG9sZFBvc0luYyxcbiAgICAgICAgbGFzdENvbXBvbmVudDoge2NvdW50OiBsYXN0LmNvdW50ICsgMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkLCBwcmV2aW91c0NvbXBvbmVudDogbGFzdC5wcmV2aW91c0NvbXBvbmVudCB9XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICBsYXN0Q29tcG9uZW50OiB7Y291bnQ6IDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCwgcHJldmlvdXNDb21wb25lbnQ6IGxhc3QgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG4gIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICBsZXQgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkUG9zID0gYmFzZVBhdGgub2xkUG9zLFxuICAgICAgICBuZXdQb3MgPSBvbGRQb3MgLSBkaWFnb25hbFBhdGgsXG5cbiAgICAgICAgY29tbW9uQ291bnQgPSAwO1xuICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICBuZXdQb3MrKztcbiAgICAgIG9sZFBvcysrO1xuICAgICAgY29tbW9uQ291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY29tbW9uQ291bnQpIHtcbiAgICAgIGJhc2VQYXRoLmxhc3RDb21wb25lbnQgPSB7Y291bnQ6IGNvbW1vbkNvdW50LCBwcmV2aW91c0NvbXBvbmVudDogYmFzZVBhdGgubGFzdENvbXBvbmVudH07XG4gICAgfVxuXG4gICAgYmFzZVBhdGgub2xkUG9zID0gb2xkUG9zO1xuICAgIHJldHVybiBuZXdQb3M7XG4gIH0sXG5cbiAgZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHRcbiAgICAgICAgfHwgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlICYmIGxlZnQudG9Mb3dlckNhc2UoKSA9PT0gcmlnaHQudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmVFbXB0eShhcnJheSkge1xuICAgIGxldCByZXQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBjYXN0SW5wdXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG4gIHRva2VuaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgfSxcbiAgam9pbihjaGFycykge1xuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgbGFzdENvbXBvbmVudCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICAvLyBGaXJzdCB3ZSBjb252ZXJ0IG91ciBsaW5rZWQgbGlzdCBvZiBjb21wb25lbnRzIGluIHJldmVyc2Ugb3JkZXIgdG8gYW5cbiAgLy8gYXJyYXkgaW4gdGhlIHJpZ2h0IG9yZGVyOlxuICBjb25zdCBjb21wb25lbnRzID0gW107XG4gIGxldCBuZXh0Q29tcG9uZW50O1xuICB3aGlsZSAobGFzdENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudHMucHVzaChsYXN0Q29tcG9uZW50KTtcbiAgICBuZXh0Q29tcG9uZW50ID0gbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBkZWxldGUgbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICBsYXN0Q29tcG9uZW50ID0gbmV4dENvbXBvbmVudDtcbiAgfVxuICBjb21wb25lbnRzLnJldmVyc2UoKTtcblxuICBsZXQgY29tcG9uZW50UG9zID0gMCxcbiAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuICAgICAgbmV3UG9zID0gMCxcbiAgICAgIG9sZFBvcyA9IDA7XG5cbiAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkICYmIHVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICBsZXQgdmFsdWUgPSBuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbih2YWx1ZSwgaSkge1xuICAgICAgICAgIGxldCBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihuZXdTdHJpbmcuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIH1cbiAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7XG5cbiAgICAgIC8vIENvbW1vbiBjYXNlXG4gICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCkge1xuICAgICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4ob2xkU3RyaW5nLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICBvbGRQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuXG4gICAgICAvLyBSZXZlcnNlIGFkZCBhbmQgcmVtb3ZlIHNvIHJlbW92ZXMgYXJlIG91dHB1dCBmaXJzdCB0byBtYXRjaCBjb21tb24gY29udmVudGlvblxuICAgICAgLy8gVGhlIGRpZmZpbmcgYWxnb3JpdGhtIGlzIHRpZWQgdG8gYWRkIHRoZW4gcmVtb3ZlIG91dHB1dCBhbmQgdGhpcyBpcyB0aGUgc2ltcGxlc3RcbiAgICAgIC8vIHJvdXRlIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgd2l0aCBtaW5pbWFsIG92ZXJoZWFkLlxuICAgICAgaWYgKGNvbXBvbmVudFBvcyAmJiBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdLmFkZGVkKSB7XG4gICAgICAgIGxldCB0bXAgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvcyAtIDFdID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudFBvc10gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsZSBmb3Igd2hlbiBvbmUgdGVybWluYWwgaXMgaWdub3JlZCAoaS5lLiB3aGl0ZXNwYWNlKS5cbiAgLy8gRm9yIHRoaXMgY2FzZSB3ZSBtZXJnZSB0aGUgdGVybWluYWwgaW50byB0aGUgcHJpb3Igc3RyaW5nIGFuZCBkcm9wIHRoZSBjaGFuZ2UuXG4gIC8vIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cmluZyBtb2RlLlxuICBsZXQgZmluYWxDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudExlbiAtIDFdO1xuICBpZiAoY29tcG9uZW50TGVuID4gMVxuICAgICAgJiYgdHlwZW9mIGZpbmFsQ29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgJiYgKGZpbmFsQ29tcG9uZW50LmFkZGVkIHx8IGZpbmFsQ29tcG9uZW50LnJlbW92ZWQpXG4gICAgICAmJiBkaWZmLmVxdWFscygnJywgZmluYWxDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBmaW5hbENvbXBvbmVudC52YWx1ZTtcbiAgICBjb21wb25lbnRzLnBvcCgpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0= /***/ }), @@ -11612,6 +11749,11 @@ exports.lineDiff = lineDiff; /*istanbul ignore end*/ lineDiff.tokenize = function (value) { + if (this.options.stripTrailingCr) { + // remove one \r before \n to match GNU diff's --strip-trailing-cr behavior + value = value.replace(/\r\n/g, '\n'); + } + var retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line @@ -11659,7 +11801,7 @@ function diffTrimmedLines(oldStr, newStr, callback) { }); return lineDiff.diff(oldStr, newStr, options); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJkaWZmTGluZXMiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiLCJkaWZmVHJpbW1lZExpbmVzIiwiZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxJQUFNQSxRQUFRLEdBQUc7QUFBSUM7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUEsQ0FBSixFQUFqQjs7Ozs7O0FBQ1BELFFBQVEsQ0FBQ0UsUUFBVCxHQUFvQixVQUFTQyxLQUFULEVBQWdCO0FBQ2xDLE1BQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsTUFDSUMsZ0JBQWdCLEdBQUdGLEtBQUssQ0FBQ0csS0FBTixDQUFZLFdBQVosQ0FEdkIsQ0FEa0MsQ0FJbEM7O0FBQ0EsTUFBSSxDQUFDRCxnQkFBZ0IsQ0FBQ0EsZ0JBQWdCLENBQUNFLE1BQWpCLEdBQTBCLENBQTNCLENBQXJCLEVBQW9EO0FBQ2xERixJQUFBQSxnQkFBZ0IsQ0FBQ0csR0FBakI7QUFDRCxHQVBpQyxDQVNsQzs7O0FBQ0EsT0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHSixnQkFBZ0IsQ0FBQ0UsTUFBckMsRUFBNkNFLENBQUMsRUFBOUMsRUFBa0Q7QUFDaEQsUUFBSUMsSUFBSSxHQUFHTCxnQkFBZ0IsQ0FBQ0ksQ0FBRCxDQUEzQjs7QUFFQSxRQUFJQSxDQUFDLEdBQUcsQ0FBSixJQUFTLENBQUMsS0FBS0UsT0FBTCxDQUFhQyxjQUEzQixFQUEyQztBQUN6Q1IsTUFBQUEsUUFBUSxDQUFDQSxRQUFRLENBQUNHLE1BQVQsR0FBa0IsQ0FBbkIsQ0FBUixJQUFpQ0csSUFBakM7QUFDRCxLQUZELE1BRU87QUFDTCxVQUFJLEtBQUtDLE9BQUwsQ0FBYUUsZ0JBQWpCLEVBQW1DO0FBQ2pDSCxRQUFBQSxJQUFJLEdBQUdBLElBQUksQ0FBQ0ksSUFBTCxFQUFQO0FBQ0Q7O0FBQ0RWLE1BQUFBLFFBQVEsQ0FBQ1csSUFBVCxDQUFjTCxJQUFkO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPTixRQUFQO0FBQ0QsQ0F4QkQ7O0FBMEJPLFNBQVNZLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsUUFBbkMsRUFBNkM7QUFBRSxTQUFPbkIsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDs7QUFDaEcsU0FBU0UsZ0JBQVQsQ0FBMEJKLE1BQTFCLEVBQWtDQyxNQUFsQyxFQUEwQ0MsUUFBMUMsRUFBb0Q7QUFDekQsTUFBSVIsT0FBTztBQUFHO0FBQUE7QUFBQTs7QUFBQVc7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2IsUUFBUSxDQUFDb0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QlAsT0FBOUIsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2VuZXJhdGVPcHRpb25zfSBmcm9tICcuLi91dGlsL3BhcmFtcyc7XG5cbmV4cG9ydCBjb25zdCBsaW5lRGlmZiA9IG5ldyBEaWZmKCk7XG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGxldCByZXRMaW5lcyA9IFtdLFxuICAgICAgbGluZXNBbmROZXdsaW5lcyA9IHZhbHVlLnNwbGl0KC8oXFxufFxcclxcbikvKTtcblxuICAvLyBJZ25vcmUgdGhlIGZpbmFsIGVtcHR5IHRva2VuIHRoYXQgb2NjdXJzIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGEgbmV3IGxpbmVcbiAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICBsaW5lc0FuZE5ld2xpbmVzLnBvcCgpO1xuICB9XG5cbiAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG4gICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXRMaW5lcztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIGNhbGxiYWNrKSB7IHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICBsZXQgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhjYWxsYmFjaywge2lnbm9yZVdoaXRlc3BhY2U6IHRydWV9KTtcbiAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsibGluZURpZmYiLCJEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzdHJpcFRyYWlsaW5nQ3IiLCJyZXBsYWNlIiwicmV0TGluZXMiLCJsaW5lc0FuZE5ld2xpbmVzIiwic3BsaXQiLCJsZW5ndGgiLCJwb3AiLCJpIiwibGluZSIsIm5ld2xpbmVJc1Rva2VuIiwiaWdub3JlV2hpdGVzcGFjZSIsInRyaW0iLCJwdXNoIiwiZGlmZkxpbmVzIiwib2xkU3RyIiwibmV3U3RyIiwiY2FsbGJhY2siLCJkaWZmIiwiZGlmZlRyaW1tZWRMaW5lcyIsImdlbmVyYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O0FBRU8sSUFBTUEsUUFBUSxHQUFHO0FBQUlDO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBO0FBQUFBLENBQUosRUFBakI7Ozs7OztBQUNQRCxRQUFRLENBQUNFLFFBQVQsR0FBb0IsVUFBU0MsS0FBVCxFQUFnQjtBQUNsQyxNQUFHLEtBQUtDLE9BQUwsQ0FBYUMsZUFBaEIsRUFBaUM7QUFDL0I7QUFDQUYsSUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNHLE9BQU4sQ0FBYyxPQUFkLEVBQXVCLElBQXZCLENBQVI7QUFDRDs7QUFFRCxNQUFJQyxRQUFRLEdBQUcsRUFBZjtBQUFBLE1BQ0lDLGdCQUFnQixHQUFHTCxLQUFLLENBQUNNLEtBQU4sQ0FBWSxXQUFaLENBRHZCLENBTmtDLENBU2xDOztBQUNBLE1BQUksQ0FBQ0QsZ0JBQWdCLENBQUNBLGdCQUFnQixDQUFDRSxNQUFqQixHQUEwQixDQUEzQixDQUFyQixFQUFvRDtBQUNsREYsSUFBQUEsZ0JBQWdCLENBQUNHLEdBQWpCO0FBQ0QsR0FaaUMsQ0FjbEM7OztBQUNBLE9BQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0osZ0JBQWdCLENBQUNFLE1BQXJDLEVBQTZDRSxDQUFDLEVBQTlDLEVBQWtEO0FBQ2hELFFBQUlDLElBQUksR0FBR0wsZ0JBQWdCLENBQUNJLENBQUQsQ0FBM0I7O0FBRUEsUUFBSUEsQ0FBQyxHQUFHLENBQUosSUFBUyxDQUFDLEtBQUtSLE9BQUwsQ0FBYVUsY0FBM0IsRUFBMkM7QUFDekNQLE1BQUFBLFFBQVEsQ0FBQ0EsUUFBUSxDQUFDRyxNQUFULEdBQWtCLENBQW5CLENBQVIsSUFBaUNHLElBQWpDO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsVUFBSSxLQUFLVCxPQUFMLENBQWFXLGdCQUFqQixFQUFtQztBQUNqQ0YsUUFBQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNHLElBQUwsRUFBUDtBQUNEOztBQUNEVCxNQUFBQSxRQUFRLENBQUNVLElBQVQsQ0FBY0osSUFBZDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT04sUUFBUDtBQUNELENBN0JEOztBQStCTyxTQUFTVyxTQUFULENBQW1CQyxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLFFBQW5DLEVBQTZDO0FBQUUsU0FBT3JCLFFBQVEsQ0FBQ3NCLElBQVQsQ0FBY0gsTUFBZCxFQUFzQkMsTUFBdEIsRUFBOEJDLFFBQTlCLENBQVA7QUFBaUQ7O0FBQ2hHLFNBQVNFLGdCQUFULENBQTBCSixNQUExQixFQUFrQ0MsTUFBbEMsRUFBMENDLFFBQTFDLEVBQW9EO0FBQ3pELE1BQUlqQixPQUFPO0FBQUc7QUFBQTtBQUFBOztBQUFBb0I7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQUE7QUFBQTtBQUFBLEdBQWdCSCxRQUFoQixFQUEwQjtBQUFDTixJQUFBQSxnQkFBZ0IsRUFBRTtBQUFuQixHQUExQixDQUFkO0FBQ0EsU0FBT2YsUUFBUSxDQUFDc0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmhCLE9BQTlCLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge2dlbmVyYXRlT3B0aW9uc30gZnJvbSAnLi4vdXRpbC9wYXJhbXMnO1xuXG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgRGlmZigpO1xubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZih0aGlzLm9wdGlvbnMuc3RyaXBUcmFpbGluZ0NyKSB7XG4gICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gIH1cblxuICBsZXQgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cbiAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgbGV0IG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiJdfQ== /***/ }), @@ -11929,6 +12071,12 @@ Object.defineProperty(exports, "merge", ({ return _merge.merge; } })); +Object.defineProperty(exports, "reversePatch", ({ + enumerable: true, + get: function get() { + return _reverse.reversePatch; + } +})); Object.defineProperty(exports, "structuredPatch", ({ enumerable: true, get: function get() { @@ -11947,6 +12095,12 @@ Object.defineProperty(exports, "createPatch", ({ return _create.createPatch; } })); +Object.defineProperty(exports, "formatPatch", ({ + enumerable: true, + get: function get() { + return _create.formatPatch; + } +})); Object.defineProperty(exports, "convertChangesToDMP", ({ enumerable: true, get: function get() { @@ -12027,6 +12181,12 @@ _merge = __nccwpck_require__(2640) /*istanbul ignore end*/ ; +var +/*istanbul ignore start*/ +_reverse = __nccwpck_require__(1794) +/*istanbul ignore end*/ +; + var /*istanbul ignore start*/ _create = __nccwpck_require__(4543) @@ -12048,7 +12208,7 @@ _xml = __nccwpck_require__(6982) /*istanbul ignore start*/ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /*istanbul ignore end*/ -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBTZWUgTElDRU5TRSBmaWxlIGZvciB0ZXJtcyBvZiB1c2UgKi9cblxuLypcbiAqIFRleHQgZGlmZiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBUElTOlxuICogSnNEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBKc0RpZmYuZGlmZldvcmRzOiBXb3JkIChhcyBkZWZpbmVkIGJ5IFxcYiByZWdleCkgZGlmZiB3aGljaCBpZ25vcmVzIHdoaXRlc3BhY2VcbiAqIEpzRGlmZi5kaWZmTGluZXM6IExpbmUgYmFzZWQgZGlmZlxuICpcbiAqIEpzRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtzdHJ1Y3R1cmVkUGF0Y2gsIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsIGNyZWF0ZVBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGFwcGx5UGF0Y2gsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgcGFyc2VQYXRjaCxcbiAgbWVyZ2UsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIFNlZSBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zIG9mIHVzZSAqL1xuXG4vKlxuICogVGV4dCBkaWZmIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoaXMgbGlicmFyeSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIEFQSXM6XG4gKiBEaWZmLmRpZmZDaGFyczogQ2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBkaWZmXG4gKiBEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG4gKiBEaWZmLmRpZmZMaW5lczogTGluZSBiYXNlZCBkaWZmXG4gKlxuICogRGlmZi5kaWZmQ3NzOiBEaWZmIHRhcmdldGVkIGF0IENTUyBjb250ZW50XG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uIHByb3Bvc2VkIGluXG4gKiBcIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9uc1wiIChNeWVycywgMTk4NikuXG4gKiBodHRwOi8vY2l0ZXNlZXJ4LmlzdC5wc3UuZWR1L3ZpZXdkb2Mvc3VtbWFyeT9kb2k9MTAuMS4xLjQuNjkyN1xuICovXG5pbXBvcnQgRGlmZiBmcm9tICcuL2RpZmYvYmFzZSc7XG5pbXBvcnQge2RpZmZDaGFyc30gZnJvbSAnLi9kaWZmL2NoYXJhY3Rlcic7XG5pbXBvcnQge2RpZmZXb3JkcywgZGlmZldvcmRzV2l0aFNwYWNlfSBmcm9tICcuL2RpZmYvd29yZCc7XG5pbXBvcnQge2RpZmZMaW5lcywgZGlmZlRyaW1tZWRMaW5lc30gZnJvbSAnLi9kaWZmL2xpbmUnO1xuaW1wb3J0IHtkaWZmU2VudGVuY2VzfSBmcm9tICcuL2RpZmYvc2VudGVuY2UnO1xuXG5pbXBvcnQge2RpZmZDc3N9IGZyb20gJy4vZGlmZi9jc3MnO1xuaW1wb3J0IHtkaWZmSnNvbiwgY2Fub25pY2FsaXplfSBmcm9tICcuL2RpZmYvanNvbic7XG5cbmltcG9ydCB7ZGlmZkFycmF5c30gZnJvbSAnLi9kaWZmL2FycmF5JztcblxuaW1wb3J0IHthcHBseVBhdGNoLCBhcHBseVBhdGNoZXN9IGZyb20gJy4vcGF0Y2gvYXBwbHknO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhdGNoL3BhcnNlJztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJy4vcGF0Y2gvbWVyZ2UnO1xuaW1wb3J0IHtyZXZlcnNlUGF0Y2h9IGZyb20gJy4vcGF0Y2gvcmV2ZXJzZSc7XG5pbXBvcnQge3N0cnVjdHVyZWRQYXRjaCwgY3JlYXRlVHdvRmlsZXNQYXRjaCwgY3JlYXRlUGF0Y2gsIGZvcm1hdFBhdGNofSBmcm9tICcuL3BhdGNoL2NyZWF0ZSc7XG5cbmltcG9ydCB7Y29udmVydENoYW5nZXNUb0RNUH0gZnJvbSAnLi9jb252ZXJ0L2RtcCc7XG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9YTUx9IGZyb20gJy4vY29udmVydC94bWwnO1xuXG5leHBvcnQge1xuICBEaWZmLFxuXG4gIGRpZmZDaGFycyxcbiAgZGlmZldvcmRzLFxuICBkaWZmV29yZHNXaXRoU3BhY2UsXG4gIGRpZmZMaW5lcyxcbiAgZGlmZlRyaW1tZWRMaW5lcyxcbiAgZGlmZlNlbnRlbmNlcyxcblxuICBkaWZmQ3NzLFxuICBkaWZmSnNvbixcblxuICBkaWZmQXJyYXlzLFxuXG4gIHN0cnVjdHVyZWRQYXRjaCxcbiAgY3JlYXRlVHdvRmlsZXNQYXRjaCxcbiAgY3JlYXRlUGF0Y2gsXG4gIGZvcm1hdFBhdGNoLFxuICBhcHBseVBhdGNoLFxuICBhcHBseVBhdGNoZXMsXG4gIHBhcnNlUGF0Y2gsXG4gIG1lcmdlLFxuICByZXZlcnNlUGF0Y2gsXG4gIGNvbnZlcnRDaGFuZ2VzVG9ETVAsXG4gIGNvbnZlcnRDaGFuZ2VzVG9YTUwsXG4gIGNhbm9uaWNhbGl6ZVxufTtcbiJdfQ== /***/ }), @@ -12207,7 +12367,7 @@ function applyPatch(source, uniDiff) { var line = _hunk.lines[j], operation = line.length > 0 ? line[0] : ' ', content = line.length > 0 ? line.substr(1) : line, - delimiter = _hunk.linedelimiters[j]; + delimiter = _hunk.linedelimiters && _hunk.linedelimiters[j] || '\n'; if (operation === ' ') { _toPos++; @@ -12294,7 +12454,7 @@ function applyPatches(uniDiff, options) { processIndex(); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7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QUNEOztBQUVELE1BQUlnRCxZQUFZLEdBQUcsQ0FBbkI7O0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxLQUFLLEdBQUdsRCxPQUFPLENBQUNnRCxZQUFZLEVBQWIsQ0FBbkI7O0FBQ0EsUUFBSSxDQUFDRSxLQUFMLEVBQVk7QUFDVixhQUFPakQsT0FBTyxDQUFDa0QsUUFBUixFQUFQO0FBQ0Q7O0FBRURsRCxJQUFBQSxPQUFPLENBQUNtRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFRCxVQUFJRSxjQUFjLEdBQUd6RCxVQUFVLENBQUN3RCxJQUFELEVBQU9KLEtBQVAsRUFBY2pELE9BQWQsQ0FBL0I7QUFDQUEsTUFBQUEsT0FBTyxDQUFDdUQsT0FBUixDQUFnQk4sS0FBaEIsRUFBdUJLLGNBQXZCLEVBQXVDLFVBQVNGLEdBQVQsRUFBYztBQUNuRCxZQUFJQSxHQUFKLEVBQVM7QUFDUCxpQkFBT3BELE9BQU8sQ0FBQ2tELFFBQVIsQ0FBaUJFLEdBQWpCLENBQVA7QUFDRDs7QUFFREosUUFBQUEsWUFBWTtBQUNiLE9BTkQ7QUFPRCxLQWJEO0FBY0Q7O0FBQ0RBLEVBQUFBLFlBQVk7QUFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJwYXJzZVBhdGNoIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiRXJyb3IiLCJsaW5lcyIsInNwbGl0IiwiZGVsaW1pdGVycyIsIm1hdGNoIiwiaHVua3MiLCJjb21wYXJlTGluZSIsImxpbmVOdW1iZXIiLCJsaW5lIiwib3BlcmF0aW9uIiwicGF0Y2hDb250ZW50IiwiZXJyb3JDb3VudCIsImZ1enpGYWN0b3IiLCJtaW5MaW5lIiwib2Zmc2V0IiwicmVtb3ZlRU9GTkwiLCJhZGRFT0ZOTCIsImh1bmtGaXRzIiwiaHVuayIsInRvUG9zIiwiaiIsImNvbnRlbnQiLCJzdWJzdHIiLCJpIiwibWF4TGluZSIsIm9sZExpbmVzIiwibG9jYWxPZmZzZXQiLCJvbGRTdGFydCIsIml0ZXJhdG9yIiwiZGlzdGFuY2VJdGVyYXRvciIsInVuZGVmaW5lZCIsImRpZmZPZmZzZXQiLCJuZXdMaW5lcyIsImRlbGltaXRlciIsImxpbmVkZWxpbWl0ZXJzIiwic3BsaWNlIiwicHJldmlvdXNPcGVyYXRpb24iLCJwb3AiLCJwdXNoIiwiX2siLCJqb2luIiwiYXBwbHlQYXRjaGVzIiwiY3VycmVudEluZGV4IiwicHJvY2Vzc0luZGV4IiwiaW5kZXgiLCJjb21wbGV0ZSIsImxvYWRGaWxlIiwiZXJyIiwiZGF0YSIsInVwZGF0ZWRDb250ZW50IiwicGF0Y2hlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7QUFFTyxTQUFTQSxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsT0FBNUIsRUFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJOztBQUN4RCxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7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QUFBO0FBQUFBO0FBQUE7QUFBQSxLQUFXRixPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJZ0QsWUFBWSxHQUFHLENBQW5COztBQUNBLFdBQVNDLFlBQVQsR0FBd0I7QUFDdEIsUUFBSUMsS0FBSyxHQUFHbEQsT0FBTyxDQUFDZ0QsWUFBWSxFQUFiLENBQW5COztBQUNBLFFBQUksQ0FBQ0UsS0FBTCxFQUFZO0FBQ1YsYUFBT2pELE9BQU8sQ0FBQ2tELFFBQVIsRUFBUDtBQUNEOztBQUVEbEQsSUFBQUEsT0FBTyxDQUFDbUQsUUFBUixDQUFpQkYsS0FBakIsRUFBd0IsVUFBU0csR0FBVCxFQUFjQyxJQUFkLEVBQW9CO0FBQzFDLFVBQUlELEdBQUosRUFBUztBQUNQLGVBQU9wRCxPQUFPLENBQUNrRCxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUUsY0FBYyxHQUFHekQsVUFBVSxDQUFDd0QsSUFBRCxFQUFPSixLQUFQLEVBQWNqRCxPQUFkLENBQS9CO0FBQ0FBLE1BQUFBLE9BQU8sQ0FBQ3VELE9BQVIsQ0FBZ0JOLEtBQWhCLEVBQXVCSyxjQUF2QixFQUF1QyxVQUFTRixHQUFULEVBQWM7QUFDbkQsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9wRCxPQUFPLENBQUNrRCxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRURKLFFBQUFBLFlBQVk7QUFDYixPQU5EO0FBT0QsS0FiRDtBQWNEOztBQUNEQSxFQUFBQSxZQUFZO0FBQ2IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3BhcnNlUGF0Y2h9IGZyb20gJy4vcGFyc2UnO1xuaW1wb3J0IGRpc3RhbmNlSXRlcmF0b3IgZnJvbSAnLi4vdXRpbC9kaXN0YW5jZS1pdGVyYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVBhdGNoKHNvdXJjZSwgdW5pRGlmZiwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHVuaURpZmYpKSB7XG4gICAgaWYgKHVuaURpZmYubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcHBseVBhdGNoIG9ubHkgd29ya3Mgd2l0aCBhIHNpbmdsZSBpbnB1dC4nKTtcbiAgICB9XG5cbiAgICB1bmlEaWZmID0gdW5pRGlmZlswXTtcbiAgfVxuXG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBpbnB1dFxuICBsZXQgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcblxuICAgICAgY29tcGFyZUxpbmUgPSBvcHRpb25zLmNvbXBhcmVMaW5lIHx8ICgobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpID0+IGxpbmUgPT09IHBhdGNoQ29udGVudCksXG4gICAgICBlcnJvckNvdW50ID0gMCxcbiAgICAgIGZ1enpGYWN0b3IgPSBvcHRpb25zLmZ1enpGYWN0b3IgfHwgMCxcbiAgICAgIG1pbkxpbmUgPSAwLFxuICAgICAgb2Zmc2V0ID0gMCxcblxuICAgICAgcmVtb3ZlRU9GTkwsXG4gICAgICBhZGRFT0ZOTDtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGh1bmtGaXRzKGh1bmssIHRvUG9zKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBodW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBsZXQgbGluZSA9IGh1bmsubGluZXNbal0sXG4gICAgICAgICAgb3BlcmF0aW9uID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcpLFxuICAgICAgICAgIGNvbnRlbnQgPSAobGluZS5sZW5ndGggPiAwID8gbGluZS5zdWJzdHIoMSkgOiBsaW5lKTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG4gICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG9Qb3MrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIG1heExpbmUgPSBsaW5lcy5sZW5ndGggLSBodW5rLm9sZExpbmVzLFxuICAgICAgICBsb2NhbE9mZnNldCA9IDAsXG4gICAgICAgIHRvUG9zID0gb2Zmc2V0ICsgaHVuay5vbGRTdGFydCAtIDE7XG5cbiAgICBsZXQgaXRlcmF0b3IgPSBkaXN0YW5jZUl0ZXJhdG9yKHRvUG9zLCBtaW5MaW5lLCBtYXhMaW5lKTtcblxuICAgIGZvciAoOyBsb2NhbE9mZnNldCAhPT0gdW5kZWZpbmVkOyBsb2NhbE9mZnNldCA9IGl0ZXJhdG9yKCkpIHtcbiAgICAgIGlmIChodW5rRml0cyhodW5rLCB0b1BvcyArIGxvY2FsT2Zmc2V0KSkge1xuICAgICAgICBodW5rLm9mZnNldCA9IG9mZnNldCArPSBsb2NhbE9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxvY2FsT2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbG93ZXIgdGV4dCBsaW1pdCB0byBlbmQgb2YgdGhlIGN1cnJlbnQgaHVuaywgc28gbmV4dCBvbmVzIGRvbid0IHRyeVxuICAgIC8vIHRvIGZpdCBvdmVyIGFscmVhZHkgcGF0Y2hlZCB0ZXh0XG4gICAgbWluTGluZSA9IGh1bmsub2Zmc2V0ICsgaHVuay5vbGRTdGFydCArIGh1bmsub2xkTGluZXM7XG4gIH1cblxuICAvLyBBcHBseSBwYXRjaCBodW5rc1xuICBsZXQgZGlmZk9mZnNldCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICB0b1BvcyA9IGh1bmsub2xkU3RhcnQgKyBodW5rLm9mZnNldCArIGRpZmZPZmZzZXQgLSAxO1xuICAgIGRpZmZPZmZzZXQgKz0gaHVuay5uZXdMaW5lcyAtIGh1bmsub2xkTGluZXM7XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpLFxuICAgICAgICAgIGRlbGltaXRlciA9IGh1bmsubGluZWRlbGltaXRlcnMgJiYgaHVuay5saW5lZGVsaW1pdGVyc1tqXSB8fCAnXFxuJztcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 /***/ }), @@ -12537,6 +12697,10 @@ function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, ne } function formatPatch(diff) { + if (Array.isArray(diff)) { + return diff.map(formatPatch).join('\n'); + } + var ret = []; if (diff.oldFileName == diff.newFileName) { @@ -12574,7 +12738,7 @@ function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsInJldCIsImFwcGx5Iiwiam9pbiIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtBQTJCLFdBQS9CLEVBQTRDO0FBQzFDRCxJQUFBQSxPQUFPLENBQUNDLE9BQVIsR0FBa0IsQ0FBbEI7QUFDRDs7QUFFRCxNQUFNQyxJQUFJO0FBQUc7QUFBQTtBQUFBOztBQUFBQztBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBQTtBQUFBO0FBQUEsR0FBVVAsTUFBVixFQUFrQkMsTUFBbEIsRUFBMEJHLE9BQTFCLENBQWI7O0FBQ0EsTUFBRyxDQUFDRSxJQUFKLEVBQVU7QUFDUjtBQUNEOztBQUVEQSxFQUFBQSxJQUFJLENBQUNFLElBQUwsQ0FBVTtBQUFDQyxJQUFBQSxLQUFLLEVBQUUsRUFBUjtBQUFZQyxJQUFBQSxLQUFLLEVBQUU7QUFBbkIsR0FBVixFQWJ1RyxDQWFwRTs7QUFFbkMsV0FBU0MsWUFBVCxDQUFzQkQsS0FBdEIsRUFBNkI7QUFDM0IsV0FBT0EsS0FBSyxDQUFDRSxHQUFOLENBQVUsVUFBU0MsS0FBVCxFQUFnQjtBQUFFLGFBQU8sTUFBTUEsS0FBYjtBQUFxQixLQUFqRCxDQUFQO0FBQ0Q7O0FBRUQsTUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQSxNQUFJQyxhQUFhLEdBQUcsQ0FBcEI7QUFBQSxNQUF1QkMsYUFBYSxHQUFHLENBQXZDO0FBQUEsTUFBMENDLFFBQVEsR0FBRyxFQUFyRDtBQUFBLE1BQ0lDLE9BQU8sR0FBRyxDQURkO0FBQUEsTUFDaUJDLE9BQU8sR0FBRyxDQUQzQjs7QUFwQnVHO0FBQUE7QUFBQTtBQXNCOUZDLEVBQUFBLENBdEI4RjtBQXVCckcsUUFBTUMsT0FBTyxHQUFHZixJQUFJLENBQUNjLENBQUQsQ0FBcEI7QUFBQSxRQUNNVixLQUFLLEdBQUdXLE9BQU8sQ0FBQ1gsS0FBUixJQUFpQlcsT0FBTyxDQUFDWixLQUFSLENBQWNhLE9BQWQsQ0FBc0IsS0FBdEIsRUFBNkIsRUFBN0IsRUFBaUNDLEtBQWpDLENBQXVDLElBQXZDLENBRC9CO0FBRUFGLElBQUFBLE9BQU8sQ0FBQ1gsS0FBUixHQUFnQkEsS0FBaEI7O0FBRUEsUUFBSVcsT0FBTyxDQUFDRyxLQUFSLElBQWlCSCxPQUFPLENBQUNJLE9BQTdCLEVBQXNDO0FBQUE7QUFBQTs7QUFBQTtBQUNwQztBQUNBLFVBQUksQ0FBQ1YsYUFBTCxFQUFvQjtBQUNsQixZQUFNVyxJQUFJLEdBQUdwQixJQUFJLENBQUNjLENBQUMsR0FBRyxDQUFMLENBQWpCO0FBQ0FMLFFBQUFBLGFBQWEsR0FBR0csT0FBaEI7QUFDQUYsUUFBQUEsYUFBYSxHQUFHRyxPQUFoQjs7QUFFQSxZQUFJTyxJQUFKLEVBQVU7QUFDUlQsVUFBQUEsUUFBUSxHQUFHYixPQUFPLENBQUNDLE9BQVIsR0FBa0IsQ0FBbEIsR0FBc0JNLFlBQVksQ0FBQ2UsSUFBSSxDQUFDaEIsS0FBTCxDQUFXaUIsS0FBWCxDQUFpQixDQUFDdkIsT0FBTyxDQUFDQyxPQUExQixDQUFELENBQWxDLEdBQXlFLEVBQXBGO0FBQ0FVLFVBQUFBLGFBQWEsSUFBSUUsUUFBUSxDQUFDVyxNQUExQjtBQUNBWixVQUFBQSxhQUFhLElBQUlDLFFBQVEsQ0FBQ1csTUFBMUI7QUFDRDtBQUNGLE9BWm1DLENBY3BDOzs7QUFDQTs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQVgsTUFBQUEsUUFBUSxFQUFDVCxJQUFUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0JFLE1BQUFBLEtBQUssQ0FBQ0UsR0FBTixDQUFVLFVBQVNDLEtBQVQsRUFBZ0I7QUFDMUMsZUFBTyxDQUFDUSxPQUFPLENBQUNHLEtBQVIsR0FBZ0IsR0FBaEIsR0FBc0IsR0FBdkIsSUFBOEJYLEtBQXJDO0FBQ0QsT0FGaUIsQ0FBbEIsR0Fmb0MsQ0FtQnBDOzs7QUFDQSxVQUFJUSxPQUFPLENBQUNHLEtBQVosRUFBbUI7QUFDakJMLFFBQUFBLE9BQU8sSUFBSVQsS0FBSyxDQUFDa0IsTUFBakI7QUFDRCxPQUZELE1BRU87QUFDTFYsUUFBQUEsT0FBTyxJQUFJUixLQUFLLENBQUNrQixNQUFqQjtBQUNEO0FBQ0YsS0F6QkQsTUF5Qk87QUFDTDtBQUNBLFVBQUliLGFBQUosRUFBbUI7QUFDakI7QUFDQSxZQUFJTCxLQUFLLENBQUNrQixNQUFOLElBQWdCeEIsT0FBTyxDQUFDQyxPQUFSLEdBQWtCLENBQWxDLElBQXVDZSxDQUFDLEdBQUdkLElBQUksQ0FBQ3NCLE1BQUwsR0FBYyxDQUE3RCxFQUFnRTtBQUFBO0FBQUE7O0FBQUE7QUFDOUQ7O0FBQ0E7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUFYLFVBQUFBLFFBQVEsRUFBQ1QsSUFBVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtCRyxVQUFBQSxZQUFZLENBQUNELEtBQUQsQ0FBOUI7QUFDRCxTQUhELE1BR087QUFBQTtBQUFBOztBQUFBO0FBQ0w7QUFDQSxjQUFJbUIsV0FBVyxHQUFHQyxJQUFJLENBQUNDLEdBQUwsQ0FBU3JCLEtBQUssQ0FBQ2tCLE1BQWYsRUFBdUJ4QixPQUFPLENBQUNDLE9BQS9CLENBQWxCOztBQUNBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBWSxVQUFBQSxRQUFRLEVBQUNULElBQVQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrQkcsVUFBQUEsWUFBWSxDQUFDRCxLQUFLLENBQUNpQixLQUFOLENBQVksQ0FBWixFQUFlRSxXQUFmLENBQUQsQ0FBOUI7O0FBRUEsY0FBSUcsSUFBSSxHQUFHO0FBQ1RDLFlBQUFBLFFBQVEsRUFBRWxCLGFBREQ7QUFFVG1CLFlBQUFBLFFBQVEsRUFBR2hCLE9BQU8sR0FBR0gsYUFBVixHQUEwQmMsV0FGNUI7QUFHVE0sWUFBQUEsUUFBUSxFQUFFbkIsYUFIRDtBQUlUb0IsWUFBQUEsUUFBUSxFQUFHakIsT0FBTyxHQUFHSCxhQUFWLEdBQTBCYSxXQUo1QjtBQUtUbkIsWUFBQUEsS0FBSyxFQUFFTztBQUxFLFdBQVg7O0FBT0EsY0FBSUcsQ0FBQyxJQUFJZCxJQUFJLENBQUNzQixNQUFMLEdBQWMsQ0FBbkIsSUFBd0JsQixLQUFLLENBQUNrQixNQUFOLElBQWdCeEIsT0FBTyxDQUFDQyxPQUFwRCxFQUE2RDtBQUMzRDtBQUNBLGdCQUFJZ0MsYUFBYSxHQUFLLEtBQUQsQ0FBUUMsSUFBUixDQUFhdEMsTUFBYixDQUFyQjtBQUNBLGdCQUFJdUMsYUFBYSxHQUFLLEtBQUQsQ0FBUUQsSUFBUixDQUFhckMsTUFBYixDQUFyQjtBQUNBLGdCQUFJdUMsY0FBYyxHQUFHOUIsS0FBSyxDQUFDa0IsTUFBTixJQUFnQixDQUFoQixJQUFxQlgsUUFBUSxDQUFDVyxNQUFULEdBQWtCSSxJQUFJLENBQUNFLFFBQWpFOztBQUNBLGdCQUFJLENBQUNHLGFBQUQsSUFBa0JHLGNBQWxCLElBQW9DeEMsTUFBTSxDQUFDNEIsTUFBUCxHQUFnQixDQUF4RCxFQUEyRDtBQUN6RDtBQUNBO0FBQ0FYLGNBQUFBLFFBQVEsQ0FBQ3dCLE1BQVQsQ0FBZ0JULElBQUksQ0FBQ0UsUUFBckIsRUFBK0IsQ0FBL0IsRUFBa0MsOEJBQWxDO0FBQ0Q7O0FBQ0QsZ0JBQUssQ0FBQ0csYUFBRCxJQUFrQixDQUFDRyxjQUFwQixJQUF1QyxDQUFDRCxhQUE1QyxFQUEyRDtBQUN6RHRCLGNBQUFBLFFBQVEsQ0FBQ1QsSUFBVCxDQUFjLDhCQUFkO0FBQ0Q7QUFDRjs7QUFDRE0sVUFBQUEsS0FBSyxDQUFDTixJQUFOLENBQVd3QixJQUFYO0FBRUFqQixVQUFBQSxhQUFhLEdBQUcsQ0FBaEI7QUFDQUMsVUFBQUEsYUFBYSxHQUFHLENBQWhCO0FBQ0FDLFVBQUFBLFFBQVEsR0FBRyxFQUFYO0FBQ0Q7QUFDRjs7QUFDREMsTUFBQUEsT0FBTyxJQUFJUixLQUFLLENBQUNrQixNQUFqQjtBQUNBVCxNQUFBQSxPQUFPLElBQUlULEtBQUssQ0FBQ2tCLE1BQWpCO0FBQ0Q7QUE5Rm9HOztBQXNCdkcsT0FBSyxJQUFJUixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHZCxJQUFJLENBQUNzQixNQUF6QixFQUFpQ1IsQ0FBQyxFQUFsQyxFQUFzQztBQUFBO0FBQUE7QUFBQTtBQUE3QkEsSUFBQUEsQ0FBNkI7QUF5RXJDOztBQUVELFNBQU87QUFDTHRCLElBQUFBLFdBQVcsRUFBRUEsV0FEUjtBQUNxQkMsSUFBQUEsV0FBVyxFQUFFQSxXQURsQztBQUVMRyxJQUFBQSxTQUFTLEVBQUVBLFNBRk47QUFFaUJDLElBQUFBLFNBQVMsRUFBRUEsU0FGNUI7QUFHTFcsSUFBQUEsS0FBSyxFQUFFQTtBQUhGLEdBQVA7QUFLRDs7QUFFTSxTQUFTNEIsV0FBVCxDQUFxQnBDLElBQXJCLEVBQTJCO0FBQ2hDLE1BQU1xQyxHQUFHLEdBQUcsRUFBWjs7QUFDQSxNQUFJckMsSUFBSSxDQUFDUixXQUFMLElBQW9CUSxJQUFJLENBQUNQLFdBQTdCLEVBQTBDO0FBQ3hDNEMsSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTLFlBQVlGLElBQUksQ0FBQ1IsV0FBMUI7QUFDRDs7QUFDRDZDLEVBQUFBLEdBQUcsQ0FBQ25DLElBQUosQ0FBUyxxRUFBVDtBQUNBbUMsRUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTLFNBQVNGLElBQUksQ0FBQ1IsV0FBZCxJQUE2QixPQUFPUSxJQUFJLENBQUNKLFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0ksSUFBSSxDQUFDSixTQUF0RixDQUFUO0FBQ0F5QyxFQUFBQSxHQUFHLENBQUNuQyxJQUFKLENBQVMsU0FBU0YsSUFBSSxDQUFDUCxXQUFkLElBQTZCLE9BQU9PLElBQUksQ0FBQ0gsU0FBWixLQUEwQixXQUExQixHQUF3QyxFQUF4QyxHQUE2QyxPQUFPRyxJQUFJLENBQUNILFNBQXRGLENBQVQ7O0FBRUEsT0FBSyxJQUFJaUIsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2QsSUFBSSxDQUFDUSxLQUFMLENBQVdjLE1BQS9CLEVBQXVDUixDQUFDLEVBQXhDLEVBQTRDO0FBQzFDLFFBQU1ZLElBQUksR0FBRzFCLElBQUksQ0FBQ1EsS0FBTCxDQUFXTSxDQUFYLENBQWIsQ0FEMEMsQ0FFMUM7QUFDQTtBQUNBOztBQUNBLFFBQUlZLElBQUksQ0FBQ0UsUUFBTCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QkYsTUFBQUEsSUFBSSxDQUFDQyxRQUFMLElBQWlCLENBQWpCO0FBQ0Q7O0FBQ0QsUUFBSUQsSUFBSSxDQUFDSSxRQUFMLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCSixNQUFBQSxJQUFJLENBQUNHLFFBQUwsSUFBaUIsQ0FBakI7QUFDRDs7QUFDRFEsSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUNFLFNBQVN3QixJQUFJLENBQUNDLFFBQWQsR0FBeUIsR0FBekIsR0FBK0JELElBQUksQ0FBQ0UsUUFBcEMsR0FDRSxJQURGLEdBQ1NGLElBQUksQ0FBQ0csUUFEZCxHQUN5QixHQUR6QixHQUMrQkgsSUFBSSxDQUFDSSxRQURwQyxHQUVFLEtBSEo7QUFLQU8sSUFBQUEsR0FBRyxDQUFDbkMsSUFBSixDQUFTb0MsS0FBVCxDQUFlRCxHQUFmLEVBQW9CWCxJQUFJLENBQUN0QixLQUF6QjtBQUNEOztBQUVELFNBQU9pQyxHQUFHLENBQUNFLElBQUosQ0FBUyxJQUFULElBQWlCLElBQXhCO0FBQ0Q7O0FBRU0sU0FBU0MsbUJBQVQsQ0FBNkJoRCxXQUE3QixFQUEwQ0MsV0FBMUMsRUFBdURDLE1BQXZELEVBQStEQyxNQUEvRCxFQUF1RUMsU0FBdkUsRUFBa0ZDLFNBQWxGLEVBQTZGQyxPQUE3RixFQUFzRztBQUMzRyxTQUFPc0MsV0FBVyxDQUFDN0MsZUFBZSxDQUFDQyxXQUFELEVBQWNDLFdBQWQsRUFBMkJDLE1BQTNCLEVBQW1DQyxNQUFuQyxFQUEyQ0MsU0FBM0MsRUFBc0RDLFNBQXRELEVBQWlFQyxPQUFqRSxDQUFoQixDQUFsQjtBQUNEOztBQUVNLFNBQVMyQyxXQUFULENBQXFCQyxRQUFyQixFQUErQmhELE1BQS9CLEVBQXVDQyxNQUF2QyxFQUErQ0MsU0FBL0MsRUFBMERDLFNBQTFELEVBQXFFQyxPQUFyRSxFQUE4RTtBQUNuRixTQUFPMEMsbUJBQW1CLENBQUNFLFFBQUQsRUFBV0EsUUFBWCxFQUFxQmhELE1BQXJCLEVBQTZCQyxNQUE3QixFQUFxQ0MsU0FBckMsRUFBZ0RDLFNBQWhELEVBQTJEQyxPQUEzRCxDQUExQjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsImRpZmZMaW5lcyIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwibm9ObEJlZm9yZUFkZHMiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJyZXQiLCJhcHBseSIsImNyZWF0ZVR3b0ZpbGVzUGF0Y2giLCJjcmVhdGVQYXRjaCIsImZpbGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULENBQXlCQyxXQUF6QixFQUFzQ0MsV0FBdEMsRUFBbURDLE1BQW5ELEVBQTJEQyxNQUEzRCxFQUFtRUMsU0FBbkUsRUFBOEVDLFNBQTlFLEVBQXlGQyxPQUF6RixFQUFrRztBQUN2RyxNQUFJLENBQUNBLE9BQUwsRUFBYztBQUNaQSxJQUFBQSxPQUFPLEdBQUcsRUFBVjtBQUNEOztBQUNELE1BQUksT0FBT0EsT0FBTyxDQUFDQyxPQUFmLEtB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QUNuRixTQUFPNEMsbUJBQW1CLENBQUNFLFFBQUQsRUFBV0EsUUFBWCxFQUFxQmxELE1BQXJCLEVBQTZCQyxNQUE3QixFQUFxQ0MsU0FBckMsRUFBZ0RDLFNBQWhELEVBQTJEQyxPQUEzRCxDQUExQjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgaWYoIWRpZmYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgoL1xcbiQvKS50ZXN0KG9sZFN0cikpO1xuICAgICAgICAgICAgbGV0IG5ld0VPRk5ld2xpbmUgPSAoKC9cXG4kLykudGVzdChuZXdTdHIpKTtcbiAgICAgICAgICAgIGxldCBub05sQmVmb3JlQWRkcyA9IGxpbmVzLmxlbmd0aCA9PSAwICYmIGN1clJhbmdlLmxlbmd0aCA+IGh1bmsub2xkTGluZXM7XG4gICAgICAgICAgICBpZiAoIW9sZEVPRk5ld2xpbmUgJiYgbm9ObEJlZm9yZUFkZHMgJiYgb2xkU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBvbGQgaGFzIG5vIGVvbCBhbmQgbm8gdHJhaWxpbmcgY29udGV4dDsgbm8tbmwgY2FuIGVuZCB1cCBiZWZvcmUgYWRkc1xuICAgICAgICAgICAgICAvLyBob3dldmVyLCBpZiB0aGUgb2xkIGZpbGUgaXMgZW1wdHksIGRvIG5vdCBvdXRwdXQgdGhlIG5vLW5sIGxpbmVcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoIW9sZEVPRk5ld2xpbmUgJiYgIW5vTmxCZWZvcmVBZGRzKSB8fCAhbmV3RU9GTmV3bGluZSkge1xuICAgICAgICAgICAgICBjdXJSYW5nZS5wdXNoKCdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcblxuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgIGN1clJhbmdlID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lOiBuZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgaHVua3M6IGh1bmtzXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRpZmYpKSB7XG4gICAgcmV0dXJuIGRpZmYubWFwKGZvcm1hdFBhdGNoKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICByZXQucHVzaC5hcHBseShyZXQsIGh1bmsubGluZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gZm9ybWF0UGF0Y2goc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cbiJdfQ== /***/ }), @@ -13373,6 +13537,77 @@ function parsePatch(uniDiff) { //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQU8sU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBZEMsRUFBQUEsT0FBYyx1RUFBSixFQUFJO0FBQ2hELE1BQUlDLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLFVBQVUsR0FBR0osT0FBTyxDQUFDSyxLQUFSLENBQWMsc0JBQWQsS0FBeUMsRUFEMUQ7QUFBQSxNQUVJQyxJQUFJLEdBQUcsRUFGWDtBQUFBLE1BR0lDLENBQUMsR0FBRyxDQUhSOztBQUtBLFdBQVNDLFVBQVQsR0FBc0I7QUFDcEIsUUFBSUMsS0FBSyxHQUFHLEVBQVo7QUFDQUgsSUFBQUEsSUFBSSxDQUFDSSxJQUFMLENBQVVELEtBQVYsRUFGb0IsQ0FJcEI7O0FB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QUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLE1BQUFBLElBQUksQ0FBQ0ksUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsSUFBSSxDQUFDRSxRQUFMLEtBQWtCLENBQXRDLEVBQXlDO0FBQ3ZDRixNQUFBQSxJQUFJLENBQUNFLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRCxLQTVEa0IsQ0E4RG5COzs7QUFDQSxRQUFJbEMsT0FBTyxDQUFDa0IsTUFBWixFQUFvQjtBQUNsQixVQUFJcUIsUUFBUSxLQUFLUCxJQUFJLENBQUNJLFFBQXRCLEVBQWdDO0FBQzlCLGNBQU0sSUFBSWpCLEtBQUosQ0FBVSxzREFBc0RVLGdCQUFnQixHQUFHLENBQXpFLENBQVYsQ0FBTjtBQUNEOztBQUNELFVBQUlXLFdBQVcsS0FBS1IsSUFBSSxDQUFDRSxRQUF6QixFQUFtQztBQUNqQyxjQUFNLElBQUlmLEtBQUosQ0FBVSx3REFBd0RVLGdCQUFnQixHQUFHLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixDQUFDLEdBQUdMLE9BQU8sQ0FBQ1MsTUFBbkIsRUFBMkI7QUFDekJILElBQUFBLFVBQVU7QUFDWDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvKS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmIGluZGV4XG4gICAgICBsZXQgaGVhZGVyID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLykuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuICAgIC8vIFBhcnNlIGh1bmtzXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgaWYgKCgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8pLnRlc3QobGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKCgvXkBALykudGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKCgvXlwiLipcIiQvKS50ZXN0KGZpbGVOYW1lKSkge1xuICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cigxLCBmaWxlTmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIH1cbiAgICAgIGluZGV4W2tleVByZWZpeCArICdGaWxlTmFtZSddID0gZmlsZU5hbWU7XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnSGVhZGVyJ10gPSAoZGF0YVsxXSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpKys7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cbiAgZnVuY3Rpb24gcGFyc2VIdW5rKCkge1xuICAgIGxldCBjaHVua0hlYWRlckluZGV4ID0gaSxcbiAgICAgICAgY2h1bmtIZWFkZXJMaW5lID0gZGlmZnN0cltpKytdLFxuICAgICAgICBjaHVua0hlYWRlciA9IGNodW5rSGVhZGVyTGluZS5zcGxpdCgvQEAgLShcXGQrKSg/OiwoXFxkKykpPyBcXCsoXFxkKykoPzosKFxcZCspKT8gQEAvKTtcblxuICAgIGxldCBodW5rID0ge1xuICAgICAgb2xkU3RhcnQ6ICtjaHVua0hlYWRlclsxXSxcbiAgICAgIG9sZExpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbMl0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlclsyXSxcbiAgICAgIG5ld1N0YXJ0OiArY2h1bmtIZWFkZXJbM10sXG4gICAgICBuZXdMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzRdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbNF0sXG4gICAgICBsaW5lczogW10sXG4gICAgICBsaW5lZGVsaW1pdGVyczogW11cbiAgICB9O1xuXG4gICAgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG4gICAgaWYgKGh1bmsubmV3TGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsubmV3U3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBsZXQgYWRkQ291bnQgPSAwLFxuICAgICAgICByZW1vdmVDb3VudCA9IDA7XG4gICAgZm9yICg7IGkgPCBkaWZmc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBMaW5lcyBzdGFydGluZyB3aXRoICctLS0nIGNvdWxkIGJlIG1pc3Rha2VuIGZvciB0aGUgXCJyZW1vdmUgbGluZVwiIG9wZXJhdGlvblxuICAgICAgLy8gQnV0IHRoZXkgY291bGQgYmUgdGhlIGhlYWRlciBmb3IgdGhlIG5leHQgZmlsZS4gVGhlcmVmb3JlIHBydW5lIHN1Y2ggY2FzZXMgb3V0LlxuICAgICAgaWYgKGRpZmZzdHJbaV0uaW5kZXhPZignLS0tICcpID09PSAwXG4gICAgICAgICAgICAmJiAoaSArIDIgPCBkaWZmc3RyLmxlbmd0aClcbiAgICAgICAgICAgICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMFxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMl0uaW5kZXhPZignQEAnKSA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IG9wZXJhdGlvbiA9IChkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gKGRpZmZzdHIubGVuZ3RoIC0gMSkpID8gJyAnIDogZGlmZnN0cltpXVswXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnIHx8IG9wZXJhdGlvbiA9PT0gJy0nIHx8IG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGh1bmsubGluZXMucHVzaChkaWZmc3RyW2ldKTtcbiAgICAgICAgaHVuay5saW5lZGVsaW1pdGVycy5wdXNoKGRlbGltaXRlcnNbaV0gfHwgJ1xcbicpO1xuXG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgICByZW1vdmVDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcbiAgICBpZiAoIWFkZENvdW50ICYmIGh1bmsubmV3TGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsubmV3TGluZXMgPSAwO1xuICAgIH1cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gb3B0aW9uYWwgc2FuaXR5IGNoZWNraW5nXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW1vdmVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaHVuaztcbiAgfVxuXG4gIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICBwYXJzZUluZGV4KCk7XG4gIH1cblxuICByZXR1cm4gbGlzdDtcbn1cbiJdfQ== +/***/ }), + +/***/ 1794: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; +/*istanbul ignore start*/ + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.reversePatch = reversePatch; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +/*istanbul ignore end*/ +function reversePatch(structuredPatch) { + if (Array.isArray(structuredPatch)) { + return structuredPatch.map(reversePatch).reverse(); + } + + return ( + /*istanbul ignore start*/ + _objectSpread(_objectSpread({}, + /*istanbul ignore end*/ + structuredPatch), {}, { + oldFileName: structuredPatch.newFileName, + oldHeader: structuredPatch.newHeader, + newFileName: structuredPatch.oldFileName, + newHeader: structuredPatch.oldHeader, + hunks: structuredPatch.hunks.map(function (hunk) { + return { + oldLines: hunk.newLines, + oldStart: hunk.newStart, + newLines: hunk.oldLines, + newStart: hunk.oldStart, + linedelimiters: hunk.linedelimiters, + lines: hunk.lines.map(function (l) { + if (l.startsWith('-')) { + return ( + /*istanbul ignore start*/ + "+".concat( + /*istanbul ignore end*/ + l.slice(1)) + ); + } + + if (l.startsWith('+')) { + return ( + /*istanbul ignore start*/ + "-".concat( + /*istanbul ignore end*/ + l.slice(1)) + ); + } + + return l; + }) + }; + }) + }) + ); +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9yZXZlcnNlLmpzIl0sIm5hbWVzIjpbInJldmVyc2VQYXRjaCIsInN0cnVjdHVyZWRQYXRjaCIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsInJldmVyc2UiLCJvbGRGaWxlTmFtZSIsIm5ld0ZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwiaHVua3MiLCJodW5rIiwib2xkTGluZXMiLCJuZXdMaW5lcyIsIm9sZFN0YXJ0IiwibmV3U3RhcnQiLCJsaW5lZGVsaW1pdGVycyIsImxpbmVzIiwibCIsInN0YXJ0c1dpdGgiLCJzbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sU0FBU0EsWUFBVCxDQUFzQkMsZUFBdEIsRUFBdUM7QUFDNUMsTUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNGLGVBQWQsQ0FBSixFQUFvQztBQUNsQyxXQUFPQSxlQUFlLENBQUNHLEdBQWhCLENBQW9CSixZQUFwQixFQUFrQ0ssT0FBbEMsRUFBUDtBQUNEOztBQUVEO0FBQUE7QUFBQTtBQUFBO0FBQ0tKLElBQUFBLGVBREw7QUFFRUssTUFBQUEsV0FBVyxFQUFFTCxlQUFlLENBQUNNLFdBRi9CO0FBR0VDLE1BQUFBLFNBQVMsRUFBRVAsZUFBZSxDQUFDUSxTQUg3QjtBQUlFRixNQUFBQSxXQUFXLEVBQUVOLGVBQWUsQ0FBQ0ssV0FKL0I7QUFLRUcsTUFBQUEsU0FBUyxFQUFFUixlQUFlLENBQUNPLFNBTDdCO0FBTUVFLE1BQUFBLEtBQUssRUFBRVQsZUFBZSxDQUFDUyxLQUFoQixDQUFzQk4sR0FBdEIsQ0FBMEIsVUFBQU8sSUFBSSxFQUFJO0FBQ3ZDLGVBQU87QUFDTEMsVUFBQUEsUUFBUSxFQUFFRCxJQUFJLENBQUNFLFFBRFY7QUFFTEMsVUFBQUEsUUFBUSxFQUFFSCxJQUFJLENBQUNJLFFBRlY7QUFHTEYsVUFBQUEsUUFBUSxFQUFFRixJQUFJLENBQUNDLFFBSFY7QUFJTEcsVUFBQUEsUUFBUSxFQUFFSixJQUFJLENBQUNHLFFBSlY7QUFLTEUsVUFBQUEsY0FBYyxFQUFFTCxJQUFJLENBQUNLLGNBTGhCO0FBTUxDLFVBQUFBLEtBQUssRUFBRU4sSUFBSSxDQUFDTSxLQUFMLENBQVdiLEdBQVgsQ0FBZSxVQUFBYyxDQUFDLEVBQUk7QUFDekIsZ0JBQUlBLENBQUMsQ0FBQ0MsVUFBRixDQUFhLEdBQWIsQ0FBSixFQUF1QjtBQUFFO0FBQUE7QUFBQTtBQUFBO0FBQVdELGdCQUFBQSxDQUFDLENBQUNFLEtBQUYsQ0FBUSxDQUFSLENBQVg7QUFBQTtBQUEwQjs7QUFDbkQsZ0JBQUlGLENBQUMsQ0FBQ0MsVUFBRixDQUFhLEdBQWIsQ0FBSixFQUF1QjtBQUFFO0FBQUE7QUFBQTtBQUFBO0FBQVdELGdCQUFBQSxDQUFDLENBQUNFLEtBQUYsQ0FBUSxDQUFSLENBQVg7QUFBQTtBQUEwQjs7QUFDbkQsbUJBQU9GLENBQVA7QUFDRCxXQUpNO0FBTkYsU0FBUDtBQVlELE9BYk07QUFOVDtBQUFBO0FBcUJEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2VQYXRjaChzdHJ1Y3R1cmVkUGF0Y2gpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RydWN0dXJlZFBhdGNoKSkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2gubWFwKHJldmVyc2VQYXRjaCkucmV2ZXJzZSgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdHJ1Y3R1cmVkUGF0Y2gsXG4gICAgb2xkRmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5uZXdGaWxlTmFtZSxcbiAgICBvbGRIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5uZXdIZWFkZXIsXG4gICAgbmV3RmlsZU5hbWU6IHN0cnVjdHVyZWRQYXRjaC5vbGRGaWxlTmFtZSxcbiAgICBuZXdIZWFkZXI6IHN0cnVjdHVyZWRQYXRjaC5vbGRIZWFkZXIsXG4gICAgaHVua3M6IHN0cnVjdHVyZWRQYXRjaC5odW5rcy5tYXAoaHVuayA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbGRMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICAgICAgb2xkU3RhcnQ6IGh1bmsubmV3U3RhcnQsXG4gICAgICAgIG5ld0xpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgICAgICBuZXdTdGFydDogaHVuay5vbGRTdGFydCxcbiAgICAgICAgbGluZWRlbGltaXRlcnM6IGh1bmsubGluZWRlbGltaXRlcnMsXG4gICAgICAgIGxpbmVzOiBodW5rLmxpbmVzLm1hcChsID0+IHtcbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCctJykpIHsgcmV0dXJuIGArJHtsLnNsaWNlKDEpfWA7IH1cbiAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCcrJykpIHsgcmV0dXJuIGAtJHtsLnNsaWNlKDEpfWA7IH1cbiAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSlcbiAgfTtcbn1cbiJdfQ== + + /***/ }), /***/ 8935: @@ -13749,6 +13984,8 @@ function onceStrict (fn) { /***/ 9103: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; + var __create = Object.create; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; @@ -13772,7 +14009,6 @@ var __spreadValues = (a, b) => { return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); -var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; @@ -13783,22 +14019,19 @@ var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; -var __reExport = (target, module2, copyDefault, desc) => { - if (module2 && typeof module2 === "object" || typeof module2 === "function") { - for (let key of __getOwnPropNames(module2)) - if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default")) - __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } - return target; -}; -var __toESM = (module2, isNodeMode) => { - return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); + return to; }; -var __toCommonJS = /* @__PURE__ */ ((cache2) => { - return (module2, temp) => { - return cache2 && cache2.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache2 && cache2.set(module2, temp), temp); - }; -})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0); +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { @@ -13824,6 +14057,7 @@ var __async = (__this, __arguments, generator) => { var GitError; var init_git_error = __esm({ "src/lib/errors/git-error.ts"() { + "use strict"; GitError = class extends Error { constructor(task, message) { super(message); @@ -13838,6 +14072,7 @@ var init_git_error = __esm({ var GitResponseError; var init_git_response_error = __esm({ "src/lib/errors/git-response-error.ts"() { + "use strict"; init_git_error(); GitResponseError = class extends GitError { constructor(git, message) { @@ -13863,6 +14098,7 @@ function toPaths(pathSpec) { var cache; var init_pathspec = __esm({ "src/lib/args/pathspec.ts"() { + "use strict"; cache = /* @__PURE__ */ new WeakMap(); } }); @@ -13871,6 +14107,7 @@ var init_pathspec = __esm({ var GitConstructError; var init_git_construct_error = __esm({ "src/lib/errors/git-construct-error.ts"() { + "use strict"; init_git_error(); GitConstructError = class extends GitError { constructor(config, message) { @@ -13885,6 +14122,7 @@ var init_git_construct_error = __esm({ var GitPluginError; var init_git_plugin_error = __esm({ "src/lib/errors/git-plugin-error.ts"() { + "use strict"; init_git_error(); GitPluginError = class extends GitError { constructor(task, plugin, message) { @@ -13901,6 +14139,7 @@ var init_git_plugin_error = __esm({ var TaskConfigurationError; var init_task_configuration_error = __esm({ "src/lib/errors/task-configuration-error.ts"() { + "use strict"; init_git_error(); TaskConfigurationError = class extends GitError { constructor(message) { @@ -14001,7 +14240,10 @@ function bufferToString(input) { return (Array.isArray(input) ? Buffer.concat(input) : input).toString("utf-8"); } function pick(source, properties) { - return Object.assign({}, ...properties.map((property) => property in source ? { [property]: source[property] } : {})); + return Object.assign( + {}, + ...properties.map((property) => property in source ? { [property]: source[property] } : {}) + ); } function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); @@ -14015,6 +14257,7 @@ function orVoid(input) { var import_file_exists, NULL, NOOP, objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { + "use strict"; import_file_exists = __nccwpck_require__(4751); NULL = "\0"; NOOP = () => { @@ -14043,6 +14286,7 @@ function filterFunction(input) { var filterArray, filterString, filterStringArray, filterStringOrStringArray, filterHasLength; var init_argument_filters = __esm({ "src/lib/utils/argument-filters.ts"() { + "use strict"; init_util(); init_pathspec(); filterArray = (input) => { @@ -14070,6 +14314,7 @@ var init_argument_filters = __esm({ var ExitCodes; var init_exit_codes = __esm({ "src/lib/utils/exit-codes.ts"() { + "use strict"; ExitCodes = /* @__PURE__ */ ((ExitCodes2) => { ExitCodes2[ExitCodes2["SUCCESS"] = 0] = "SUCCESS"; ExitCodes2[ExitCodes2["ERROR"] = 1] = "ERROR"; @@ -14084,6 +14329,7 @@ var init_exit_codes = __esm({ var GitOutputStreams; var init_git_output_streams = __esm({ "src/lib/utils/git-output-streams.ts"() { + "use strict"; GitOutputStreams = class { constructor(stdOut, stdErr) { this.stdOut = stdOut; @@ -14100,6 +14346,7 @@ var init_git_output_streams = __esm({ var LineParser, RemoteLineParser; var init_line_parser = __esm({ "src/lib/utils/line-parser.ts"() { + "use strict"; LineParser = class { constructor(regExp, useMatches) { this.matches = []; @@ -14151,7 +14398,10 @@ var init_line_parser = __esm({ // src/lib/utils/simple-git-options.ts function createInstanceConfig(...options) { const baseDir = process.cwd(); - const config = Object.assign(__spreadValues({ baseDir }, defaultOptions), ...options.filter((o) => typeof o === "object" && o)); + const config = Object.assign( + __spreadValues({ baseDir }, defaultOptions), + ...options.filter((o) => typeof o === "object" && o) + ); config.baseDir = config.baseDir || baseDir; config.trimmed = config.trimmed === true; return config; @@ -14159,6 +14409,7 @@ function createInstanceConfig(...options) { var defaultOptions; var init_simple_git_options = __esm({ "src/lib/utils/simple-git-options.ts"() { + "use strict"; defaultOptions = { binary: "git", maxConcurrentProcesses: 5, @@ -14212,6 +14463,7 @@ function trailingFunctionArgument(args, includeNoop = true) { } var init_task_options = __esm({ "src/lib/utils/task-options.ts"() { + "use strict"; init_argument_filters(); init_util(); init_pathspec(); @@ -14238,6 +14490,7 @@ function parseStringResponse(result, parsers12, texts, trim = true) { } var init_task_parser = __esm({ "src/lib/utils/task-parser.ts"() { + "use strict"; init_util(); } }); @@ -14290,6 +14543,7 @@ __export(utils_exports, { }); var init_utils = __esm({ "src/lib/utils/index.ts"() { + "use strict"; init_argument_filters(); init_exit_codes(); init_git_output_streams(); @@ -14350,6 +14604,7 @@ function isNotRepoMessage(error) { var CheckRepoActions, onError, parser; var init_check_is_repo = __esm({ "src/lib/tasks/check-is-repo.ts"() { + "use strict"; init_utils(); CheckRepoActions = /* @__PURE__ */ ((CheckRepoActions2) => { CheckRepoActions2["BARE"] = "bare"; @@ -14383,6 +14638,7 @@ function cleanSummaryParser(dryRun, text) { var CleanResponse, removalRegexp, dryRunRemovalRegexp, isFolderRegexp; var init_CleanSummary = __esm({ "src/lib/responses/CleanSummary.ts"() { + "use strict"; init_utils(); CleanResponse = class { constructor(dryRun) { @@ -14452,6 +14708,7 @@ function isEmptyTask(task) { var EMPTY_COMMANDS; var init_task = __esm({ "src/lib/tasks/task.ts"() { + "use strict"; init_task_configuration_error(); EMPTY_COMMANDS = []; } @@ -14528,6 +14785,7 @@ function isInteractiveMode(option) { var CONFIG_ERROR_INTERACTIVE_MODE, CONFIG_ERROR_MODE_REQUIRED, CONFIG_ERROR_UNKNOWN_OPTION, CleanOptions, CleanOptionValues; var init_clean = __esm({ "src/lib/tasks/clean.ts"() { + "use strict"; init_CleanSummary(); init_utils(); init_task(); @@ -14601,6 +14859,7 @@ function* configParser(text, requestedKey = null) { var ConfigList; var init_ConfigList = __esm({ "src/lib/responses/ConfigList.ts"() { + "use strict"; init_utils(); ConfigList = class { constructor() { @@ -14688,19 +14947,34 @@ function listConfigTask(scope) { function config_default() { return { addConfig(key, value, ...rest) { - return this._runTask(addConfigTask(key, value, rest[0] === true, asConfigScope(rest[1], "local" /* local */)), trailingFunctionArgument(arguments)); + return this._runTask( + addConfigTask( + key, + value, + rest[0] === true, + asConfigScope(rest[1], "local" /* local */) + ), + trailingFunctionArgument(arguments) + ); }, getConfig(key, scope) { - return this._runTask(getConfigTask(key, asConfigScope(scope, void 0)), trailingFunctionArgument(arguments)); + return this._runTask( + getConfigTask(key, asConfigScope(scope, void 0)), + trailingFunctionArgument(arguments) + ); }, listConfig(...rest) { - return this._runTask(listConfigTask(asConfigScope(rest[0], void 0)), trailingFunctionArgument(arguments)); + return this._runTask( + listConfigTask(asConfigScope(rest[0], void 0)), + trailingFunctionArgument(arguments) + ); } }; } var GitConfigScope; var init_config = __esm({ "src/lib/tasks/config.ts"() { + "use strict"; init_ConfigList(); init_utils(); GitConfigScope = /* @__PURE__ */ ((GitConfigScope2) => { @@ -14720,6 +14994,7 @@ function isDiffNameStatus(input) { var DiffNameStatus, diffNameStatus; var init_diff_name_status = __esm({ "src/lib/tasks/diff-name-status.ts"() { + "use strict"; DiffNameStatus = /* @__PURE__ */ ((DiffNameStatus2) => { DiffNameStatus2["ADDED"] = "A"; DiffNameStatus2["COPIED"] = "C"; @@ -14764,26 +15039,33 @@ function grep_default() { const options = getTrailingOptions(arguments); for (const option of disallowedOptions) { if (options.includes(option)) { - return this._runTask(configurationErrorTask(`git.grep: use of "${option}" is not supported.`), then); + return this._runTask( + configurationErrorTask(`git.grep: use of "${option}" is not supported.`), + then + ); } } if (typeof searchTerm === "string") { searchTerm = grepQueryBuilder().param(searchTerm); } const commands = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; - return this._runTask({ - commands, - format: "utf-8", - parser(stdOut) { - return parseGrep(stdOut); - } - }, then); + return this._runTask( + { + commands, + format: "utf-8", + parser(stdOut) { + return parseGrep(stdOut); + } + }, + then + ); } }; } var disallowedOptions, Query, _a, GrepQuery; var init_grep = __esm({ "src/lib/tasks/grep.ts"() { + "use strict"; init_utils(); init_task(); disallowedOptions = ["-h"]; @@ -14841,6 +15123,7 @@ function isValidResetMode(mode) { var ResetMode, ResetModes; var init_reset = __esm({ "src/lib/tasks/reset.ts"() { + "use strict"; init_task(); ResetMode = /* @__PURE__ */ ((ResetMode2) => { ResetMode2["MIXED"] = "mixed"; @@ -14872,6 +15155,7 @@ __export(api_exports, { }); var init_api = __esm({ "src/lib/api.ts"() { + "use strict"; init_pathspec(); init_git_construct_error(); init_git_error(); @@ -14914,6 +15198,7 @@ function abortPlugin(signal) { } var init_abort_plugin = __esm({ "src/lib/plugins/abort-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -14929,17 +15214,33 @@ function preventProtocolOverride(arg, next) { if (!/^\s*protocol(.[a-z]+)?.allow/.test(next)) { return; } - throw new GitPluginError(void 0, "unsafe", "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol"); + throw new GitPluginError( + void 0, + "unsafe", + "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol" + ); } function preventUploadPack(arg, method) { if (/^\s*--(upload|receive)-pack/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack` + ); } if (method === "clone" && /^\s*-u\b/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of clone with option -u is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of clone with option -u is not permitted without enabling allowUnsafePack` + ); } if (method === "push" && /^\s*--exec\b/.test(arg)) { - throw new GitPluginError(void 0, "unsafe", `Use of push with option --exec is not permitted without enabling allowUnsafePack`); + throw new GitPluginError( + void 0, + "unsafe", + `Use of push with option --exec is not permitted without enabling allowUnsafePack` + ); } } function blockUnsafeOperationsPlugin({ @@ -14960,6 +15261,7 @@ function blockUnsafeOperationsPlugin({ } var init_block_unsafe_operations_plugin = __esm({ "src/lib/plugins/block-unsafe-operations-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -14976,6 +15278,7 @@ function commandConfigPrefixingPlugin(configuration) { } var init_command_config_prefixing_plugin = __esm({ "src/lib/plugins/command-config-prefixing-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15024,11 +15327,11 @@ function completionDetectionPlugin({ type: "spawn.after", action(_0, _1) { return __async(this, arguments, function* (_data, { spawned, close }) { - var _a2, _b; + var _a3, _b; const events = createEvents(); let deferClose = true; let quickClose = () => void (deferClose = false); - (_a2 = spawned.stdout) == null ? void 0 : _a2.on("data", quickClose); + (_a3 = spawned.stdout) == null ? void 0 : _a3.on("data", quickClose); (_b = spawned.stderr) == null ? void 0 : _b.on("data", quickClose); spawned.on("error", quickClose); spawned.on("close", (code) => events.close(code)); @@ -15049,12 +15352,58 @@ function completionDetectionPlugin({ var import_promise_deferred, never; var init_completion_detection_plugin = __esm({ "src/lib/plugins/completion-detection.plugin.ts"() { + "use strict"; import_promise_deferred = __nccwpck_require__(9819); init_utils(); never = (0, import_promise_deferred.deferred)().promise; } }); +// src/lib/plugins/custom-binary.plugin.ts +function isBadArgument(arg) { + return !arg || !/^([a-z]:)?([a-z0-9/.\\_-]+)$/i.test(arg); +} +function toBinaryConfig(input, allowUnsafe) { + if (input.length < 1 || input.length > 2) { + throw new GitPluginError(void 0, "binary", WRONG_NUMBER_ERR); + } + const isBad = input.some(isBadArgument); + if (isBad) { + if (allowUnsafe) { + console.warn(WRONG_CHARS_ERR); + } else { + throw new GitPluginError(void 0, "binary", WRONG_CHARS_ERR); + } + } + const [binary, prefix] = input; + return { + binary, + prefix + }; +} +function customBinaryPlugin(plugins, input = ["git"], allowUnsafe = false) { + let config = toBinaryConfig(asArray(input), allowUnsafe); + plugins.on("binary", (input2) => { + config = toBinaryConfig(asArray(input2), allowUnsafe); + }); + plugins.append("spawn.binary", () => { + return config.binary; + }); + plugins.append("spawn.args", (data) => { + return config.prefix ? [config.prefix, ...data] : data; + }); +} +var WRONG_NUMBER_ERR, WRONG_CHARS_ERR; +var init_custom_binary_plugin = __esm({ + "src/lib/plugins/custom-binary.plugin.ts"() { + "use strict"; + init_git_plugin_error(); + init_utils(); + WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`; + WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`; + } +}); + // src/lib/plugins/error-detection.plugin.ts function isTaskError(result) { return !!(result.exitCode && result.stdErr.length); @@ -15090,18 +15439,32 @@ function errorDetectionPlugin(config) { } var init_error_detection_plugin = __esm({ "src/lib/plugins/error-detection.plugin.ts"() { + "use strict"; init_git_error(); } }); // src/lib/plugins/plugin-store.ts -var PluginStore; +var import_node_events, PluginStore; var init_plugin_store = __esm({ "src/lib/plugins/plugin-store.ts"() { + "use strict"; + import_node_events = __nccwpck_require__(5673); init_utils(); PluginStore = class { constructor() { this.plugins = /* @__PURE__ */ new Set(); + this.events = new import_node_events.EventEmitter(); + } + on(type, listener) { + this.events.on(type, listener); + } + reconfigure(type, data) { + this.events.emit(type, data); + } + append(type, action) { + const plugin = append(this.plugins, { type, action }); + return () => this.plugins.delete(plugin); } add(plugin) { const plugins = []; @@ -15166,6 +15529,7 @@ function progressEventStage(input) { } var init_progress_monitor_plugin = __esm({ "src/lib/plugins/progress-monitor-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15173,6 +15537,7 @@ var init_progress_monitor_plugin = __esm({ // src/lib/plugins/simple-git-plugin.ts var init_simple_git_plugin = __esm({ "src/lib/plugins/simple-git-plugin.ts"() { + "use strict"; } }); @@ -15188,6 +15553,7 @@ function spawnOptionsPlugin(spawnOptions) { } var init_spawn_options_plugin = __esm({ "src/lib/plugins/spawn-options-plugin.ts"() { + "use strict"; init_utils(); } }); @@ -15231,6 +15597,7 @@ function timeoutPlugin({ } var init_timout_plugin = __esm({ "src/lib/plugins/timout-plugin.ts"() { + "use strict"; init_git_plugin_error(); } }); @@ -15238,10 +15605,12 @@ var init_timout_plugin = __esm({ // src/lib/plugins/index.ts var init_plugins = __esm({ "src/lib/plugins/index.ts"() { + "use strict"; init_abort_plugin(); init_block_unsafe_operations_plugin(); init_command_config_prefixing_plugin(); init_completion_detection_plugin(); + init_custom_binary_plugin(); init_error_detection_plugin(); init_plugin_store(); init_progress_monitor_plugin(); @@ -15268,7 +15637,9 @@ function suffixPathsPlugin() { continue; } if (param === "--") { - append2(data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item)); + append2( + data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item) + ); break; } prefix.push(param); @@ -15279,6 +15650,7 @@ function suffixPathsPlugin() { } var init_suffix_paths_plugin = __esm({ "src/lib/plugins/suffix-paths.plugin.ts"() { + "use strict"; init_pathspec(); } }); @@ -15318,7 +15690,10 @@ function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger); return step(initialStep); function sibling(name, initial) { - return append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); + return append( + spawned, + createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger) + ); } function step(phase) { const stepPrefix = phase && `[${phase}]` || ""; @@ -15335,6 +15710,7 @@ function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { var import_debug; var init_git_logger = __esm({ "src/lib/git-logger.ts"() { + "use strict"; import_debug = __toESM(__nccwpck_require__(8237)); init_utils(); import_debug.default.formatters.L = (value) => String(filterHasLength(value) ? value.length : "-"); @@ -15351,6 +15727,7 @@ var init_git_logger = __esm({ var _TasksPendingQueue, TasksPendingQueue; var init_tasks_pending_queue = __esm({ "src/lib/runners/tasks-pending-queue.ts"() { + "use strict"; init_git_error(); init_git_logger(); _TasksPendingQueue = class { @@ -15380,9 +15757,14 @@ var init_tasks_pending_queue = __esm({ for (const [task, { logger }] of Array.from(this._queue.entries())) { if (task === err.task) { logger.info(`Failed %o`, err); - logger(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); + logger( + `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted` + ); } else { - logger.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); + logger.info( + `A fatal exception occurred in a previous task, the queue has been purged: %o`, + err.message + ); } this.complete(task); } @@ -15436,6 +15818,7 @@ function onDataReceived(target, name, logger, output) { var import_child_process, GitExecutorChain; var init_git_executor_chain = __esm({ "src/lib/runners/git-executor-chain.ts"() { + "use strict"; import_child_process = __nccwpck_require__(2081); init_git_error(); init_task(); @@ -15449,9 +15832,6 @@ var init_git_executor_chain = __esm({ this._chain = Promise.resolve(); this._queue = new TasksPendingQueue(); } - get binary() { - return this._executor.binary; - } get cwd() { return this._cwd || this._executor.cwd; } @@ -15494,8 +15874,19 @@ var init_git_executor_chain = __esm({ } attemptRemoteTask(task, logger) { return __async(this, null, function* () { - const args = this._plugins.exec("spawn.args", [...task.commands], pluginContext(task, task.commands)); - const raw = yield this.gitResponse(task, this.binary, args, this.outputHandler, logger.step("SPAWN")); + const binary = this._plugins.exec("spawn.binary", "", pluginContext(task, task.commands)); + const args = this._plugins.exec( + "spawn.args", + [...task.commands], + pluginContext(task, task.commands) + ); + const raw = yield this.gitResponse( + task, + binary, + args, + this.outputHandler, + logger.step("SPAWN") + ); const outputStreams = yield this.handleTaskData(task, args, raw, logger.step("HANDLE")); logger(`passing response to task's parser as a %s`, task.format); if (isBufferTask(task)) { @@ -15514,17 +15905,36 @@ var init_git_executor_chain = __esm({ const { exitCode, rejection, stdOut, stdErr } = result; return new Promise((done, fail) => { logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); - const { error } = this._plugins.exec("task.error", { error: rejection }, __spreadValues(__spreadValues({}, pluginContext(task, args)), result)); + const { error } = this._plugins.exec( + "task.error", + { error: rejection }, + __spreadValues(__spreadValues({}, pluginContext(task, args)), result) + ); if (error && task.onError) { logger.info(`exitCode=%s handling with custom error handler`); - return task.onError(result, error, (newStdOut) => { - logger.info(`custom error handler treated as success`); - logger(`custom error returned a %s`, objectToString(newStdOut)); - done(new GitOutputStreams(Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, Buffer.concat(stdErr))); - }, fail); + return task.onError( + result, + error, + (newStdOut) => { + logger.info(`custom error handler treated as success`); + logger(`custom error returned a %s`, objectToString(newStdOut)); + done( + new GitOutputStreams( + Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, + Buffer.concat(stdErr) + ) + ); + }, + fail + ); } if (error) { - logger.info(`handling as error: exitCode=%s stdErr=%s rejection=%o`, exitCode, stdErr.length, rejection); + logger.info( + `handling as error: exitCode=%s stdErr=%s rejection=%o`, + exitCode, + stdErr.length, + rejection + ); return fail(error); } logger.info(`retrieving task output complete`); @@ -15534,11 +15944,15 @@ var init_git_executor_chain = __esm({ gitResponse(task, command, args, outputHandler, logger) { return __async(this, null, function* () { const outputLogger = logger.sibling("output"); - const spawnOptions = this._plugins.exec("spawn.options", { - cwd: this.cwd, - env: this.env, - windowsHide: true - }, pluginContext(task, task.commands)); + const spawnOptions = this._plugins.exec( + "spawn.options", + { + cwd: this.cwd, + env: this.env, + windowsHide: true + }, + pluginContext(task, task.commands) + ); return new Promise((done) => { const stdOut = []; const stdErr = []; @@ -15559,8 +15973,14 @@ var init_git_executor_chain = __esm({ } })); const spawned = (0, import_child_process.spawn)(command, args, spawnOptions); - spawned.stdout.on("data", onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut"))); - spawned.stderr.on("data", onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr"))); + spawned.stdout.on( + "data", + onDataReceived(stdOut, "stdOut", logger, outputLogger.step("stdOut")) + ); + spawned.stderr.on( + "data", + onDataReceived(stdErr, "stdErr", logger, outputLogger.step("stdErr")) + ); spawned.on("error", onErrorReceived(stdErr, logger)); if (outputHandler) { logger(`Passing child process stdOut/stdErr to custom outputHandler`); @@ -15608,10 +16028,10 @@ __export(git_executor_exports, { var GitExecutor; var init_git_executor = __esm({ "src/lib/runners/git-executor.ts"() { + "use strict"; init_git_executor_chain(); GitExecutor = class { - constructor(binary = "git", cwd, _scheduler, _plugins) { - this.binary = binary; + constructor(cwd, _scheduler, _plugins) { this.cwd = cwd; this._scheduler = _scheduler; this._plugins = _plugins; @@ -15634,14 +16054,19 @@ function taskCallback(task, response, callback = NOOP) { }; const onError2 = (err) => { if ((err == null ? void 0 : err.task) === task) { - callback(err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, void 0); + callback( + err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, + void 0 + ); } }; response.then(onSuccess, onError2); } function addDeprecationNoticeToError(err) { let log = (name) => { - console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); + console.warn( + `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3` + ); log = NOOP; }; return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); @@ -15662,6 +16087,7 @@ function addDeprecationNoticeToError(err) { } var init_task_callback = __esm({ "src/lib/task-callback.ts"() { + "use strict"; init_git_response_error(); init_utils(); } @@ -15678,6 +16104,7 @@ function changeWorkingDirectoryTask(directory, root) { } var init_change_working_directory = __esm({ "src/lib/tasks/change-working-directory.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15694,18 +16121,28 @@ function checkoutTask(args) { function checkout_default() { return { checkout() { - return this._runTask(checkoutTask(getTrailingOptions(arguments, 1)), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(getTrailingOptions(arguments, 1)), + trailingFunctionArgument(arguments) + ); }, checkoutBranch(branchName, startPoint) { - return this._runTask(checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); }, checkoutLocalBranch(branchName) { - return this._runTask(checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); } }; } var init_checkout = __esm({ "src/lib/tasks/checkout.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15729,6 +16166,7 @@ function parseCommitResult(stdOut) { var parsers; var init_parse_commit = __esm({ "src/lib/parsers/parse-commit.ts"() { + "use strict"; init_utils(); parsers = [ new LineParser(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { @@ -15747,20 +16185,26 @@ var init_parse_commit = __esm({ name: parts.join("<").trim() }; }), - new LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { - result.summary.changes = parseInt(changes, 10) || 0; - result.summary.insertions = parseInt(insertions, 10) || 0; - result.summary.deletions = parseInt(deletions, 10) || 0; - }), - new LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { - result.summary.changes = parseInt(changes, 10) || 0; - const count = parseInt(lines, 10) || 0; - if (direction === "-") { - result.summary.deletions = count; - } else if (direction === "+") { - result.summary.insertions = count; + new LineParser( + /(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, + (result, [changes, insertions, deletions]) => { + result.summary.changes = parseInt(changes, 10) || 0; + result.summary.insertions = parseInt(insertions, 10) || 0; + result.summary.deletions = parseInt(deletions, 10) || 0; + } + ), + new LineParser( + /^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, + (result, [changes, lines, direction]) => { + result.summary.changes = parseInt(changes, 10) || 0; + const count = parseInt(lines, 10) || 0; + if (direction === "-") { + result.summary.deletions = count; + } else if (direction === "+") { + result.summary.insertions = count; + } } - }) + ) ]; } }); @@ -15785,16 +16229,23 @@ function commit_default() { return { commit(message, ...rest) { const next = trailingFunctionArgument(arguments); - const task = rejectDeprecatedSignatures(message) || commitTask(asArray(message), asArray(filterType(rest[0], filterStringOrStringArray, [])), [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)]); + const task = rejectDeprecatedSignatures(message) || commitTask( + asArray(message), + asArray(filterType(rest[0], filterStringOrStringArray, [])), + [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)] + ); return this._runTask(task, next); } }; function rejectDeprecatedSignatures(message) { - return !filterStringOrStringArray(message) && configurationErrorTask(`git.commit: requires the commit message to be supplied as a string/string[]`); + return !filterStringOrStringArray(message) && configurationErrorTask( + `git.commit: requires the commit message to be supplied as a string/string[]` + ); } } var init_commit = __esm({ "src/lib/tasks/commit.ts"() { + "use strict"; init_parse_commit(); init_utils(); init_task(); @@ -15805,12 +16256,16 @@ var init_commit = __esm({ function first_commit_default() { return { firstCommit() { - return this._runTask(straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["rev-list", "--max-parents=0", "HEAD"], true), + trailingFunctionArgument(arguments) + ); } }; } var init_first_commit = __esm({ "src/lib/tasks/first-commit.ts"() { + "use strict"; init_utils(); init_task(); } @@ -15826,6 +16281,7 @@ function hashObjectTask(filePath, write) { } var init_hash_object = __esm({ "src/lib/tasks/hash-object.ts"() { + "use strict"; init_task(); } }); @@ -15854,6 +16310,7 @@ function parseInit(bare, path, text) { var InitSummary, initResponseRegex, reInitResponseRegex; var init_InitSummary = __esm({ "src/lib/responses/InitSummary.ts"() { + "use strict"; InitSummary = class { constructor(bare, path, existing, gitDir) { this.bare = bare; @@ -15887,6 +16344,7 @@ function initTask(bare = false, path, customArgs) { var bareCommand; var init_init = __esm({ "src/lib/tasks/init.ts"() { + "use strict"; init_InitSummary(); bareCommand = "--bare"; } @@ -15908,6 +16366,7 @@ function isLogFormat(customArg) { var logFormatRegex; var init_log_format = __esm({ "src/lib/args/log-format.ts"() { + "use strict"; logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/; } }); @@ -15916,6 +16375,7 @@ var init_log_format = __esm({ var DiffSummary; var init_DiffSummary = __esm({ "src/lib/responses/DiffSummary.ts"() { + "use strict"; DiffSummary = class { constructor() { this.changed = 0; @@ -15935,51 +16395,64 @@ function getDiffParser(format = "" /* NONE */) { var statParser, numStatParser, nameOnlyParser, nameStatusParser, diffSummaryParsers; var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { + "use strict"; init_log_format(); init_DiffSummary(); init_diff_name_status(); init_utils(); statParser = [ - new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { - result.files.push({ - file: file.trim(), - changes: asNumber(changes), - insertions: alterations.replace(/[^+]/g, "").length, - deletions: alterations.replace(/[^-]/g, "").length, - binary: false - }); - }), - new LineParser(/(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, (result, [file, before, after]) => { - result.files.push({ - file: file.trim(), - before: asNumber(before), - after: asNumber(after), - binary: true - }); - }), - new LineParser(/(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, (result, [changed, summary]) => { - const inserted = /(\d+) i/.exec(summary); - const deleted = /(\d+) d/.exec(summary); - result.changed = asNumber(changed); - result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); - result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); - }) + new LineParser( + /^(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, + (result, [file, changes, alterations = ""]) => { + result.files.push({ + file: file.trim(), + changes: asNumber(changes), + insertions: alterations.replace(/[^+]/g, "").length, + deletions: alterations.replace(/[^-]/g, "").length, + binary: false + }); + } + ), + new LineParser( + /^(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, + (result, [file, before, after]) => { + result.files.push({ + file: file.trim(), + before: asNumber(before), + after: asNumber(after), + binary: true + }); + } + ), + new LineParser( + /(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, + (result, [changed, summary]) => { + const inserted = /(\d+) i/.exec(summary); + const deleted = /(\d+) d/.exec(summary); + result.changed = asNumber(changed); + result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); + result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); + } + ) ]; numStatParser = [ - new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { - const insertions = asNumber(changesInsert); - const deletions = asNumber(changesDelete); - result.changed++; - result.insertions += insertions; - result.deletions += deletions; - result.files.push({ - file, - changes: insertions + deletions, - insertions, - deletions, - binary: false - }); - }), + new LineParser( + /(\d+)\t(\d+)\t(.+)$/, + (result, [changesInsert, changesDelete, file]) => { + const insertions = asNumber(changesInsert); + const deletions = asNumber(changesDelete); + result.changed++; + result.insertions += insertions; + result.deletions += deletions; + result.files.push({ + file, + changes: insertions + deletions, + insertions, + deletions, + binary: false + }); + } + ), new LineParser(/-\t-\t(.+)$/, (result, [file]) => { result.changed++; result.files.push({ @@ -16003,17 +16476,20 @@ var init_parse_diff_summary = __esm({ }) ]; nameStatusParser = [ - new LineParser(/([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, (result, [status, _similarity, from, _to, to]) => { - result.changed++; - result.files.push({ - file: to != null ? to : from, - changes: 0, - status: orVoid(isDiffNameStatus(status) && status), - insertions: 0, - deletions: 0, - binary: false - }); - }) + new LineParser( + /([ACDMRTUXB])([0-9]{0,3})\t(.[^\t]*)(\t(.[^\t]*))?$/, + (result, [status, _similarity, from, _to, to]) => { + result.changed++; + result.files.push({ + file: to != null ? to : from, + changes: 0, + status: orVoid(isDiffNameStatus(status) && status), + insertions: 0, + deletions: 0, + binary: false + }); + } + ) ]; diffSummaryParsers = { ["" /* NONE */]: statParser, @@ -16027,17 +16503,27 @@ var init_parse_diff_summary = __esm({ // src/lib/parsers/parse-list-log-summary.ts function lineBuilder(tokens, fields) { - return fields.reduce((line, field, index) => { - line[field] = tokens[index] || ""; - return line; - }, /* @__PURE__ */ Object.create({ diff: null })); + return fields.reduce( + (line, field, index) => { + line[field] = tokens[index] || ""; + return line; + }, + /* @__PURE__ */ Object.create({ diff: null }) + ); } function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNames, logFormat = "" /* NONE */) { const parseDiffResult = getDiffParser(logFormat); return function(stdOut) { - const all = toLinesWithContent(stdOut, true, START_BOUNDARY).map(function(item) { + const all = toLinesWithContent( + stdOut, + true, + START_BOUNDARY + ).map(function(item) { const lineDetail = item.trim().split(COMMIT_BOUNDARY); - const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); + const listLogLine = lineBuilder( + lineDetail[0].trim().split(splitter), + fields + ); if (lineDetail.length > 1 && !!lineDetail[1].trim()) { listLogLine.diff = parseDiffResult(lineDetail[1]); } @@ -16053,6 +16539,7 @@ function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNa var START_BOUNDARY, COMMIT_BOUNDARY, SPLITTER, defaultFieldNames; var init_parse_list_log_summary = __esm({ "src/lib/parsers/parse-list-log-summary.ts"() { + "use strict"; init_utils(); init_parse_diff_summary(); init_log_format(); @@ -16086,14 +16573,19 @@ function diffSummaryTask(customArgs) { function validateLogFormatConfig(customArgs) { const flags = customArgs.filter(isLogFormat); if (flags.length > 1) { - return configurationErrorTask(`Summary flags are mutually exclusive - pick one of ${flags.join(",")}`); + return configurationErrorTask( + `Summary flags are mutually exclusive - pick one of ${flags.join(",")}` + ); } if (flags.length && customArgs.includes("-z")) { - return configurationErrorTask(`Summary flag ${flags} parsing is not compatible with null termination option '-z'`); + return configurationErrorTask( + `Summary flag ${flags} parsing is not compatible with null termination option '-z'` + ); } } var init_diff = __esm({ "src/lib/tasks/diff.ts"() { + "use strict"; init_log_format(); init_parse_diff_summary(); init_task(); @@ -16165,7 +16657,10 @@ function log_default() { return { log(...rest) { const next = trailingFunctionArgument(arguments); - const options = parseLogOptions(trailingOptionsArgument(arguments), filterType(arguments[0], filterArray)); + const options = parseLogOptions( + trailingOptionsArgument(arguments), + filterType(arguments[0], filterArray) + ); const task = rejectDeprecatedSignatures(...rest) || validateLogFormatConfig(options.commands) || createLogTask(options); return this._runTask(task, next); } @@ -16174,12 +16669,15 @@ function log_default() { return logTask(options.splitter, options.fields, options.commands); } function rejectDeprecatedSignatures(from, to) { - return filterString(from) && filterString(to) && configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`); + return filterString(from) && filterString(to) && configurationErrorTask( + `git.log(string, string) should be replaced with git.log({ from: string, to: string })` + ); } } var excludeOptions; var init_log = __esm({ "src/lib/tasks/log.ts"() { + "use strict"; init_log_format(); init_pathspec(); init_parse_list_log_summary(); @@ -16209,6 +16707,7 @@ var init_log = __esm({ var MergeSummaryConflict, MergeSummaryDetail; var init_MergeSummary = __esm({ "src/lib/responses/MergeSummary.ts"() { + "use strict"; MergeSummaryConflict = class { constructor(reason, file = null, meta) { this.reason = reason; @@ -16245,6 +16744,7 @@ var init_MergeSummary = __esm({ var PullSummary, PullFailedSummary; var init_PullSummary = __esm({ "src/lib/responses/PullSummary.ts"() { + "use strict"; PullSummary = class { constructor() { this.remoteMessages = { @@ -16304,24 +16804,34 @@ function asObjectCount(source) { var remoteMessagesObjectParsers; var init_parse_remote_objects = __esm({ "src/lib/parsers/parse-remote-objects.ts"() { + "use strict"; init_utils(); remoteMessagesObjectParsers = [ - new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - }), - new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { - const key = action.toLowerCase(); - const enumeration = objectEnumerationResult(result.remoteMessages); - Object.assign(enumeration, { [key]: asNumber(count) }); - }), - new RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { - const objects = objectEnumerationResult(result.remoteMessages); - objects.total = asObjectCount(total); - objects.reused = asObjectCount(reused); - objects.packReused = asNumber(packReused); - }) + new RemoteLineParser( + /^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber(count) }); + } + ), + new RemoteLineParser( + /^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, + (result, [action, count]) => { + const key = action.toLowerCase(); + const enumeration = objectEnumerationResult(result.remoteMessages); + Object.assign(enumeration, { [key]: asNumber(count) }); + } + ), + new RemoteLineParser( + /total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, + (result, [total, reused, packReused]) => { + const objects = objectEnumerationResult(result.remoteMessages); + objects.total = asObjectCount(total); + objects.reused = asObjectCount(reused); + objects.packReused = asNumber(packReused); + } + ) ]; } }); @@ -16333,6 +16843,7 @@ function parseRemoteMessages(_stdOut, stdErr) { var parsers2, RemoteMessageSummary; var init_parse_remote_messages = __esm({ "src/lib/parsers/parse-remote-messages.ts"() { + "use strict"; init_utils(); init_parse_remote_objects(); parsers2 = [ @@ -16341,16 +16852,22 @@ var init_parse_remote_messages = __esm({ return false; }), ...remoteMessagesObjectParsers, - new RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { - result.remoteMessages.pullRequestUrl = pullRequestUrl; - }), - new RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { - result.remoteMessages.vulnerabilities = { - count: asNumber(count), - summary, - url - }; - }) + new RemoteLineParser( + [/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], + (result, [pullRequestUrl]) => { + result.remoteMessages.pullRequestUrl = pullRequestUrl; + } + ), + new RemoteLineParser( + [/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], + (result, [count, summary, url]) => { + result.remoteMessages.vulnerabilities = { + count: asNumber(count), + summary, + url + }; + } + ) ]; RemoteMessageSummary = class { constructor() { @@ -16368,6 +16885,7 @@ function parsePullErrorResult(stdOut, stdErr) { var FILE_UPDATE_REGEX, SUMMARY_REGEX, ACTION_REGEX, parsers3, errorParsers, parsePullDetail, parsePullResult; var init_parse_pull = __esm({ "src/lib/parsers/parse-pull.ts"() { + "use strict"; init_PullSummary(); init_utils(); init_parse_remote_messages(); @@ -16401,18 +16919,25 @@ var init_parse_pull = __esm({ errorParsers = [ new LineParser(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), new LineParser(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), - new LineParser(/([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { - result.branch.local = branchLocal; - result.hash.local = hashLocal; - result.branch.remote = branchRemote; - result.hash.remote = hashRemote; - }) + new LineParser( + /([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, + (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { + result.branch.local = branchLocal; + result.hash.local = hashLocal; + result.branch.remote = branchRemote; + result.hash.remote = hashRemote; + } + ) ]; parsePullDetail = (stdOut, stdErr) => { return parseStringResponse(new PullSummary(), parsers3, [stdOut, stdErr]); }; parsePullResult = (stdOut, stdErr) => { - return Object.assign(new PullSummary(), parsePullDetail(stdOut, stdErr), parseRemoteMessages(stdOut, stdErr)); + return Object.assign( + new PullSummary(), + parsePullDetail(stdOut, stdErr), + parseRemoteMessages(stdOut, stdErr) + ); }; } }); @@ -16421,6 +16946,7 @@ var init_parse_pull = __esm({ var parsers4, parseMergeResult, parseMergeDetail; var init_parse_merge = __esm({ "src/lib/parsers/parse-merge.ts"() { + "use strict"; init_MergeSummary(); init_utils(); init_parse_pull(); @@ -16431,9 +16957,12 @@ var init_parse_merge = __esm({ new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { summary.conflicts.push(new MergeSummaryConflict(reason, file)); }), - new LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { - summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); - }), + new LineParser( + /^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, + (summary, [reason, file, deleteRef]) => { + summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); + } + ), new LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { summary.conflicts.push(new MergeSummaryConflict(reason, null)); }), @@ -16469,6 +16998,7 @@ function mergeTask(customArgs) { } var init_merge = __esm({ "src/lib/tasks/merge.ts"() { + "use strict"; init_git_response_error(); init_parse_merge(); init_task(); @@ -16493,6 +17023,7 @@ function pushResultPushedItem(local, remote, status) { var parsers5, parsePushResult, parsePushDetail; var init_parse_push = __esm({ "src/lib/parsers/parse-push.ts"() { + "use strict"; init_utils(); init_parse_remote_messages(); parsers5 = [ @@ -16507,25 +17038,31 @@ var init_parse_push = __esm({ new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { result.pushed.push(pushResultPushedItem(local, remote, type)); }), - new LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { - result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { - local, - remote, - remoteName - }); - }), - new LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { - result.update = { - head: { + new LineParser( + /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, + (result, [local, remote, remoteName]) => { + result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { local, - remote - }, - hash: { - from, - to - } - }; - }) + remote, + remoteName + }); + } + ), + new LineParser( + /^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, + (result, [local, remote, from, to]) => { + result.update = { + head: { + local, + remote + }, + hash: { + from, + to + } + }; + } + ) ]; parsePushResult = (stdOut, stdErr) => { const pushDetail = parsePushDetail(stdOut, stdErr); @@ -16567,6 +17104,7 @@ function pushTask(ref = {}, customArgs) { } var init_push = __esm({ "src/lib/tasks/push.ts"() { + "use strict"; init_parse_push(); init_utils(); } @@ -16580,16 +17118,23 @@ function show_default() { if (!commands.includes("--binary")) { commands.splice(1, 0, "--binary"); } - return this._runTask(straightThroughBufferTask(commands), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughBufferTask(commands), + trailingFunctionArgument(arguments) + ); }, show() { const commands = ["show", ...getTrailingOptions(arguments, 1)]; - return this._runTask(straightThroughStringTask(commands), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(commands), + trailingFunctionArgument(arguments) + ); } }; } var init_show = __esm({ "src/lib/tasks/show.ts"() { + "use strict"; init_utils(); init_task(); } @@ -16599,13 +17144,14 @@ var init_show = __esm({ var fromPathRegex, FileStatusSummary; var init_FileStatusSummary = __esm({ "src/lib/responses/FileStatusSummary.ts"() { + "use strict"; fromPathRegex = /^(.+) -> (.+)$/; FileStatusSummary = class { constructor(path, index, working_dir) { this.path = path; this.index = index; this.working_dir = working_dir; - if (index + working_dir === "R") { + if ("R" === index + working_dir) { const detail = fromPathRegex.exec(path) || [null, path, path]; this.from = detail[1] || ""; this.path = detail[2] || ""; @@ -16653,6 +17199,7 @@ function splitLine(result, lineStr) { var StatusSummary, parsers6, parseStatusSummary; var init_StatusSummary = __esm({ "src/lib/responses/StatusSummary.ts"() { + "use strict"; init_utils(); init_FileStatusSummary(); StatusSummary = class { @@ -16677,14 +17224,46 @@ var init_StatusSummary = __esm({ } }; parsers6 = new Map([ - parser2(" " /* NONE */, "A" /* ADDED */, (result, file) => append(result.created, file)), - parser2(" " /* NONE */, "D" /* DELETED */, (result, file) => append(result.deleted, file)), - parser2(" " /* NONE */, "M" /* MODIFIED */, (result, file) => append(result.modified, file)), - parser2("A" /* ADDED */, " " /* NONE */, (result, file) => append(result.created, file) && append(result.staged, file)), - parser2("A" /* ADDED */, "M" /* MODIFIED */, (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file)), - parser2("D" /* DELETED */, " " /* NONE */, (result, file) => append(result.deleted, file) && append(result.staged, file)), - parser2("M" /* MODIFIED */, " " /* NONE */, (result, file) => append(result.modified, file) && append(result.staged, file)), - parser2("M" /* MODIFIED */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) && append(result.staged, file)), + parser2( + " " /* NONE */, + "A" /* ADDED */, + (result, file) => append(result.created, file) + ), + parser2( + " " /* NONE */, + "D" /* DELETED */, + (result, file) => append(result.deleted, file) + ), + parser2( + " " /* NONE */, + "M" /* MODIFIED */, + (result, file) => append(result.modified, file) + ), + parser2( + "A" /* ADDED */, + " " /* NONE */, + (result, file) => append(result.created, file) && append(result.staged, file) + ), + parser2( + "A" /* ADDED */, + "M" /* MODIFIED */, + (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file) + ), + parser2( + "D" /* DELETED */, + " " /* NONE */, + (result, file) => append(result.deleted, file) && append(result.staged, file) + ), + parser2( + "M" /* MODIFIED */, + " " /* NONE */, + (result, file) => append(result.modified, file) && append(result.staged, file) + ), + parser2( + "M" /* MODIFIED */, + "M" /* MODIFIED */, + (result, file) => append(result.modified, file) && append(result.staged, file) + ), parser2("R" /* RENAMED */, " " /* NONE */, (result, file) => { append(result.renamed, renamedFile(file)); }), @@ -16696,10 +17275,23 @@ var init_StatusSummary = __esm({ parser2("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2("?" /* UNTRACKED */, "?" /* UNTRACKED */, (result, file) => append(result.not_added, file)), + parser2( + "?" /* UNTRACKED */, + "?" /* UNTRACKED */, + (result, file) => append(result.not_added, file) + ), ...conflicts("A" /* ADDED */, "A" /* ADDED */, "U" /* UNMERGED */), - ...conflicts("D" /* DELETED */, "D" /* DELETED */, "U" /* UNMERGED */), - ...conflicts("U" /* UNMERGED */, "A" /* ADDED */, "D" /* DELETED */, "U" /* UNMERGED */), + ...conflicts( + "D" /* DELETED */, + "D" /* DELETED */, + "U" /* UNMERGED */ + ), + ...conflicts( + "U" /* UNMERGED */, + "A" /* ADDED */, + "D" /* DELETED */, + "U" /* UNMERGED */ + ), [ "##", (result, line) => { @@ -16762,6 +17354,7 @@ function statusTask(customArgs) { var ignoredOptions; var init_status = __esm({ "src/lib/tasks/status.ts"() { + "use strict"; init_StatusSummary(); ignoredOptions = ["--null", "-z"]; } @@ -16769,19 +17362,23 @@ var init_status = __esm({ // src/lib/tasks/version.ts function versionResponse(major = 0, minor = 0, patch = 0, agent = "", installed = true) { - return Object.defineProperty({ - major, - minor, - patch, - agent, - installed - }, "toString", { - value() { - return `${this.major}.${this.minor}.${this.patch}`; + return Object.defineProperty( + { + major, + minor, + patch, + agent, + installed }, - configurable: false, - enumerable: false - }); + "toString", + { + value() { + return `${this.major}.${this.minor}.${this.patch}`; + }, + configurable: false, + enumerable: false + } + ); } function notInstalledResponse() { return versionResponse(0, 0, 0, "", false); @@ -16812,15 +17409,25 @@ function versionParser(stdOut) { var NOT_INSTALLED, parsers7; var init_version = __esm({ "src/lib/tasks/version.ts"() { + "use strict"; init_utils(); NOT_INSTALLED = "installed=false"; parsers7 = [ - new LineParser(/version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)); - }), - new LineParser(/version (\d+)\.(\d+)\.(\D+)(.+)?$/, (result, [major, minor, patch, agent = ""]) => { - Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); - }) + new LineParser( + /version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign( + result, + versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent) + ); + } + ), + new LineParser( + /version (\d+)\.(\d+)\.(\D+)(.+)?$/, + (result, [major, minor, patch, agent = ""]) => { + Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); + } + ) ]; } }); @@ -16833,6 +17440,7 @@ __export(simple_git_api_exports, { var SimpleGitApi; var init_simple_git_api = __esm({ "src/lib/simple-git-api.ts"() { + "use strict"; init_task_callback(); init_change_working_directory(); init_checkout(); @@ -16867,7 +17475,10 @@ var init_simple_git_api = __esm({ }); } add(files) { - return this._runTask(straightThroughStringTask(["add", ...asArray(files)]), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["add", ...asArray(files)]), + trailingFunctionArgument(arguments) + ); } cwd(directory) { const next = trailingFunctionArgument(arguments); @@ -16875,44 +17486,88 @@ var init_simple_git_api = __esm({ return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next); } if (typeof (directory == null ? void 0 : directory.path) === "string") { - return this._runTask(changeWorkingDirectoryTask(directory.path, directory.root && this._executor || void 0), next); + return this._runTask( + changeWorkingDirectoryTask( + directory.path, + directory.root && this._executor || void 0 + ), + next + ); } - return this._runTask(configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), next); + return this._runTask( + configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), + next + ); } hashObject(path, write) { - return this._runTask(hashObjectTask(path, write === true), trailingFunctionArgument(arguments)); + return this._runTask( + hashObjectTask(path, write === true), + trailingFunctionArgument(arguments) + ); } init(bare) { - return this._runTask(initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } merge() { - return this._runTask(mergeTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + mergeTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } mergeFromTo(remote, branch) { if (!(filterString(remote) && filterString(branch))) { - return this._runTask(configurationErrorTask(`Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`)); + return this._runTask( + configurationErrorTask( + `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings` + ) + ); } - return this._runTask(mergeTask([remote, branch, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments, false)); + return this._runTask( + mergeTask([remote, branch, ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments, false) + ); } outputHandler(handler) { this._executor.outputHandler = handler; return this; } push() { - const task = pushTask({ - remote: filterType(arguments[0], filterString), - branch: filterType(arguments[1], filterString) - }, getTrailingOptions(arguments)); + const task = pushTask( + { + remote: filterType(arguments[0], filterString), + branch: filterType(arguments[1], filterString) + }, + getTrailingOptions(arguments) + ); return this._runTask(task, trailingFunctionArgument(arguments)); } stash() { - return this._runTask(straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); + return this._runTask( + straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), + trailingFunctionArgument(arguments) + ); } status() { - return this._runTask(statusTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); + return this._runTask( + statusTask(getTrailingOptions(arguments)), + trailingFunctionArgument(arguments) + ); } }; - Object.assign(SimpleGitApi.prototype, checkout_default(), commit_default(), config_default(), first_commit_default(), grep_default(), log_default(), show_default(), version_default()); + Object.assign( + SimpleGitApi.prototype, + checkout_default(), + commit_default(), + config_default(), + first_commit_default(), + grep_default(), + log_default(), + show_default(), + version_default() + ); } }); @@ -16924,6 +17579,7 @@ __export(scheduler_exports, { var import_promise_deferred2, createScheduledTask, Scheduler; var init_scheduler = __esm({ "src/lib/runners/scheduler.ts"() { + "use strict"; init_utils(); import_promise_deferred2 = __nccwpck_require__(9819); init_git_logger(); @@ -16949,7 +17605,12 @@ var init_scheduler = __esm({ } schedule() { if (!this.pending.length || this.running.length >= this.concurrency) { - this.logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); + this.logger( + `Schedule attempt ignored, pending=%s running=%s concurrency=%s`, + this.pending.length, + this.running.length, + this.concurrency + ); return; } const task = append(this.running, this.pending.shift()); @@ -16980,6 +17641,7 @@ function applyPatchTask(patches, customArgs) { } var init_apply_patch = __esm({ "src/lib/tasks/apply-patch.ts"() { + "use strict"; init_task(); } }); @@ -17002,6 +17664,7 @@ function branchDeletionFailure(branch) { var BranchDeletionBatch; var init_BranchDeleteSummary = __esm({ "src/lib/responses/BranchDeleteSummary.ts"() { + "use strict"; BranchDeletionBatch = class { constructor() { this.all = []; @@ -17022,6 +17685,7 @@ function hasBranchDeletionError(data, processExitCode) { var deleteSuccessRegex, deleteErrorRegex, parsers8, parseBranchDeletions; var init_parse_branch_delete = __esm({ "src/lib/parsers/parse-branch-delete.ts"() { + "use strict"; init_BranchDeleteSummary(); init_utils(); deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; @@ -17049,6 +17713,7 @@ var init_parse_branch_delete = __esm({ var BranchSummaryResult; var init_BranchSummary = __esm({ "src/lib/responses/BranchSummary.ts"() { + "use strict"; BranchSummaryResult = class { constructor() { this.all = []; @@ -17084,15 +17749,22 @@ function parseBranchSummary(stdOut) { var parsers9; var init_parse_branch = __esm({ "src/lib/parsers/parse-branch.ts"() { + "use strict"; init_BranchSummary(); init_utils(); parsers9 = [ - new LineParser(/^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { - result.push(branchStatus(current), true, name, commit, label); - }), - new LineParser(/^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, (result, [current, name, commit, label]) => { - result.push(branchStatus(current), false, name, commit, label); - }) + new LineParser( + /^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, + (result, [current, name, commit, label]) => { + result.push(branchStatus(current), true, name, commit, label); + } + ), + new LineParser( + new RegExp("^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$", "s"), + (result, [current, name, commit, label]) => { + result.push(branchStatus(current), false, name, commit, label); + } + ) ]; } }); @@ -17164,13 +17836,17 @@ function deleteBranchTask(branch, forceDelete = false) { if (!hasBranchDeletionError(String(error), exitCode)) { return fail(error); } - throw new GitResponseError(task.parser(bufferToString(stdOut), bufferToString(stdErr)), String(error)); + throw new GitResponseError( + task.parser(bufferToString(stdOut), bufferToString(stdErr)), + String(error) + ); } }; return task; } var init_branch = __esm({ "src/lib/tasks/branch.ts"() { + "use strict"; init_git_response_error(); init_parse_branch_delete(); init_parse_branch(); @@ -17182,6 +17858,7 @@ var init_branch = __esm({ var parseCheckIgnore; var init_CheckIgnore = __esm({ "src/lib/responses/CheckIgnore.ts"() { + "use strict"; parseCheckIgnore = (text) => { return text.split(/\n/g).map((line) => line.trim()).filter((file) => !!file); }; @@ -17202,6 +17879,7 @@ function checkIgnoreTask(paths) { } var init_check_ignore = __esm({ "src/lib/tasks/check-ignore.ts"() { + "use strict"; init_CheckIgnore(); } }); @@ -17231,6 +17909,7 @@ function cloneMirrorTask(repo, directory, customArgs) { } var init_clone = __esm({ "src/lib/tasks/clone.ts"() { + "use strict"; init_task(); init_utils(); } @@ -17251,6 +17930,7 @@ function parseFetchResult(stdOut, stdErr) { var parsers10; var init_parse_fetch = __esm({ "src/lib/parsers/parse-fetch.ts"() { + "use strict"; init_utils(); parsers10 = [ new LineParser(/From (.+)$/, (result, [remote]) => { @@ -17273,14 +17953,17 @@ var init_parse_fetch = __esm({ tracking }); }), - new LineParser(/\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, (result, [from, to, name, tracking]) => { - result.updated.push({ - name, - tracking, - to, - from - }); - }) + new LineParser( + /\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, + (result, [from, to, name, tracking]) => { + result.updated.push({ + name, + tracking, + to, + from + }); + } + ) ]; } }); @@ -17310,6 +17993,7 @@ function fetchTask(remote, branch, customArgs) { } var init_fetch = __esm({ "src/lib/tasks/fetch.ts"() { + "use strict"; init_parse_fetch(); init_task(); } @@ -17322,6 +18006,7 @@ function parseMoveResult(stdOut) { var parsers11; var init_parse_move = __esm({ "src/lib/parsers/parse-move.ts"() { + "use strict"; init_utils(); parsers11 = [ new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { @@ -17345,6 +18030,7 @@ function moveTask(from, to) { } var init_move = __esm({ "src/lib/tasks/move.ts"() { + "use strict"; init_parse_move(); init_utils(); } @@ -17367,7 +18053,10 @@ function pullTask(remote, branch, customArgs) { return parsePullResult(stdOut, stdErr); }, onError(result, _error, _done, fail) { - const pullError = parsePullErrorResult(bufferToString(result.stdOut), bufferToString(result.stdErr)); + const pullError = parsePullErrorResult( + bufferToString(result.stdOut), + bufferToString(result.stdErr) + ); if (pullError) { return fail(new GitResponseError(pullError)); } @@ -17377,6 +18066,7 @@ function pullTask(remote, branch, customArgs) { } var init_pull = __esm({ "src/lib/tasks/pull.ts"() { + "use strict"; init_git_response_error(); init_parse_pull(); init_utils(); @@ -17409,6 +18099,7 @@ function forEach(text, handler) { } var init_GetRemoteSummary = __esm({ "src/lib/responses/GetRemoteSummary.ts"() { + "use strict"; init_utils(); } }); @@ -17422,7 +18113,7 @@ __export(remote_exports, { remoteTask: () => remoteTask, removeRemoteTask: () => removeRemoteTask }); -function addRemoteTask(remoteName, remoteRepo, customArgs = []) { +function addRemoteTask(remoteName, remoteRepo, customArgs) { return straightThroughStringTask(["remote", "add", ...customArgs, remoteName, remoteRepo]); } function getRemotesTask(verbose) { @@ -17436,14 +18127,14 @@ function getRemotesTask(verbose) { parser: verbose ? parseGetRemotesVerbose : parseGetRemotes }; } -function listRemotesTask(customArgs = []) { +function listRemotesTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "ls-remote") { commands.unshift("ls-remote"); } return straightThroughStringTask(commands); } -function remoteTask(customArgs = []) { +function remoteTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "remote") { commands.unshift("remote"); @@ -17455,6 +18146,7 @@ function removeRemoteTask(remoteName) { } var init_remote = __esm({ "src/lib/tasks/remote.ts"() { + "use strict"; init_GetRemoteSummary(); init_task(); } @@ -17468,7 +18160,11 @@ __export(stash_list_exports, { function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; - const parser3 = createListLogSummaryParser(options.splitter, options.fields, logFormatFromCommand(commands)); + const parser3 = createListLogSummaryParser( + options.splitter, + options.fields, + logFormatFromCommand(commands) + ); return validateLogFormatConfig(commands) || { commands, format: "utf-8", @@ -17477,6 +18173,7 @@ function stashListTask(opt = {}, customArgs) { } var init_stash_list = __esm({ "src/lib/tasks/stash-list.ts"() { + "use strict"; init_log_format(); init_parse_list_log_summary(); init_diff(); @@ -17510,6 +18207,7 @@ function updateSubModuleTask(customArgs) { } var init_sub_module = __esm({ "src/lib/tasks/sub-module.ts"() { + "use strict"; init_task(); } }); @@ -17538,6 +18236,7 @@ function toNumber(input) { var TagList, parseTagList; var init_TagList = __esm({ "src/lib/responses/TagList.ts"() { + "use strict"; TagList = class { constructor(all, latest) { this.all = all; @@ -17605,6 +18304,7 @@ function addAnnotatedTagTask(name, tagMessage) { } var init_tag = __esm({ "src/lib/tasks/tag.ts"() { + "use strict"; init_TagList(); } }); @@ -17612,6 +18312,7 @@ var init_tag = __esm({ // src/git.js var require_git = __commonJS({ "src/git.js"(exports2, module2) { + "use strict"; var { GitExecutor: GitExecutor2 } = (init_git_executor(), __toCommonJS(git_executor_exports)); var { SimpleGitApi: SimpleGitApi2 } = (init_simple_git_api(), __toCommonJS(simple_git_api_exports)); var { Scheduler: Scheduler2 } = (init_scheduler(), __toCommonJS(scheduler_exports)); @@ -17661,12 +18362,17 @@ var require_git = __commonJS({ var { addAnnotatedTagTask: addAnnotatedTagTask2, addTagTask: addTagTask2, tagListTask: tagListTask2 } = (init_tag(), __toCommonJS(tag_exports)); var { straightThroughBufferTask: straightThroughBufferTask2, straightThroughStringTask: straightThroughStringTask2 } = (init_task(), __toCommonJS(task_exports)); function Git2(options, plugins) { - this._executor = new GitExecutor2(options.binary, options.baseDir, new Scheduler2(options.maxConcurrentProcesses), plugins); + this._plugins = plugins; + this._executor = new GitExecutor2( + options.baseDir, + new Scheduler2(options.maxConcurrentProcesses), + plugins + ); this._trimmed = options.trimmed; } (Git2.prototype = Object.create(SimpleGitApi2.prototype)).constructor = Git2; Git2.prototype.customBinary = function(command) { - this._executor.binary = command; + this._plugins.reconfigure("binary", command); return this; }; Git2.prototype.env = function(name, value) { @@ -17678,7 +18384,13 @@ var require_git = __commonJS({ return this; }; Git2.prototype.stashList = function(options) { - return this._runTask(stashListTask2(trailingOptionsArgument2(arguments) || {}, filterArray2(options) && options || []), trailingFunctionArgument2(arguments)); + return this._runTask( + stashListTask2( + trailingOptionsArgument2(arguments) || {}, + filterArray2(options) && options || [] + ), + trailingFunctionArgument2(arguments) + ); }; function createCloneTask(api, task, repoPath, localPath) { if (typeof repoPath !== "string") { @@ -17687,10 +18399,16 @@ var require_git = __commonJS({ return task(repoPath, filterType2(localPath, filterString2), getTrailingOptions2(arguments)); } Git2.prototype.clone = function() { - return this._runTask(createCloneTask("clone", cloneTask2, ...arguments), trailingFunctionArgument2(arguments)); + return this._runTask( + createCloneTask("clone", cloneTask2, ...arguments), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.mirror = function() { - return this._runTask(createCloneTask("mirror", cloneMirrorTask2, ...arguments), trailingFunctionArgument2(arguments)); + return this._runTask( + createCloneTask("mirror", cloneMirrorTask2, ...arguments), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.mv = function(from, to) { return this._runTask(moveTask2(from, to), trailingFunctionArgument2(arguments)); @@ -17704,46 +18422,86 @@ var require_git = __commonJS({ }); }; Git2.prototype.pull = function(remote, branch, options, then) { - return this._runTask(pullTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + pullTask2( + filterType2(remote, filterString2), + filterType2(branch, filterString2), + getTrailingOptions2(arguments) + ), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.fetch = function(remote, branch) { - return this._runTask(fetchTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + fetchTask2( + filterType2(remote, filterString2), + filterType2(branch, filterString2), + getTrailingOptions2(arguments) + ), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.silent = function(silence) { - console.warn("simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3"); + console.warn( + "simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3" + ); return this; }; Git2.prototype.tags = function(options, then) { - return this._runTask(tagListTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + tagListTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.rebase = function() { - return this._runTask(straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.reset = function(mode) { - return this._runTask(resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.revert = function(commit) { const next = trailingFunctionArgument2(arguments); if (typeof commit !== "string") { return this._runTask(configurationErrorTask2("Commit must be a string"), next); } - return this._runTask(straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), next); + return this._runTask( + straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), + next + ); }; Git2.prototype.addTag = function(name) { const task = typeof name === "string" ? addTagTask2(name) : configurationErrorTask2("Git.addTag requires a tag name"); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.addAnnotatedTag = function(tagName, tagMessage) { - return this._runTask(addAnnotatedTagTask2(tagName, tagMessage), trailingFunctionArgument2(arguments)); + return this._runTask( + addAnnotatedTagTask2(tagName, tagMessage), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.deleteLocalBranch = function(branchName, forceDelete, then) { - return this._runTask(deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); + return this._runTask( + deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.deleteLocalBranches = function(branchNames, forceDelete, then) { - return this._runTask(deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); + return this._runTask( + deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.branch = function(options, then) { - return this._runTask(branchTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + branchTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.branchLocal = function(then) { return this._runTask(branchLocalTask2(), trailingFunctionArgument2(arguments)); @@ -17760,7 +18518,10 @@ var require_git = __commonJS({ command.push(...getTrailingOptions2(arguments, 0, true)); var next = trailingFunctionArgument2(arguments); if (!command.length) { - return this._runTask(configurationErrorTask2("Raw: must supply one or more command to execute"), next); + return this._runTask( + configurationErrorTask2("Raw: must supply one or more command to execute"), + next + ); } return this._runTask(straightThroughStringTask2(command, this._trimmed), next); }; @@ -17768,19 +18529,34 @@ var require_git = __commonJS({ return this._runTask(addSubModuleTask2(repo, path), trailingFunctionArgument2(arguments)); }; Git2.prototype.submoduleUpdate = function(args, then) { - return this._runTask(updateSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); + return this._runTask( + updateSubModuleTask2(getTrailingOptions2(arguments, true)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.submoduleInit = function(args, then) { - return this._runTask(initSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); + return this._runTask( + initSubModuleTask2(getTrailingOptions2(arguments, true)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.subModule = function(options, then) { - return this._runTask(subModuleTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + subModuleTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.listRemote = function() { - return this._runTask(listRemotesTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + listRemotesTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.addRemote = function(remoteName, remoteRepo, then) { - return this._runTask(addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.removeRemote = function(remoteName, then) { return this._runTask(removeRemoteTask2(remoteName), trailingFunctionArgument2(arguments)); @@ -17789,7 +18565,10 @@ var require_git = __commonJS({ return this._runTask(getRemotesTask2(verbose === true), trailingFunctionArgument2(arguments)); }; Git2.prototype.remote = function(options, then) { - return this._runTask(remoteTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); + return this._runTask( + remoteTask2(getTrailingOptions2(arguments)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.tag = function(options, then) { const command = getTrailingOptions2(arguments); @@ -17799,17 +18578,29 @@ var require_git = __commonJS({ return this._runTask(straightThroughStringTask2(command), trailingFunctionArgument2(arguments)); }; Git2.prototype.updateServerInfo = function(then) { - return this._runTask(straightThroughStringTask2(["update-server-info"]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["update-server-info"]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.pushTags = function(remote, then) { - const task = pushTagsTask2({ remote: filterType2(remote, filterString2) }, getTrailingOptions2(arguments)); + const task = pushTagsTask2( + { remote: filterType2(remote, filterString2) }, + getTrailingOptions2(arguments) + ); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.rm = function(files) { - return this._runTask(straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.rmKeepLocal = function(files) { - return this._runTask(straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.catFile = function(options, then) { return this._catFile("utf-8", arguments); @@ -17822,7 +18613,10 @@ var require_git = __commonJS({ var command = ["cat-file"]; var options = args[0]; if (typeof options === "string") { - return this._runTask(configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), handler); + return this._runTask( + configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), + handler + ); } if (Array.isArray(options)) { command.push.apply(command, options); @@ -17831,25 +18625,38 @@ var require_git = __commonJS({ return this._runTask(task, handler); }; Git2.prototype.diff = function(options, then) { - const task = filterString2(options) ? configurationErrorTask2("git.diff: supplying options as a single string is no longer supported, switch to an array of strings") : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); + const task = filterString2(options) ? configurationErrorTask2( + "git.diff: supplying options as a single string is no longer supported, switch to an array of strings" + ) : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.diffSummary = function() { - return this._runTask(diffSummaryTask2(getTrailingOptions2(arguments, 1)), trailingFunctionArgument2(arguments)); + return this._runTask( + diffSummaryTask2(getTrailingOptions2(arguments, 1)), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.applyPatch = function(patches) { - const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2(`git.applyPatch requires one or more string patches as the first argument`) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); + const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2( + `git.applyPatch requires one or more string patches as the first argument` + ) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.revparse = function() { const commands = ["rev-parse", ...getTrailingOptions2(arguments, true)]; - return this._runTask(straightThroughStringTask2(commands, true), trailingFunctionArgument2(arguments)); + return this._runTask( + straightThroughStringTask2(commands, true), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.clean = function(mode, options, then) { const usingCleanOptionsArray = isCleanOptionsArray2(mode); const cleanMode = usingCleanOptionsArray && mode.join("") || filterType2(mode, filterString2) || ""; const customArgs = getTrailingOptions2([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); - return this._runTask(cleanWithOptionsTask2(cleanMode, customArgs), trailingFunctionArgument2(arguments)); + return this._runTask( + cleanWithOptionsTask2(cleanMode, customArgs), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.exec = function(then) { const task = { @@ -17867,10 +18674,16 @@ var require_git = __commonJS({ return this; }; Git2.prototype.checkIgnore = function(pathnames, then) { - return this._runTask(checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), trailingFunctionArgument2(arguments)); + return this._runTask( + checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), + trailingFunctionArgument2(arguments) + ); }; Git2.prototype.checkIsRepo = function(checkType, then) { - return this._runTask(checkIsRepoTask2(filterType2(checkType, filterString2)), trailingFunctionArgument2(arguments)); + return this._runTask( + checkIsRepoTask2(filterType2(checkType, filterString2)), + trailingFunctionArgument2(arguments) + ); }; module2.exports = Git2; } @@ -17893,10 +18706,17 @@ function gitExportFactory(factory) { return Object.assign(factory.bind(null), api_exports); } function gitInstanceFactory(baseDir, options) { + var _a2; const plugins = new PluginStore(); - const config = createInstanceConfig(baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, options); + const config = createInstanceConfig( + baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, + options + ); if (!folderExists(config.baseDir)) { - throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); + throw new GitConstructError( + config, + `Cannot use simple-git on a directory that does not exist` + ); } if (Array.isArray(config.config)) { plugins.add(commandConfigPrefixingPlugin(config.config)); @@ -17910,11 +18730,13 @@ function gitInstanceFactory(baseDir, options) { config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); config.errors && plugins.add(errorDetectionPlugin(config.errors)); + customBinaryPlugin(plugins, config.binary, (_a2 = config.unsafe) == null ? void 0 : _a2.allowUnsafeCustomBinary); return new Git(config, plugins); } var Git; var init_git_factory = __esm({ "src/lib/git-factory.ts"() { + "use strict"; init_api(); init_plugins(); init_suffix_paths_plugin(); @@ -17942,22 +18764,27 @@ function gitP(...args) { function chainReturn() { return chain; } - const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce((api, name) => { - const isAsync = functionNamesPromiseApi.includes(name); - const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); - const alternative = isAsync ? chainReturn : builderReturn; - Object.defineProperty(api, name, { - enumerable: false, - configurable: false, - value: git ? valid : alternative - }); - return api; - }, {}); + const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce( + (api, name) => { + const isAsync = functionNamesPromiseApi.includes(name); + const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api); + const alternative = isAsync ? chainReturn : builderReturn; + Object.defineProperty(api, name, { + enumerable: false, + configurable: false, + value: git ? valid : alternative + }); + return api; + }, + {} + ); return promiseApi; function asyncWrapper(fn, git2) { return function(...args2) { if (typeof args2[args2.length] === "function") { - throw new TypeError("Promise interface requires that handlers are not supplied inline, trailing function not allowed in call to " + fn); + throw new TypeError( + "Promise interface requires that handlers are not supplied inline, trailing function not allowed in call to " + fn + ); } return chain.then(function() { return new Promise(function(resolve, reject) { @@ -17992,6 +18819,7 @@ function toError(error) { var functionNamesBuilderApi, functionNamesPromiseApi; var init_promise_wrapped = __esm({ "src/lib/runners/promise-wrapped.ts"() { + "use strict"; init_git_response_error(); init_git_factory(); functionNamesBuilderApi = ["customBinary", "env", "outputHandler", "silent"]; @@ -30271,6 +31099,9 @@ function httpRedirectFetch (fetchParams, response) { // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name request.headersList.delete('authorization') + // https://fetch.spec.whatwg.org/#authentication-entries + request.headersList.delete('proxy-authorization', true) + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. request.headersList.delete('cookie') request.headersList.delete('host') @@ -41950,7 +42781,7 @@ Dicer.prototype._write = function (data, encoding, cb) { if (this._headerFirst && this._isPreamble) { if (!this._part) { this._part = new PartStream(this._partOpts) - if (this._events.preamble) { this.emit('preamble', this._part) } else { this._ignore() } + if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() } } const r = this._hparser.push(data) if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() } @@ -42007,7 +42838,7 @@ Dicer.prototype._oninfo = function (isMatch, data, start, end) { } } if (this._dashes === 2) { - if ((start + i) < end && this._events.trailer) { this.emit('trailer', data.slice(start + i, end)) } + if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) } this.reset() this._finished = true // no more parts will be added @@ -42025,7 +42856,13 @@ Dicer.prototype._oninfo = function (isMatch, data, start, end) { this._part._read = function (n) { self._unpause() } - if (this._isPreamble && this._events.preamble) { this.emit('preamble', this._part) } else if (this._isPreamble !== true && this._events.part) { this.emit('part', this._part) } else { this._ignore() } + if (this._isPreamble && this.listenerCount('preamble') !== 0) { + this.emit('preamble', this._part) + } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) { + this.emit('part', this._part) + } else { + this._ignore() + } if (!this._isPreamble) { this._inHeader = true } } if (data && start < end && !this._ignoreData) { @@ -42708,7 +43545,7 @@ function Multipart (boy, cfg) { ++nfiles - if (!boy._events.file) { + if (boy.listenerCount('file') === 0) { self.parser._ignore() return } @@ -43237,7 +44074,7 @@ const decoders = { if (textDecoders.has(this.toString())) { try { return textDecoders.get(this).decode(data) - } catch (e) { } + } catch {} } return typeof data === 'string' ? data diff --git a/package-lock.json b/package-lock.json index ead9268..ba557b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,136 +72,65 @@ } }, "node_modules/@actions/http-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", - "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.1.tgz", + "integrity": "sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==", "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/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, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/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, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/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, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/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, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -226,14 +155,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -300,12 +229,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -331,9 +260,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -364,9 +293,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -391,28 +320,29 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -490,9 +420,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -562,12 +492,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -664,12 +594,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -679,33 +609,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@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", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -723,9 +653,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -743,9 +673,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.1.0.tgz", - "integrity": "sha512-ivPexRuSLBOKhjnyxou0iGomsxj63mtLpReL437AKFOCWoCC2ruu76lSWShGdLSf4jjv8oxV9+YH5RJGbc4Vew==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.2.0.tgz", + "integrity": "sha512-FTG1egTOCsZAgSdqRzwTodNAsidtmp0ocFrAB4uToQI7WgY20wLl09XkudCoZbe2ZkW2m2fwSNgqLTJcICiE9Q==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" @@ -842,18 +772,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } @@ -908,9 +838,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "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==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -1300,32 +1230,32 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "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, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1338,9 +1268,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", - "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1404,9 +1334,9 @@ } }, "node_modules/@octokit/core": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.2.tgz", - "integrity": "sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", + "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.0.0", @@ -1448,40 +1378,41 @@ "node_modules/@octokit/openapi-types": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", - "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==" + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", + "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", - "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", + "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", "dependencies": { - "@octokit/types": "^12.4.0" + "@octokit/types": "^12.6.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" + "@octokit/core": "5" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz", - "integrity": "sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", "dependencies": { - "@octokit/types": "^12.3.0" + "@octokit/types": "^12.6.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" + "@octokit/core": "5" } }, "node_modules/@octokit/request": { - "version": "8.1.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", - "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", @@ -1506,13 +1437,18 @@ } }, "node_modules/@octokit/types": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz", - "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", "dependencies": { - "@octokit/openapi-types": "^19.1.0" + "@octokit/openapi-types": "^20.0.0" } }, + "node_modules/@octokit/types/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1520,9 +1456,9 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -1538,9 +1474,9 @@ } }, "node_modules/@tsconfig/node20": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.2.tgz", - "integrity": "sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==", + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz", + "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==", "dev": true }, "node_modules/@types/babel__core": { @@ -1618,9 +1554,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1640,29 +1576,23 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.8.tgz", - "integrity": "sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg==", + "version": "18.19.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.28.tgz", + "integrity": "sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, "node_modules/@types/sarif": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -1687,16 +1617,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz", - "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/type-utils": "6.19.0", - "@typescript-eslint/utils": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1722,15 +1652,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", - "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -1750,13 +1680,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", - "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1767,13 +1697,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", - "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1794,9 +1724,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1807,13 +1737,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1835,17 +1765,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", - "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -1860,12 +1790,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1998,28 +1928,32 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -2039,16 +1973,17 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "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" @@ -2094,17 +2029,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2115,10 +2051,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "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, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2275,9 +2214,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -2294,8 +2233,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -2334,14 +2273,19 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2366,9 +2310,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001578", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001578.tgz", - "integrity": "sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==", + "version": "1.0.30001605", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", + "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", "dev": true, "funding": [ { @@ -2531,6 +2475,57 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "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.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2577,17 +2572,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "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, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "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": { @@ -2622,9 +2620,9 @@ } }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "engines": { "node": ">=0.3.1" } @@ -2663,9 +2661,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.636", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.636.tgz", - "integrity": "sha512-NLE0GIy1OL9wRiKL20h9TkctBEYZuc99tquSS9MVdTahnuHputoETHeqDzgqGqyOY9NUH0g9wjfEuw5OD+wRcQ==", + "version": "1.4.723", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz", + "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==", "dev": true }, "node_modules/emittery": { @@ -2687,9 +2685,9 @@ "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2709,50 +2707,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -2761,15 +2766,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -2802,9 +2840,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -2823,16 +2861,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -2923,9 +2961,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -3032,9 +3070,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.6.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", - "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -3043,7 +3081,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", "eslint": "^7.0.0 || ^8.0.0", "jest": "*" }, @@ -3395,9 +3433,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3467,9 +3505,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/for-each": { @@ -3556,16 +3594,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3592,13 +3634,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -3608,9 +3651,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -3765,21 +3808,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "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, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -3801,12 +3844,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3816,9 +3859,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -3827,27 +3870,6 @@ "node": ">= 0.4" } }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -3864,9 +3886,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -3933,12 +3955,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -3947,14 +3969,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4018,6 +4042,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -4073,9 +4112,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -4134,12 +4173,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4188,12 +4230,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -4236,14 +4278,14 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -4280,9 +4322,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5118,21 +5160,6 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5142,10 +5169,19 @@ "node": ">=0.10.0" } }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm-run-all2": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.1.1.tgz", - "integrity": "sha512-lWLbkPZ5BSdXtN8lR+0rc8caKoPdymycpZksyDEC9MOBvfdwTXZ0uVhb7bMcGeXv2/BKtfQuo6Zn3zfc8rxNXA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.1.2.tgz", + "integrity": "sha512-WwwnS8Ft+RpXve6T2EIEVpFLSqN+ORHRvgNk3H9N62SZXjmzKoRhMFg3I17TK3oMaAEr+XFbRirWS2Fn3BCPSg==", "dev": true, "dependencies": { "ansi-styles": "^6.2.1", @@ -5153,7 +5189,7 @@ "memorystream": "^0.3.1", "minimatch": "^9.0.0", "pidtree": "^0.6.0", - "read-pkg": "^8.0.0", + "read-package-json-fast": "^3.0.2", "shell-quote": "^1.7.3" }, "bin": { @@ -5228,14 +5264,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "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" @@ -5245,26 +5282,28 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "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.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5527,6 +5566,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "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", @@ -5537,9 +5585,9 @@ } }, "node_modules/prettier": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", - "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5600,9 +5648,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -5641,25 +5689,20 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", @@ -5668,67 +5711,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", - "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -5860,13 +5852,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -5878,13 +5870,13 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -5895,9 +5887,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5928,30 +5920,32 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "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, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "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, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5988,14 +5982,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6008,9 +6006,9 @@ "dev": true }, "node_modules/simple-git": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", - "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.24.0.tgz", + "integrity": "sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -6055,38 +6053,6 @@ "source-map": "^0.6.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6142,14 +6108,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6159,28 +6126,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "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, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "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" @@ -6330,21 +6300,21 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" } }, "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -6360,7 +6330,7 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", @@ -6480,29 +6450,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6512,16 +6483,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6531,23 +6503,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6573,9 +6551,9 @@ } }, "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -6655,16 +6633,6 @@ "node": ">=10.12.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -6706,16 +6674,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" diff --git a/test/validator.test.ts b/test/validator.test.ts index ad15628..a1af03a 100644 --- a/test/validator.test.ts +++ b/test/validator.test.ts @@ -143,6 +143,7 @@ describe("Validate valid Pull Request vs Commits", () => { commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat: add new feature" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore(deps-dev): update dependencies" }), ], error: true, }, @@ -152,6 +153,7 @@ describe("Validate valid Pull Request vs Commits", () => { commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat!: add new feature" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore(deps-dev): update dependencies" }), ], error: false, }, @@ -179,6 +181,7 @@ describe("Validate valid Pull Request vs Commits", () => { commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "feat!: add new feature" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore(deps-dev): update dependencies" }), ], error: false, }, @@ -206,6 +209,7 @@ describe("Validate valid Pull Request vs Commits", () => { commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "fix: fixed a bug" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore(deps-dev): update dependencies" }), ], error: false, }, @@ -215,6 +219,7 @@ describe("Validate valid Pull Request vs Commits", () => { commits: [ ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore: silly change" }), ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "fix: fixed a bug" }), + ConventionalCommit.fromString({ hash: "0a0b0c0d", message: "chore(deps-dev): update dependencies" }), ], error: false, }, From ee548476f93faa57a8af7ad1ca218a14ba863c31 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Tue, 9 Apr 2024 10:01:11 +0200 Subject: [PATCH 18/25] chore: add additional accepted Conventional Commit scopes --- .github/.commit-me.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/.commit-me.json b/.github/.commit-me.json index 153f824..08b04c9 100644 --- a/.github/.commit-me.json +++ b/.github/.commit-me.json @@ -1,4 +1,4 @@ { "types": [ "build", "chore", "ci", "docs", "style", "refactor", "perf", "test" ], - "scopes": [ "cli", "precommit", "action", "deps" ] + "scopes": [ "cli", "precommit", "action", "deps", "dev-deps", "security" ] } From 56a8b6c307c12c5597618372a2635e5c6a759a1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:41:06 +0000 Subject: [PATCH 19/25] fix(security): bump undici from 5.28.3 to 5.28.4 Bumps [undici](https://github.com/nodejs/undici) from 5.28.3 to 5.28.4. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.28.3...v5.28.4) Addresses the following CVEs: - CVE-2024-30260 - CVE-2024-30261 --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] --- lib/action/index.js | 297 +++++++++++++++++++++++++++++++++++------ lib/cli/index.js | 297 +++++++++++++++++++++++++++++++++++------ lib/precommit/index.js | 297 +++++++++++++++++++++++++++++++++++------ package-lock.json | 6 +- 4 files changed, 771 insertions(+), 126 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index 3dd1620..4b575c6 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -25650,6 +25650,132 @@ function onConnectTimeout (socket) { module.exports = buildConnector +/***/ }), + +/***/ 4462: +/***/ ((module) => { + +"use strict"; + + +/** @type {Record} */ +const headerNameLowerCasedRecord = {} + +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) + +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} + + /***/ }), /***/ 8045: @@ -26482,6 +26608,7 @@ const { InvalidArgumentError } = __nccwpck_require__(8045) const { Blob } = __nccwpck_require__(4300) const nodeUtil = __nccwpck_require__(3837) const { stringify } = __nccwpck_require__(3477) +const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -26691,6 +26818,15 @@ function parseKeepAliveTimeout (val) { return m ? parseInt(m[1], 10) * 1000 : null } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase() +} + function parseHeaders (headers, obj = {}) { // For H2 support if (!Array.isArray(headers)) return headers @@ -26962,6 +27098,7 @@ module.exports = { isIterable, isAsyncIterable, isDestroyed, + headerNameToString, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -33609,14 +33746,18 @@ const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983 const assert = __nccwpck_require__(9491) const { isUint8Array } = __nccwpck_require__(9830) +let supportedHashes = [] + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable /** @type {import('crypto')|undefined} */ let crypto try { crypto = __nccwpck_require__(6113) + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'] + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)) +/* c8 ignore next 3 */ } catch { - } function responseURL (response) { @@ -34144,66 +34285,56 @@ function bytesMatch (bytes, metadataList) { return true } - // 3. If parsedMetadata is the empty set, return true. + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. if (parsedMetadata.length === 0) { return true } - // 4. Let metadata be the result of getting the strongest + // 5. Let metadata be the result of getting the strongest // metadata from parsedMetadata. - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) - // get the strongest algorithm - const strongest = list[0].algo - // get all entries that use the strongest algorithm; ignore weaker - const metadata = list.filter((item) => item.algo === strongest) + const strongest = getStrongestMetadata(parsedMetadata) + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest) - // 5. For each item in metadata: + // 6. For each item in metadata: for (const item of metadata) { // 1. Let algorithm be the alg component of item. const algorithm = item.algo // 2. Let expectedValue be the val component of item. - let expectedValue = item.hash + const expectedValue = item.hash // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e // "be liberal with padding". This is annoying, and it's not even in the spec. - if (expectedValue.endsWith('==')) { - expectedValue = expectedValue.slice(0, -2) - } - // 3. Let actualValue be the result of applying algorithm to bytes. let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - if (actualValue.endsWith('==')) { - actualValue = actualValue.slice(0, -2) + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2) + } else { + actualValue = actualValue.slice(0, -1) + } } // 4. If actualValue is a case-sensitive match for expectedValue, // return true. - if (actualValue === expectedValue) { - return true - } - - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') - - if (actualBase64URL.endsWith('==')) { - actualBase64URL = actualBase64URL.slice(0, -2) - } - - if (actualBase64URL === expectedValue) { + if (compareBase64Mixed(actualValue, expectedValue)) { return true } } - // 6. Return false. + // 7. Return false. return false } // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options // https://www.w3.org/TR/CSP2/#source-list-syntax // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 -const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i +const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i /** * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata @@ -34217,8 +34348,6 @@ function parseMetadata (metadata) { // 2. Let empty be equal to true. let empty = true - const supportedHashes = crypto.getHashes() - // 3. For each token returned by splitting metadata on spaces: for (const token of metadata.split(' ')) { // 1. Set empty to false. @@ -34228,7 +34357,11 @@ function parseMetadata (metadata) { const parsedToken = parseHashWithOptions.exec(token) // 3. If token does not parse, continue to the next token. - if (parsedToken === null || parsedToken.groups === undefined) { + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { // Note: Chromium blocks the request at this point, but Firefox // gives a warning that an invalid integrity was given. The // correct behavior is to ignore these, and subsequently not @@ -34237,11 +34370,11 @@ function parseMetadata (metadata) { } // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo + const algorithm = parsedToken.groups.algo.toLowerCase() // 5. If algorithm is a hash function recognized by the user // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm.toLowerCase())) { + if (supportedHashes.includes(algorithm)) { result.push(parsedToken.groups) } } @@ -34254,6 +34387,82 @@ function parseMetadata (metadata) { return result } +/** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ +function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i] + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512' + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384' + } + } + return algorithm +} + +function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + + let pos = 0 + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i] + } + } + + metadataList.length = pos + + return metadataList +} + +/** + * Compares two base64 strings, allowing for base64url + * in the second string. + * +* @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ +function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true +} + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { // TODO @@ -34669,7 +34878,8 @@ module.exports = { urlHasHttpsScheme, urlIsHttpHttpsScheme, readAllBytes, - normalizeMethodRecord + normalizeMethodRecord, + parseMetadata } @@ -36756,12 +36966,17 @@ function parseLocation (statusCode, headers) { // https://tools.ietf.org/html/rfc7231#section-6.4.4 function shouldRemoveHeader (header, removeContent, unknownOrigin) { - return ( - (header.length === 4 && header.toString().toLowerCase() === 'host') || - (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || - (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || - (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') - ) + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header) + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false } // https://tools.ietf.org/html/rfc7231#section-6.4 diff --git a/lib/cli/index.js b/lib/cli/index.js index be5b8ba..fe8a2cb 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -25651,6 +25651,132 @@ function onConnectTimeout (socket) { module.exports = buildConnector +/***/ }), + +/***/ 4462: +/***/ ((module) => { + +"use strict"; + + +/** @type {Record} */ +const headerNameLowerCasedRecord = {} + +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) + +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} + + /***/ }), /***/ 8045: @@ -26483,6 +26609,7 @@ const { InvalidArgumentError } = __nccwpck_require__(8045) const { Blob } = __nccwpck_require__(4300) const nodeUtil = __nccwpck_require__(3837) const { stringify } = __nccwpck_require__(3477) +const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -26692,6 +26819,15 @@ function parseKeepAliveTimeout (val) { return m ? parseInt(m[1], 10) * 1000 : null } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase() +} + function parseHeaders (headers, obj = {}) { // For H2 support if (!Array.isArray(headers)) return headers @@ -26963,6 +27099,7 @@ module.exports = { isIterable, isAsyncIterable, isDestroyed, + headerNameToString, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -33610,14 +33747,18 @@ const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983 const assert = __nccwpck_require__(9491) const { isUint8Array } = __nccwpck_require__(9830) +let supportedHashes = [] + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable /** @type {import('crypto')|undefined} */ let crypto try { crypto = __nccwpck_require__(6113) + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'] + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)) +/* c8 ignore next 3 */ } catch { - } function responseURL (response) { @@ -34145,66 +34286,56 @@ function bytesMatch (bytes, metadataList) { return true } - // 3. If parsedMetadata is the empty set, return true. + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. if (parsedMetadata.length === 0) { return true } - // 4. Let metadata be the result of getting the strongest + // 5. Let metadata be the result of getting the strongest // metadata from parsedMetadata. - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) - // get the strongest algorithm - const strongest = list[0].algo - // get all entries that use the strongest algorithm; ignore weaker - const metadata = list.filter((item) => item.algo === strongest) + const strongest = getStrongestMetadata(parsedMetadata) + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest) - // 5. For each item in metadata: + // 6. For each item in metadata: for (const item of metadata) { // 1. Let algorithm be the alg component of item. const algorithm = item.algo // 2. Let expectedValue be the val component of item. - let expectedValue = item.hash + const expectedValue = item.hash // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e // "be liberal with padding". This is annoying, and it's not even in the spec. - if (expectedValue.endsWith('==')) { - expectedValue = expectedValue.slice(0, -2) - } - // 3. Let actualValue be the result of applying algorithm to bytes. let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - if (actualValue.endsWith('==')) { - actualValue = actualValue.slice(0, -2) + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2) + } else { + actualValue = actualValue.slice(0, -1) + } } // 4. If actualValue is a case-sensitive match for expectedValue, // return true. - if (actualValue === expectedValue) { - return true - } - - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') - - if (actualBase64URL.endsWith('==')) { - actualBase64URL = actualBase64URL.slice(0, -2) - } - - if (actualBase64URL === expectedValue) { + if (compareBase64Mixed(actualValue, expectedValue)) { return true } } - // 6. Return false. + // 7. Return false. return false } // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options // https://www.w3.org/TR/CSP2/#source-list-syntax // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 -const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i +const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i /** * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata @@ -34218,8 +34349,6 @@ function parseMetadata (metadata) { // 2. Let empty be equal to true. let empty = true - const supportedHashes = crypto.getHashes() - // 3. For each token returned by splitting metadata on spaces: for (const token of metadata.split(' ')) { // 1. Set empty to false. @@ -34229,7 +34358,11 @@ function parseMetadata (metadata) { const parsedToken = parseHashWithOptions.exec(token) // 3. If token does not parse, continue to the next token. - if (parsedToken === null || parsedToken.groups === undefined) { + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { // Note: Chromium blocks the request at this point, but Firefox // gives a warning that an invalid integrity was given. The // correct behavior is to ignore these, and subsequently not @@ -34238,11 +34371,11 @@ function parseMetadata (metadata) { } // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo + const algorithm = parsedToken.groups.algo.toLowerCase() // 5. If algorithm is a hash function recognized by the user // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm.toLowerCase())) { + if (supportedHashes.includes(algorithm)) { result.push(parsedToken.groups) } } @@ -34255,6 +34388,82 @@ function parseMetadata (metadata) { return result } +/** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ +function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i] + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512' + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384' + } + } + return algorithm +} + +function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + + let pos = 0 + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i] + } + } + + metadataList.length = pos + + return metadataList +} + +/** + * Compares two base64 strings, allowing for base64url + * in the second string. + * +* @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ +function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true +} + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { // TODO @@ -34670,7 +34879,8 @@ module.exports = { urlHasHttpsScheme, urlIsHttpHttpsScheme, readAllBytes, - normalizeMethodRecord + normalizeMethodRecord, + parseMetadata } @@ -36757,12 +36967,17 @@ function parseLocation (statusCode, headers) { // https://tools.ietf.org/html/rfc7231#section-6.4.4 function shouldRemoveHeader (header, removeContent, unknownOrigin) { - return ( - (header.length === 4 && header.toString().toLowerCase() === 'host') || - (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || - (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || - (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') - ) + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header) + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false } // https://tools.ietf.org/html/rfc7231#section-6.4 diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 20cd587..d9cec2b 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -25651,6 +25651,132 @@ function onConnectTimeout (socket) { module.exports = buildConnector +/***/ }), + +/***/ 4462: +/***/ ((module) => { + +"use strict"; + + +/** @type {Record} */ +const headerNameLowerCasedRecord = {} + +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) + +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} + + /***/ }), /***/ 8045: @@ -26483,6 +26609,7 @@ const { InvalidArgumentError } = __nccwpck_require__(8045) const { Blob } = __nccwpck_require__(4300) const nodeUtil = __nccwpck_require__(3837) const { stringify } = __nccwpck_require__(3477) +const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) @@ -26692,6 +26819,15 @@ function parseKeepAliveTimeout (val) { return m ? parseInt(m[1], 10) * 1000 : null } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase() +} + function parseHeaders (headers, obj = {}) { // For H2 support if (!Array.isArray(headers)) return headers @@ -26963,6 +27099,7 @@ module.exports = { isIterable, isAsyncIterable, isDestroyed, + headerNameToString, parseRawHeaders, parseHeaders, parseKeepAliveTimeout, @@ -33610,14 +33747,18 @@ const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983 const assert = __nccwpck_require__(9491) const { isUint8Array } = __nccwpck_require__(9830) +let supportedHashes = [] + // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable /** @type {import('crypto')|undefined} */ let crypto try { crypto = __nccwpck_require__(6113) + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'] + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)) +/* c8 ignore next 3 */ } catch { - } function responseURL (response) { @@ -34145,66 +34286,56 @@ function bytesMatch (bytes, metadataList) { return true } - // 3. If parsedMetadata is the empty set, return true. + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. if (parsedMetadata.length === 0) { return true } - // 4. Let metadata be the result of getting the strongest + // 5. Let metadata be the result of getting the strongest // metadata from parsedMetadata. - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)) - // get the strongest algorithm - const strongest = list[0].algo - // get all entries that use the strongest algorithm; ignore weaker - const metadata = list.filter((item) => item.algo === strongest) + const strongest = getStrongestMetadata(parsedMetadata) + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest) - // 5. For each item in metadata: + // 6. For each item in metadata: for (const item of metadata) { // 1. Let algorithm be the alg component of item. const algorithm = item.algo // 2. Let expectedValue be the val component of item. - let expectedValue = item.hash + const expectedValue = item.hash // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e // "be liberal with padding". This is annoying, and it's not even in the spec. - if (expectedValue.endsWith('==')) { - expectedValue = expectedValue.slice(0, -2) - } - // 3. Let actualValue be the result of applying algorithm to bytes. let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') - if (actualValue.endsWith('==')) { - actualValue = actualValue.slice(0, -2) + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2) + } else { + actualValue = actualValue.slice(0, -1) + } } // 4. If actualValue is a case-sensitive match for expectedValue, // return true. - if (actualValue === expectedValue) { - return true - } - - let actualBase64URL = crypto.createHash(algorithm).update(bytes).digest('base64url') - - if (actualBase64URL.endsWith('==')) { - actualBase64URL = actualBase64URL.slice(0, -2) - } - - if (actualBase64URL === expectedValue) { + if (compareBase64Mixed(actualValue, expectedValue)) { return true } } - // 6. Return false. + // 7. Return false. return false } // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options // https://www.w3.org/TR/CSP2/#source-list-syntax // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 -const parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i +const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i /** * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata @@ -34218,8 +34349,6 @@ function parseMetadata (metadata) { // 2. Let empty be equal to true. let empty = true - const supportedHashes = crypto.getHashes() - // 3. For each token returned by splitting metadata on spaces: for (const token of metadata.split(' ')) { // 1. Set empty to false. @@ -34229,7 +34358,11 @@ function parseMetadata (metadata) { const parsedToken = parseHashWithOptions.exec(token) // 3. If token does not parse, continue to the next token. - if (parsedToken === null || parsedToken.groups === undefined) { + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { // Note: Chromium blocks the request at this point, but Firefox // gives a warning that an invalid integrity was given. The // correct behavior is to ignore these, and subsequently not @@ -34238,11 +34371,11 @@ function parseMetadata (metadata) { } // 4. Let algorithm be the hash-algo component of token. - const algorithm = parsedToken.groups.algo + const algorithm = parsedToken.groups.algo.toLowerCase() // 5. If algorithm is a hash function recognized by the user // agent, add the parsed token to result. - if (supportedHashes.includes(algorithm.toLowerCase())) { + if (supportedHashes.includes(algorithm)) { result.push(parsedToken.groups) } } @@ -34255,6 +34388,82 @@ function parseMetadata (metadata) { return result } +/** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ +function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i] + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512' + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384' + } + } + return algorithm +} + +function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + + let pos = 0 + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i] + } + } + + metadataList.length = pos + + return metadataList +} + +/** + * Compares two base64 strings, allowing for base64url + * in the second string. + * +* @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ +function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true +} + // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { // TODO @@ -34670,7 +34879,8 @@ module.exports = { urlHasHttpsScheme, urlIsHttpHttpsScheme, readAllBytes, - normalizeMethodRecord + normalizeMethodRecord, + parseMetadata } @@ -36757,12 +36967,17 @@ function parseLocation (statusCode, headers) { // https://tools.ietf.org/html/rfc7231#section-6.4.4 function shouldRemoveHeader (header, removeContent, unknownOrigin) { - return ( - (header.length === 4 && header.toString().toLowerCase() === 'host') || - (removeContent && header.toString().toLowerCase().indexOf('content-') === 0) || - (unknownOrigin && header.length === 13 && header.toString().toLowerCase() === 'authorization') || - (unknownOrigin && header.length === 6 && header.toString().toLowerCase() === 'cookie') - ) + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header) + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false } // https://tools.ietf.org/html/rfc7231#section-6.4 diff --git a/package-lock.json b/package-lock.json index ba557b0..5a46c74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6551,9 +6551,9 @@ } }, "node_modules/undici": { - "version": "5.28.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", - "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dependencies": { "@fastify/busboy": "^2.0.0" }, From 1a8ee6833ee25341a8ec37647f07eda98e3d7dcd Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Wed, 10 Apr 2024 14:14:31 +0200 Subject: [PATCH 20/25] fix: improve error handling for missing content Use proper type handling for Request Errors provided by Octokit requests. --- lib/action/index.js | 10 +++++++--- lib/cli/index.js | 10 +++++++--- lib/precommit/index.js | 10 +++++++--- src/datasources.ts | 10 +++++++--- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index 4b575c6..f3ddbdf 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -42372,6 +42372,7 @@ const assert_1 = __importDefault(__nccwpck_require__(9491)); const fs = __importStar(__nccwpck_require__(7147)); const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); +const request_error_1 = __nccwpck_require__(537); const commit_it_1 = __nccwpck_require__(9403); const simple_git_1 = __nccwpck_require__(9103); /** @@ -42448,10 +42449,13 @@ class GitHubSource { return Buffer.from(config.content, "base64").toString(); } catch (error) { - if (error.message !== "Not Found") { - throw error; + if (error instanceof request_error_1.RequestError && error.response) { + const reponseData = error.response.data; + if ("message" in reponseData && reponseData.message === "Not Found") { + return undefined; + } } - return undefined; + throw error; } } } diff --git a/lib/cli/index.js b/lib/cli/index.js index fe8a2cb..96135cc 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -42373,6 +42373,7 @@ const assert_1 = __importDefault(__nccwpck_require__(9491)); const fs = __importStar(__nccwpck_require__(7147)); const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); +const request_error_1 = __nccwpck_require__(537); const commit_it_1 = __nccwpck_require__(9403); const simple_git_1 = __nccwpck_require__(9103); /** @@ -42449,10 +42450,13 @@ class GitHubSource { return Buffer.from(config.content, "base64").toString(); } catch (error) { - if (error.message !== "Not Found") { - throw error; + if (error instanceof request_error_1.RequestError && error.response) { + const reponseData = error.response.data; + if ("message" in reponseData && reponseData.message === "Not Found") { + return undefined; + } } - return undefined; + throw error; } } } diff --git a/lib/precommit/index.js b/lib/precommit/index.js index d9cec2b..cde5abd 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -42373,6 +42373,7 @@ const assert_1 = __importDefault(__nccwpck_require__(9491)); const fs = __importStar(__nccwpck_require__(7147)); const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); +const request_error_1 = __nccwpck_require__(537); const commit_it_1 = __nccwpck_require__(9403); const simple_git_1 = __nccwpck_require__(9103); /** @@ -42449,10 +42450,13 @@ class GitHubSource { return Buffer.from(config.content, "base64").toString(); } catch (error) { - if (error.message !== "Not Found") { - throw error; + if (error instanceof request_error_1.RequestError && error.response) { + const reponseData = error.response.data; + if ("message" in reponseData && reponseData.message === "Not Found") { + return undefined; + } } - return undefined; + throw error; } } } diff --git a/src/datasources.ts b/src/datasources.ts index 9bc9d65..a3734db 100644 --- a/src/datasources.ts +++ b/src/datasources.ts @@ -8,6 +8,7 @@ import * as fs from "fs"; import * as core from "@actions/core"; import * as github from "@actions/github"; +import { RequestError } from "@octokit/request-error"; import { Commit } from "@dev-build-deploy/commit-it"; import { simpleGit } from "simple-git"; @@ -110,10 +111,13 @@ export class GitHubSource implements IDataSource { return Buffer.from(config.content, "base64").toString(); } catch (error: unknown) { - if ((error as Error).message !== "Not Found") { - throw error; + if (error instanceof RequestError && error.response) { + const reponseData = error.response.data as Record + if ("message" in reponseData && reponseData.message === "Not Found") { + return undefined; + } } - return undefined; + throw error; } } } From 3e4b05860d83d9120140d8dd220b0d389ddc79a9 Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Mon, 17 Jun 2024 16:49:06 +0200 Subject: [PATCH 21/25] feat: support merges of remote branches Co-authored-by: @tobias-kleinschmidt-fnt --- lib/action/index.js | 2 +- lib/cli/index.js | 2 +- lib/precommit/index.js | 2 +- package-lock.json | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index f3ddbdf..a1d6c9e 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2252,7 +2252,7 @@ exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; function subjectIsMergePattern(subject) { const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; - const gitlabMergeRegex = /^Merge branch '?(.*?)'? into '?(.*?)'?$/; + const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?(.*?)'? into '?(.*?)'?$/; return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); } /** diff --git a/lib/cli/index.js b/lib/cli/index.js index 96135cc..390c41b 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2253,7 +2253,7 @@ exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; function subjectIsMergePattern(subject) { const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; - const gitlabMergeRegex = /^Merge branch '?(.*?)'? into '?(.*?)'?$/; + const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?(.*?)'? into '?(.*?)'?$/; return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); } /** diff --git a/lib/precommit/index.js b/lib/precommit/index.js index cde5abd..2d61c90 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2253,7 +2253,7 @@ exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; function subjectIsMergePattern(subject) { const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; - const gitlabMergeRegex = /^Merge branch '?(.*?)'? into '?(.*?)'?$/; + const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?(.*?)'? into '?(.*?)'?$/; return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); } /** diff --git a/package-lock.json b/package-lock.json index 5a46c74..fd90b55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -673,9 +673,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.2.0.tgz", - "integrity": "sha512-FTG1egTOCsZAgSdqRzwTodNAsidtmp0ocFrAB4uToQI7WgY20wLl09XkudCoZbe2ZkW2m2fwSNgqLTJcICiE9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.3.0.tgz", + "integrity": "sha512-LZiPqr9y41hFKWH+WUhPQqXv1l9CzL5mAXyR1gJ2H0sylkC0ggD1WX/hWvxdRF4L7vqBftQSmr39RYI+Ff2q7g==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" From 558809dde28148e54420791dc82a1510f9ff28bd Mon Sep 17 00:00:00 2001 From: Kevin de Jong Date: Mon, 17 Jun 2024 16:55:28 +0200 Subject: [PATCH 22/25] chore(deps): update braces to 3.0.3 --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd90b55..7afefee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2202,12 +2202,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3463,9 +3463,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" From 744a57bb3aa0060452c0fcfdc5edc0f88f3f11f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:57:59 +0000 Subject: [PATCH 23/25] chore(deps): bump simple-git from 3.24.0 to 3.25.0 Bumps [simple-git](https://github.com/steveukx/git-js/tree/HEAD/simple-git) from 3.24.0 to 3.25.0. - [Release notes](https://github.com/steveukx/git-js/releases) - [Changelog](https://github.com/steveukx/git-js/blob/main/simple-git/CHANGELOG.md) - [Commits](https://github.com/steveukx/git-js/commits/simple-git@3.25.0/simple-git) --- updated-dependencies: - dependency-name: simple-git dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lib/action/index.js | 107 ++++++++++++++++++++++++++++++----------- lib/cli/index.js | 107 ++++++++++++++++++++++++++++++----------- lib/precommit/index.js | 107 ++++++++++++++++++++++++++++++----------- package-lock.json | 14 +++--- 4 files changed, 244 insertions(+), 91 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index a1d6c9e..9a1434a 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -10823,11 +10823,11 @@ function getDate() { } /** - * Invokes `util.format()` with the specified arguments and writes to stderr. + * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr. */ function log(...args) { - return process.stderr.write(util.format(...args) + '\n'); + return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n'); } /** @@ -14218,6 +14218,11 @@ function remove(target, item) { function asArray(source) { return Array.isArray(source) ? source : [source]; } +function asCamelCase(str) { + return str.replace(/[\s-]+(.)/g, (_all, chr) => { + return chr.toUpperCase(); + }); +} function asStringArray(source) { return asArray(source).map(String); } @@ -14470,8 +14475,8 @@ var init_task_options = __esm({ }); // src/lib/utils/task-parser.ts -function callTaskParser(parser3, streams) { - return parser3(streams.stdOut, streams.stdErr); +function callTaskParser(parser4, streams) { + return parser4(streams.stdOut, streams.stdErr); } function parseStringResponse(result, parsers12, texts, trim = true) { asArray(texts).forEach((text) => { @@ -14506,6 +14511,7 @@ __export(utils_exports, { append: () => append, appendTaskOptions: () => appendTaskOptions, asArray: () => asArray, + asCamelCase: () => asCamelCase, asFunction: () => asFunction, asNumber: () => asNumber, asStringArray: () => asStringArray, @@ -14664,11 +14670,11 @@ __export(task_exports, { straightThroughBufferTask: () => straightThroughBufferTask, straightThroughStringTask: () => straightThroughStringTask }); -function adhocExecTask(parser3) { +function adhocExecTask(parser4) { return { commands: EMPTY_COMMANDS, format: "empty", - parser: parser3 + parser: parser4 }; } function configurationErrorTask(error) { @@ -16147,6 +16153,49 @@ var init_checkout = __esm({ } }); +// src/lib/tasks/count-objects.ts +function countObjectsResponse() { + return { + count: 0, + garbage: 0, + inPack: 0, + packs: 0, + prunePackable: 0, + size: 0, + sizeGarbage: 0, + sizePack: 0 + }; +} +function count_objects_default() { + return { + countObjects() { + return this._runTask({ + commands: ["count-objects", "--verbose"], + format: "utf-8", + parser(stdOut) { + return parseStringResponse(countObjectsResponse(), [parser2], stdOut); + } + }); + } + }; +} +var parser2; +var init_count_objects = __esm({ + "src/lib/tasks/count-objects.ts"() { + "use strict"; + init_utils(); + parser2 = new LineParser( + /([a-z-]+): (\d+)$/, + (result, [key, value]) => { + const property = asCamelCase(key); + if (result.hasOwnProperty(property)) { + result[property] = asNumber(value); + } + } + ); + } +}); + // src/lib/parsers/parse-commit.ts function parseCommitResult(stdOut) { const result = { @@ -16388,8 +16437,8 @@ var init_DiffSummary = __esm({ // src/lib/parsers/parse-diff-summary.ts function getDiffParser(format = "" /* NONE */) { - const parser3 = diffSummaryParsers[format]; - return (stdOut) => parseStringResponse(new DiffSummary(), parser3, stdOut, false); + const parser4 = diffSummaryParsers[format]; + return (stdOut) => parseStringResponse(new DiffSummary(), parser4, stdOut, false); } var statParser, numStatParser, nameOnlyParser, nameStatusParser, diffSummaryParsers; var init_parse_diff_summary = __esm({ @@ -16645,11 +16694,11 @@ function parseLogOptions(opt = {}, customArgs = []) { }; } function logTask(splitter, fields, customArgs) { - const parser3 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); + const parser4 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); return { commands: ["log", ...customArgs], format: "utf-8", - parser: parser3 + parser: parser4 }; } function log_default() { @@ -17168,11 +17217,11 @@ function renamedFile(line) { to }; } -function parser2(indexX, indexY, handler) { +function parser3(indexX, indexY, handler) { return [`${indexX}${indexY}`, handler]; } function conflicts(indexX, ...indexY) { - return indexY.map((y) => parser2(indexX, y, (result, file) => append(result.conflicted, file))); + return indexY.map((y) => parser3(indexX, y, (result, file) => append(result.conflicted, file))); } function splitLine(result, lineStr) { const trimmed2 = lineStr.trim(); @@ -17223,58 +17272,58 @@ var init_StatusSummary = __esm({ } }; parsers6 = new Map([ - parser2( + parser3( " " /* NONE */, "A" /* ADDED */, (result, file) => append(result.created, file) ), - parser2( + parser3( " " /* NONE */, "D" /* DELETED */, (result, file) => append(result.deleted, file) ), - parser2( + parser3( " " /* NONE */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) ), - parser2( + parser3( "A" /* ADDED */, " " /* NONE */, (result, file) => append(result.created, file) && append(result.staged, file) ), - parser2( + parser3( "A" /* ADDED */, "M" /* MODIFIED */, (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file) ), - parser2( + parser3( "D" /* DELETED */, " " /* NONE */, (result, file) => append(result.deleted, file) && append(result.staged, file) ), - parser2( + parser3( "M" /* MODIFIED */, " " /* NONE */, (result, file) => append(result.modified, file) && append(result.staged, file) ), - parser2( + parser3( "M" /* MODIFIED */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) && append(result.staged, file) ), - parser2("R" /* RENAMED */, " " /* NONE */, (result, file) => { + parser3("R" /* RENAMED */, " " /* NONE */, (result, file) => { append(result.renamed, renamedFile(file)); }), - parser2("R" /* RENAMED */, "M" /* MODIFIED */, (result, file) => { + parser3("R" /* RENAMED */, "M" /* MODIFIED */, (result, file) => { const renamed = renamedFile(file); append(result.renamed, renamed); append(result.modified, renamed.to); }), - parser2("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { + parser3("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2( + parser3( "?" /* UNTRACKED */, "?" /* UNTRACKED */, (result, file) => append(result.not_added, file) @@ -17443,6 +17492,7 @@ var init_simple_git_api = __esm({ init_task_callback(); init_change_working_directory(); init_checkout(); + init_count_objects(); init_commit(); init_config(); init_first_commit(); @@ -17561,6 +17611,7 @@ var init_simple_git_api = __esm({ checkout_default(), commit_default(), config_default(), + count_objects_default(), first_commit_default(), grep_default(), log_default(), @@ -17802,11 +17853,11 @@ function branchTask(customArgs) { }; } function branchLocalTask() { - const parser3 = parseBranchSummary; + const parser4 = parseBranchSummary; return { format: "utf-8", commands: ["branch", "-v"], - parser: parser3 + parser: parser4 }; } function deleteBranchesTask(branches, forceDelete = false) { @@ -18159,7 +18210,7 @@ __export(stash_list_exports, { function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; - const parser3 = createListLogSummaryParser( + const parser4 = createListLogSummaryParser( options.splitter, options.fields, logFormatFromCommand(commands) @@ -18167,7 +18218,7 @@ function stashListTask(opt = {}, customArgs) { return validateLogFormatConfig(commands) || { commands, format: "utf-8", - parser: parser3 + parser: parser4 }; } var init_stash_list = __esm({ diff --git a/lib/cli/index.js b/lib/cli/index.js index 390c41b..054c084 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -10824,11 +10824,11 @@ function getDate() { } /** - * Invokes `util.format()` with the specified arguments and writes to stderr. + * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr. */ function log(...args) { - return process.stderr.write(util.format(...args) + '\n'); + return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n'); } /** @@ -14219,6 +14219,11 @@ function remove(target, item) { function asArray(source) { return Array.isArray(source) ? source : [source]; } +function asCamelCase(str) { + return str.replace(/[\s-]+(.)/g, (_all, chr) => { + return chr.toUpperCase(); + }); +} function asStringArray(source) { return asArray(source).map(String); } @@ -14471,8 +14476,8 @@ var init_task_options = __esm({ }); // src/lib/utils/task-parser.ts -function callTaskParser(parser3, streams) { - return parser3(streams.stdOut, streams.stdErr); +function callTaskParser(parser4, streams) { + return parser4(streams.stdOut, streams.stdErr); } function parseStringResponse(result, parsers12, texts, trim = true) { asArray(texts).forEach((text) => { @@ -14507,6 +14512,7 @@ __export(utils_exports, { append: () => append, appendTaskOptions: () => appendTaskOptions, asArray: () => asArray, + asCamelCase: () => asCamelCase, asFunction: () => asFunction, asNumber: () => asNumber, asStringArray: () => asStringArray, @@ -14665,11 +14671,11 @@ __export(task_exports, { straightThroughBufferTask: () => straightThroughBufferTask, straightThroughStringTask: () => straightThroughStringTask }); -function adhocExecTask(parser3) { +function adhocExecTask(parser4) { return { commands: EMPTY_COMMANDS, format: "empty", - parser: parser3 + parser: parser4 }; } function configurationErrorTask(error) { @@ -16148,6 +16154,49 @@ var init_checkout = __esm({ } }); +// src/lib/tasks/count-objects.ts +function countObjectsResponse() { + return { + count: 0, + garbage: 0, + inPack: 0, + packs: 0, + prunePackable: 0, + size: 0, + sizeGarbage: 0, + sizePack: 0 + }; +} +function count_objects_default() { + return { + countObjects() { + return this._runTask({ + commands: ["count-objects", "--verbose"], + format: "utf-8", + parser(stdOut) { + return parseStringResponse(countObjectsResponse(), [parser2], stdOut); + } + }); + } + }; +} +var parser2; +var init_count_objects = __esm({ + "src/lib/tasks/count-objects.ts"() { + "use strict"; + init_utils(); + parser2 = new LineParser( + /([a-z-]+): (\d+)$/, + (result, [key, value]) => { + const property = asCamelCase(key); + if (result.hasOwnProperty(property)) { + result[property] = asNumber(value); + } + } + ); + } +}); + // src/lib/parsers/parse-commit.ts function parseCommitResult(stdOut) { const result = { @@ -16389,8 +16438,8 @@ var init_DiffSummary = __esm({ // src/lib/parsers/parse-diff-summary.ts function getDiffParser(format = "" /* NONE */) { - const parser3 = diffSummaryParsers[format]; - return (stdOut) => parseStringResponse(new DiffSummary(), parser3, stdOut, false); + const parser4 = diffSummaryParsers[format]; + return (stdOut) => parseStringResponse(new DiffSummary(), parser4, stdOut, false); } var statParser, numStatParser, nameOnlyParser, nameStatusParser, diffSummaryParsers; var init_parse_diff_summary = __esm({ @@ -16646,11 +16695,11 @@ function parseLogOptions(opt = {}, customArgs = []) { }; } function logTask(splitter, fields, customArgs) { - const parser3 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); + const parser4 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); return { commands: ["log", ...customArgs], format: "utf-8", - parser: parser3 + parser: parser4 }; } function log_default() { @@ -17169,11 +17218,11 @@ function renamedFile(line) { to }; } -function parser2(indexX, indexY, handler) { +function parser3(indexX, indexY, handler) { return [`${indexX}${indexY}`, handler]; } function conflicts(indexX, ...indexY) { - return indexY.map((y) => parser2(indexX, y, (result, file) => append(result.conflicted, file))); + return indexY.map((y) => parser3(indexX, y, (result, file) => append(result.conflicted, file))); } function splitLine(result, lineStr) { const trimmed2 = lineStr.trim(); @@ -17224,58 +17273,58 @@ var init_StatusSummary = __esm({ } }; parsers6 = new Map([ - parser2( + parser3( " " /* NONE */, "A" /* ADDED */, (result, file) => append(result.created, file) ), - parser2( + parser3( " " /* NONE */, "D" /* DELETED */, (result, file) => append(result.deleted, file) ), - parser2( + parser3( " " /* NONE */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) ), - parser2( + parser3( "A" /* ADDED */, " " /* NONE */, (result, file) => append(result.created, file) && append(result.staged, file) ), - parser2( + parser3( "A" /* ADDED */, "M" /* MODIFIED */, (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file) ), - parser2( + parser3( "D" /* DELETED */, " " /* NONE */, (result, file) => append(result.deleted, file) && append(result.staged, file) ), - parser2( + parser3( "M" /* MODIFIED */, " " /* NONE */, (result, file) => append(result.modified, file) && append(result.staged, file) ), - parser2( + parser3( "M" /* MODIFIED */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) && append(result.staged, file) ), - parser2("R" /* RENAMED */, " " /* NONE */, (result, file) => { + parser3("R" /* RENAMED */, " " /* NONE */, (result, file) => { append(result.renamed, renamedFile(file)); }), - parser2("R" /* RENAMED */, "M" /* MODIFIED */, (result, file) => { + parser3("R" /* RENAMED */, "M" /* MODIFIED */, (result, file) => { const renamed = renamedFile(file); append(result.renamed, renamed); append(result.modified, renamed.to); }), - parser2("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { + parser3("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2( + parser3( "?" /* UNTRACKED */, "?" /* UNTRACKED */, (result, file) => append(result.not_added, file) @@ -17444,6 +17493,7 @@ var init_simple_git_api = __esm({ init_task_callback(); init_change_working_directory(); init_checkout(); + init_count_objects(); init_commit(); init_config(); init_first_commit(); @@ -17562,6 +17612,7 @@ var init_simple_git_api = __esm({ checkout_default(), commit_default(), config_default(), + count_objects_default(), first_commit_default(), grep_default(), log_default(), @@ -17803,11 +17854,11 @@ function branchTask(customArgs) { }; } function branchLocalTask() { - const parser3 = parseBranchSummary; + const parser4 = parseBranchSummary; return { format: "utf-8", commands: ["branch", "-v"], - parser: parser3 + parser: parser4 }; } function deleteBranchesTask(branches, forceDelete = false) { @@ -18160,7 +18211,7 @@ __export(stash_list_exports, { function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; - const parser3 = createListLogSummaryParser( + const parser4 = createListLogSummaryParser( options.splitter, options.fields, logFormatFromCommand(commands) @@ -18168,7 +18219,7 @@ function stashListTask(opt = {}, customArgs) { return validateLogFormatConfig(commands) || { commands, format: "utf-8", - parser: parser3 + parser: parser4 }; } var init_stash_list = __esm({ diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 2d61c90..0821227 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -10824,11 +10824,11 @@ function getDate() { } /** - * Invokes `util.format()` with the specified arguments and writes to stderr. + * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr. */ function log(...args) { - return process.stderr.write(util.format(...args) + '\n'); + return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n'); } /** @@ -14219,6 +14219,11 @@ function remove(target, item) { function asArray(source) { return Array.isArray(source) ? source : [source]; } +function asCamelCase(str) { + return str.replace(/[\s-]+(.)/g, (_all, chr) => { + return chr.toUpperCase(); + }); +} function asStringArray(source) { return asArray(source).map(String); } @@ -14471,8 +14476,8 @@ var init_task_options = __esm({ }); // src/lib/utils/task-parser.ts -function callTaskParser(parser3, streams) { - return parser3(streams.stdOut, streams.stdErr); +function callTaskParser(parser4, streams) { + return parser4(streams.stdOut, streams.stdErr); } function parseStringResponse(result, parsers12, texts, trim = true) { asArray(texts).forEach((text) => { @@ -14507,6 +14512,7 @@ __export(utils_exports, { append: () => append, appendTaskOptions: () => appendTaskOptions, asArray: () => asArray, + asCamelCase: () => asCamelCase, asFunction: () => asFunction, asNumber: () => asNumber, asStringArray: () => asStringArray, @@ -14665,11 +14671,11 @@ __export(task_exports, { straightThroughBufferTask: () => straightThroughBufferTask, straightThroughStringTask: () => straightThroughStringTask }); -function adhocExecTask(parser3) { +function adhocExecTask(parser4) { return { commands: EMPTY_COMMANDS, format: "empty", - parser: parser3 + parser: parser4 }; } function configurationErrorTask(error) { @@ -16148,6 +16154,49 @@ var init_checkout = __esm({ } }); +// src/lib/tasks/count-objects.ts +function countObjectsResponse() { + return { + count: 0, + garbage: 0, + inPack: 0, + packs: 0, + prunePackable: 0, + size: 0, + sizeGarbage: 0, + sizePack: 0 + }; +} +function count_objects_default() { + return { + countObjects() { + return this._runTask({ + commands: ["count-objects", "--verbose"], + format: "utf-8", + parser(stdOut) { + return parseStringResponse(countObjectsResponse(), [parser2], stdOut); + } + }); + } + }; +} +var parser2; +var init_count_objects = __esm({ + "src/lib/tasks/count-objects.ts"() { + "use strict"; + init_utils(); + parser2 = new LineParser( + /([a-z-]+): (\d+)$/, + (result, [key, value]) => { + const property = asCamelCase(key); + if (result.hasOwnProperty(property)) { + result[property] = asNumber(value); + } + } + ); + } +}); + // src/lib/parsers/parse-commit.ts function parseCommitResult(stdOut) { const result = { @@ -16389,8 +16438,8 @@ var init_DiffSummary = __esm({ // src/lib/parsers/parse-diff-summary.ts function getDiffParser(format = "" /* NONE */) { - const parser3 = diffSummaryParsers[format]; - return (stdOut) => parseStringResponse(new DiffSummary(), parser3, stdOut, false); + const parser4 = diffSummaryParsers[format]; + return (stdOut) => parseStringResponse(new DiffSummary(), parser4, stdOut, false); } var statParser, numStatParser, nameOnlyParser, nameStatusParser, diffSummaryParsers; var init_parse_diff_summary = __esm({ @@ -16646,11 +16695,11 @@ function parseLogOptions(opt = {}, customArgs = []) { }; } function logTask(splitter, fields, customArgs) { - const parser3 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); + const parser4 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); return { commands: ["log", ...customArgs], format: "utf-8", - parser: parser3 + parser: parser4 }; } function log_default() { @@ -17169,11 +17218,11 @@ function renamedFile(line) { to }; } -function parser2(indexX, indexY, handler) { +function parser3(indexX, indexY, handler) { return [`${indexX}${indexY}`, handler]; } function conflicts(indexX, ...indexY) { - return indexY.map((y) => parser2(indexX, y, (result, file) => append(result.conflicted, file))); + return indexY.map((y) => parser3(indexX, y, (result, file) => append(result.conflicted, file))); } function splitLine(result, lineStr) { const trimmed2 = lineStr.trim(); @@ -17224,58 +17273,58 @@ var init_StatusSummary = __esm({ } }; parsers6 = new Map([ - parser2( + parser3( " " /* NONE */, "A" /* ADDED */, (result, file) => append(result.created, file) ), - parser2( + parser3( " " /* NONE */, "D" /* DELETED */, (result, file) => append(result.deleted, file) ), - parser2( + parser3( " " /* NONE */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) ), - parser2( + parser3( "A" /* ADDED */, " " /* NONE */, (result, file) => append(result.created, file) && append(result.staged, file) ), - parser2( + parser3( "A" /* ADDED */, "M" /* MODIFIED */, (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file) ), - parser2( + parser3( "D" /* DELETED */, " " /* NONE */, (result, file) => append(result.deleted, file) && append(result.staged, file) ), - parser2( + parser3( "M" /* MODIFIED */, " " /* NONE */, (result, file) => append(result.modified, file) && append(result.staged, file) ), - parser2( + parser3( "M" /* MODIFIED */, "M" /* MODIFIED */, (result, file) => append(result.modified, file) && append(result.staged, file) ), - parser2("R" /* RENAMED */, " " /* NONE */, (result, file) => { + parser3("R" /* RENAMED */, " " /* NONE */, (result, file) => { append(result.renamed, renamedFile(file)); }), - parser2("R" /* RENAMED */, "M" /* MODIFIED */, (result, file) => { + parser3("R" /* RENAMED */, "M" /* MODIFIED */, (result, file) => { const renamed = renamedFile(file); append(result.renamed, renamed); append(result.modified, renamed.to); }), - parser2("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { + parser3("!" /* IGNORED */, "!" /* IGNORED */, (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), - parser2( + parser3( "?" /* UNTRACKED */, "?" /* UNTRACKED */, (result, file) => append(result.not_added, file) @@ -17444,6 +17493,7 @@ var init_simple_git_api = __esm({ init_task_callback(); init_change_working_directory(); init_checkout(); + init_count_objects(); init_commit(); init_config(); init_first_commit(); @@ -17562,6 +17612,7 @@ var init_simple_git_api = __esm({ checkout_default(), commit_default(), config_default(), + count_objects_default(), first_commit_default(), grep_default(), log_default(), @@ -17803,11 +17854,11 @@ function branchTask(customArgs) { }; } function branchLocalTask() { - const parser3 = parseBranchSummary; + const parser4 = parseBranchSummary; return { format: "utf-8", commands: ["branch", "-v"], - parser: parser3 + parser: parser4 }; } function deleteBranchesTask(branches, forceDelete = false) { @@ -18160,7 +18211,7 @@ __export(stash_list_exports, { function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; - const parser3 = createListLogSummaryParser( + const parser4 = createListLogSummaryParser( options.splitter, options.fields, logFormatFromCommand(commands) @@ -18168,7 +18219,7 @@ function stashListTask(opt = {}, customArgs) { return validateLogFormatConfig(commands) || { commands, format: "utf-8", - parser: parser3 + parser: parser4 }; } var init_stash_list = __esm({ diff --git a/package-lock.json b/package-lock.json index 7afefee..01d2dda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2527,9 +2527,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -6006,13 +6006,13 @@ "dev": true }, "node_modules/simple-git": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.24.0.tgz", - "integrity": "sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.25.0.tgz", + "integrity": "sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" + "debug": "^4.3.5" }, "funding": { "type": "github", From 5c4fc91edbac8cc592578bfee84ec59530c0b12e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:57:58 +0000 Subject: [PATCH 24/25] chore(deps): bump commander from 12.0.0 to 12.1.0 Bumps [commander](https://github.com/tj/commander.js) from 12.0.0 to 12.1.0. - [Release notes](https://github.com/tj/commander.js/releases) - [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/tj/commander.js/compare/v12.0.0...v12.1.0) --- updated-dependencies: - dependency-name: commander dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- lib/cli/index.js | 835 ++++++++++++++++++++++++++++------------- lib/precommit/index.js | 835 ++++++++++++++++++++++++++++------------- package-lock.json | 6 +- src/datasources.ts | 2 +- 4 files changed, 1140 insertions(+), 538 deletions(-) diff --git a/lib/cli/index.js b/lib/cli/index.js index 054c084..669367c 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -11439,7 +11439,7 @@ function buildValues(diff, lastComponent, newString, oldString, useLongestToken) /***/ }), -/***/ 1005: +/***/ 2081: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -12123,7 +12123,7 @@ _base = _interopRequireDefault(__nccwpck_require__(1653)) var /*istanbul ignore start*/ -_character = __nccwpck_require__(1005) +_character = __nccwpck_require__(2081) /*istanbul ignore end*/ ; @@ -15825,7 +15825,7 @@ var import_child_process, GitExecutorChain; var init_git_executor_chain = __esm({ "src/lib/runners/git-executor-chain.ts"() { "use strict"; - import_child_process = __nccwpck_require__(2081); + import_child_process = __nccwpck_require__(8493); init_git_error(); init_task(); init_utils(); @@ -42752,7 +42752,7 @@ module.exports = require("buffer"); /***/ }), -/***/ 2081: +/***/ 8493: /***/ ((module) => { "use strict"; @@ -42832,6 +42832,14 @@ module.exports = require("net"); /***/ }), +/***/ 7718: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:child_process"); + +/***/ }), + /***/ 5673: /***/ ((module) => { @@ -42840,6 +42848,30 @@ module.exports = require("node:events"); /***/ }), +/***/ 7561: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:fs"); + +/***/ }), + +/***/ 9411: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:path"); + +/***/ }), + +/***/ 7742: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:process"); + +/***/ }), + /***/ 4492: /***/ ((module) => { @@ -42880,14 +42912,6 @@ module.exports = require("perf_hooks"); /***/ }), -/***/ 7282: -/***/ ((module) => { - -"use strict"; -module.exports = require("process"); - -/***/ }), - /***/ 3477: /***/ ((module) => { @@ -44695,7 +44719,7 @@ class Argument { } /** - * @package internal use only + * @package */ _concatValue(value, previous) { @@ -44743,7 +44767,9 @@ class Argument { this.argChoices = values.slice(); this.parseArg = (arg, previous) => { if (!this.argChoices.includes(arg)) { - throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`); + throw new InvalidArgumentError( + `Allowed choices are ${this.argChoices.join(', ')}.`, + ); } if (this.variadic) { return this._concatValue(arg, previous); @@ -44755,6 +44781,8 @@ class Argument { /** * Make argument required. + * + * @returns {Argument} */ argRequired() { this.required = true; @@ -44763,6 +44791,8 @@ class Argument { /** * Make argument optional. + * + * @returns {Argument} */ argOptional() { this.required = false; @@ -44781,9 +44811,7 @@ class Argument { function humanReadableArgName(arg) { const nameOutput = arg.name() + (arg.variadic === true ? '...' : ''); - return arg.required - ? '<' + nameOutput + '>' - : '[' + nameOutput + ']'; + return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']'; } exports.Argument = Argument; @@ -44795,11 +44823,11 @@ exports.humanReadableArgName = humanReadableArgName; /***/ 552: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { -const EventEmitter = (__nccwpck_require__(2361).EventEmitter); -const childProcess = __nccwpck_require__(2081); -const path = __nccwpck_require__(1017); -const fs = __nccwpck_require__(7147); -const process = __nccwpck_require__(7282); +const EventEmitter = (__nccwpck_require__(5673).EventEmitter); +const childProcess = __nccwpck_require__(7718); +const path = __nccwpck_require__(9411); +const fs = __nccwpck_require__(7561); +const process = __nccwpck_require__(7742); const { Argument, humanReadableArgName } = __nccwpck_require__(9414); const { CommanderError } = __nccwpck_require__(2625); @@ -44857,9 +44885,11 @@ class Command extends EventEmitter { this._outputConfiguration = { writeOut: (str) => process.stdout.write(str), writeErr: (str) => process.stderr.write(str), - getOutHelpWidth: () => process.stdout.isTTY ? process.stdout.columns : undefined, - getErrHelpWidth: () => process.stderr.isTTY ? process.stderr.columns : undefined, - outputError: (str, write) => write(str) + getOutHelpWidth: () => + process.stdout.isTTY ? process.stdout.columns : undefined, + getErrHelpWidth: () => + process.stderr.isTTY ? process.stderr.columns : undefined, + outputError: (str, write) => write(str), }; this._hidden = false; @@ -44886,7 +44916,8 @@ class Command extends EventEmitter { this._helpConfiguration = sourceCommand._helpConfiguration; this._exitCallback = sourceCommand._exitCallback; this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties; - this._combineFlagAndOptionalValue = sourceCommand._combineFlagAndOptionalValue; + this._combineFlagAndOptionalValue = + sourceCommand._combineFlagAndOptionalValue; this._allowExcessArguments = sourceCommand._allowExcessArguments; this._enablePositionalOptions = sourceCommand._enablePositionalOptions; this._showHelpAfterError = sourceCommand._showHelpAfterError; @@ -44902,6 +44933,7 @@ class Command extends EventEmitter { _getCommandAndAncestors() { const result = []; + // eslint-disable-next-line @typescript-eslint/no-this-alias for (let command = this; command; command = command.parent) { result.push(command); } @@ -44928,8 +44960,8 @@ class Command extends EventEmitter { * .command('stop [service]', 'stop named service, or all if no name supplied'); * * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param {(Object|string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) - * @param {Object} [execOpts] - configuration options (for executable) + * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {object} [execOpts] - configuration options (for executable) * @return {Command} returns new command for action handler, or `this` for executable command */ @@ -44989,8 +45021,8 @@ class Command extends EventEmitter { * You can customise the help by overriding Help properties using configureHelp(), * or with a subclass of Help by overriding createHelp(). * - * @param {Object} [configuration] - configuration options - * @return {(Command|Object)} `this` command for chaining, or stored configuration + * @param {object} [configuration] - configuration options + * @return {(Command | object)} `this` command for chaining, or stored configuration */ configureHelp(configuration) { @@ -45015,8 +45047,8 @@ class Command extends EventEmitter { * // functions based on what is being written out * outputError(str, write) // used for displaying errors, and not used for displaying help * - * @param {Object} [configuration] - configuration options - * @return {(Command|Object)} `this` command for chaining, or stored configuration + * @param {object} [configuration] - configuration options + * @return {(Command | object)} `this` command for chaining, or stored configuration */ configureOutput(configuration) { @@ -45055,7 +45087,7 @@ class Command extends EventEmitter { * See .command() for creating an attached subcommand which inherits settings from its parent. * * @param {Command} cmd - new subcommand - * @param {Object} [opts] - configuration options + * @param {object} [opts] - configuration options * @return {Command} `this` command for chaining */ @@ -45131,9 +45163,12 @@ class Command extends EventEmitter { */ arguments(names) { - names.trim().split(/ +/).forEach((detail) => { - this.argument(detail); - }); + names + .trim() + .split(/ +/) + .forEach((detail) => { + this.argument(detail); + }); return this; } @@ -45146,10 +45181,18 @@ class Command extends EventEmitter { addArgument(argument) { const previousArgument = this.registeredArguments.slice(-1)[0]; if (previousArgument && previousArgument.variadic) { - throw new Error(`only the last argument can be variadic '${previousArgument.name()}'`); + throw new Error( + `only the last argument can be variadic '${previousArgument.name()}'`, + ); } - if (argument.required && argument.defaultValue !== undefined && argument.parseArg === undefined) { - throw new Error(`a default value for a required argument is never used: '${argument.name()}'`); + if ( + argument.required && + argument.defaultValue !== undefined && + argument.parseArg === undefined + ) { + throw new Error( + `a default value for a required argument is never used: '${argument.name()}'`, + ); } this.registeredArguments.push(argument); return this; @@ -45158,6 +45201,7 @@ class Command extends EventEmitter { /** * Customise or override default help command. By default a help command is automatically added if your command has subcommands. * + * @example * program.helpCommand('help [cmd]'); * program.helpCommand('help [cmd]', 'show help'); * program.helpCommand(false); // suppress default help command @@ -45216,8 +45260,11 @@ class Command extends EventEmitter { * @package */ _getHelpCommand() { - const hasImplicitHelpCommand = this._addImplicitHelpCommand ?? - (this.commands.length && !this._actionHandler && !this._findCommand('help')); + const hasImplicitHelpCommand = + this._addImplicitHelpCommand ?? + (this.commands.length && + !this._actionHandler && + !this._findCommand('help')); if (hasImplicitHelpCommand) { if (this._helpCommand === undefined) { @@ -45365,14 +45412,18 @@ Expecting one of '${allowedValues.join("', '")}'`); * Register option if no conflicts found, or throw on conflict. * * @param {Option} option - * @api private + * @private */ _registerOption(option) { - const matchingOption = (option.short && this._findOption(option.short)) || + const matchingOption = + (option.short && this._findOption(option.short)) || (option.long && this._findOption(option.long)); if (matchingOption) { - const matchingFlag = (option.long && this._findOption(option.long)) ? option.long : option.short; + const matchingFlag = + option.long && this._findOption(option.long) + ? option.long + : option.short; throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}' - already used by option '${matchingOption.flags}'`); } @@ -45385,7 +45436,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Register command if no conflicts found, or throw on conflict. * * @param {Command} command - * @api private + * @private */ _registerCommand(command) { @@ -45393,11 +45444,15 @@ Expecting one of '${allowedValues.join("', '")}'`); return [cmd.name()].concat(cmd.aliases()); }; - const alreadyUsed = knownBy(command).find((name) => this._findCommand(name)); + const alreadyUsed = knownBy(command).find((name) => + this._findCommand(name), + ); if (alreadyUsed) { const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|'); const newCmd = knownBy(command).join('|'); - throw new Error(`cannot add command '${newCmd}' as already have command '${existingCmd}'`); + throw new Error( + `cannot add command '${newCmd}' as already have command '${existingCmd}'`, + ); } this.commands.push(command); @@ -45420,7 +45475,11 @@ Expecting one of '${allowedValues.join("', '")}'`); // --no-foo is special and defaults foo to true, unless a --foo option is already defined const positiveLongFlag = option.long.replace(/^--no-/, '--'); if (!this._findOption(positiveLongFlag)) { - this.setOptionValueWithSource(name, option.defaultValue === undefined ? true : option.defaultValue, 'default'); + this.setOptionValueWithSource( + name, + option.defaultValue === undefined ? true : option.defaultValue, + 'default', + ); } } else if (option.defaultValue !== undefined) { this.setOptionValueWithSource(name, option.defaultValue, 'default'); @@ -45473,11 +45532,14 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Internal implementation shared by .option() and .requiredOption() * + * @return {Command} `this` command for chaining * @private */ _optionEx(config, flags, description, fn, defaultValue) { if (typeof flags === 'object' && flags instanceof Option) { - throw new Error('To add an Option object use addOption() instead of option() or requiredOption()'); + throw new Error( + 'To add an Option object use addOption() instead of option() or requiredOption()', + ); } const option = this.createOption(flags, description); option.makeOptionMandatory(!!config.mandatory); @@ -45525,20 +45587,26 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * Add a required option which must have a value after parsing. This usually means - * the option must be specified on the command line. (Otherwise the same as .option().) - * - * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. - * - * @param {string} flags - * @param {string} [description] - * @param {(Function|*)} [parseArg] - custom option processing function or default value - * @param {*} [defaultValue] - * @return {Command} `this` command for chaining - */ + * Add a required option which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. + * + * @param {string} flags + * @param {string} [description] + * @param {(Function|*)} [parseArg] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + */ requiredOption(flags, description, parseArg, defaultValue) { - return this._optionEx({ mandatory: true }, flags, description, parseArg, defaultValue); + return this._optionEx( + { mandatory: true }, + flags, + description, + parseArg, + defaultValue, + ); } /** @@ -45549,7 +45617,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` * - * @param {boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. + * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag. + * @return {Command} `this` command for chaining */ combineFlagAndOptionalValue(combine = true) { this._combineFlagAndOptionalValue = !!combine; @@ -45559,8 +45628,8 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow unknown options on the command line. * - * @param {boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown - * for unknown options. + * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options. + * @return {Command} `this` command for chaining */ allowUnknownOption(allowUnknown = true) { this._allowUnknownOption = !!allowUnknown; @@ -45570,8 +45639,8 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow excess command-arguments on the command line. Pass false to make excess arguments an error. * - * @param {boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown - * for excess arguments. + * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments. + * @return {Command} `this` command for chaining */ allowExcessArguments(allowExcess = true) { this._allowExcessArguments = !!allowExcess; @@ -45583,7 +45652,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions. * The default behaviour is non-positional and global options may appear anywhere on the command line. * - * @param {boolean} [positional=true] + * @param {boolean} [positional] + * @return {Command} `this` command for chaining */ enablePositionalOptions(positional = true) { this._enablePositionalOptions = !!positional; @@ -45596,8 +45666,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * positional options to have been enabled on the program (parent commands). * The default behaviour is non-positional and options may appear before or after command-arguments. * - * @param {boolean} [passThrough=true] - * for unknown options. + * @param {boolean} [passThrough] for unknown options. + * @return {Command} `this` command for chaining */ passThroughOptions(passThrough = true) { this._passThroughOptions = !!passThrough; @@ -45610,25 +45680,33 @@ Expecting one of '${allowedValues.join("', '")}'`); */ _checkForBrokenPassThrough() { - if (this.parent && this._passThroughOptions && !this.parent._enablePositionalOptions) { - throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`); + if ( + this.parent && + this._passThroughOptions && + !this.parent._enablePositionalOptions + ) { + throw new Error( + `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`, + ); } } /** - * Whether to store option values as properties on command object, - * or store separately (specify false). In both cases the option values can be accessed using .opts(). - * - * @param {boolean} [storeAsProperties=true] - * @return {Command} `this` command for chaining - */ + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @param {boolean} [storeAsProperties=true] + * @return {Command} `this` command for chaining + */ storeOptionsAsProperties(storeAsProperties = true) { if (this.options.length) { throw new Error('call .storeOptionsAsProperties() before adding options'); } if (Object.keys(this._optionValues).length) { - throw new Error('call .storeOptionsAsProperties() before setting option values'); + throw new Error( + 'call .storeOptionsAsProperties() before setting option values', + ); } this._storeOptionsAsProperties = !!storeAsProperties; return this; @@ -45638,7 +45716,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Retrieve option value. * * @param {string} key - * @return {Object} value + * @return {object} value */ getOptionValue(key) { @@ -45652,7 +45730,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Store option value. * * @param {string} key - * @param {Object} value + * @param {object} value * @return {Command} `this` command for chaining */ @@ -45661,13 +45739,13 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * Store option value and where the value came from. - * - * @param {string} key - * @param {Object} value - * @param {string} source - expected values are default/config/env/cli/implied - * @return {Command} `this` command for chaining - */ + * Store option value and where the value came from. + * + * @param {string} key + * @param {object} value + * @param {string} source - expected values are default/config/env/cli/implied + * @return {Command} `this` command for chaining + */ setOptionValueWithSource(key, value, source) { if (this._storeOptionsAsProperties) { @@ -45680,24 +45758,24 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * Get source of option value. - * Expected values are default | config | env | cli | implied - * - * @param {string} key - * @return {string} - */ + * Get source of option value. + * Expected values are default | config | env | cli | implied + * + * @param {string} key + * @return {string} + */ getOptionValueSource(key) { return this._optionValueSources[key]; } /** - * Get source of option value. See also .optsWithGlobals(). - * Expected values are default | config | env | cli | implied - * - * @param {string} key - * @return {string} - */ + * Get source of option value. See also .optsWithGlobals(). + * Expected values are default | config | env | cli | implied + * + * @param {string} key + * @return {string} + */ getOptionValueSourceWithGlobals(key) { // global overwrites local, like optsWithGlobals @@ -45723,17 +45801,30 @@ Expecting one of '${allowedValues.join("', '")}'`); } parseOptions = parseOptions || {}; - // Default to using process.argv - if (argv === undefined) { - argv = process.argv; - // @ts-ignore: unknown property - if (process.versions && process.versions.electron) { + // auto-detect argument conventions if nothing supplied + if (argv === undefined && parseOptions.from === undefined) { + if (process.versions?.electron) { parseOptions.from = 'electron'; } + // check node specific options for scenarios where user CLI args follow executable without scriptname + const execArgv = process.execArgv ?? []; + if ( + execArgv.includes('-e') || + execArgv.includes('--eval') || + execArgv.includes('-p') || + execArgv.includes('--print') + ) { + parseOptions.from = 'eval'; // internal usage, not documented + } + } + + // default to using process.argv + if (argv === undefined) { + argv = process.argv; } this.rawArgs = argv.slice(); - // make it a little easier for callers by supporting various argv conventions + // extract the user args and scriptPath let userArgs; switch (parseOptions.from) { case undefined: @@ -45742,7 +45833,7 @@ Expecting one of '${allowedValues.join("', '")}'`); userArgs = argv.slice(2); break; case 'electron': - // @ts-ignore: unknown property + // @ts-ignore: because defaultApp is an unknown property if (process.defaultApp) { this._scriptPath = argv[1]; userArgs = argv.slice(2); @@ -45753,12 +45844,18 @@ Expecting one of '${allowedValues.join("', '")}'`); case 'user': userArgs = argv.slice(0); break; + case 'eval': + userArgs = argv.slice(1); + break; default: - throw new Error(`unexpected parse option { from: '${parseOptions.from}' }`); + throw new Error( + `unexpected parse option { from: '${parseOptions.from}' }`, + ); } // Find default name for program from arguments. - if (!this._name && this._scriptPath) this.nameFromFilename(this._scriptPath); + if (!this._name && this._scriptPath) + this.nameFromFilename(this._scriptPath); this._name = this._name || 'program'; return userArgs; @@ -45767,16 +45864,22 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Parse `argv`, setting options and invoking commands when defined. * - * The default expectation is that the arguments are from node and have the application as argv[0] - * and the script being run in argv[1], with user parameters after that. + * Use parseAsync instead of parse if any of your action handlers are async. + * + * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode! + * + * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`: + * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that + * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged + * - `'user'`: just user arguments * * @example - * program.parse(process.argv); - * program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parse(); // parse process.argv and auto-detect electron and special node flags + * program.parse(process.argv); // assume argv[0] is app and argv[1] is script * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] * * @param {string[]} [argv] - optional, defaults to process.argv - * @param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron + * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron' * @return {Command} `this` command for chaining */ @@ -45791,18 +45894,20 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Parse `argv`, setting options and invoking commands when defined. * - * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode! * - * The default expectation is that the arguments are from node and have the application as argv[0] - * and the script being run in argv[1], with user parameters after that. + * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`: + * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that + * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged + * - `'user'`: just user arguments * * @example - * await program.parseAsync(process.argv); - * await program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions + * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags + * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] * * @param {string[]} [argv] - * @param {Object} [parseOptions] + * @param {object} [parseOptions] * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron' * @return {Promise} */ @@ -45834,7 +45939,9 @@ Expecting one of '${allowedValues.join("', '")}'`); if (sourceExt.includes(path.extname(baseName))) return undefined; // Try all the extensions. - const foundExt = sourceExt.find(ext => fs.existsSync(`${localBin}${ext}`)); + const foundExt = sourceExt.find((ext) => + fs.existsSync(`${localBin}${ext}`), + ); if (foundExt) return `${localBin}${foundExt}`; return undefined; @@ -45845,7 +45952,8 @@ Expecting one of '${allowedValues.join("', '")}'`); this._checkForConflictingOptions(); // executableFile and executableDir might be full path, or just a name - let executableFile = subcommand._executableFile || `${this._name}-${subcommand._name}`; + let executableFile = + subcommand._executableFile || `${this._name}-${subcommand._name}`; let executableDir = this._executableDir || ''; if (this._scriptPath) { let resolvedScriptPath; // resolve possible symlink for installed npm binary @@ -45854,7 +45962,10 @@ Expecting one of '${allowedValues.join("', '")}'`); } catch (err) { resolvedScriptPath = this._scriptPath; } - executableDir = path.resolve(path.dirname(resolvedScriptPath), executableDir); + executableDir = path.resolve( + path.dirname(resolvedScriptPath), + executableDir, + ); } // Look for a local file in preference to a command in PATH. @@ -45863,9 +45974,15 @@ Expecting one of '${allowedValues.join("', '")}'`); // Legacy search using prefix of script name instead of command name if (!localFile && !subcommand._executableFile && this._scriptPath) { - const legacyName = path.basename(this._scriptPath, path.extname(this._scriptPath)); + const legacyName = path.basename( + this._scriptPath, + path.extname(this._scriptPath), + ); if (legacyName !== this._name) { - localFile = findFile(executableDir, `${legacyName}-${subcommand._name}`); + localFile = findFile( + executableDir, + `${legacyName}-${subcommand._name}`, + ); } } executableFile = localFile || executableFile; @@ -45891,12 +46008,13 @@ Expecting one of '${allowedValues.join("', '")}'`); proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' }); } - if (!proc.killed) { // testing mainly to avoid leak warnings during unit tests with mocked spawn + if (!proc.killed) { + // testing mainly to avoid leak warnings during unit tests with mocked spawn const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP']; signals.forEach((signal) => { - // @ts-ignore process.on(signal, () => { if (proc.killed === false && proc.exitCode === null) { + // @ts-ignore because signals not typed to known strings proc.kill(signal); } }); @@ -45905,16 +46023,22 @@ Expecting one of '${allowedValues.join("', '")}'`); // By default terminate process when spawned process terminates. const exitCallback = this._exitCallback; - proc.on('close', (code, _signal) => { + proc.on('close', (code) => { code = code ?? 1; // code is null if spawned process terminated due to a signal if (!exitCallback) { process.exit(code); } else { - exitCallback(new CommanderError(code, 'commander.executeSubCommandAsync', '(close)')); + exitCallback( + new CommanderError( + code, + 'commander.executeSubCommandAsync', + '(close)', + ), + ); } }); proc.on('error', (err) => { - // @ts-ignore + // @ts-ignore: because err.code is an unknown property if (err.code === 'ENOENT') { const executableDirMessage = executableDir ? `searched for local subcommand relative to directory '${executableDir}'` @@ -45924,14 +46048,18 @@ Expecting one of '${allowedValues.join("', '")}'`); - if the default executable name is not suitable, use the executableFile option to supply a custom name or path - ${executableDirMessage}`; throw new Error(executableMissing); - // @ts-ignore + // @ts-ignore: because err.code is an unknown property } else if (err.code === 'EACCES') { throw new Error(`'${executableFile}' not executable`); } if (!exitCallback) { process.exit(1); } else { - const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)'); + const wrappedError = new CommanderError( + 1, + 'commander.executeSubCommandAsync', + '(error)', + ); wrappedError.nestedError = err; exitCallback(wrappedError); } @@ -45950,7 +46078,11 @@ Expecting one of '${allowedValues.join("', '")}'`); if (!subCommand) this.help({ error: true }); let promiseChain; - promiseChain = this._chainOrCallSubCommandHook(promiseChain, subCommand, 'preSubcommand'); + promiseChain = this._chainOrCallSubCommandHook( + promiseChain, + subCommand, + 'preSubcommand', + ); promiseChain = this._chainOrCall(promiseChain, () => { if (subCommand._executableHandler) { this._executeSubCommand(subCommand, operands.concat(unknown)); @@ -45978,9 +46110,11 @@ Expecting one of '${allowedValues.join("', '")}'`); } // Fallback to parsing the help flag to invoke the help. - return this._dispatchSubcommand(subcommandName, [], [ - this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help' - ]); + return this._dispatchSubcommand( + subcommandName, + [], + [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'], + ); } /** @@ -45997,7 +46131,10 @@ Expecting one of '${allowedValues.join("', '")}'`); } }); // too many - if (this.registeredArguments.length > 0 && this.registeredArguments[this.registeredArguments.length - 1].variadic) { + if ( + this.registeredArguments.length > 0 && + this.registeredArguments[this.registeredArguments.length - 1].variadic + ) { return; } if (this.args.length > this.registeredArguments.length) { @@ -46017,7 +46154,12 @@ Expecting one of '${allowedValues.join("', '")}'`); let parsedValue = value; if (value !== null && argument.parseArg) { const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`; - parsedValue = this._callParseArg(argument, value, previous, invalidValueMessage); + parsedValue = this._callParseArg( + argument, + value, + previous, + invalidValueMessage, + ); } return parsedValue; }; @@ -46082,8 +46224,8 @@ Expecting one of '${allowedValues.join("', '")}'`); const hooks = []; this._getCommandAndAncestors() .reverse() - .filter(cmd => cmd._lifeCycleHooks[event] !== undefined) - .forEach(hookedCommand => { + .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined) + .forEach((hookedCommand) => { hookedCommand._lifeCycleHooks[event].forEach((callback) => { hooks.push({ hookedCommand, callback }); }); @@ -46139,14 +46281,26 @@ Expecting one of '${allowedValues.join("', '")}'`); if (operands && this._findCommand(operands[0])) { return this._dispatchSubcommand(operands[0], operands.slice(1), unknown); } - if (this._getHelpCommand() && operands[0] === this._getHelpCommand().name()) { + if ( + this._getHelpCommand() && + operands[0] === this._getHelpCommand().name() + ) { return this._dispatchHelpCommand(operands[1]); } if (this._defaultCommandName) { this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command - return this._dispatchSubcommand(this._defaultCommandName, operands, unknown); + return this._dispatchSubcommand( + this._defaultCommandName, + operands, + unknown, + ); } - if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { + if ( + this.commands.length && + this.args.length === 0 && + !this._actionHandler && + !this._defaultCommandName + ) { // probably missing subcommand and no handler, user needs help (and exit) this.help({ error: true }); } @@ -46169,7 +46323,9 @@ Expecting one of '${allowedValues.join("', '")}'`); let promiseChain; promiseChain = this._chainOrCallHooks(promiseChain, 'preAction'); - promiseChain = this._chainOrCall(promiseChain, () => this._actionHandler(this.processedArgs)); + promiseChain = this._chainOrCall(promiseChain, () => + this._actionHandler(this.processedArgs), + ); if (this.parent) { promiseChain = this._chainOrCall(promiseChain, () => { this.parent.emit(commandEvent, operands, unknown); // legacy @@ -46183,7 +46339,8 @@ Expecting one of '${allowedValues.join("', '")}'`); this._processArguments(); this.parent.emit(commandEvent, operands, unknown); // legacy } else if (operands.length) { - if (this._findCommand('*')) { // legacy default command + if (this._findCommand('*')) { + // legacy default command return this._dispatchSubcommand('*', operands, unknown); } if (this.listenerCount('command:*')) { @@ -46210,10 +46367,13 @@ Expecting one of '${allowedValues.join("', '")}'`); * Find matching command. * * @private + * @return {Command | undefined} */ _findCommand(name) { if (!name) return undefined; - return this.commands.find(cmd => cmd._name === name || cmd._aliases.includes(name)); + return this.commands.find( + (cmd) => cmd._name === name || cmd._aliases.includes(name), + ); } /** @@ -46221,11 +46381,11 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} arg * @return {Option} - * @package internal use only + * @package */ _findOption(arg) { - return this.options.find(option => option.is(arg)); + return this.options.find((option) => option.is(arg)); } /** @@ -46239,7 +46399,10 @@ Expecting one of '${allowedValues.join("', '")}'`); // Walk up hierarchy so can call in subcommand after checking for displaying help. this._getCommandAndAncestors().forEach((cmd) => { cmd.options.forEach((anOption) => { - if (anOption.mandatory && (cmd.getOptionValue(anOption.attributeName()) === undefined)) { + if ( + anOption.mandatory && + cmd.getOptionValue(anOption.attributeName()) === undefined + ) { cmd.missingMandatoryOptionValue(anOption); } }); @@ -46252,23 +46415,21 @@ Expecting one of '${allowedValues.join("', '")}'`); * @private */ _checkForConflictingLocalOptions() { - const definedNonDefaultOptions = this.options.filter( - (option) => { - const optionKey = option.attributeName(); - if (this.getOptionValue(optionKey) === undefined) { - return false; - } - return this.getOptionValueSource(optionKey) !== 'default'; + const definedNonDefaultOptions = this.options.filter((option) => { + const optionKey = option.attributeName(); + if (this.getOptionValue(optionKey) === undefined) { + return false; } - ); + return this.getOptionValueSource(optionKey) !== 'default'; + }); const optionsWithConflicting = definedNonDefaultOptions.filter( - (option) => option.conflictsWith.length > 0 + (option) => option.conflictsWith.length > 0, ); optionsWithConflicting.forEach((option) => { const conflictingAndDefined = definedNonDefaultOptions.find((defined) => - option.conflictsWith.includes(defined.attributeName()) + option.conflictsWith.includes(defined.attributeName()), ); if (conflictingAndDefined) { this._conflictingOption(option, conflictingAndDefined); @@ -46348,7 +46509,8 @@ Expecting one of '${allowedValues.join("', '")}'`); value = args.shift(); } this.emit(`option:${option.name()}`, value); - } else { // boolean flag + } else { + // boolean flag this.emit(`option:${option.name()}`); } activeVariadicOption = option.variadic ? option : null; @@ -46360,7 +46522,10 @@ Expecting one of '${allowedValues.join("', '")}'`); if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') { const option = this._findOption(`-${arg[1]}`); if (option) { - if (option.required || (option.optional && this._combineFlagAndOptionalValue)) { + if ( + option.required || + (option.optional && this._combineFlagAndOptionalValue) + ) { // option with value following in same argument this.emit(`option:${option.name()}`, arg.slice(2)); } else { @@ -46391,12 +46556,19 @@ Expecting one of '${allowedValues.join("', '")}'`); } // If using positionalOptions, stop processing our options at subcommand. - if ((this._enablePositionalOptions || this._passThroughOptions) && operands.length === 0 && unknown.length === 0) { + if ( + (this._enablePositionalOptions || this._passThroughOptions) && + operands.length === 0 && + unknown.length === 0 + ) { if (this._findCommand(arg)) { operands.push(arg); if (args.length > 0) unknown.push(...args); break; - } else if (this._getHelpCommand() && arg === this._getHelpCommand().name()) { + } else if ( + this._getHelpCommand() && + arg === this._getHelpCommand().name() + ) { operands.push(arg); if (args.length > 0) operands.push(...args); break; @@ -46424,7 +46596,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Return an object containing local option values as key-value pairs. * - * @return {Object} + * @return {object} */ opts() { if (this._storeOptionsAsProperties) { @@ -46434,7 +46606,8 @@ Expecting one of '${allowedValues.join("', '")}'`); for (let i = 0; i < len; i++) { const key = this.options[i].attributeName(); - result[key] = key === this._versionOptionName ? this._version : this[key]; + result[key] = + key === this._versionOptionName ? this._version : this[key]; } return result; } @@ -46445,13 +46618,13 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Return an object containing merged local and global option values as key-value pairs. * - * @return {Object} + * @return {object} */ optsWithGlobals() { // globals overwrite locals return this._getCommandAndAncestors().reduce( (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()), - {} + {}, ); } @@ -46459,13 +46632,16 @@ Expecting one of '${allowedValues.join("', '")}'`); * Display error message and exit (or call exitOverride). * * @param {string} message - * @param {Object} [errorOptions] + * @param {object} [errorOptions] * @param {string} [errorOptions.code] - an id string representing the error * @param {number} [errorOptions.exitCode] - used with process.exit */ error(message, errorOptions) { // output handling - this._outputConfiguration.outputError(`${message}\n`, this._outputConfiguration.writeErr); + this._outputConfiguration.outputError( + `${message}\n`, + this._outputConfiguration.writeErr, + ); if (typeof this._showHelpAfterError === 'string') { this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`); } else if (this._showHelpAfterError) { @@ -46491,11 +46667,18 @@ Expecting one of '${allowedValues.join("', '")}'`); if (option.envVar && option.envVar in process.env) { const optionKey = option.attributeName(); // Priority check. Do not overwrite cli or options from unknown source (client-code). - if (this.getOptionValue(optionKey) === undefined || ['default', 'config', 'env'].includes(this.getOptionValueSource(optionKey))) { - if (option.required || option.optional) { // option can take a value + if ( + this.getOptionValue(optionKey) === undefined || + ['default', 'config', 'env'].includes( + this.getOptionValueSource(optionKey), + ) + ) { + if (option.required || option.optional) { + // option can take a value // keep very simple, optional always takes value this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]); - } else { // boolean + } else { + // boolean // keep very simple, only care that envVar defined and not the value this.emit(`optionEnv:${option.name()}`); } @@ -46512,17 +46695,30 @@ Expecting one of '${allowedValues.join("', '")}'`); _parseOptionsImplied() { const dualHelper = new DualOptions(this.options); const hasCustomOptionValue = (optionKey) => { - return this.getOptionValue(optionKey) !== undefined && !['default', 'implied'].includes(this.getOptionValueSource(optionKey)); + return ( + this.getOptionValue(optionKey) !== undefined && + !['default', 'implied'].includes(this.getOptionValueSource(optionKey)) + ); }; this.options - .filter(option => (option.implied !== undefined) && - hasCustomOptionValue(option.attributeName()) && - dualHelper.valueFromOption(this.getOptionValue(option.attributeName()), option)) + .filter( + (option) => + option.implied !== undefined && + hasCustomOptionValue(option.attributeName()) && + dualHelper.valueFromOption( + this.getOptionValue(option.attributeName()), + option, + ), + ) .forEach((option) => { Object.keys(option.implied) - .filter(impliedKey => !hasCustomOptionValue(impliedKey)) - .forEach(impliedKey => { - this.setOptionValueWithSource(impliedKey, option.implied[impliedKey], 'implied'); + .filter((impliedKey) => !hasCustomOptionValue(impliedKey)) + .forEach((impliedKey) => { + this.setOptionValueWithSource( + impliedKey, + option.implied[impliedKey], + 'implied', + ); }); }); } @@ -46576,12 +46772,18 @@ Expecting one of '${allowedValues.join("', '")}'`); const findBestOptionFromValue = (option) => { const optionKey = option.attributeName(); const optionValue = this.getOptionValue(optionKey); - const negativeOption = this.options.find(target => target.negate && optionKey === target.attributeName()); - const positiveOption = this.options.find(target => !target.negate && optionKey === target.attributeName()); - if (negativeOption && ( - (negativeOption.presetArg === undefined && optionValue === false) || - (negativeOption.presetArg !== undefined && optionValue === negativeOption.presetArg) - )) { + const negativeOption = this.options.find( + (target) => target.negate && optionKey === target.attributeName(), + ); + const positiveOption = this.options.find( + (target) => !target.negate && optionKey === target.attributeName(), + ); + if ( + negativeOption && + ((negativeOption.presetArg === undefined && optionValue === false) || + (negativeOption.presetArg !== undefined && + optionValue === negativeOption.presetArg)) + ) { return negativeOption; } return positiveOption || option; @@ -46615,11 +46817,14 @@ Expecting one of '${allowedValues.join("', '")}'`); if (flag.startsWith('--') && this._showSuggestionAfterError) { // Looping to pick up the global options too let candidateFlags = []; + // eslint-disable-next-line @typescript-eslint/no-this-alias let command = this; do { - const moreFlags = command.createHelp().visibleOptions(command) - .filter(option => option.long) - .map(option => option.long); + const moreFlags = command + .createHelp() + .visibleOptions(command) + .filter((option) => option.long) + .map((option) => option.long); candidateFlags = candidateFlags.concat(moreFlags); command = command.parent; } while (command && !command._enablePositionalOptions); @@ -46641,7 +46846,7 @@ Expecting one of '${allowedValues.join("', '")}'`); if (this._allowExcessArguments) return; const expected = this.registeredArguments.length; - const s = (expected === 1) ? '' : 's'; + const s = expected === 1 ? '' : 's'; const forSubcommand = this.parent ? ` for '${this.name()}'` : ''; const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`; this.error(message, { code: 'commander.excessArguments' }); @@ -46659,11 +46864,13 @@ Expecting one of '${allowedValues.join("', '")}'`); if (this._showSuggestionAfterError) { const candidateNames = []; - this.createHelp().visibleCommands(this).forEach((command) => { - candidateNames.push(command.name()); - // just visible alias - if (command.alias()) candidateNames.push(command.alias()); - }); + this.createHelp() + .visibleCommands(this) + .forEach((command) => { + candidateNames.push(command.name()); + // just visible alias + if (command.alias()) candidateNames.push(command.alias()); + }); suggestion = suggestSimilar(unknownName, candidateNames); } @@ -46704,11 +46911,12 @@ Expecting one of '${allowedValues.join("', '")}'`); * Set the description. * * @param {string} [str] - * @param {Object} [argsDescription] + * @param {object} [argsDescription] * @return {(string|Command)} */ description(str, argsDescription) { - if (str === undefined && argsDescription === undefined) return this._description; + if (str === undefined && argsDescription === undefined) + return this._description; this._description = str; if (argsDescription) { this._argsDescription = argsDescription; @@ -46741,18 +46949,27 @@ Expecting one of '${allowedValues.join("', '")}'`); if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility /** @type {Command} */ + // eslint-disable-next-line @typescript-eslint/no-this-alias let command = this; - if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) { + if ( + this.commands.length !== 0 && + this.commands[this.commands.length - 1]._executableHandler + ) { // assume adding alias for last added executable subcommand, rather than this command = this.commands[this.commands.length - 1]; } - if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); + if (alias === command._name) + throw new Error("Command alias can't be the same as its name"); const matchingCommand = this.parent?._findCommand(alias); if (matchingCommand) { // c.f. _registerCommand - const existingCmd = [matchingCommand.name()].concat(matchingCommand.aliases()).join('|'); - throw new Error(`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`); + const existingCmd = [matchingCommand.name()] + .concat(matchingCommand.aliases()) + .join('|'); + throw new Error( + `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`, + ); } command._aliases.push(alias); @@ -46790,11 +47007,13 @@ Expecting one of '${allowedValues.join("', '")}'`); const args = this.registeredArguments.map((arg) => { return humanReadableArgName(arg); }); - return [].concat( - (this.options.length || (this._helpOption !== null) ? '[options]' : []), - (this.commands.length ? '[command]' : []), - (this.registeredArguments.length ? args : []) - ).join(' '); + return [] + .concat( + this.options.length || this._helpOption !== null ? '[options]' : [], + this.commands.length ? '[command]' : [], + this.registeredArguments.length ? args : [], + ) + .join(' '); } this._usage = str; @@ -46861,7 +47080,10 @@ Expecting one of '${allowedValues.join("', '")}'`); helpInformation(contextOptions) { const helper = this.createHelp(); if (helper.helpWidth === undefined) { - helper.helpWidth = (contextOptions && contextOptions.error) ? this._outputConfiguration.getErrHelpWidth() : this._outputConfiguration.getOutHelpWidth(); + helper.helpWidth = + contextOptions && contextOptions.error + ? this._outputConfiguration.getErrHelpWidth() + : this._outputConfiguration.getOutHelpWidth(); } return helper.formatHelp(this, helper); } @@ -46900,13 +47122,18 @@ Expecting one of '${allowedValues.join("', '")}'`); } const context = this._getHelpContext(contextOptions); - this._getCommandAndAncestors().reverse().forEach(command => command.emit('beforeAllHelp', context)); + this._getCommandAndAncestors() + .reverse() + .forEach((command) => command.emit('beforeAllHelp', context)); this.emit('beforeHelp', context); let helpInformation = this.helpInformation(context); if (deprecatedCallback) { helpInformation = deprecatedCallback(helpInformation); - if (typeof helpInformation !== 'string' && !Buffer.isBuffer(helpInformation)) { + if ( + typeof helpInformation !== 'string' && + !Buffer.isBuffer(helpInformation) + ) { throw new Error('outputHelp callback must return a string or a Buffer'); } } @@ -46916,7 +47143,9 @@ Expecting one of '${allowedValues.join("', '")}'`); this.emit(this._getHelpOption().long); // deprecated } this.emit('afterHelp', context); - this._getCommandAndAncestors().forEach(command => command.emit('afterAllHelp', context)); + this._getCommandAndAncestors().forEach((command) => + command.emit('afterAllHelp', context), + ); } /** @@ -46956,7 +47185,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Returns null if has been disabled with .helpOption(false). * * @returns {(Option | null)} the help option - * @package internal use only + * @package */ _getHelpOption() { // Lazy create help option on demand. @@ -46989,7 +47218,12 @@ Expecting one of '${allowedValues.join("', '")}'`); help(contextOptions) { this.outputHelp(contextOptions); let exitCode = process.exitCode || 0; - if (exitCode === 0 && contextOptions && typeof contextOptions !== 'function' && contextOptions.error) { + if ( + exitCode === 0 && + contextOptions && + typeof contextOptions !== 'function' && + contextOptions.error + ) { exitCode = 1; } // message: do not have all displayed text available so only passing placeholder. @@ -47037,7 +47271,7 @@ Expecting one of '${allowedValues.join("', '")}'`); _outputHelpIfRequested(args) { const helpOption = this._getHelpOption(); - const helpRequested = helpOption && args.find(arg => helpOption.is(arg)); + const helpRequested = helpOption && args.find((arg) => helpOption.is(arg)); if (helpRequested) { this.outputHelp(); // (Do not have all displayed text available so only passing placeholder.) @@ -47070,7 +47304,9 @@ function incrementNodeInspectorPort(args) { if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { // e.g. --inspect debugOption = match[1]; - } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { + } else if ( + (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null + ) { debugOption = match[1]; if (/^\d+$/.test(match[3])) { // e.g. --inspect=1234 @@ -47079,7 +47315,9 @@ function incrementNodeInspectorPort(args) { // e.g. --inspect=localhost debugHost = match[3]; } - } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { + } else if ( + (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null + ) { // e.g. --inspect=localhost:1234 debugOption = match[1]; debugHost = match[3]; @@ -47103,7 +47341,6 @@ exports.Command = Command; /** * CommanderError class - * @class */ class CommanderError extends Error { /** @@ -47111,7 +47348,6 @@ class CommanderError extends Error { * @param {number} exitCode suggested exit code which could be used with process.exit * @param {string} code an id string representing the error * @param {string} message human-readable description of the error - * @constructor */ constructor(exitCode, code, message) { super(message); @@ -47126,13 +47362,11 @@ class CommanderError extends Error { /** * InvalidArgumentError class - * @class */ class InvalidArgumentError extends CommanderError { /** * Constructs the InvalidArgumentError class * @param {string} [message] explanation of why argument is invalid - * @constructor */ constructor(message) { super(1, 'commander.invalidArgument', message); @@ -47178,14 +47412,14 @@ class Help { */ visibleCommands(cmd) { - const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden); + const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden); const helpCommand = cmd._getHelpCommand(); if (helpCommand && !helpCommand._hidden) { visibleCommands.push(helpCommand); } if (this.sortSubcommands) { visibleCommands.sort((a, b) => { - // @ts-ignore: overloaded return type + // @ts-ignore: because overloaded return type return a.name().localeCompare(b.name()); }); } @@ -47197,12 +47431,14 @@ class Help { * * @param {Option} a * @param {Option} b - * @returns number + * @returns {number} */ compareOptions(a, b) { const getSortKey = (option) => { // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated. - return option.short ? option.short.replace(/^-/, '') : option.long.replace(/^--/, ''); + return option.short + ? option.short.replace(/^-/, '') + : option.long.replace(/^--/, ''); }; return getSortKey(a).localeCompare(getSortKey(b)); } @@ -47225,9 +47461,13 @@ class Help { if (!removeShort && !removeLong) { visibleOptions.push(helpOption); // no changes needed } else if (helpOption.long && !removeLong) { - visibleOptions.push(cmd.createOption(helpOption.long, helpOption.description)); + visibleOptions.push( + cmd.createOption(helpOption.long, helpOption.description), + ); } else if (helpOption.short && !removeShort) { - visibleOptions.push(cmd.createOption(helpOption.short, helpOption.description)); + visibleOptions.push( + cmd.createOption(helpOption.short, helpOption.description), + ); } } if (this.sortOptions) { @@ -47247,8 +47487,14 @@ class Help { if (!this.showGlobalOptions) return []; const globalOptions = []; - for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) { - const visibleOptions = ancestorCmd.options.filter((option) => !option.hidden); + for ( + let ancestorCmd = cmd.parent; + ancestorCmd; + ancestorCmd = ancestorCmd.parent + ) { + const visibleOptions = ancestorCmd.options.filter( + (option) => !option.hidden, + ); globalOptions.push(...visibleOptions); } if (this.sortOptions) { @@ -47267,13 +47513,14 @@ class Help { visibleArguments(cmd) { // Side effect! Apply the legacy descriptions before the arguments are displayed. if (cmd._argsDescription) { - cmd.registeredArguments.forEach(argument => { - argument.description = argument.description || cmd._argsDescription[argument.name()] || ''; + cmd.registeredArguments.forEach((argument) => { + argument.description = + argument.description || cmd._argsDescription[argument.name()] || ''; }); } // If there are any arguments with a description then return all the arguments. - if (cmd.registeredArguments.find(argument => argument.description)) { + if (cmd.registeredArguments.find((argument) => argument.description)) { return cmd.registeredArguments; } return []; @@ -47288,11 +47535,15 @@ class Help { subcommandTerm(cmd) { // Legacy. Ignores custom usage string, and nested commands. - const args = cmd.registeredArguments.map(arg => humanReadableArgName(arg)).join(' '); - return cmd._name + + const args = cmd.registeredArguments + .map((arg) => humanReadableArgName(arg)) + .join(' '); + return ( + cmd._name + (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') + (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option - (args ? ' ' + args : ''); + (args ? ' ' + args : '') + ); } /** @@ -47387,7 +47638,11 @@ class Help { cmdName = cmdName + '|' + cmd._aliases[0]; } let ancestorCmdNames = ''; - for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) { + for ( + let ancestorCmd = cmd.parent; + ancestorCmd; + ancestorCmd = ancestorCmd.parent + ) { ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames; } return ancestorCmdNames + cmdName + ' ' + cmd.usage(); @@ -47401,7 +47656,7 @@ class Help { */ commandDescription(cmd) { - // @ts-ignore: overloaded return type + // @ts-ignore: because overloaded return type return cmd.description(); } @@ -47414,7 +47669,7 @@ class Help { */ subcommandDescription(cmd) { - // @ts-ignore: overloaded return type + // @ts-ignore: because overloaded return type return cmd.summary() || cmd.description(); } @@ -47431,15 +47686,20 @@ class Help { if (option.argChoices) { extraInfo.push( // use stringify to match the display of the default value - `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`); + `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`, + ); } if (option.defaultValue !== undefined) { // default for boolean and negated more for programmer than end user, // but show true/false for boolean option as may be for hand-rolled env or config processing. - const showDefault = option.required || option.optional || + const showDefault = + option.required || + option.optional || (option.isBoolean() && typeof option.defaultValue === 'boolean'); if (showDefault) { - extraInfo.push(`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`); + extraInfo.push( + `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`, + ); } } // preset for boolean and negated are more for programmer than end user @@ -47468,10 +47728,13 @@ class Help { if (argument.argChoices) { extraInfo.push( // use stringify to match the display of the default value - `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`); + `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`, + ); } if (argument.defaultValue !== undefined) { - extraInfo.push(`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`); + extraInfo.push( + `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`, + ); } if (extraInfo.length > 0) { const extraDescripton = `(${extraInfo.join(', ')})`; @@ -47499,7 +47762,11 @@ class Help { function formatItem(term, description) { if (description) { const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`; - return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth); + return helper.wrap( + fullText, + helpWidth - itemIndentWidth, + termWidth + itemSeparatorWidth, + ); } return term; } @@ -47513,12 +47780,18 @@ class Help { // Description const commandDescription = helper.commandDescription(cmd); if (commandDescription.length > 0) { - output = output.concat([helper.wrap(commandDescription, helpWidth, 0), '']); + output = output.concat([ + helper.wrap(commandDescription, helpWidth, 0), + '', + ]); } // Arguments const argumentList = helper.visibleArguments(cmd).map((argument) => { - return formatItem(helper.argumentTerm(argument), helper.argumentDescription(argument)); + return formatItem( + helper.argumentTerm(argument), + helper.argumentDescription(argument), + ); }); if (argumentList.length > 0) { output = output.concat(['Arguments:', formatList(argumentList), '']); @@ -47526,24 +47799,39 @@ class Help { // Options const optionList = helper.visibleOptions(cmd).map((option) => { - return formatItem(helper.optionTerm(option), helper.optionDescription(option)); + return formatItem( + helper.optionTerm(option), + helper.optionDescription(option), + ); }); if (optionList.length > 0) { output = output.concat(['Options:', formatList(optionList), '']); } if (this.showGlobalOptions) { - const globalOptionList = helper.visibleGlobalOptions(cmd).map((option) => { - return formatItem(helper.optionTerm(option), helper.optionDescription(option)); - }); + const globalOptionList = helper + .visibleGlobalOptions(cmd) + .map((option) => { + return formatItem( + helper.optionTerm(option), + helper.optionDescription(option), + ); + }); if (globalOptionList.length > 0) { - output = output.concat(['Global Options:', formatList(globalOptionList), '']); + output = output.concat([ + 'Global Options:', + formatList(globalOptionList), + '', + ]); } } // Commands const commandList = helper.visibleCommands(cmd).map((cmd) => { - return formatItem(helper.subcommandTerm(cmd), helper.subcommandDescription(cmd)); + return formatItem( + helper.subcommandTerm(cmd), + helper.subcommandDescription(cmd), + ); }); if (commandList.length > 0) { output = output.concat(['Commands:', formatList(commandList), '']); @@ -47565,7 +47853,7 @@ class Help { helper.longestOptionTermLength(cmd, helper), helper.longestGlobalOptionTermLength(cmd, helper), helper.longestSubcommandTermLength(cmd, helper), - helper.longestArgumentTermLength(cmd, helper) + helper.longestArgumentTermLength(cmd, helper), ); } @@ -47583,7 +47871,8 @@ class Help { wrap(str, width, indent, minColumnWidth = 40) { // Full \s characters, minus the linefeeds. - const indents = ' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff'; + const indents = + ' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff'; // Detect manually wrapped and indented strings by searching for line break followed by spaces. const manualIndent = new RegExp(`[\\n][${indents}]+`); if (str.match(manualIndent)) return str; @@ -47598,12 +47887,20 @@ class Help { const breaks = `\\s${zeroWidthSpace}`; // Match line end (so empty lines don't collapse), // or as much text as will fit in column, or excess text up to first break. - const regex = new RegExp(`\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, 'g'); + const regex = new RegExp( + `\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, + 'g', + ); const lines = columnText.match(regex) || []; - return leadingStr + lines.map((line, i) => { - if (line === '\n') return ''; // preserve empty lines - return ((i > 0) ? indentString : '') + line.trimEnd(); - }).join('\n'); + return ( + leadingStr + + lines + .map((line, i) => { + if (line === '\n') return ''; // preserve empty lines + return (i > 0 ? indentString : '') + line.trimEnd(); + }) + .join('\n') + ); } } @@ -47710,7 +48007,7 @@ class Option { * .addOption(new Option('--log', 'write logging information to file')) * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' })); * - * @param {Object} impliedOptionValues + * @param {object} impliedOptionValues * @return {Option} */ implies(impliedOptionValues) { @@ -47775,7 +48072,7 @@ class Option { } /** - * @package internal use only + * @package */ _concatValue(value, previous) { @@ -47797,7 +48094,9 @@ class Option { this.argChoices = values.slice(); this.parseArg = (arg, previous) => { if (!this.argChoices.includes(arg)) { - throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`); + throw new InvalidArgumentError( + `Allowed choices are ${this.argChoices.join(', ')}.`, + ); } if (this.variadic) { return this._concatValue(arg, previous); @@ -47836,7 +48135,7 @@ class Option { * * @param {string} arg * @return {boolean} - * @package internal use only + * @package */ is(arg) { @@ -47849,7 +48148,7 @@ class Option { * Options are one of boolean, negated, required argument, or optional argument. * * @return {boolean} - * @package internal use only + * @package */ isBoolean() { @@ -47872,7 +48171,7 @@ class DualOptions { this.positiveOptions = new Map(); this.negativeOptions = new Map(); this.dualOptions = new Set(); - options.forEach(option => { + options.forEach((option) => { if (option.negate) { this.negativeOptions.set(option.attributeName(), option); } else { @@ -47899,7 +48198,7 @@ class DualOptions { // Use the value to deduce if (probably) came from the option. const preset = this.negativeOptions.get(optionKey).presetArg; - const negativeValue = (preset !== undefined) ? preset : false; + const negativeValue = preset !== undefined ? preset : false; return option.negate === (negativeValue === value); } } @@ -47930,7 +48229,8 @@ function splitOptionFlags(flags) { // Use original very loose parsing to maintain backwards compatibility for now, // which allowed for example unintended `-sw, --short-word` [sic]. const flagParts = flags.split(/[ |,]+/); - if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift(); + if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) + shortFlag = flagParts.shift(); longFlag = flagParts.shift(); // Add support for lone short flag without significantly changing parsing! if (!shortFlag && /^-[^-]$/.test(longFlag)) { @@ -47957,7 +48257,8 @@ function editDistance(a, b) { // (Simple implementation.) // Quick early exit, return worst case. - if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length); + if (Math.abs(a.length - b.length) > maxDistance) + return Math.max(a.length, b.length); // distance between prefix substrings of a and b const d = []; @@ -47983,7 +48284,7 @@ function editDistance(a, b) { d[i][j] = Math.min( d[i - 1][j] + 1, // deletion d[i][j - 1] + 1, // insertion - d[i - 1][j - 1] + cost // substitution + d[i - 1][j - 1] + cost, // substitution ); // transposition if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { @@ -48011,7 +48312,7 @@ function suggestSimilar(word, candidates) { const searchingOptions = word.startsWith('--'); if (searchingOptions) { word = word.slice(2); - candidates = candidates.map(candidate => candidate.slice(2)); + candidates = candidates.map((candidate) => candidate.slice(2)); } let similar = []; @@ -48036,7 +48337,7 @@ function suggestSimilar(word, candidates) { similar.sort((a, b) => a.localeCompare(b)); if (searchingOptions) { - similar = similar.map(candidate => `--${candidate}`); + similar = similar.map((candidate) => `--${candidate}`); } if (similar.length > 1) { diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 0821227..6ec37d5 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -11439,7 +11439,7 @@ function buildValues(diff, lastComponent, newString, oldString, useLongestToken) /***/ }), -/***/ 1005: +/***/ 2081: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -12123,7 +12123,7 @@ _base = _interopRequireDefault(__nccwpck_require__(1653)) var /*istanbul ignore start*/ -_character = __nccwpck_require__(1005) +_character = __nccwpck_require__(2081) /*istanbul ignore end*/ ; @@ -15825,7 +15825,7 @@ var import_child_process, GitExecutorChain; var init_git_executor_chain = __esm({ "src/lib/runners/git-executor-chain.ts"() { "use strict"; - import_child_process = __nccwpck_require__(2081); + import_child_process = __nccwpck_require__(8493); init_git_error(); init_task(); init_utils(); @@ -42735,7 +42735,7 @@ module.exports = require("buffer"); /***/ }), -/***/ 2081: +/***/ 8493: /***/ ((module) => { "use strict"; @@ -42815,6 +42815,14 @@ module.exports = require("net"); /***/ }), +/***/ 7718: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:child_process"); + +/***/ }), + /***/ 5673: /***/ ((module) => { @@ -42823,6 +42831,30 @@ module.exports = require("node:events"); /***/ }), +/***/ 7561: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:fs"); + +/***/ }), + +/***/ 9411: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:path"); + +/***/ }), + +/***/ 7742: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:process"); + +/***/ }), + /***/ 4492: /***/ ((module) => { @@ -42863,14 +42895,6 @@ module.exports = require("perf_hooks"); /***/ }), -/***/ 7282: -/***/ ((module) => { - -"use strict"; -module.exports = require("process"); - -/***/ }), - /***/ 3477: /***/ ((module) => { @@ -44678,7 +44702,7 @@ class Argument { } /** - * @package internal use only + * @package */ _concatValue(value, previous) { @@ -44726,7 +44750,9 @@ class Argument { this.argChoices = values.slice(); this.parseArg = (arg, previous) => { if (!this.argChoices.includes(arg)) { - throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`); + throw new InvalidArgumentError( + `Allowed choices are ${this.argChoices.join(', ')}.`, + ); } if (this.variadic) { return this._concatValue(arg, previous); @@ -44738,6 +44764,8 @@ class Argument { /** * Make argument required. + * + * @returns {Argument} */ argRequired() { this.required = true; @@ -44746,6 +44774,8 @@ class Argument { /** * Make argument optional. + * + * @returns {Argument} */ argOptional() { this.required = false; @@ -44764,9 +44794,7 @@ class Argument { function humanReadableArgName(arg) { const nameOutput = arg.name() + (arg.variadic === true ? '...' : ''); - return arg.required - ? '<' + nameOutput + '>' - : '[' + nameOutput + ']'; + return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']'; } exports.Argument = Argument; @@ -44778,11 +44806,11 @@ exports.humanReadableArgName = humanReadableArgName; /***/ 552: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { -const EventEmitter = (__nccwpck_require__(2361).EventEmitter); -const childProcess = __nccwpck_require__(2081); -const path = __nccwpck_require__(1017); -const fs = __nccwpck_require__(7147); -const process = __nccwpck_require__(7282); +const EventEmitter = (__nccwpck_require__(5673).EventEmitter); +const childProcess = __nccwpck_require__(7718); +const path = __nccwpck_require__(9411); +const fs = __nccwpck_require__(7561); +const process = __nccwpck_require__(7742); const { Argument, humanReadableArgName } = __nccwpck_require__(9414); const { CommanderError } = __nccwpck_require__(2625); @@ -44840,9 +44868,11 @@ class Command extends EventEmitter { this._outputConfiguration = { writeOut: (str) => process.stdout.write(str), writeErr: (str) => process.stderr.write(str), - getOutHelpWidth: () => process.stdout.isTTY ? process.stdout.columns : undefined, - getErrHelpWidth: () => process.stderr.isTTY ? process.stderr.columns : undefined, - outputError: (str, write) => write(str) + getOutHelpWidth: () => + process.stdout.isTTY ? process.stdout.columns : undefined, + getErrHelpWidth: () => + process.stderr.isTTY ? process.stderr.columns : undefined, + outputError: (str, write) => write(str), }; this._hidden = false; @@ -44869,7 +44899,8 @@ class Command extends EventEmitter { this._helpConfiguration = sourceCommand._helpConfiguration; this._exitCallback = sourceCommand._exitCallback; this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties; - this._combineFlagAndOptionalValue = sourceCommand._combineFlagAndOptionalValue; + this._combineFlagAndOptionalValue = + sourceCommand._combineFlagAndOptionalValue; this._allowExcessArguments = sourceCommand._allowExcessArguments; this._enablePositionalOptions = sourceCommand._enablePositionalOptions; this._showHelpAfterError = sourceCommand._showHelpAfterError; @@ -44885,6 +44916,7 @@ class Command extends EventEmitter { _getCommandAndAncestors() { const result = []; + // eslint-disable-next-line @typescript-eslint/no-this-alias for (let command = this; command; command = command.parent) { result.push(command); } @@ -44911,8 +44943,8 @@ class Command extends EventEmitter { * .command('stop [service]', 'stop named service, or all if no name supplied'); * * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` - * @param {(Object|string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) - * @param {Object} [execOpts] - configuration options (for executable) + * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {object} [execOpts] - configuration options (for executable) * @return {Command} returns new command for action handler, or `this` for executable command */ @@ -44972,8 +45004,8 @@ class Command extends EventEmitter { * You can customise the help by overriding Help properties using configureHelp(), * or with a subclass of Help by overriding createHelp(). * - * @param {Object} [configuration] - configuration options - * @return {(Command|Object)} `this` command for chaining, or stored configuration + * @param {object} [configuration] - configuration options + * @return {(Command | object)} `this` command for chaining, or stored configuration */ configureHelp(configuration) { @@ -44998,8 +45030,8 @@ class Command extends EventEmitter { * // functions based on what is being written out * outputError(str, write) // used for displaying errors, and not used for displaying help * - * @param {Object} [configuration] - configuration options - * @return {(Command|Object)} `this` command for chaining, or stored configuration + * @param {object} [configuration] - configuration options + * @return {(Command | object)} `this` command for chaining, or stored configuration */ configureOutput(configuration) { @@ -45038,7 +45070,7 @@ class Command extends EventEmitter { * See .command() for creating an attached subcommand which inherits settings from its parent. * * @param {Command} cmd - new subcommand - * @param {Object} [opts] - configuration options + * @param {object} [opts] - configuration options * @return {Command} `this` command for chaining */ @@ -45114,9 +45146,12 @@ class Command extends EventEmitter { */ arguments(names) { - names.trim().split(/ +/).forEach((detail) => { - this.argument(detail); - }); + names + .trim() + .split(/ +/) + .forEach((detail) => { + this.argument(detail); + }); return this; } @@ -45129,10 +45164,18 @@ class Command extends EventEmitter { addArgument(argument) { const previousArgument = this.registeredArguments.slice(-1)[0]; if (previousArgument && previousArgument.variadic) { - throw new Error(`only the last argument can be variadic '${previousArgument.name()}'`); + throw new Error( + `only the last argument can be variadic '${previousArgument.name()}'`, + ); } - if (argument.required && argument.defaultValue !== undefined && argument.parseArg === undefined) { - throw new Error(`a default value for a required argument is never used: '${argument.name()}'`); + if ( + argument.required && + argument.defaultValue !== undefined && + argument.parseArg === undefined + ) { + throw new Error( + `a default value for a required argument is never used: '${argument.name()}'`, + ); } this.registeredArguments.push(argument); return this; @@ -45141,6 +45184,7 @@ class Command extends EventEmitter { /** * Customise or override default help command. By default a help command is automatically added if your command has subcommands. * + * @example * program.helpCommand('help [cmd]'); * program.helpCommand('help [cmd]', 'show help'); * program.helpCommand(false); // suppress default help command @@ -45199,8 +45243,11 @@ class Command extends EventEmitter { * @package */ _getHelpCommand() { - const hasImplicitHelpCommand = this._addImplicitHelpCommand ?? - (this.commands.length && !this._actionHandler && !this._findCommand('help')); + const hasImplicitHelpCommand = + this._addImplicitHelpCommand ?? + (this.commands.length && + !this._actionHandler && + !this._findCommand('help')); if (hasImplicitHelpCommand) { if (this._helpCommand === undefined) { @@ -45348,14 +45395,18 @@ Expecting one of '${allowedValues.join("', '")}'`); * Register option if no conflicts found, or throw on conflict. * * @param {Option} option - * @api private + * @private */ _registerOption(option) { - const matchingOption = (option.short && this._findOption(option.short)) || + const matchingOption = + (option.short && this._findOption(option.short)) || (option.long && this._findOption(option.long)); if (matchingOption) { - const matchingFlag = (option.long && this._findOption(option.long)) ? option.long : option.short; + const matchingFlag = + option.long && this._findOption(option.long) + ? option.long + : option.short; throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}' - already used by option '${matchingOption.flags}'`); } @@ -45368,7 +45419,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Register command if no conflicts found, or throw on conflict. * * @param {Command} command - * @api private + * @private */ _registerCommand(command) { @@ -45376,11 +45427,15 @@ Expecting one of '${allowedValues.join("', '")}'`); return [cmd.name()].concat(cmd.aliases()); }; - const alreadyUsed = knownBy(command).find((name) => this._findCommand(name)); + const alreadyUsed = knownBy(command).find((name) => + this._findCommand(name), + ); if (alreadyUsed) { const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|'); const newCmd = knownBy(command).join('|'); - throw new Error(`cannot add command '${newCmd}' as already have command '${existingCmd}'`); + throw new Error( + `cannot add command '${newCmd}' as already have command '${existingCmd}'`, + ); } this.commands.push(command); @@ -45403,7 +45458,11 @@ Expecting one of '${allowedValues.join("', '")}'`); // --no-foo is special and defaults foo to true, unless a --foo option is already defined const positiveLongFlag = option.long.replace(/^--no-/, '--'); if (!this._findOption(positiveLongFlag)) { - this.setOptionValueWithSource(name, option.defaultValue === undefined ? true : option.defaultValue, 'default'); + this.setOptionValueWithSource( + name, + option.defaultValue === undefined ? true : option.defaultValue, + 'default', + ); } } else if (option.defaultValue !== undefined) { this.setOptionValueWithSource(name, option.defaultValue, 'default'); @@ -45456,11 +45515,14 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Internal implementation shared by .option() and .requiredOption() * + * @return {Command} `this` command for chaining * @private */ _optionEx(config, flags, description, fn, defaultValue) { if (typeof flags === 'object' && flags instanceof Option) { - throw new Error('To add an Option object use addOption() instead of option() or requiredOption()'); + throw new Error( + 'To add an Option object use addOption() instead of option() or requiredOption()', + ); } const option = this.createOption(flags, description); option.makeOptionMandatory(!!config.mandatory); @@ -45508,20 +45570,26 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * Add a required option which must have a value after parsing. This usually means - * the option must be specified on the command line. (Otherwise the same as .option().) - * - * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. - * - * @param {string} flags - * @param {string} [description] - * @param {(Function|*)} [parseArg] - custom option processing function or default value - * @param {*} [defaultValue] - * @return {Command} `this` command for chaining - */ + * Add a required option which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. + * + * @param {string} flags + * @param {string} [description] + * @param {(Function|*)} [parseArg] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + */ requiredOption(flags, description, parseArg, defaultValue) { - return this._optionEx({ mandatory: true }, flags, description, parseArg, defaultValue); + return this._optionEx( + { mandatory: true }, + flags, + description, + parseArg, + defaultValue, + ); } /** @@ -45532,7 +45600,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` * - * @param {boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag. + * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag. + * @return {Command} `this` command for chaining */ combineFlagAndOptionalValue(combine = true) { this._combineFlagAndOptionalValue = !!combine; @@ -45542,8 +45611,8 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow unknown options on the command line. * - * @param {boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown - * for unknown options. + * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options. + * @return {Command} `this` command for chaining */ allowUnknownOption(allowUnknown = true) { this._allowUnknownOption = !!allowUnknown; @@ -45553,8 +45622,8 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Allow excess command-arguments on the command line. Pass false to make excess arguments an error. * - * @param {boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown - * for excess arguments. + * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments. + * @return {Command} `this` command for chaining */ allowExcessArguments(allowExcess = true) { this._allowExcessArguments = !!allowExcess; @@ -45566,7 +45635,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions. * The default behaviour is non-positional and global options may appear anywhere on the command line. * - * @param {boolean} [positional=true] + * @param {boolean} [positional] + * @return {Command} `this` command for chaining */ enablePositionalOptions(positional = true) { this._enablePositionalOptions = !!positional; @@ -45579,8 +45649,8 @@ Expecting one of '${allowedValues.join("', '")}'`); * positional options to have been enabled on the program (parent commands). * The default behaviour is non-positional and options may appear before or after command-arguments. * - * @param {boolean} [passThrough=true] - * for unknown options. + * @param {boolean} [passThrough] for unknown options. + * @return {Command} `this` command for chaining */ passThroughOptions(passThrough = true) { this._passThroughOptions = !!passThrough; @@ -45593,25 +45663,33 @@ Expecting one of '${allowedValues.join("', '")}'`); */ _checkForBrokenPassThrough() { - if (this.parent && this._passThroughOptions && !this.parent._enablePositionalOptions) { - throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`); + if ( + this.parent && + this._passThroughOptions && + !this.parent._enablePositionalOptions + ) { + throw new Error( + `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`, + ); } } /** - * Whether to store option values as properties on command object, - * or store separately (specify false). In both cases the option values can be accessed using .opts(). - * - * @param {boolean} [storeAsProperties=true] - * @return {Command} `this` command for chaining - */ + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @param {boolean} [storeAsProperties=true] + * @return {Command} `this` command for chaining + */ storeOptionsAsProperties(storeAsProperties = true) { if (this.options.length) { throw new Error('call .storeOptionsAsProperties() before adding options'); } if (Object.keys(this._optionValues).length) { - throw new Error('call .storeOptionsAsProperties() before setting option values'); + throw new Error( + 'call .storeOptionsAsProperties() before setting option values', + ); } this._storeOptionsAsProperties = !!storeAsProperties; return this; @@ -45621,7 +45699,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Retrieve option value. * * @param {string} key - * @return {Object} value + * @return {object} value */ getOptionValue(key) { @@ -45635,7 +45713,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Store option value. * * @param {string} key - * @param {Object} value + * @param {object} value * @return {Command} `this` command for chaining */ @@ -45644,13 +45722,13 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * Store option value and where the value came from. - * - * @param {string} key - * @param {Object} value - * @param {string} source - expected values are default/config/env/cli/implied - * @return {Command} `this` command for chaining - */ + * Store option value and where the value came from. + * + * @param {string} key + * @param {object} value + * @param {string} source - expected values are default/config/env/cli/implied + * @return {Command} `this` command for chaining + */ setOptionValueWithSource(key, value, source) { if (this._storeOptionsAsProperties) { @@ -45663,24 +45741,24 @@ Expecting one of '${allowedValues.join("', '")}'`); } /** - * Get source of option value. - * Expected values are default | config | env | cli | implied - * - * @param {string} key - * @return {string} - */ + * Get source of option value. + * Expected values are default | config | env | cli | implied + * + * @param {string} key + * @return {string} + */ getOptionValueSource(key) { return this._optionValueSources[key]; } /** - * Get source of option value. See also .optsWithGlobals(). - * Expected values are default | config | env | cli | implied - * - * @param {string} key - * @return {string} - */ + * Get source of option value. See also .optsWithGlobals(). + * Expected values are default | config | env | cli | implied + * + * @param {string} key + * @return {string} + */ getOptionValueSourceWithGlobals(key) { // global overwrites local, like optsWithGlobals @@ -45706,17 +45784,30 @@ Expecting one of '${allowedValues.join("', '")}'`); } parseOptions = parseOptions || {}; - // Default to using process.argv - if (argv === undefined) { - argv = process.argv; - // @ts-ignore: unknown property - if (process.versions && process.versions.electron) { + // auto-detect argument conventions if nothing supplied + if (argv === undefined && parseOptions.from === undefined) { + if (process.versions?.electron) { parseOptions.from = 'electron'; } + // check node specific options for scenarios where user CLI args follow executable without scriptname + const execArgv = process.execArgv ?? []; + if ( + execArgv.includes('-e') || + execArgv.includes('--eval') || + execArgv.includes('-p') || + execArgv.includes('--print') + ) { + parseOptions.from = 'eval'; // internal usage, not documented + } + } + + // default to using process.argv + if (argv === undefined) { + argv = process.argv; } this.rawArgs = argv.slice(); - // make it a little easier for callers by supporting various argv conventions + // extract the user args and scriptPath let userArgs; switch (parseOptions.from) { case undefined: @@ -45725,7 +45816,7 @@ Expecting one of '${allowedValues.join("', '")}'`); userArgs = argv.slice(2); break; case 'electron': - // @ts-ignore: unknown property + // @ts-ignore: because defaultApp is an unknown property if (process.defaultApp) { this._scriptPath = argv[1]; userArgs = argv.slice(2); @@ -45736,12 +45827,18 @@ Expecting one of '${allowedValues.join("', '")}'`); case 'user': userArgs = argv.slice(0); break; + case 'eval': + userArgs = argv.slice(1); + break; default: - throw new Error(`unexpected parse option { from: '${parseOptions.from}' }`); + throw new Error( + `unexpected parse option { from: '${parseOptions.from}' }`, + ); } // Find default name for program from arguments. - if (!this._name && this._scriptPath) this.nameFromFilename(this._scriptPath); + if (!this._name && this._scriptPath) + this.nameFromFilename(this._scriptPath); this._name = this._name || 'program'; return userArgs; @@ -45750,16 +45847,22 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Parse `argv`, setting options and invoking commands when defined. * - * The default expectation is that the arguments are from node and have the application as argv[0] - * and the script being run in argv[1], with user parameters after that. + * Use parseAsync instead of parse if any of your action handlers are async. + * + * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode! + * + * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`: + * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that + * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged + * - `'user'`: just user arguments * * @example - * program.parse(process.argv); - * program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parse(); // parse process.argv and auto-detect electron and special node flags + * program.parse(process.argv); // assume argv[0] is app and argv[1] is script * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] * * @param {string[]} [argv] - optional, defaults to process.argv - * @param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron + * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron' * @return {Command} `this` command for chaining */ @@ -45774,18 +45877,20 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Parse `argv`, setting options and invoking commands when defined. * - * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode! * - * The default expectation is that the arguments are from node and have the application as argv[0] - * and the script being run in argv[1], with user parameters after that. + * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`: + * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that + * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged + * - `'user'`: just user arguments * * @example - * await program.parseAsync(process.argv); - * await program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions + * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags + * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] * * @param {string[]} [argv] - * @param {Object} [parseOptions] + * @param {object} [parseOptions] * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron' * @return {Promise} */ @@ -45817,7 +45922,9 @@ Expecting one of '${allowedValues.join("', '")}'`); if (sourceExt.includes(path.extname(baseName))) return undefined; // Try all the extensions. - const foundExt = sourceExt.find(ext => fs.existsSync(`${localBin}${ext}`)); + const foundExt = sourceExt.find((ext) => + fs.existsSync(`${localBin}${ext}`), + ); if (foundExt) return `${localBin}${foundExt}`; return undefined; @@ -45828,7 +45935,8 @@ Expecting one of '${allowedValues.join("', '")}'`); this._checkForConflictingOptions(); // executableFile and executableDir might be full path, or just a name - let executableFile = subcommand._executableFile || `${this._name}-${subcommand._name}`; + let executableFile = + subcommand._executableFile || `${this._name}-${subcommand._name}`; let executableDir = this._executableDir || ''; if (this._scriptPath) { let resolvedScriptPath; // resolve possible symlink for installed npm binary @@ -45837,7 +45945,10 @@ Expecting one of '${allowedValues.join("', '")}'`); } catch (err) { resolvedScriptPath = this._scriptPath; } - executableDir = path.resolve(path.dirname(resolvedScriptPath), executableDir); + executableDir = path.resolve( + path.dirname(resolvedScriptPath), + executableDir, + ); } // Look for a local file in preference to a command in PATH. @@ -45846,9 +45957,15 @@ Expecting one of '${allowedValues.join("', '")}'`); // Legacy search using prefix of script name instead of command name if (!localFile && !subcommand._executableFile && this._scriptPath) { - const legacyName = path.basename(this._scriptPath, path.extname(this._scriptPath)); + const legacyName = path.basename( + this._scriptPath, + path.extname(this._scriptPath), + ); if (legacyName !== this._name) { - localFile = findFile(executableDir, `${legacyName}-${subcommand._name}`); + localFile = findFile( + executableDir, + `${legacyName}-${subcommand._name}`, + ); } } executableFile = localFile || executableFile; @@ -45874,12 +45991,13 @@ Expecting one of '${allowedValues.join("', '")}'`); proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' }); } - if (!proc.killed) { // testing mainly to avoid leak warnings during unit tests with mocked spawn + if (!proc.killed) { + // testing mainly to avoid leak warnings during unit tests with mocked spawn const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP']; signals.forEach((signal) => { - // @ts-ignore process.on(signal, () => { if (proc.killed === false && proc.exitCode === null) { + // @ts-ignore because signals not typed to known strings proc.kill(signal); } }); @@ -45888,16 +46006,22 @@ Expecting one of '${allowedValues.join("', '")}'`); // By default terminate process when spawned process terminates. const exitCallback = this._exitCallback; - proc.on('close', (code, _signal) => { + proc.on('close', (code) => { code = code ?? 1; // code is null if spawned process terminated due to a signal if (!exitCallback) { process.exit(code); } else { - exitCallback(new CommanderError(code, 'commander.executeSubCommandAsync', '(close)')); + exitCallback( + new CommanderError( + code, + 'commander.executeSubCommandAsync', + '(close)', + ), + ); } }); proc.on('error', (err) => { - // @ts-ignore + // @ts-ignore: because err.code is an unknown property if (err.code === 'ENOENT') { const executableDirMessage = executableDir ? `searched for local subcommand relative to directory '${executableDir}'` @@ -45907,14 +46031,18 @@ Expecting one of '${allowedValues.join("', '")}'`); - if the default executable name is not suitable, use the executableFile option to supply a custom name or path - ${executableDirMessage}`; throw new Error(executableMissing); - // @ts-ignore + // @ts-ignore: because err.code is an unknown property } else if (err.code === 'EACCES') { throw new Error(`'${executableFile}' not executable`); } if (!exitCallback) { process.exit(1); } else { - const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)'); + const wrappedError = new CommanderError( + 1, + 'commander.executeSubCommandAsync', + '(error)', + ); wrappedError.nestedError = err; exitCallback(wrappedError); } @@ -45933,7 +46061,11 @@ Expecting one of '${allowedValues.join("', '")}'`); if (!subCommand) this.help({ error: true }); let promiseChain; - promiseChain = this._chainOrCallSubCommandHook(promiseChain, subCommand, 'preSubcommand'); + promiseChain = this._chainOrCallSubCommandHook( + promiseChain, + subCommand, + 'preSubcommand', + ); promiseChain = this._chainOrCall(promiseChain, () => { if (subCommand._executableHandler) { this._executeSubCommand(subCommand, operands.concat(unknown)); @@ -45961,9 +46093,11 @@ Expecting one of '${allowedValues.join("', '")}'`); } // Fallback to parsing the help flag to invoke the help. - return this._dispatchSubcommand(subcommandName, [], [ - this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help' - ]); + return this._dispatchSubcommand( + subcommandName, + [], + [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'], + ); } /** @@ -45980,7 +46114,10 @@ Expecting one of '${allowedValues.join("', '")}'`); } }); // too many - if (this.registeredArguments.length > 0 && this.registeredArguments[this.registeredArguments.length - 1].variadic) { + if ( + this.registeredArguments.length > 0 && + this.registeredArguments[this.registeredArguments.length - 1].variadic + ) { return; } if (this.args.length > this.registeredArguments.length) { @@ -46000,7 +46137,12 @@ Expecting one of '${allowedValues.join("', '")}'`); let parsedValue = value; if (value !== null && argument.parseArg) { const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`; - parsedValue = this._callParseArg(argument, value, previous, invalidValueMessage); + parsedValue = this._callParseArg( + argument, + value, + previous, + invalidValueMessage, + ); } return parsedValue; }; @@ -46065,8 +46207,8 @@ Expecting one of '${allowedValues.join("', '")}'`); const hooks = []; this._getCommandAndAncestors() .reverse() - .filter(cmd => cmd._lifeCycleHooks[event] !== undefined) - .forEach(hookedCommand => { + .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined) + .forEach((hookedCommand) => { hookedCommand._lifeCycleHooks[event].forEach((callback) => { hooks.push({ hookedCommand, callback }); }); @@ -46122,14 +46264,26 @@ Expecting one of '${allowedValues.join("', '")}'`); if (operands && this._findCommand(operands[0])) { return this._dispatchSubcommand(operands[0], operands.slice(1), unknown); } - if (this._getHelpCommand() && operands[0] === this._getHelpCommand().name()) { + if ( + this._getHelpCommand() && + operands[0] === this._getHelpCommand().name() + ) { return this._dispatchHelpCommand(operands[1]); } if (this._defaultCommandName) { this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command - return this._dispatchSubcommand(this._defaultCommandName, operands, unknown); + return this._dispatchSubcommand( + this._defaultCommandName, + operands, + unknown, + ); } - if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { + if ( + this.commands.length && + this.args.length === 0 && + !this._actionHandler && + !this._defaultCommandName + ) { // probably missing subcommand and no handler, user needs help (and exit) this.help({ error: true }); } @@ -46152,7 +46306,9 @@ Expecting one of '${allowedValues.join("', '")}'`); let promiseChain; promiseChain = this._chainOrCallHooks(promiseChain, 'preAction'); - promiseChain = this._chainOrCall(promiseChain, () => this._actionHandler(this.processedArgs)); + promiseChain = this._chainOrCall(promiseChain, () => + this._actionHandler(this.processedArgs), + ); if (this.parent) { promiseChain = this._chainOrCall(promiseChain, () => { this.parent.emit(commandEvent, operands, unknown); // legacy @@ -46166,7 +46322,8 @@ Expecting one of '${allowedValues.join("', '")}'`); this._processArguments(); this.parent.emit(commandEvent, operands, unknown); // legacy } else if (operands.length) { - if (this._findCommand('*')) { // legacy default command + if (this._findCommand('*')) { + // legacy default command return this._dispatchSubcommand('*', operands, unknown); } if (this.listenerCount('command:*')) { @@ -46193,10 +46350,13 @@ Expecting one of '${allowedValues.join("', '")}'`); * Find matching command. * * @private + * @return {Command | undefined} */ _findCommand(name) { if (!name) return undefined; - return this.commands.find(cmd => cmd._name === name || cmd._aliases.includes(name)); + return this.commands.find( + (cmd) => cmd._name === name || cmd._aliases.includes(name), + ); } /** @@ -46204,11 +46364,11 @@ Expecting one of '${allowedValues.join("', '")}'`); * * @param {string} arg * @return {Option} - * @package internal use only + * @package */ _findOption(arg) { - return this.options.find(option => option.is(arg)); + return this.options.find((option) => option.is(arg)); } /** @@ -46222,7 +46382,10 @@ Expecting one of '${allowedValues.join("', '")}'`); // Walk up hierarchy so can call in subcommand after checking for displaying help. this._getCommandAndAncestors().forEach((cmd) => { cmd.options.forEach((anOption) => { - if (anOption.mandatory && (cmd.getOptionValue(anOption.attributeName()) === undefined)) { + if ( + anOption.mandatory && + cmd.getOptionValue(anOption.attributeName()) === undefined + ) { cmd.missingMandatoryOptionValue(anOption); } }); @@ -46235,23 +46398,21 @@ Expecting one of '${allowedValues.join("', '")}'`); * @private */ _checkForConflictingLocalOptions() { - const definedNonDefaultOptions = this.options.filter( - (option) => { - const optionKey = option.attributeName(); - if (this.getOptionValue(optionKey) === undefined) { - return false; - } - return this.getOptionValueSource(optionKey) !== 'default'; + const definedNonDefaultOptions = this.options.filter((option) => { + const optionKey = option.attributeName(); + if (this.getOptionValue(optionKey) === undefined) { + return false; } - ); + return this.getOptionValueSource(optionKey) !== 'default'; + }); const optionsWithConflicting = definedNonDefaultOptions.filter( - (option) => option.conflictsWith.length > 0 + (option) => option.conflictsWith.length > 0, ); optionsWithConflicting.forEach((option) => { const conflictingAndDefined = definedNonDefaultOptions.find((defined) => - option.conflictsWith.includes(defined.attributeName()) + option.conflictsWith.includes(defined.attributeName()), ); if (conflictingAndDefined) { this._conflictingOption(option, conflictingAndDefined); @@ -46331,7 +46492,8 @@ Expecting one of '${allowedValues.join("', '")}'`); value = args.shift(); } this.emit(`option:${option.name()}`, value); - } else { // boolean flag + } else { + // boolean flag this.emit(`option:${option.name()}`); } activeVariadicOption = option.variadic ? option : null; @@ -46343,7 +46505,10 @@ Expecting one of '${allowedValues.join("', '")}'`); if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') { const option = this._findOption(`-${arg[1]}`); if (option) { - if (option.required || (option.optional && this._combineFlagAndOptionalValue)) { + if ( + option.required || + (option.optional && this._combineFlagAndOptionalValue) + ) { // option with value following in same argument this.emit(`option:${option.name()}`, arg.slice(2)); } else { @@ -46374,12 +46539,19 @@ Expecting one of '${allowedValues.join("', '")}'`); } // If using positionalOptions, stop processing our options at subcommand. - if ((this._enablePositionalOptions || this._passThroughOptions) && operands.length === 0 && unknown.length === 0) { + if ( + (this._enablePositionalOptions || this._passThroughOptions) && + operands.length === 0 && + unknown.length === 0 + ) { if (this._findCommand(arg)) { operands.push(arg); if (args.length > 0) unknown.push(...args); break; - } else if (this._getHelpCommand() && arg === this._getHelpCommand().name()) { + } else if ( + this._getHelpCommand() && + arg === this._getHelpCommand().name() + ) { operands.push(arg); if (args.length > 0) operands.push(...args); break; @@ -46407,7 +46579,7 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Return an object containing local option values as key-value pairs. * - * @return {Object} + * @return {object} */ opts() { if (this._storeOptionsAsProperties) { @@ -46417,7 +46589,8 @@ Expecting one of '${allowedValues.join("', '")}'`); for (let i = 0; i < len; i++) { const key = this.options[i].attributeName(); - result[key] = key === this._versionOptionName ? this._version : this[key]; + result[key] = + key === this._versionOptionName ? this._version : this[key]; } return result; } @@ -46428,13 +46601,13 @@ Expecting one of '${allowedValues.join("', '")}'`); /** * Return an object containing merged local and global option values as key-value pairs. * - * @return {Object} + * @return {object} */ optsWithGlobals() { // globals overwrite locals return this._getCommandAndAncestors().reduce( (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()), - {} + {}, ); } @@ -46442,13 +46615,16 @@ Expecting one of '${allowedValues.join("', '")}'`); * Display error message and exit (or call exitOverride). * * @param {string} message - * @param {Object} [errorOptions] + * @param {object} [errorOptions] * @param {string} [errorOptions.code] - an id string representing the error * @param {number} [errorOptions.exitCode] - used with process.exit */ error(message, errorOptions) { // output handling - this._outputConfiguration.outputError(`${message}\n`, this._outputConfiguration.writeErr); + this._outputConfiguration.outputError( + `${message}\n`, + this._outputConfiguration.writeErr, + ); if (typeof this._showHelpAfterError === 'string') { this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`); } else if (this._showHelpAfterError) { @@ -46474,11 +46650,18 @@ Expecting one of '${allowedValues.join("', '")}'`); if (option.envVar && option.envVar in process.env) { const optionKey = option.attributeName(); // Priority check. Do not overwrite cli or options from unknown source (client-code). - if (this.getOptionValue(optionKey) === undefined || ['default', 'config', 'env'].includes(this.getOptionValueSource(optionKey))) { - if (option.required || option.optional) { // option can take a value + if ( + this.getOptionValue(optionKey) === undefined || + ['default', 'config', 'env'].includes( + this.getOptionValueSource(optionKey), + ) + ) { + if (option.required || option.optional) { + // option can take a value // keep very simple, optional always takes value this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]); - } else { // boolean + } else { + // boolean // keep very simple, only care that envVar defined and not the value this.emit(`optionEnv:${option.name()}`); } @@ -46495,17 +46678,30 @@ Expecting one of '${allowedValues.join("', '")}'`); _parseOptionsImplied() { const dualHelper = new DualOptions(this.options); const hasCustomOptionValue = (optionKey) => { - return this.getOptionValue(optionKey) !== undefined && !['default', 'implied'].includes(this.getOptionValueSource(optionKey)); + return ( + this.getOptionValue(optionKey) !== undefined && + !['default', 'implied'].includes(this.getOptionValueSource(optionKey)) + ); }; this.options - .filter(option => (option.implied !== undefined) && - hasCustomOptionValue(option.attributeName()) && - dualHelper.valueFromOption(this.getOptionValue(option.attributeName()), option)) + .filter( + (option) => + option.implied !== undefined && + hasCustomOptionValue(option.attributeName()) && + dualHelper.valueFromOption( + this.getOptionValue(option.attributeName()), + option, + ), + ) .forEach((option) => { Object.keys(option.implied) - .filter(impliedKey => !hasCustomOptionValue(impliedKey)) - .forEach(impliedKey => { - this.setOptionValueWithSource(impliedKey, option.implied[impliedKey], 'implied'); + .filter((impliedKey) => !hasCustomOptionValue(impliedKey)) + .forEach((impliedKey) => { + this.setOptionValueWithSource( + impliedKey, + option.implied[impliedKey], + 'implied', + ); }); }); } @@ -46559,12 +46755,18 @@ Expecting one of '${allowedValues.join("', '")}'`); const findBestOptionFromValue = (option) => { const optionKey = option.attributeName(); const optionValue = this.getOptionValue(optionKey); - const negativeOption = this.options.find(target => target.negate && optionKey === target.attributeName()); - const positiveOption = this.options.find(target => !target.negate && optionKey === target.attributeName()); - if (negativeOption && ( - (negativeOption.presetArg === undefined && optionValue === false) || - (negativeOption.presetArg !== undefined && optionValue === negativeOption.presetArg) - )) { + const negativeOption = this.options.find( + (target) => target.negate && optionKey === target.attributeName(), + ); + const positiveOption = this.options.find( + (target) => !target.negate && optionKey === target.attributeName(), + ); + if ( + negativeOption && + ((negativeOption.presetArg === undefined && optionValue === false) || + (negativeOption.presetArg !== undefined && + optionValue === negativeOption.presetArg)) + ) { return negativeOption; } return positiveOption || option; @@ -46598,11 +46800,14 @@ Expecting one of '${allowedValues.join("', '")}'`); if (flag.startsWith('--') && this._showSuggestionAfterError) { // Looping to pick up the global options too let candidateFlags = []; + // eslint-disable-next-line @typescript-eslint/no-this-alias let command = this; do { - const moreFlags = command.createHelp().visibleOptions(command) - .filter(option => option.long) - .map(option => option.long); + const moreFlags = command + .createHelp() + .visibleOptions(command) + .filter((option) => option.long) + .map((option) => option.long); candidateFlags = candidateFlags.concat(moreFlags); command = command.parent; } while (command && !command._enablePositionalOptions); @@ -46624,7 +46829,7 @@ Expecting one of '${allowedValues.join("', '")}'`); if (this._allowExcessArguments) return; const expected = this.registeredArguments.length; - const s = (expected === 1) ? '' : 's'; + const s = expected === 1 ? '' : 's'; const forSubcommand = this.parent ? ` for '${this.name()}'` : ''; const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`; this.error(message, { code: 'commander.excessArguments' }); @@ -46642,11 +46847,13 @@ Expecting one of '${allowedValues.join("', '")}'`); if (this._showSuggestionAfterError) { const candidateNames = []; - this.createHelp().visibleCommands(this).forEach((command) => { - candidateNames.push(command.name()); - // just visible alias - if (command.alias()) candidateNames.push(command.alias()); - }); + this.createHelp() + .visibleCommands(this) + .forEach((command) => { + candidateNames.push(command.name()); + // just visible alias + if (command.alias()) candidateNames.push(command.alias()); + }); suggestion = suggestSimilar(unknownName, candidateNames); } @@ -46687,11 +46894,12 @@ Expecting one of '${allowedValues.join("', '")}'`); * Set the description. * * @param {string} [str] - * @param {Object} [argsDescription] + * @param {object} [argsDescription] * @return {(string|Command)} */ description(str, argsDescription) { - if (str === undefined && argsDescription === undefined) return this._description; + if (str === undefined && argsDescription === undefined) + return this._description; this._description = str; if (argsDescription) { this._argsDescription = argsDescription; @@ -46724,18 +46932,27 @@ Expecting one of '${allowedValues.join("', '")}'`); if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility /** @type {Command} */ + // eslint-disable-next-line @typescript-eslint/no-this-alias let command = this; - if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) { + if ( + this.commands.length !== 0 && + this.commands[this.commands.length - 1]._executableHandler + ) { // assume adding alias for last added executable subcommand, rather than this command = this.commands[this.commands.length - 1]; } - if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); + if (alias === command._name) + throw new Error("Command alias can't be the same as its name"); const matchingCommand = this.parent?._findCommand(alias); if (matchingCommand) { // c.f. _registerCommand - const existingCmd = [matchingCommand.name()].concat(matchingCommand.aliases()).join('|'); - throw new Error(`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`); + const existingCmd = [matchingCommand.name()] + .concat(matchingCommand.aliases()) + .join('|'); + throw new Error( + `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`, + ); } command._aliases.push(alias); @@ -46773,11 +46990,13 @@ Expecting one of '${allowedValues.join("', '")}'`); const args = this.registeredArguments.map((arg) => { return humanReadableArgName(arg); }); - return [].concat( - (this.options.length || (this._helpOption !== null) ? '[options]' : []), - (this.commands.length ? '[command]' : []), - (this.registeredArguments.length ? args : []) - ).join(' '); + return [] + .concat( + this.options.length || this._helpOption !== null ? '[options]' : [], + this.commands.length ? '[command]' : [], + this.registeredArguments.length ? args : [], + ) + .join(' '); } this._usage = str; @@ -46844,7 +47063,10 @@ Expecting one of '${allowedValues.join("', '")}'`); helpInformation(contextOptions) { const helper = this.createHelp(); if (helper.helpWidth === undefined) { - helper.helpWidth = (contextOptions && contextOptions.error) ? this._outputConfiguration.getErrHelpWidth() : this._outputConfiguration.getOutHelpWidth(); + helper.helpWidth = + contextOptions && contextOptions.error + ? this._outputConfiguration.getErrHelpWidth() + : this._outputConfiguration.getOutHelpWidth(); } return helper.formatHelp(this, helper); } @@ -46883,13 +47105,18 @@ Expecting one of '${allowedValues.join("', '")}'`); } const context = this._getHelpContext(contextOptions); - this._getCommandAndAncestors().reverse().forEach(command => command.emit('beforeAllHelp', context)); + this._getCommandAndAncestors() + .reverse() + .forEach((command) => command.emit('beforeAllHelp', context)); this.emit('beforeHelp', context); let helpInformation = this.helpInformation(context); if (deprecatedCallback) { helpInformation = deprecatedCallback(helpInformation); - if (typeof helpInformation !== 'string' && !Buffer.isBuffer(helpInformation)) { + if ( + typeof helpInformation !== 'string' && + !Buffer.isBuffer(helpInformation) + ) { throw new Error('outputHelp callback must return a string or a Buffer'); } } @@ -46899,7 +47126,9 @@ Expecting one of '${allowedValues.join("', '")}'`); this.emit(this._getHelpOption().long); // deprecated } this.emit('afterHelp', context); - this._getCommandAndAncestors().forEach(command => command.emit('afterAllHelp', context)); + this._getCommandAndAncestors().forEach((command) => + command.emit('afterAllHelp', context), + ); } /** @@ -46939,7 +47168,7 @@ Expecting one of '${allowedValues.join("', '")}'`); * Returns null if has been disabled with .helpOption(false). * * @returns {(Option | null)} the help option - * @package internal use only + * @package */ _getHelpOption() { // Lazy create help option on demand. @@ -46972,7 +47201,12 @@ Expecting one of '${allowedValues.join("', '")}'`); help(contextOptions) { this.outputHelp(contextOptions); let exitCode = process.exitCode || 0; - if (exitCode === 0 && contextOptions && typeof contextOptions !== 'function' && contextOptions.error) { + if ( + exitCode === 0 && + contextOptions && + typeof contextOptions !== 'function' && + contextOptions.error + ) { exitCode = 1; } // message: do not have all displayed text available so only passing placeholder. @@ -47020,7 +47254,7 @@ Expecting one of '${allowedValues.join("', '")}'`); _outputHelpIfRequested(args) { const helpOption = this._getHelpOption(); - const helpRequested = helpOption && args.find(arg => helpOption.is(arg)); + const helpRequested = helpOption && args.find((arg) => helpOption.is(arg)); if (helpRequested) { this.outputHelp(); // (Do not have all displayed text available so only passing placeholder.) @@ -47053,7 +47287,9 @@ function incrementNodeInspectorPort(args) { if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { // e.g. --inspect debugOption = match[1]; - } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { + } else if ( + (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null + ) { debugOption = match[1]; if (/^\d+$/.test(match[3])) { // e.g. --inspect=1234 @@ -47062,7 +47298,9 @@ function incrementNodeInspectorPort(args) { // e.g. --inspect=localhost debugHost = match[3]; } - } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { + } else if ( + (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null + ) { // e.g. --inspect=localhost:1234 debugOption = match[1]; debugHost = match[3]; @@ -47086,7 +47324,6 @@ exports.Command = Command; /** * CommanderError class - * @class */ class CommanderError extends Error { /** @@ -47094,7 +47331,6 @@ class CommanderError extends Error { * @param {number} exitCode suggested exit code which could be used with process.exit * @param {string} code an id string representing the error * @param {string} message human-readable description of the error - * @constructor */ constructor(exitCode, code, message) { super(message); @@ -47109,13 +47345,11 @@ class CommanderError extends Error { /** * InvalidArgumentError class - * @class */ class InvalidArgumentError extends CommanderError { /** * Constructs the InvalidArgumentError class * @param {string} [message] explanation of why argument is invalid - * @constructor */ constructor(message) { super(1, 'commander.invalidArgument', message); @@ -47161,14 +47395,14 @@ class Help { */ visibleCommands(cmd) { - const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden); + const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden); const helpCommand = cmd._getHelpCommand(); if (helpCommand && !helpCommand._hidden) { visibleCommands.push(helpCommand); } if (this.sortSubcommands) { visibleCommands.sort((a, b) => { - // @ts-ignore: overloaded return type + // @ts-ignore: because overloaded return type return a.name().localeCompare(b.name()); }); } @@ -47180,12 +47414,14 @@ class Help { * * @param {Option} a * @param {Option} b - * @returns number + * @returns {number} */ compareOptions(a, b) { const getSortKey = (option) => { // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated. - return option.short ? option.short.replace(/^-/, '') : option.long.replace(/^--/, ''); + return option.short + ? option.short.replace(/^-/, '') + : option.long.replace(/^--/, ''); }; return getSortKey(a).localeCompare(getSortKey(b)); } @@ -47208,9 +47444,13 @@ class Help { if (!removeShort && !removeLong) { visibleOptions.push(helpOption); // no changes needed } else if (helpOption.long && !removeLong) { - visibleOptions.push(cmd.createOption(helpOption.long, helpOption.description)); + visibleOptions.push( + cmd.createOption(helpOption.long, helpOption.description), + ); } else if (helpOption.short && !removeShort) { - visibleOptions.push(cmd.createOption(helpOption.short, helpOption.description)); + visibleOptions.push( + cmd.createOption(helpOption.short, helpOption.description), + ); } } if (this.sortOptions) { @@ -47230,8 +47470,14 @@ class Help { if (!this.showGlobalOptions) return []; const globalOptions = []; - for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) { - const visibleOptions = ancestorCmd.options.filter((option) => !option.hidden); + for ( + let ancestorCmd = cmd.parent; + ancestorCmd; + ancestorCmd = ancestorCmd.parent + ) { + const visibleOptions = ancestorCmd.options.filter( + (option) => !option.hidden, + ); globalOptions.push(...visibleOptions); } if (this.sortOptions) { @@ -47250,13 +47496,14 @@ class Help { visibleArguments(cmd) { // Side effect! Apply the legacy descriptions before the arguments are displayed. if (cmd._argsDescription) { - cmd.registeredArguments.forEach(argument => { - argument.description = argument.description || cmd._argsDescription[argument.name()] || ''; + cmd.registeredArguments.forEach((argument) => { + argument.description = + argument.description || cmd._argsDescription[argument.name()] || ''; }); } // If there are any arguments with a description then return all the arguments. - if (cmd.registeredArguments.find(argument => argument.description)) { + if (cmd.registeredArguments.find((argument) => argument.description)) { return cmd.registeredArguments; } return []; @@ -47271,11 +47518,15 @@ class Help { subcommandTerm(cmd) { // Legacy. Ignores custom usage string, and nested commands. - const args = cmd.registeredArguments.map(arg => humanReadableArgName(arg)).join(' '); - return cmd._name + + const args = cmd.registeredArguments + .map((arg) => humanReadableArgName(arg)) + .join(' '); + return ( + cmd._name + (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') + (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option - (args ? ' ' + args : ''); + (args ? ' ' + args : '') + ); } /** @@ -47370,7 +47621,11 @@ class Help { cmdName = cmdName + '|' + cmd._aliases[0]; } let ancestorCmdNames = ''; - for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) { + for ( + let ancestorCmd = cmd.parent; + ancestorCmd; + ancestorCmd = ancestorCmd.parent + ) { ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames; } return ancestorCmdNames + cmdName + ' ' + cmd.usage(); @@ -47384,7 +47639,7 @@ class Help { */ commandDescription(cmd) { - // @ts-ignore: overloaded return type + // @ts-ignore: because overloaded return type return cmd.description(); } @@ -47397,7 +47652,7 @@ class Help { */ subcommandDescription(cmd) { - // @ts-ignore: overloaded return type + // @ts-ignore: because overloaded return type return cmd.summary() || cmd.description(); } @@ -47414,15 +47669,20 @@ class Help { if (option.argChoices) { extraInfo.push( // use stringify to match the display of the default value - `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`); + `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`, + ); } if (option.defaultValue !== undefined) { // default for boolean and negated more for programmer than end user, // but show true/false for boolean option as may be for hand-rolled env or config processing. - const showDefault = option.required || option.optional || + const showDefault = + option.required || + option.optional || (option.isBoolean() && typeof option.defaultValue === 'boolean'); if (showDefault) { - extraInfo.push(`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`); + extraInfo.push( + `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`, + ); } } // preset for boolean and negated are more for programmer than end user @@ -47451,10 +47711,13 @@ class Help { if (argument.argChoices) { extraInfo.push( // use stringify to match the display of the default value - `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`); + `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`, + ); } if (argument.defaultValue !== undefined) { - extraInfo.push(`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`); + extraInfo.push( + `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`, + ); } if (extraInfo.length > 0) { const extraDescripton = `(${extraInfo.join(', ')})`; @@ -47482,7 +47745,11 @@ class Help { function formatItem(term, description) { if (description) { const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`; - return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth); + return helper.wrap( + fullText, + helpWidth - itemIndentWidth, + termWidth + itemSeparatorWidth, + ); } return term; } @@ -47496,12 +47763,18 @@ class Help { // Description const commandDescription = helper.commandDescription(cmd); if (commandDescription.length > 0) { - output = output.concat([helper.wrap(commandDescription, helpWidth, 0), '']); + output = output.concat([ + helper.wrap(commandDescription, helpWidth, 0), + '', + ]); } // Arguments const argumentList = helper.visibleArguments(cmd).map((argument) => { - return formatItem(helper.argumentTerm(argument), helper.argumentDescription(argument)); + return formatItem( + helper.argumentTerm(argument), + helper.argumentDescription(argument), + ); }); if (argumentList.length > 0) { output = output.concat(['Arguments:', formatList(argumentList), '']); @@ -47509,24 +47782,39 @@ class Help { // Options const optionList = helper.visibleOptions(cmd).map((option) => { - return formatItem(helper.optionTerm(option), helper.optionDescription(option)); + return formatItem( + helper.optionTerm(option), + helper.optionDescription(option), + ); }); if (optionList.length > 0) { output = output.concat(['Options:', formatList(optionList), '']); } if (this.showGlobalOptions) { - const globalOptionList = helper.visibleGlobalOptions(cmd).map((option) => { - return formatItem(helper.optionTerm(option), helper.optionDescription(option)); - }); + const globalOptionList = helper + .visibleGlobalOptions(cmd) + .map((option) => { + return formatItem( + helper.optionTerm(option), + helper.optionDescription(option), + ); + }); if (globalOptionList.length > 0) { - output = output.concat(['Global Options:', formatList(globalOptionList), '']); + output = output.concat([ + 'Global Options:', + formatList(globalOptionList), + '', + ]); } } // Commands const commandList = helper.visibleCommands(cmd).map((cmd) => { - return formatItem(helper.subcommandTerm(cmd), helper.subcommandDescription(cmd)); + return formatItem( + helper.subcommandTerm(cmd), + helper.subcommandDescription(cmd), + ); }); if (commandList.length > 0) { output = output.concat(['Commands:', formatList(commandList), '']); @@ -47548,7 +47836,7 @@ class Help { helper.longestOptionTermLength(cmd, helper), helper.longestGlobalOptionTermLength(cmd, helper), helper.longestSubcommandTermLength(cmd, helper), - helper.longestArgumentTermLength(cmd, helper) + helper.longestArgumentTermLength(cmd, helper), ); } @@ -47566,7 +47854,8 @@ class Help { wrap(str, width, indent, minColumnWidth = 40) { // Full \s characters, minus the linefeeds. - const indents = ' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff'; + const indents = + ' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff'; // Detect manually wrapped and indented strings by searching for line break followed by spaces. const manualIndent = new RegExp(`[\\n][${indents}]+`); if (str.match(manualIndent)) return str; @@ -47581,12 +47870,20 @@ class Help { const breaks = `\\s${zeroWidthSpace}`; // Match line end (so empty lines don't collapse), // or as much text as will fit in column, or excess text up to first break. - const regex = new RegExp(`\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, 'g'); + const regex = new RegExp( + `\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, + 'g', + ); const lines = columnText.match(regex) || []; - return leadingStr + lines.map((line, i) => { - if (line === '\n') return ''; // preserve empty lines - return ((i > 0) ? indentString : '') + line.trimEnd(); - }).join('\n'); + return ( + leadingStr + + lines + .map((line, i) => { + if (line === '\n') return ''; // preserve empty lines + return (i > 0 ? indentString : '') + line.trimEnd(); + }) + .join('\n') + ); } } @@ -47693,7 +47990,7 @@ class Option { * .addOption(new Option('--log', 'write logging information to file')) * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' })); * - * @param {Object} impliedOptionValues + * @param {object} impliedOptionValues * @return {Option} */ implies(impliedOptionValues) { @@ -47758,7 +48055,7 @@ class Option { } /** - * @package internal use only + * @package */ _concatValue(value, previous) { @@ -47780,7 +48077,9 @@ class Option { this.argChoices = values.slice(); this.parseArg = (arg, previous) => { if (!this.argChoices.includes(arg)) { - throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`); + throw new InvalidArgumentError( + `Allowed choices are ${this.argChoices.join(', ')}.`, + ); } if (this.variadic) { return this._concatValue(arg, previous); @@ -47819,7 +48118,7 @@ class Option { * * @param {string} arg * @return {boolean} - * @package internal use only + * @package */ is(arg) { @@ -47832,7 +48131,7 @@ class Option { * Options are one of boolean, negated, required argument, or optional argument. * * @return {boolean} - * @package internal use only + * @package */ isBoolean() { @@ -47855,7 +48154,7 @@ class DualOptions { this.positiveOptions = new Map(); this.negativeOptions = new Map(); this.dualOptions = new Set(); - options.forEach(option => { + options.forEach((option) => { if (option.negate) { this.negativeOptions.set(option.attributeName(), option); } else { @@ -47882,7 +48181,7 @@ class DualOptions { // Use the value to deduce if (probably) came from the option. const preset = this.negativeOptions.get(optionKey).presetArg; - const negativeValue = (preset !== undefined) ? preset : false; + const negativeValue = preset !== undefined ? preset : false; return option.negate === (negativeValue === value); } } @@ -47913,7 +48212,8 @@ function splitOptionFlags(flags) { // Use original very loose parsing to maintain backwards compatibility for now, // which allowed for example unintended `-sw, --short-word` [sic]. const flagParts = flags.split(/[ |,]+/); - if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift(); + if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) + shortFlag = flagParts.shift(); longFlag = flagParts.shift(); // Add support for lone short flag without significantly changing parsing! if (!shortFlag && /^-[^-]$/.test(longFlag)) { @@ -47940,7 +48240,8 @@ function editDistance(a, b) { // (Simple implementation.) // Quick early exit, return worst case. - if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length); + if (Math.abs(a.length - b.length) > maxDistance) + return Math.max(a.length, b.length); // distance between prefix substrings of a and b const d = []; @@ -47966,7 +48267,7 @@ function editDistance(a, b) { d[i][j] = Math.min( d[i - 1][j] + 1, // deletion d[i][j - 1] + 1, // insertion - d[i - 1][j - 1] + cost // substitution + d[i - 1][j - 1] + cost, // substitution ); // transposition if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { @@ -47994,7 +48295,7 @@ function suggestSimilar(word, candidates) { const searchingOptions = word.startsWith('--'); if (searchingOptions) { word = word.slice(2); - candidates = candidates.map(candidate => candidate.slice(2)); + candidates = candidates.map((candidate) => candidate.slice(2)); } let similar = []; @@ -48019,7 +48320,7 @@ function suggestSimilar(word, candidates) { similar.sort((a, b) => a.localeCompare(b)); if (searchingOptions) { - similar = similar.map(candidate => `--${candidate}`); + similar = similar.map((candidate) => `--${candidate}`); } if (similar.length > 1) { diff --git a/package-lock.json b/package-lock.json index 01d2dda..bbb4666 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2421,9 +2421,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "engines": { "node": ">=18" } diff --git a/src/datasources.ts b/src/datasources.ts index a3734db..3b55f7b 100644 --- a/src/datasources.ts +++ b/src/datasources.ts @@ -112,7 +112,7 @@ export class GitHubSource implements IDataSource { return Buffer.from(config.content, "base64").toString(); } catch (error: unknown) { if (error instanceof RequestError && error.response) { - const reponseData = error.response.data as Record + const reponseData = error.response.data as Record; if ("message" in reponseData && reponseData.message === "Not Found") { return undefined; } From cff98c4f9d47999a229e1333d609f36b0e3189d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 02:58:50 +0000 Subject: [PATCH 25/25] chore(deps): bump @dev-build-deploy/commit-it from 2.3.0 to 2.3.1 Bumps [@dev-build-deploy/commit-it](https://github.com/dev-build-deploy/commit-it) from 2.3.0 to 2.3.1. - [Release notes](https://github.com/dev-build-deploy/commit-it/releases) - [Commits](https://github.com/dev-build-deploy/commit-it/compare/2.3.0...2.3.1) --- updated-dependencies: - dependency-name: "@dev-build-deploy/commit-it" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- lib/action/index.js | 8 ++++---- lib/cli/index.js | 8 ++++---- lib/precommit/index.js | 8 ++++---- package-lock.json | 6 +++--- src/datasources.ts | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/action/index.js b/lib/action/index.js index 9a1434a..cfe6c75 100644 --- a/lib/action/index.js +++ b/lib/action/index.js @@ -2250,9 +2250,9 @@ exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; * @returns True if the subject is a common merge pattern, false otherwise */ function subjectIsMergePattern(subject) { - const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; - const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; - const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?(.*?)'? into '?(.*?)'?$/; + const githubMergeRegex = /^Merge pull request #(\d+) from '?([a-zA-Z0-9_./-]+)'?$/; + const bitbucketMergeRegex = /^Merged in '?([a-zA-Z0-9_./-]+)'? \(pull request #(\d+)\)$/; + const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?([a-zA-Z0-9_./-]+)'?? into '?([a-zA-Z0-9_./-]+)'?$/; return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); } /** @@ -42423,8 +42423,8 @@ const assert_1 = __importDefault(__nccwpck_require__(9491)); const fs = __importStar(__nccwpck_require__(7147)); const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); -const request_error_1 = __nccwpck_require__(537); const commit_it_1 = __nccwpck_require__(9403); +const request_error_1 = __nccwpck_require__(537); const simple_git_1 = __nccwpck_require__(9103); /** * File data source for parsing a file containing the commit message. diff --git a/lib/cli/index.js b/lib/cli/index.js index 669367c..e991dd0 100755 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -2251,9 +2251,9 @@ exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; * @returns True if the subject is a common merge pattern, false otherwise */ function subjectIsMergePattern(subject) { - const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; - const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; - const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?(.*?)'? into '?(.*?)'?$/; + const githubMergeRegex = /^Merge pull request #(\d+) from '?([a-zA-Z0-9_./-]+)'?$/; + const bitbucketMergeRegex = /^Merged in '?([a-zA-Z0-9_./-]+)'? \(pull request #(\d+)\)$/; + const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?([a-zA-Z0-9_./-]+)'?? into '?([a-zA-Z0-9_./-]+)'?$/; return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); } /** @@ -42424,8 +42424,8 @@ const assert_1 = __importDefault(__nccwpck_require__(9491)); const fs = __importStar(__nccwpck_require__(7147)); const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); -const request_error_1 = __nccwpck_require__(537); const commit_it_1 = __nccwpck_require__(9403); +const request_error_1 = __nccwpck_require__(537); const simple_git_1 = __nccwpck_require__(9103); /** * File data source for parsing a file containing the commit message. diff --git a/lib/precommit/index.js b/lib/precommit/index.js index 6ec37d5..ceff0d9 100755 --- a/lib/precommit/index.js +++ b/lib/precommit/index.js @@ -2251,9 +2251,9 @@ exports.getFooterElementsFromParagraph = getFooterElementsFromParagraph; * @returns True if the subject is a common merge pattern, false otherwise */ function subjectIsMergePattern(subject) { - const githubMergeRegex = /^Merge pull request #(\d+) from '?(.*)'?$/; - const bitbucketMergeRegex = /^Merged in '?(.*)'? \(pull request #(\d+)\)$/; - const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?(.*?)'? into '?(.*?)'?$/; + const githubMergeRegex = /^Merge pull request #(\d+) from '?([a-zA-Z0-9_./-]+)'?$/; + const bitbucketMergeRegex = /^Merged in '?([a-zA-Z0-9_./-]+)'? \(pull request #(\d+)\)$/; + const gitlabMergeRegex = /^Merge( remote-tracking)? branch '?([a-zA-Z0-9_./-]+)'?? into '?([a-zA-Z0-9_./-]+)'?$/; return githubMergeRegex.test(subject) || bitbucketMergeRegex.test(subject) || gitlabMergeRegex.test(subject); } /** @@ -42424,8 +42424,8 @@ const assert_1 = __importDefault(__nccwpck_require__(9491)); const fs = __importStar(__nccwpck_require__(7147)); const core = __importStar(__nccwpck_require__(2186)); const github = __importStar(__nccwpck_require__(5438)); -const request_error_1 = __nccwpck_require__(537); const commit_it_1 = __nccwpck_require__(9403); +const request_error_1 = __nccwpck_require__(537); const simple_git_1 = __nccwpck_require__(9103); /** * File data source for parsing a file containing the commit message. diff --git a/package-lock.json b/package-lock.json index bbb4666..aeeb7f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -673,9 +673,9 @@ "dev": true }, "node_modules/@dev-build-deploy/commit-it": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.3.0.tgz", - "integrity": "sha512-LZiPqr9y41hFKWH+WUhPQqXv1l9CzL5mAXyR1gJ2H0sylkC0ggD1WX/hWvxdRF4L7vqBftQSmr39RYI+Ff2q7g==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@dev-build-deploy/commit-it/-/commit-it-2.3.1.tgz", + "integrity": "sha512-fwLS2Y4yIJGsw2A/x/Zdxc45NNX+Yp1lmbt+d54qdr1ssOZOtu4QCQe3L//FZRyERC8HoUuKK5iefH+ZzgYpmw==", "dependencies": { "@dev-build-deploy/diagnose-it": "^1", "chalk": "<5" diff --git a/src/datasources.ts b/src/datasources.ts index 3b55f7b..fb3600b 100644 --- a/src/datasources.ts +++ b/src/datasources.ts @@ -8,8 +8,8 @@ import * as fs from "fs"; import * as core from "@actions/core"; import * as github from "@actions/github"; -import { RequestError } from "@octokit/request-error"; import { Commit } from "@dev-build-deploy/commit-it"; +import { RequestError } from "@octokit/request-error"; import { simpleGit } from "simple-git"; /** DataSource abstraction interface