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 (err) {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2NoZW1hLWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRFQUE0RTtBQUM1RSx1R0FBdUc7QUFHdkcsT0FBTyxPQUFPLE1BQU0sYUFBYSxDQUFDO0FBUWxDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDekIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBRTFCLE1BQU0sNEJBQTRCLEdBQXFELEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUM7QUFFMUcsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFO0lBQ3JELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQVUsRUFBRTtJQUNoRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBWSxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUVGLE1BQU0sZUFBZSxHQUFHLENBQUksRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBNEMsRUFBSyxFQUFFO0lBQ25HLElBQUksQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDO0lBQ2xELENB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RSxJQUFJLElBQUksK0NBQStDO29CQUNoRSxJQUFJO29CQUNKLFVBQVU7aUJBQ2IsQ0FBQztZQUNOLENBQUM7WUFFRDtnQkFDSSxlQUFlLEdBQUcsRUFBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLFlBQWtELEVBQUUsQ0FBQztZQUM1RSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ3hELE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FwaWRlY2stbGlicmFyaWVzL2JldHRlci1hanYtZXJyb3JzIChNSVQpXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBpZGVjay1saWJyYXJpZXMvYmV0dGVyLWFqdi1lcnJvcnMvdHJlZS8wMjYyMDYwMzg5MTljMWZiNzNiNGU4ZWYyNThhMmU0YTAxODEzYzRhXG5cbmltcG9ydCB7RGVmaW5lZEVycm9yLCBFcnJvck9iamVjdH0gZnJvbSBcImFqdlwiO1xuaW1wb3J0IHBvaW50ZXIgZnJvbSBcImpzb25wb2ludGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbkVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHNjaGVtYVBhdGg6IHN0cmluZztcbn1cblxuY29uc3QgUVVPVEVTX1JFR0VYID0gL1wiL2c7XG5jb25zdCBOT1RfUkVHRVggPSAvTk9UL2c7XG5jb25zdCBTTEFTSF9SRUdFWCA9IC9cXC8vZztcblxuY29uc3QgQUpWX0VSUk9SX0tFWVdPUkRfV0VJR0hUX01BUDogUGFydGlhbDxSZWNvcmQ8RGVmaW5lZEVycm9yW1wia2V5d29yZFwiXSwgbnVtYmVyPj4gPSB7ZW51bTogMSwgdHlwZTogMH07XG5cbmNvbnN0IHBvaW50ZXJUb0RvdE5vdGF0aW9uID0gKHBvaW50ZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIHBvaW50ZXIucmVwbGFjZShTTEFTSF9SRUdFWCwgXCIuXCIpO1xufTtcblxuY29uc3QgY2xlYW5BanZNZXNzYWdlID0gKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZShRVU9URVNfUkVHRVgsIFwiJ1wiKS5yZXBsYWNlKE5PVF9SRUdFWCwgXCJub3RcIik7XG59O1xuXG5jb25zdCBnZXRMYXN0U2VnbWVudCA9IChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgcmV0dXJuIHNlZ21lbnRzLnBvcCgpIGFzIHN0cmluZztcbn07XG5cbmNvbnN0IHNhZmVKc29uUG9pbnRlciA9IDxUPih7b2JqZWN0LCBwbnRlciwgZmFsbGJhY2t9OiB7b2JqZWN0OiBhbnk7IHBudGVyOiBzdHJpbmc7IGZhbGxiYWNrOiBUfSk6IFQgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwb2ludGVyLmdldChvYmplY3QsIHBudGVyKSA/PyBmYWxsYmFjaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbn07XG5cbmNvbnN0IGZpbHRlclNpbmdsZUVycm9yUGVyUHJvcGVydHkgPSAoZXJyb3JzOiBEZWZpbmVkRXJyb3JbXSk6IERlZmluZWRFcnJvcltdID0+IHtcbiAgICBjb25zdCBlcnJvcnNQZXJQcm9wZXJ0eTogUmVjb3JkPHN0cmluZywgRGVmaW5lZEVycm9yPiA9IHt9O1xuICAgIGVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc3QgcHJvcCA9XG4gICAgICAgICAgICBlcnJvci5pbnN0YW5jZVBhdGggKyAoKGVycm9yLnBhcmFtcyBhcyBhbnkpPy5hZGRpdGlvbmFsUHJvcGVydHkgPz8gKGVycm9yLnBhcmFtcyBhcyBhbnkpPy5taXNzaW5nUHJvcGVydHkgPz8gXCJcIik7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3IgPSBlcnJvcnNQZXJQcm9wZXJ0eVtwcm9wXTtcbiAgICAgICAgaWYgKCFleGlzdGluZ0Vycm9yKSB7XG4gICAgICAgICAgICBlcnJvcnNQZXJQcm9wZXJ0eVtwcm9wXSA9IGVycm9yO1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yc1BlclByb3BlcnR5O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2VpZ2h0ID0gQUpWX0VSUk9SX0tFWVdPUkRfV0VJR0hUX01BUFtlcnJvci5rZXl3b3JkXSA/PyAwO1xuICAgICAgICBjb25zdCBleGlzdGluZ1dlaWdodCA9IEFKVl9FUlJPUl9LRVlXT1JEX1dFSUdIVF9NQVBbZXhpc3RpbmdFcnJvci5rZXl3b3JkXSA/PyAwO1xuXG4gICAgICAgIGlmICh3ZWlnaHQgPiBleGlzdGluZ1dlaWdodCkge1xuICAgICAgICAgICAgZXJyb3JzUGVyUHJvcGVydHlbcHJvcF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZXJyb3JzUGVyUHJvcGVydHkpO1xufTtcblxuaW50ZXJmYWNlIEJldHRlckFqdkVycm9yc09wdGlvbnMge1xuICAgIGVycm9yczogRXJyb3JPYmplY3RbXSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgZGF0YTogYW55O1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgYmV0dGVyQWp2RXJyb3JzID0gKHtcbiAgICBlcnJvcnMsXG4gICAgZGF0YSxcbiAgICBiYXNlUGF0aCA9IFwiXCIsXG59OiBCZXR0ZXJBanZFcnJvcnNPcHRpb25zKTogVmFsaWRhdGlvbkVycm9yW10gPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlcnJvcnMpIHx8ICFlcnJvcnM/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZGVmaW5lZEVycm9ycyA9IGZpbHRlclNpbmdsZUVycm9yUGVyUHJvcGVydHkoZXJyb3JzIGFzIERlZmluZWRFcnJvcltdKTtcblxuICAgIHJldHVybiBkZWZpbmVkRXJyb3JzLm1hcCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gcG9pbnRlclRvRG90Tm90YXRpb24oYmFzZVBhdGggKyBlcnJvci5pbnN0YW5jZVBhdGgpIDogcG9pbnRlclRvRG90Tm90YXRpb24oZXJyb3IuaW5zdGFuY2VQYXRoKS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGNvbnN0IHByb3AgPSBnZXRMYXN0U2VnbWVudChlcnJvci5pbnN0YW5jZVBhdGgpO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXRoID0gZXJyb3Iuc2NoZW1hUGF0aDtcbiAgICAgICAgY29uc3QgcHJvcGVydHlNZXNzYWdlID0gcHJvcCA/IGBwcm9wZXJ0eSAnJHtwcm9wfSdgIDogcGF0aDtcbiAgICAgICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSBgJHtwcm9wZXJ0eU1lc3NhZ2V9ICR7KGNsZWFuQWp2TWVzc2FnZShlcnJvci5tZXNzYWdlIGFzIHN0cmluZykpfWA7XG5cbiAgICAgICAgbGV0IHZhbGlkYXRpb25FcnJvcjogVmFsaWRhdGlvbkVycm9yO1xuXG4gICAgICAgIHN3aXRjaCAoZXJyb3Iua2V5d29yZCkge1xuICAgICAgICAgICAgY2FzZSBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUHJvcCA9IGVycm9yLnBhcmFtcy5hZGRpdGlvbmFsUHJvcGVydHk7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgJyR7YWRkaXRpb25hbFByb3B9JyBwcm9wZXJ0eSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgaGVyZWAsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gZXJyb3IucGFyYW1zLmFsbG93ZWRWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IGdldExhc3RTZWdtZW50KGVycm9yLmluc3RhbmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzYWZlSnNvblBvaW50ZXIoe29iamVjdDogZGF0YSwgcG50ZXI6IGVycm9yLmluc3RhbmNlUGF0aCwgZmFsbGJhY2s6IFwiXCJ9KTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAnJHtwcm9wfScgcHJvcGVydHkgbXVzdCBiZSBvbmUgb2YgWyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiLCBcIil9XSAoZm91bmQgJHt2YWx1ZX0pYCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInR5cGVcIjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSBnZXRMYXN0U2VnbWVudChlcnJvci5pbnN0YW5jZVBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlcnJvci5wYXJhbXMudHlwZTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAnJHtwcm9wfScgcHJvcGVydHkgdHlwZSBtdXN0IGJlICR7dHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFQYXRoLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYCR7cGF0aH0gbXVzdCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5ICcke2Vycm9yLnBhcmFtcy5taXNzaW5nUHJvcGVydHl9J2AsXG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtYVBhdGgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJjb25zdFwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYCcke3Byb3B9JyBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIHRvIHRoZSBhbGxvd2VkIHZhbHVlYCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hUGF0aCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHttZXNzYWdlOiBkZWZhdWx0TWVzc2FnZSwgcGF0aCwgc2NoZW1hUGF0aH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZW1wdHkgcHJvcGVydGllc1xuICAgICAgICBjb25zdCBlcnJvckVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlcnJvckVudHJpZXMgYXMgW2tleW9mIFZhbGlkYXRpb25FcnJvciwgdW5rbm93bl1bXSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdmFsaWRhdGlvbkVycm9yW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==