UNPKG

@redocly/respect-core

Version:
57 lines 2.06 kB
export function isRegexpSuccessCriteria(criteria) { return criteria.type === 'regex'; } export function isJSONPathSuccessCriteria(criteria) { const typeValue = criteria?.type; return (typeValue === 'jsonpath' || (typeof typeValue === 'object' && typeValue?.type === 'jsonpath')); } export const ALLOWED_EXPRESSION_KEYS = [ '$url', '$method', '$statusCode', '$request', '$response', '$inputs', '$outputs', '$steps', '$workflows', '$sourceDescriptions', '$components', ]; export function validateSuccessCriteria(successCriteria) { successCriteria.forEach((criteria) => { const { condition } = criteria; if (isRegexpSuccessCriteria(criteria)) { const { context } = criteria; const regex = /\$[a-zA-Z_]\w*/g; const matches = context.match(regex); if (!matches) { throw new Error(`"${context}" does not contain any valid context.`); } const invalidKeys = matches.filter((key) => !ALLOWED_EXPRESSION_KEYS.includes(key)); if (invalidKeys.length) { throw new Error(`Success criteria context "${context}" is not allowed.`); } } else if (isJSONPathSuccessCriteria(criteria)) { if (!criteria.context) { throw new Error(`jsonpath success criteria context is required.`); } if (!criteria.condition) { throw new Error(`jsonpath success criteria condition is required.`); } } else { const regex = /\$[a-zA-Z_]\w*/g; const matches = condition.match(regex); if (!matches) { return; } const invalidKeys = matches.filter((key) => !ALLOWED_EXPRESSION_KEYS.includes(key)); if (invalidKeys.length) { throw new Error(`Success criteria condition ${condition} is not allowed.`); } } }); } //# sourceMappingURL=validate-success-criteria.js.map