@redocly/respect-core 2.29.0 → 2.29.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/modules/flow-runner/success-criteria/check-success-criteria.d.ts.map +1 -1
- package/lib/modules/flow-runner/success-criteria/check-success-criteria.js +6 -1
- package/lib/modules/flow-runner/success-criteria/check-success-criteria.js.map +1 -1
- package/lib/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.d.ts +8 -1
- package/lib/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.d.ts.map +1 -1
- package/lib/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.js +25 -165
- package/lib/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-success-criteria.d.ts","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/check-success-criteria.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,KAAK,EAEL,IAAI,EACJ,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAW3B,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,IAAI,EACJ,QAAQ,EAAE,YAAiB,EAC3B,GAAG,GACJ,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,GAAG,EAAE,WAAW,CAAC;CAClB,GAAG,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"check-success-criteria.d.ts","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/check-success-criteria.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,KAAK,EAEL,IAAI,EACJ,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAW3B,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,IAAI,EACJ,QAAQ,EAAE,YAAiB,EAC3B,GAAG,GACJ,EAAE;IACD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,GAAG,EAAE,WAAW,CAAC;CAClB,GAAG,KAAK,EAAE,CAyFV"}
|
|
@@ -50,7 +50,12 @@ export function checkCriteria({ workflowId, step, criteria: criteriaList = [], c
|
|
|
50
50
|
const data = evaluateRuntimeExpression(context, criteriaContext, ctx.options.logger);
|
|
51
51
|
checks.push({
|
|
52
52
|
name: CHECKS.SUCCESS_CRITERIA_CHECK,
|
|
53
|
-
passed: evaluateJSONPathCondition(
|
|
53
|
+
passed: evaluateJSONPathCondition({
|
|
54
|
+
condition,
|
|
55
|
+
data,
|
|
56
|
+
context: criteriaContext,
|
|
57
|
+
logger: ctx.options.logger,
|
|
58
|
+
}),
|
|
54
59
|
message: `Checking jsonpath criteria: ${condition}`,
|
|
55
60
|
severity: ctx.severity['SUCCESS_CRITERIA_CHECK'],
|
|
56
61
|
condition: condition,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-success-criteria.js","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/check-success-criteria.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,EAC5B,UAAU,EACV,IAAI,EACJ,QAAQ,EAAE,YAAY,GAAG,EAAE,EAC3B,GAAG,GAMJ;IACC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM,CAAC,sBAAsB;YACnC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,iCAAiC,IAAI,CAAC,MAAM,EAAE;YACvD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SACjD,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,eAAe,GAAG,0BAA0B,CAAC;QACjD,GAAG;QACH,UAAU;QACV,IAAI;KACL,CAAC,CAAC;IAEH,YAAY,CAAC,OAAO,CAAC,CAAC,QAAyB,EAAE,EAAE;QACjD,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAE/B,IAAI,CAAC;YACH,IAAI,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAE5D,IAAI,YAAoB,CAAC;gBACzB,IAAI,KAAa,CAAC;gBAElB,IAAI,UAAU,EAAE,CAAC;oBACf,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,mDAAmD;oBACjF,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,qCAAqC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,SAAS,CAAC,CAAC,mEAAmE;oBAC7F,KAAK,GAAG,EAAE,CAAC,CAAC,wBAAwB;gBACtC,CAAC;gBAED,MAAM,EAAE,OAAO,EAAE,GAAG,QAAiC,CAAC;gBACtD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAE9C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,MAAM,CAAC,sBAAsB;oBACnC,MAAM,EAAE,KAAK,CAAC,IAAI,CAChB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CACxE;oBACD,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC/D,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC;oBAChD,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,yBAAyB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;gBAC7B,MAAM,IAAI,GAAG,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAErF,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,MAAM,CAAC,sBAAsB;oBACnC,MAAM,EAAE,yBAAyB,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"check-success-criteria.js","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/check-success-criteria.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import { type LoggerInterface } from '@redocly/openapi-core';
|
|
1
2
|
import { type JsonValue } from 'jsonpath-rfc9535';
|
|
2
|
-
|
|
3
|
+
import type { RuntimeExpressionContext } from '../../../types.js';
|
|
4
|
+
export declare function evaluateJSONPathCondition({ condition, data, context, logger, }: {
|
|
5
|
+
condition: string;
|
|
6
|
+
data: JsonValue;
|
|
7
|
+
context: RuntimeExpressionContext;
|
|
8
|
+
logger: LoggerInterface;
|
|
9
|
+
}): boolean;
|
|
3
10
|
//# sourceMappingURL=evaluate-jsonpath-condition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate-jsonpath-condition.d.ts","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"evaluate-jsonpath-condition.d.ts","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAQlE,wBAAgB,yBAAyB,CAAC,EACxC,SAAS,EACT,IAAI,EACJ,OAAO,EACP,MAAM,GACP,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,eAAe,CAAC;CACzB,GAAG,OAAO,CAOV"}
|
|
@@ -1,176 +1,36 @@
|
|
|
1
|
+
import { isPlainObject } from '@redocly/openapi-core';
|
|
1
2
|
import { query } from 'jsonpath-rfc9535';
|
|
2
|
-
|
|
3
|
+
import { evaluateRuntimeExpression } from '../../runtime-expressions/index.js';
|
|
4
|
+
// Matches Arazzo embedded runtime expressions of the form `{$...}`, which must be
|
|
5
|
+
// resolved first to construct the final JSONPath expression. Nested braces are not
|
|
6
|
+
// supported, which aligns with Arazzo runtime-expression syntax.
|
|
7
|
+
const EMBEDDED_EXPRESSION_REGEX = /\{(\$[^{}]+)\}/g;
|
|
8
|
+
export function evaluateJSONPathCondition({ condition, data, context, logger, }) {
|
|
3
9
|
try {
|
|
4
|
-
const resolvedCondition =
|
|
5
|
-
|
|
6
|
-
return !!evaluateFn();
|
|
10
|
+
const resolvedCondition = resolveEmbeddedExpressions(condition, context, logger);
|
|
11
|
+
return query([data], resolvedCondition).length > 0;
|
|
7
12
|
}
|
|
8
|
-
catch
|
|
13
|
+
catch {
|
|
9
14
|
return false;
|
|
10
15
|
}
|
|
11
16
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
expressionElements = '';
|
|
21
|
-
}
|
|
22
|
-
const start = i;
|
|
23
|
-
const expression = parseSingleJSONPath(condition, i);
|
|
24
|
-
if (expression.length > 1) {
|
|
25
|
-
const evaluatedExpression = evaluateJSONPathExpression(expression, context);
|
|
26
|
-
expressionsParts.push(evaluatedExpression);
|
|
27
|
-
}
|
|
28
|
-
i = start + expression.length;
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
expressionElements += condition[i];
|
|
32
|
-
i++;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
// Push any remaining content after the while loop
|
|
36
|
-
if (expressionElements.length > 0) {
|
|
37
|
-
expressionsParts.push(expressionElements);
|
|
38
|
-
}
|
|
39
|
-
return expressionsParts.join('');
|
|
40
|
-
}
|
|
41
|
-
function parseSingleJSONPath(condition, startIndex) {
|
|
42
|
-
let jsonpath = '$';
|
|
43
|
-
let bracketDepth = 0;
|
|
44
|
-
let inQuotes = false;
|
|
45
|
-
let quoteChar = '';
|
|
46
|
-
let inFilter = false;
|
|
47
|
-
let filterDepth = 0;
|
|
48
|
-
let i = startIndex + 1; // Skip the '$'
|
|
49
|
-
while (i < condition.length) {
|
|
50
|
-
const char = condition[i];
|
|
51
|
-
if ((char === '"' || char === "'") && !inQuotes) {
|
|
52
|
-
inQuotes = true;
|
|
53
|
-
quoteChar = char;
|
|
54
|
-
jsonpath += char;
|
|
55
|
-
i++;
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
if (char === quoteChar && inQuotes) {
|
|
59
|
-
inQuotes = false;
|
|
60
|
-
jsonpath += char;
|
|
61
|
-
i++;
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
if (inQuotes) {
|
|
65
|
-
jsonpath += char;
|
|
66
|
-
i++;
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
if (char === '[') {
|
|
70
|
-
bracketDepth++;
|
|
71
|
-
if (i + 1 < condition.length && condition[i + 1] === '?') {
|
|
72
|
-
inFilter = true;
|
|
73
|
-
filterDepth = bracketDepth;
|
|
74
|
-
}
|
|
75
|
-
jsonpath += char;
|
|
76
|
-
i++;
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
if (char === ']') {
|
|
80
|
-
bracketDepth--;
|
|
81
|
-
if (inFilter && bracketDepth < filterDepth) {
|
|
82
|
-
inFilter = false;
|
|
83
|
-
}
|
|
84
|
-
jsonpath += char;
|
|
85
|
-
i++;
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
// Stop at logical operators, comparison operators, or whitespace (outside of filters)
|
|
89
|
-
if (!inFilter && (/\s/.test(char) || /[<>=!&|,)]/.test(char))) {
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
jsonpath += char;
|
|
93
|
-
i++;
|
|
94
|
-
}
|
|
95
|
-
return jsonpath;
|
|
96
|
-
}
|
|
97
|
-
function evaluateJSONPathExpression(expression, context) {
|
|
98
|
-
// Handle legacy .length suffix for backward compatibility that is not a valid RFC 9535 expression
|
|
99
|
-
if (expression.endsWith('.length')) {
|
|
100
|
-
const basePath = expression.slice(0, -'.length'.length);
|
|
101
|
-
const normalizedPath = transformHyphensToUnderscores(basePath);
|
|
102
|
-
const result = query(context, normalizedPath);
|
|
103
|
-
const value = result[0] ?? null;
|
|
104
|
-
return Array.isArray(value) ? String(value.length) : '0';
|
|
105
|
-
}
|
|
106
|
-
if (expression.includes('[?(') && expression.includes(')]')) {
|
|
107
|
-
return handleFilterExpression(expression, context);
|
|
108
|
-
}
|
|
109
|
-
const normalizedPath = transformHyphensToUnderscores(expression);
|
|
110
|
-
const result = query(context, normalizedPath);
|
|
111
|
-
return JSON.stringify(result[0]);
|
|
112
|
-
}
|
|
113
|
-
function handleFilterExpression(expression, context) {
|
|
114
|
-
const filterMatch = expression.match(/\[\?\((.*)\)\]/);
|
|
115
|
-
if (!filterMatch)
|
|
116
|
-
return 'false';
|
|
117
|
-
const filterCondition = filterMatch[1];
|
|
118
|
-
const basePath = expression.substring(0, expression.indexOf('[?('));
|
|
119
|
-
const normalizedBasePath = transformHyphensToUnderscores(basePath);
|
|
120
|
-
const jsonpathResult = query(context, normalizedBasePath);
|
|
121
|
-
// Flatten the result in case JSONPath returns nested arrays
|
|
122
|
-
const arrayToFilter = Array.isArray(jsonpathResult) ? jsonpathResult.flat() : jsonpathResult;
|
|
123
|
-
if (!Array.isArray(arrayToFilter)) {
|
|
124
|
-
return 'false';
|
|
125
|
-
}
|
|
126
|
-
const filteredArray = arrayToFilter.filter((item) => {
|
|
127
|
-
const convertedCondition = processFilterCondition(filterCondition, item);
|
|
128
|
-
try {
|
|
129
|
-
const safeEval = new Function('item', `return ${convertedCondition};`);
|
|
130
|
-
return !!safeEval(item);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
17
|
+
// Per the Arazzo spec, expressions can be embedded into string values by surrounding
|
|
18
|
+
// the expression with `{}` curly braces. Any embedded `{$...}` expression in a JSONPath
|
|
19
|
+
// condition MUST be evaluated first to construct the JSONPath expression before it is
|
|
20
|
+
// evaluated against the data.
|
|
21
|
+
function resolveEmbeddedExpressions(condition, context, logger) {
|
|
22
|
+
return condition.replace(EMBEDDED_EXPRESSION_REGEX, (match, expression) => {
|
|
23
|
+
const value = evaluateRuntimeExpression(expression, context, logger);
|
|
24
|
+
return formatJsonPathLiteral(value, match);
|
|
135
25
|
});
|
|
136
|
-
const afterFilter = expression.substring(expression.indexOf(')]') + 2);
|
|
137
|
-
if (afterFilter.startsWith('.')) {
|
|
138
|
-
const propertyMatch = afterFilter.match(/\.([a-zA-Z0-9_-]+)/);
|
|
139
|
-
if (propertyMatch) {
|
|
140
|
-
const propertyName = propertyMatch[1].replace(/-/g, '_');
|
|
141
|
-
const propertyValues = filteredArray.map((item) => item[propertyName]);
|
|
142
|
-
return JSON.stringify(propertyValues);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return filteredArray.length > 0 ? JSON.stringify(filteredArray) : 'false';
|
|
146
26
|
}
|
|
147
|
-
function
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const value = item[normalizedProp];
|
|
153
|
-
if (typeof value !== 'string')
|
|
154
|
-
return 'false';
|
|
155
|
-
try {
|
|
156
|
-
let cleanPattern = pattern.replace(/^["']|["']$/g, ''); // Remove quotes
|
|
157
|
-
cleanPattern = cleanPattern.replace(/^\/|\/$/g, ''); // Remove leading/trailing slashes
|
|
158
|
-
const regex = new RegExp(cleanPattern);
|
|
159
|
-
return String(regex.test(value));
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
return 'false';
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
// Handle @.property expressions (simple property access)
|
|
166
|
-
convertedCondition = convertedCondition.replace(/@\.([a-zA-Z0-9_-]+)/g, (_, prop) => {
|
|
167
|
-
const normalizedProp = prop.replace(/-/g, '_');
|
|
168
|
-
const value = item[normalizedProp];
|
|
27
|
+
function formatJsonPathLiteral(value, fallback) {
|
|
28
|
+
if (value === undefined) {
|
|
29
|
+
return fallback;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === 'string' || Array.isArray(value) || isPlainObject(value)) {
|
|
169
32
|
return JSON.stringify(value);
|
|
170
|
-
}
|
|
171
|
-
return
|
|
172
|
-
}
|
|
173
|
-
function transformHyphensToUnderscores(path) {
|
|
174
|
-
return path.replace(/\.([a-zA-Z0-9_-]+)/g, (_, prop) => '.' + prop.replace(/-/g, '_'));
|
|
33
|
+
}
|
|
34
|
+
return String(value);
|
|
175
35
|
}
|
|
176
36
|
//# sourceMappingURL=evaluate-jsonpath-condition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate-jsonpath-condition.js","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"evaluate-jsonpath-condition.js","sourceRoot":"","sources":["../../../../src/modules/flow-runner/success-criteria/evaluate-jsonpath-condition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAkB,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,kFAAkF;AAClF,mFAAmF;AACnF,iEAAiE;AACjE,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;AAEpD,MAAM,UAAU,yBAAyB,CAAC,EACxC,SAAS,EACT,IAAI,EACJ,OAAO,EACP,MAAM,GAMP;IACC,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,wFAAwF;AACxF,sFAAsF;AACtF,8BAA8B;AAC9B,SAAS,0BAA0B,CACjC,SAAiB,EACjB,OAAiC,EACjC,MAAuB;IAEvB,OAAO,SAAS,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QACxE,MAAM,KAAK,GAAG,yBAAyB,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrE,OAAO,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAE,QAAgB;IAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@redocly/respect-core",
|
|
3
|
-
"version": "2.29.
|
|
3
|
+
"version": "2.29.1",
|
|
4
4
|
"description": "API testing framework core",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"@faker-js/faker": "^7.6.0",
|
|
49
49
|
"@noble/hashes": "^1.8.0",
|
|
50
50
|
"@redocly/ajv": "^8.18.0",
|
|
51
|
-
"@redocly/openapi-core": "2.29.
|
|
51
|
+
"@redocly/openapi-core": "2.29.1",
|
|
52
52
|
"ajv": "npm:@redocly/ajv@8.18.0",
|
|
53
53
|
"better-ajv-errors": "^1.2.0",
|
|
54
54
|
"colorette": "^2.0.20",
|