gitlab-ci-local
Version:
Tired of pushing to test your .gitlab-ci.yml?
114 lines • 17.2 kB
JavaScript
// adapted from https://github.com/apideck-libraries/better-ajv-errors (MIT)
// https://github.com/apideck-libraries/better-ajv-errors/tree/026206038919c1fb73b4e8ef258a2e4a01813c4a
import pointer from "jsonpointer";
const QUOTES_REGEX = /"/g;
const NOT_REGEX = /NOT/g;
const SLASH_REGEX = /\//g;
const AJV_ERROR_KEYWORD_WEIGHT_MAP = { enum: 1, type: 0 };
const pointerToDotNotation = (pointer) => {
return pointer.replace(SLASH_REGEX, ".");
};
const cleanAjvMessage = (message) => {
return message.replace(QUOTES_REGEX, "'").replace(NOT_REGEX, "not");
};
const getLastSegment = (path) => {
const segments = path.split("/");
return segments.pop();
};
const safeJsonPointer = ({ object, pnter, fallback }) => {
try {
return pointer.get(object, pnter) ?? fallback;
}
catch {
return fallback;
}
};
const filterSingleErrorPerProperty = (errors) => {
const errorsPerProperty = {};
errors.forEach(error => {
const prop = error.instancePath + (error.params?.additionalProperty ?? error.params?.missingProperty ?? "");
const existingError = errorsPerProperty[prop];
if (!existingError) {
errorsPerProperty[prop] = error;
return errorsPerProperty;
}
const weight = AJV_ERROR_KEYWORD_WEIGHT_MAP[error.keyword] ?? 0;
const existingWeight = AJV_ERROR_KEYWORD_WEIGHT_MAP[existingError.keyword] ?? 0;
if (weight > existingWeight) {
errorsPerProperty[prop] = error;
}
});
return Object.values(errorsPerProperty);
};
export const betterAjvErrors = ({ errors, data, basePath = "", }) => {
if (!Array.isArray(errors) || !errors?.length) {
return [];
}
const definedErrors = filterSingleErrorPerProperty(errors);
return definedErrors.map((error) => {
const path = basePath ? pointerToDotNotation(basePath + error.instancePath) : pointerToDotNotation(error.instancePath).substring(1);
const prop = getLastSegment(error.instancePath);
const schemaPath = error.schemaPath;
const propertyMessage = prop ? `property '${prop}'` : path;
const defaultMessage = `${propertyMessage} ${(cleanAjvMessage(error.message))}`;
let validationError;
switch (error.keyword) {
case "additionalProperties": {
const additionalProp = error.params.additionalProperty;
validationError = {
message: `'${additionalProp}' property is not expected to be here`,
path,
schemaPath,
};
break;
}
case "enum": {
const allowedValues = error.params.allowedValues.map((value) => value.toString());
const prop = getLastSegment(error.instancePath);
const value = safeJsonPointer({ object: data, pnter: error.instancePath, fallback: "" });
validationError = {
message: `'${prop}' property must be one of [${allowedValues.join(", ")}] (found ${value})`,
path,
schemaPath,
};
break;
}
case "type": {
const prop = getLastSegment(error.instancePath);
const type = error.params.type;
validationError = {
message: `'${prop}' property type must be ${type}`,
path,
schemaPath,
};
break;
}
case "required": {
validationError = {
message: `${path} must have required property '${error.params.missingProperty}'`,
path,
schemaPath,
};
break;
}
case "const": {
return {
message: `'${prop}' property must be equal to the allowed value`,
path,
schemaPath,
};
}
default:
validationError = { message: defaultMessage, path, schemaPath };
}
// Remove empty properties
const errorEntries = Object.entries(validationError);
for (const [key, value] of errorEntries) {
if (value === null || value === undefined || value === "") {
delete validationError[key];
}
}
return validationError;
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSx1R0FBdUc7QUFHdkcsT0FBTyxPQUFPLE1BQU0sYUFBYSxDQUFDO0FBUWxDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDekIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBRTFCLE1BQU0sNEJBQTRCLEdBQXFELEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUM7QUFFMUcsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFO0lBQ3JELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQVUsRUFBRTtJQUNoRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBWSxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUksRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBNEMsRUFBSyxFQUFFO0lBQ25HLElBQUksQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDO0lBQ2xELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDTCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE1BQXNCLEVBQWtCLEVBQUU7SUFDNUUsTUFBTSxpQkFBaUIsR0FBaUMsRUFBRSxDQUFDO0lBQzNELE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEdBQ04sS0FBSyxDQUFDLFlBQVksR0FBRyxDQUFFLEtBQUssQ0FBQyxNQUFjLEVBQUUsa0JBQWtCLElBQUssS0FBSyxDQUFDLE1BQWMsRUFBRSxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckgsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2pCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNoQyxPQUFPLGlCQUFpQixDQUFDO1FBQzdCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEYsSUFBSSxNQUFNLEdBQUcsY0FBYyxFQUFFLENBQUM7WUFDMUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQVFGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEVBQzVCLE1BQU0sRUFDTixJQUFJLEVBQ0osUUFBUSxHQUFHLEVBQUUsR0FDUSxFQUFxQixFQUFFO0lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzVDLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLDRCQUE0QixDQUFDLE1BQXdCLENBQUMsQ0FBQztJQUU3RSxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMvQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEksTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3BDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNELE1BQU0sY0FBYyxHQUFHLEdBQUcsZUFBZSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxPQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTFGLElBQUksZUFBZ0MsQ0FBQztRQUVyQyxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDdkQsZUFBZSxHQUFHO29CQUNkLE9BQU8sRUFBRSxJQUFJLGNBQWMsdUNBQXVDO29CQUNsRSxJQUFJO29CQUNKLFVBQVU7aUJBQ2IsQ0FBQztnQkFDRixNQUFNO1lBQ1YsQ0FBQztZQUNELEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDVixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDO2dCQUN2RixlQUFlLEdBQUc7b0JBQ2QsT0FBTyxFQUFFLElBQUksSUFBSSw4QkFBOEIsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLEdBQUc7b0JBQzNGLElBQUk7b0JBQ0osVUFBVTtpQkFDYixDQUFDO2dCQUNGLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNWLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMvQixlQUFlLEdBQUc7b0JBQ2QsT0FBTyxFQUFFLElBQUksSUFBSSwyQkFBMkIsSUFBSSxFQUFFO29CQUNsRCxJQUFJO29CQUNKLFVBQVU7aUJBQ2IsQ0FBQztnQkFDRixNQUFNO1lBQ1YsQ0FBQztZQUNELEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDZCxlQUFlLEdBQUc7b0JBQ2QsT0FBTyxFQUFFLEdBQUcsSUFBSSxpQ0FBaUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUc7b0JBQ2hGLElBQUk7b0JBQ0osVUFBVTtpQkFDYixDQUFDO2dCQUNGLE1BQU07WUFDVixDQUFDO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNYLE9BQU87b0JBQ0gsT0FBTyxFQUFFLElBQUksSUFBSSwrQ0FBK0M7b0JBQ2hFLElBQUk7b0JBQ0osVUFBVTtpQkFDYixDQUFDO1lBQ04sQ0FBQztZQUVEO2dCQUNJLGVBQWUsR0FBRyxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksWUFBa0QsRUFBRSxDQUFDO1lBQzVFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDeEQsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXBpZGVjay1saWJyYXJpZXMvYmV0dGVyLWFqdi1lcnJvcnMgKE1JVClcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGlkZWNrLWxpYnJhcmllcy9iZXR0ZXItYWp2LWVycm9ycy90cmVlLzAyNjIwNjAzODkxOWMxZmI3M2I0ZThlZjI1OGEyZTRhMDE4MTNjNGFcblxuaW1wb3J0IHtEZWZpbmVkRXJyb3IsIEVycm9yT2JqZWN0fSBmcm9tIFwiYWp2XCI7XG5pbXBvcnQgcG9pbnRlciBmcm9tIFwianNvbnBvaW50ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgc2NoZW1hUGF0aDogc3RyaW5nO1xufVxuXG5jb25zdCBRVU9URVNfUkVHRVggPSAvXCIvZztcbmNvbnN0IE5PVF9SRUdFWCA9IC9OT1QvZztcbmNvbnN0IFNMQVNIX1JFR0VYID0gL1xcLy9nO1xuXG5jb25zdCBBSlZfRVJST1JfS0VZV09SRF9XRUlHSFRfTUFQOiBQYXJ0aWFsPFJlY29yZDxEZWZpbmVkRXJyb3JbXCJrZXl3b3JkXCJdLCBudW1iZXI+PiA9IHtlbnVtOiAxLCB0eXBlOiAwfTtcblxuY29uc3QgcG9pbnRlclRvRG90Tm90YXRpb24gPSAocG9pbnRlcjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gcG9pbnRlci5yZXBsYWNlKFNMQVNIX1JFR0VYLCBcIi5cIik7XG59O1xuXG5jb25zdCBjbGVhbkFqdk1lc3NhZ2UgPSAobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKFFVT1RFU19SRUdFWCwgXCInXCIpLnJlcGxhY2UoTk9UX1JFR0VYLCBcIm5vdFwiKTtcbn07XG5cbmNvbnN0IGdldExhc3RTZWdtZW50ID0gKHBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgICByZXR1cm4gc2VnbWVudHMucG9wKCkgYXMgc3RyaW5nO1xufTtcblxuY29uc3Qgc2FmZUpzb25Qb2ludGVyID0gPFQ+KHtvYmplY3QsIHBudGVyLCBmYWxsYmFja306IHtvYmplY3Q6IGFueTsgcG50ZXI6IHN0cmluZzsgZmFsbGJhY2s6IFR9KTogVCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBvaW50ZXIuZ2V0KG9iamVjdCwgcG50ZXIpID8/IGZhbGxiYWNrO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgfVxufTtcblxuY29uc3QgZmlsdGVyU2luZ2xlRXJyb3JQZXJQcm9wZXJ0eSA9IChlcnJvcnM6IERlZmluZWRFcnJvcltdKTogRGVmaW5lZEVycm9yW10gPT4ge1xuICAgIGNvbnN0IGVycm9yc1BlclByb3BlcnR5OiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVkRXJyb3I+ID0ge307XG4gICAgZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBwcm9wID1cbiAgICAgICAgICAgIGVycm9yLmluc3RhbmNlUGF0aCArICgoZXJyb3IucGFyYW1zIGFzIGFueSk/LmFkZGl0aW9uYWxQcm9wZXJ0eSA/PyAoZXJyb3IucGFyYW1zIGFzIGFueSk/Lm1pc3NpbmdQcm9wZXJ0eSA/PyBcIlwiKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFcnJvciA9IGVycm9yc1BlclByb3BlcnR5W3Byb3BdO1xuICAgICAgICBpZiAoIWV4aXN0aW5nRXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yc1BlclByb3BlcnR5W3Byb3BdID0gZXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzUGVyUHJvcGVydHk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3ZWlnaHQgPSBBSlZfRVJST1JfS0VZV09SRF9XRUlHSFRfTUFQW2Vycm9yLmtleXdvcmRdID8/IDA7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nV2VpZ2h0ID0gQUpWX0VSUk9SX0tFWVdPUkRfV0VJR0hUX01BUFtleGlzdGluZ0Vycm9yLmtleXdvcmRdID8/IDA7XG5cbiAgICAgICAgaWYgKHdlaWdodCA+IGV4aXN0aW5nV2VpZ2h0KSB7XG4gICAgICAgICAgICBlcnJvcnNQZXJQcm9wZXJ0eVtwcm9wXSA9IGVycm9yO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhlcnJvcnNQZXJQcm9wZXJ0eSk7XG59O1xuXG5pbnRlcmZhY2UgQmV0dGVyQWp2RXJyb3JzT3B0aW9ucyB7XG4gICAgZXJyb3JzOiBFcnJvck9iamVjdFtdIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICBkYXRhOiBhbnk7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBiZXR0ZXJBanZFcnJvcnMgPSAoe1xuICAgIGVycm9ycyxcbiAgICBkYXRhLFxuICAgIGJhc2VQYXRoID0gXCJcIixcbn06IEJldHRlckFqdkVycm9yc09wdGlvbnMpOiBWYWxpZGF0aW9uRXJyb3JbXSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVycm9ycykgfHwgIWVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZpbmVkRXJyb3JzID0gZmlsdGVyU2luZ2xlRXJyb3JQZXJQcm9wZXJ0eShlcnJvcnMgYXMgRGVmaW5lZEVycm9yW10pO1xuXG4gICAgcmV0dXJuIGRlZmluZWRFcnJvcnMubWFwKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBwb2ludGVyVG9Eb3ROb3RhdGlvbihiYXNlUGF0aCArIGVycm9yLmluc3RhbmNlUGF0aCkgOiBwb2ludGVyVG9Eb3ROb3RhdGlvbihlcnJvci5pbnN0YW5jZVBhdGgpLnN1YnN0cmluZygxKTtcbiAgICAgICAgY29uc3QgcHJvcCA9IGdldExhc3RTZWdtZW50KGVycm9yLmluc3RhbmNlUGF0aCk7XG4gICAgICAgIGNvbnN0IHNjaGVtYVBhdGggPSBlcnJvci5zY2hlbWFQYXRoO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU1lc3NhZ2UgPSBwcm9wID8gYHByb3BlcnR5ICcke3Byb3B9J2AgOiBwYXRoO1xuICAgICAgICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9IGAke3Byb3BlcnR5TWVzc2FnZX0gJHsoY2xlYW5BanZNZXNzYWdlKGVycm9yLm1lc3NhZ2UgYXMgc3RyaW5nKSl9YDtcblxuICAgICAgICBsZXQgdmFsaWRhdGlvbkVycm9yOiBWYWxpZGF0aW9uRXJyb3I7XG5cbiAgICAgICAgc3dpdGNoIChlcnJvci5rZXl3b3JkKSB7XG4gICAgICAgICAgICBjYXNlIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQcm9wID0gZXJyb3IucGFyYW1zLmFkZGl0aW9uYWxQcm9wZXJ0eTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAnJHthZGRpdGlvbmFsUHJvcH0nIHByb3BlcnR5IGlzIG5vdCBleHBlY3RlZCB0byBiZSBoZXJlYCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVudW1cIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRWYWx1ZXMgPSBlcnJvci5wYXJhbXMuYWxsb3dlZFZhbHVlcy5tYXAoKHZhbHVlKSA9PiB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wID0gZ2V0TGFzdFNlZ21lbnQoZXJyb3IuaW5zdGFuY2VQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNhZmVKc29uUG9pbnRlcih7b2JqZWN0OiBkYXRhLCBwbnRlcjogZXJyb3IuaW5zdGFuY2VQYXRoLCBmYWxsYmFjazogXCJcIn0pO1xuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYCcke3Byb3B9JyBwcm9wZXJ0eSBtdXN0IGJlIG9uZSBvZiBbJHthbGxvd2VkVmFsdWVzLmpvaW4oXCIsIFwiKX1dIChmb3VuZCAke3ZhbHVlfSlgLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidHlwZVwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IGdldExhc3RTZWdtZW50KGVycm9yLmluc3RhbmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVycm9yLnBhcmFtcy50eXBlO1xuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYCcke3Byb3B9JyBwcm9wZXJ0eSB0eXBlIG11c3QgYmUgJHt0eXBlfWAsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJHtwYXRofSBtdXN0IGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgJyR7ZXJyb3IucGFyYW1zLm1pc3NpbmdQcm9wZXJ0eX0nYCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImNvbnN0XCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJyR7cHJvcH0nIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgdG8gdGhlIGFsbG93ZWQgdmFsdWVgLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge21lc3NhZ2U6IGRlZmF1bHRNZXNzYWdlLCBwYXRoLCBzY2hlbWFQYXRofTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBlbXB0eSBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IGVycm9yRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbGlkYXRpb25FcnJvcik7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVycm9yRW50cmllcyBhcyBba2V5b2YgVmFsaWRhdGlvbkVycm9yLCB1bmtub3duXVtdKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uRXJyb3Jba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3I7XG4gICAgfSk7XG59O1xuIl19