@redocly/openapi-core 1.21.1 → 1.22.0
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/CHANGELOG.md +11 -0
- package/lib/config/all.js +14 -1
- package/lib/config/minimal.js +11 -1
- package/lib/config/recommended-strict.js +11 -1
- package/lib/config/recommended.js +11 -1
- package/lib/oas-types.js +2 -1
- package/lib/rules/arazzo/index.js +22 -2
- package/lib/rules/arazzo/parameters-unique.d.ts +2 -0
- package/lib/rules/arazzo/parameters-unique.js +32 -0
- package/lib/rules/arazzo/requestBody-replacements-unique.d.ts +2 -0
- package/lib/rules/arazzo/requestBody-replacements-unique.js +28 -0
- package/lib/rules/arazzo/source-description-type.d.ts +2 -0
- package/lib/rules/arazzo/source-description-type.js +20 -0
- package/lib/rules/arazzo/sourceDescriptions-name-unique.d.ts +2 -0
- package/lib/rules/arazzo/sourceDescriptions-name-unique.js +24 -0
- package/lib/rules/arazzo/step-onFailure-unique.d.ts +2 -0
- package/lib/rules/arazzo/step-onFailure-unique.js +32 -0
- package/lib/rules/arazzo/step-onSuccess-unique.d.ts +2 -0
- package/lib/rules/arazzo/step-onSuccess-unique.js +32 -0
- package/lib/rules/arazzo/stepId-unique.d.ts +2 -0
- package/lib/rules/arazzo/stepId-unique.js +26 -0
- package/lib/rules/arazzo/workflow-dependsOn.d.ts +2 -0
- package/lib/rules/arazzo/workflow-dependsOn.js +56 -0
- package/lib/rules/arazzo/workflowId-unique.d.ts +2 -0
- package/lib/rules/arazzo/workflowId-unique.js +22 -0
- package/lib/rules/spot/parameters-not-in-body.d.ts +2 -0
- package/lib/rules/spot/{parameters-no-body-inside-in.js → parameters-not-in-body.js} +3 -3
- package/lib/rules/spot/version-enum.d.ts +2 -0
- package/lib/rules/spot/version-enum.js +21 -0
- package/lib/types/arazzo.js +8 -10
- package/lib/types/redocly-yaml.d.ts +1 -1
- package/lib/types/redocly-yaml.js +14 -1
- package/lib/typings/arazzo.d.ts +2 -0
- package/lib/typings/arazzo.js +3 -0
- package/lib/utils.d.ts +1 -0
- package/lib/utils.js +8 -0
- package/package.json +2 -2
- package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +22 -2
- package/src/config/all.ts +14 -1
- package/src/config/minimal.ts +11 -1
- package/src/config/recommended-strict.ts +11 -1
- package/src/config/recommended.ts +11 -1
- package/src/oas-types.ts +2 -1
- package/src/rules/arazzo/__tests__/{parameters-no-body-inside-in.test.ts → parameters-not-in-body.test.ts} +3 -5
- package/src/rules/arazzo/__tests__/parameters-unique.test.ts +114 -0
- package/src/rules/arazzo/__tests__/requestBody-replacements-unique.test.ts +109 -0
- package/src/rules/arazzo/__tests__/source-description-type.test.ts +80 -0
- package/src/rules/arazzo/__tests__/sourceDescription-name-unique.test.ts +79 -0
- package/src/rules/arazzo/__tests__/step-onFailure-unique.test.ts +111 -0
- package/src/rules/arazzo/__tests__/step-onSuccess-unique.test.ts +111 -0
- package/src/rules/arazzo/__tests__/stepId-unique.test.ts +95 -0
- package/src/rules/arazzo/__tests__/version-enum.test.ts +76 -0
- package/src/rules/arazzo/__tests__/workflow-dependsOn.test.ts +212 -0
- package/src/rules/arazzo/__tests__/workflowId-unique.test.ts +90 -0
- package/src/rules/arazzo/index.ts +22 -2
- package/src/rules/arazzo/parameters-unique.ts +33 -0
- package/src/rules/arazzo/requestBody-replacements-unique.ts +28 -0
- package/src/rules/arazzo/source-description-type.ts +20 -0
- package/src/rules/arazzo/sourceDescriptions-name-unique.ts +23 -0
- package/src/rules/arazzo/step-onFailure-unique.ts +33 -0
- package/src/rules/arazzo/step-onSuccess-unique.ts +33 -0
- package/src/rules/arazzo/stepId-unique.ts +24 -0
- package/src/rules/arazzo/workflow-dependsOn.ts +56 -0
- package/src/rules/arazzo/workflowId-unique.ts +21 -0
- package/src/rules/spot/{parameters-no-body-inside-in.ts → parameters-not-in-body.ts} +1 -1
- package/src/rules/spot/version-enum.ts +24 -0
- package/src/types/arazzo.ts +8 -10
- package/src/types/redocly-yaml.ts +14 -1
- package/src/typings/arazzo.ts +4 -0
- package/src/utils.ts +8 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/lib/rules/spot/parameters-no-body-inside-in.d.ts +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @redocly/openapi-core
|
|
2
2
|
|
|
3
|
+
## 1.22.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Updated the Arazzo validation types for workflows input, parameter objects, and criteria to match the specification.
|
|
8
|
+
- Added Arazzo rulesets so that users can customize their linting rules for this format.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- Updated @redocly/config to v0.10.1.
|
|
13
|
+
|
|
3
14
|
## 1.21.1
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/lib/config/all.js
CHANGED
|
@@ -126,6 +126,19 @@ const all = {
|
|
|
126
126
|
'channels-kebab-case': 'error',
|
|
127
127
|
'no-channel-trailing-slash': 'error',
|
|
128
128
|
},
|
|
129
|
-
arazzoRules: {
|
|
129
|
+
arazzoRules: {
|
|
130
|
+
spec: 'error',
|
|
131
|
+
'parameters-not-in-body': 'error',
|
|
132
|
+
'sourceDescription-type': 'error',
|
|
133
|
+
'version-enum': 'error',
|
|
134
|
+
'workflowId-unique': 'error',
|
|
135
|
+
'stepId-unique': 'error',
|
|
136
|
+
'sourceDescription-name-unique': 'error',
|
|
137
|
+
'workflow-dependsOn': 'error',
|
|
138
|
+
'parameters-unique': 'error',
|
|
139
|
+
'step-onSuccess-unique': 'error',
|
|
140
|
+
'step-onFailure-unique': 'error',
|
|
141
|
+
'requestBody-replacements-unique': 'error',
|
|
142
|
+
},
|
|
130
143
|
};
|
|
131
144
|
exports.default = all;
|
package/lib/config/minimal.js
CHANGED
|
@@ -110,7 +110,17 @@ const minimal = {
|
|
|
110
110
|
},
|
|
111
111
|
arazzoRules: {
|
|
112
112
|
spec: 'error',
|
|
113
|
-
'parameters-
|
|
113
|
+
'parameters-not-in-body': 'off',
|
|
114
|
+
'sourceDescription-type': 'off',
|
|
115
|
+
'version-enum': 'warn',
|
|
116
|
+
'workflowId-unique': 'error',
|
|
117
|
+
'stepId-unique': 'error',
|
|
118
|
+
'sourceDescription-name-unique': 'off',
|
|
119
|
+
'workflow-dependsOn': 'off',
|
|
120
|
+
'parameters-unique': 'off',
|
|
121
|
+
'step-onSuccess-unique': 'off',
|
|
122
|
+
'step-onFailure-unique': 'off',
|
|
123
|
+
'requestBody-replacements-unique': 'off',
|
|
114
124
|
},
|
|
115
125
|
};
|
|
116
126
|
exports.default = minimal;
|
|
@@ -110,7 +110,17 @@ const recommendedStrict = {
|
|
|
110
110
|
},
|
|
111
111
|
arazzoRules: {
|
|
112
112
|
spec: 'error',
|
|
113
|
-
'parameters-
|
|
113
|
+
'parameters-not-in-body': 'error',
|
|
114
|
+
'sourceDescription-type': 'error',
|
|
115
|
+
'version-enum': 'error',
|
|
116
|
+
'workflowId-unique': 'error',
|
|
117
|
+
'stepId-unique': 'error',
|
|
118
|
+
'sourceDescription-name-unique': 'error',
|
|
119
|
+
'workflow-dependsOn': 'error',
|
|
120
|
+
'parameters-unique': 'error',
|
|
121
|
+
'step-onSuccess-unique': 'error',
|
|
122
|
+
'step-onFailure-unique': 'error',
|
|
123
|
+
'requestBody-replacements-unique': 'error',
|
|
114
124
|
},
|
|
115
125
|
};
|
|
116
126
|
exports.default = recommendedStrict;
|
|
@@ -110,7 +110,17 @@ const recommended = {
|
|
|
110
110
|
},
|
|
111
111
|
arazzoRules: {
|
|
112
112
|
spec: 'error',
|
|
113
|
-
'parameters-
|
|
113
|
+
'parameters-not-in-body': 'warn',
|
|
114
|
+
'sourceDescription-type': 'error',
|
|
115
|
+
'version-enum': 'warn',
|
|
116
|
+
'workflowId-unique': 'error',
|
|
117
|
+
'stepId-unique': 'error',
|
|
118
|
+
'sourceDescription-name-unique': 'error',
|
|
119
|
+
'workflow-dependsOn': 'error',
|
|
120
|
+
'parameters-unique': 'error',
|
|
121
|
+
'step-onSuccess-unique': 'warn',
|
|
122
|
+
'step-onFailure-unique': 'warn',
|
|
123
|
+
'requestBody-replacements-unique': 'warn',
|
|
114
124
|
},
|
|
115
125
|
};
|
|
116
126
|
exports.default = recommended;
|
package/lib/oas-types.js
CHANGED
|
@@ -11,6 +11,7 @@ const asyncapi2_1 = require("./types/asyncapi2");
|
|
|
11
11
|
const asyncapi3_1 = require("./types/asyncapi3");
|
|
12
12
|
const arazzo_1 = require("./types/arazzo");
|
|
13
13
|
const utils_1 = require("./utils");
|
|
14
|
+
const arazzo_2 = require("./typings/arazzo");
|
|
14
15
|
var SpecVersion;
|
|
15
16
|
(function (SpecVersion) {
|
|
16
17
|
SpecVersion["OAS2"] = "oas2";
|
|
@@ -64,7 +65,7 @@ function detectSpec(root) {
|
|
|
64
65
|
if (root.asyncapi) {
|
|
65
66
|
throw new Error(`Unsupported AsyncAPI version: ${root.asyncapi}`);
|
|
66
67
|
}
|
|
67
|
-
if (typeof root.arazzo === 'string' &&
|
|
68
|
+
if (typeof root.arazzo === 'string' && arazzo_2.VERSION_PATTERN.test(root.arazzo)) {
|
|
68
69
|
return SpecVersion.Arazzo;
|
|
69
70
|
}
|
|
70
71
|
throw new Error(`Unsupported specification`);
|
|
@@ -3,10 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.preprocessors = exports.rules = void 0;
|
|
4
4
|
const spec_1 = require("../common/spec");
|
|
5
5
|
const assertions_1 = require("../common/assertions");
|
|
6
|
-
const
|
|
6
|
+
const parameters_not_in_body_1 = require("../spot/parameters-not-in-body");
|
|
7
|
+
const source_description_type_1 = require("../arazzo/source-description-type");
|
|
8
|
+
const version_enum_1 = require("../spot/version-enum");
|
|
9
|
+
const workflowId_unique_1 = require("./workflowId-unique");
|
|
10
|
+
const stepId_unique_1 = require("./stepId-unique");
|
|
11
|
+
const sourceDescriptions_name_unique_1 = require("./sourceDescriptions-name-unique");
|
|
12
|
+
const workflow_dependsOn_1 = require("./workflow-dependsOn");
|
|
13
|
+
const parameters_unique_1 = require("./parameters-unique");
|
|
14
|
+
const step_onSuccess_unique_1 = require("./step-onSuccess-unique");
|
|
15
|
+
const step_onFailure_unique_1 = require("./step-onFailure-unique");
|
|
16
|
+
const requestBody_replacements_unique_1 = require("./requestBody-replacements-unique");
|
|
7
17
|
exports.rules = {
|
|
8
18
|
spec: spec_1.Spec,
|
|
9
19
|
assertions: assertions_1.Assertions,
|
|
10
|
-
'parameters-
|
|
20
|
+
'parameters-not-in-body': parameters_not_in_body_1.ParametersNotInBody,
|
|
21
|
+
'sourceDescription-type': source_description_type_1.SourceDescriptionType,
|
|
22
|
+
'version-enum': version_enum_1.VersionEnum,
|
|
23
|
+
'workflowId-unique': workflowId_unique_1.WorkflowIdUnique,
|
|
24
|
+
'stepId-unique': stepId_unique_1.StepIdUnique,
|
|
25
|
+
'sourceDescription-name-unique': sourceDescriptions_name_unique_1.SourceDescriptionsNameUnique,
|
|
26
|
+
'workflow-dependsOn': workflow_dependsOn_1.WorkflowDependsOn,
|
|
27
|
+
'parameters-unique': parameters_unique_1.ParametersUnique,
|
|
28
|
+
'step-onSuccess-unique': step_onSuccess_unique_1.StepOnSuccessUnique,
|
|
29
|
+
'step-onFailure-unique': step_onFailure_unique_1.StepOnFailureUnique,
|
|
30
|
+
'requestBody-replacements-unique': requestBody_replacements_unique_1.RequestBodyReplacementsUnique,
|
|
11
31
|
};
|
|
12
32
|
exports.preprocessors = {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParametersUnique = void 0;
|
|
4
|
+
const ParametersUnique = () => {
|
|
5
|
+
return {
|
|
6
|
+
Parameters: {
|
|
7
|
+
enter(parameters, { report, location }) {
|
|
8
|
+
if (!parameters)
|
|
9
|
+
return;
|
|
10
|
+
const seenParameters = new Set();
|
|
11
|
+
for (const parameter of parameters) {
|
|
12
|
+
if (seenParameters.has(parameter?.name)) {
|
|
13
|
+
report({
|
|
14
|
+
message: 'The parameter `name` must be unique amongst listed parameters.',
|
|
15
|
+
location: location.child([parameters.indexOf(parameter)]),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (seenParameters.has(parameter?.reference)) {
|
|
19
|
+
report({
|
|
20
|
+
message: 'The parameter `reference` must be unique amongst listed parameters.',
|
|
21
|
+
location: location.child([parameters.indexOf(parameter)]),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
parameter?.name
|
|
25
|
+
? seenParameters.add(parameter.name)
|
|
26
|
+
: seenParameters.add(parameter.reference);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.ParametersUnique = ParametersUnique;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequestBodyReplacementsUnique = void 0;
|
|
4
|
+
const RequestBodyReplacementsUnique = () => {
|
|
5
|
+
const seenReplacements = new Set();
|
|
6
|
+
return {
|
|
7
|
+
RequestBody: {
|
|
8
|
+
enter(requestBody, { report, location }) {
|
|
9
|
+
if (!requestBody.replacements)
|
|
10
|
+
return;
|
|
11
|
+
for (const replacement of requestBody.replacements) {
|
|
12
|
+
if (seenReplacements.has(replacement.target)) {
|
|
13
|
+
report({
|
|
14
|
+
message: 'Every `replacement` in `requestBody` must be unique.',
|
|
15
|
+
location: location.child([
|
|
16
|
+
'replacements',
|
|
17
|
+
requestBody.replacements.indexOf(replacement),
|
|
18
|
+
`target`,
|
|
19
|
+
]),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
seenReplacements.add(replacement.target);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.RequestBodyReplacementsUnique = RequestBodyReplacementsUnique;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SourceDescriptionType = void 0;
|
|
4
|
+
const SourceDescriptionType = () => {
|
|
5
|
+
return {
|
|
6
|
+
SourceDescriptions: {
|
|
7
|
+
enter(SourceDescriptions, { report, location }) {
|
|
8
|
+
for (const sourceDescription of SourceDescriptions) {
|
|
9
|
+
if (!['openapi', 'arazzo'].includes(sourceDescription?.type)) {
|
|
10
|
+
report({
|
|
11
|
+
message: 'The `type` property of the `sourceDescription` object must be either `openapi` or `arazzo`.',
|
|
12
|
+
location: location.child([SourceDescriptions.indexOf(sourceDescription)]),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
exports.SourceDescriptionType = SourceDescriptionType;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SourceDescriptionsNameUnique = void 0;
|
|
4
|
+
const SourceDescriptionsNameUnique = () => {
|
|
5
|
+
const seenSourceDescriptions = new Set();
|
|
6
|
+
return {
|
|
7
|
+
SourceDescriptions: {
|
|
8
|
+
enter(sourceDescriptions, { report, location }) {
|
|
9
|
+
if (!sourceDescriptions.length)
|
|
10
|
+
return;
|
|
11
|
+
for (const sourceDescription of sourceDescriptions) {
|
|
12
|
+
if (seenSourceDescriptions.has(sourceDescription.name)) {
|
|
13
|
+
report({
|
|
14
|
+
message: 'The `name` must be unique amongst all SourceDescriptions.',
|
|
15
|
+
location: location.child([sourceDescriptions.indexOf(sourceDescription)]),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
seenSourceDescriptions.add(sourceDescription.name);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
exports.SourceDescriptionsNameUnique = SourceDescriptionsNameUnique;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StepOnFailureUnique = void 0;
|
|
4
|
+
const StepOnFailureUnique = () => {
|
|
5
|
+
return {
|
|
6
|
+
OnFailureActionList: {
|
|
7
|
+
enter(onFailureActionList, { report, location }) {
|
|
8
|
+
if (!onFailureActionList)
|
|
9
|
+
return;
|
|
10
|
+
const seenFailureActions = new Set();
|
|
11
|
+
for (const onFailureAction of onFailureActionList) {
|
|
12
|
+
if (seenFailureActions.has(onFailureAction?.name)) {
|
|
13
|
+
report({
|
|
14
|
+
message: 'The action `name` must be unique amongst listed `onFailure` actions.',
|
|
15
|
+
location: location.child([onFailureActionList.indexOf(onFailureAction)]),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (seenFailureActions.has(onFailureAction?.reference)) {
|
|
19
|
+
report({
|
|
20
|
+
message: 'The action `reference` must be unique amongst listed `onFailure` actions.',
|
|
21
|
+
location: location.child([onFailureActionList.indexOf(onFailureAction)]),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
onFailureAction?.name
|
|
25
|
+
? seenFailureActions.add(onFailureAction.name)
|
|
26
|
+
: seenFailureActions.add(onFailureAction.reference);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.StepOnFailureUnique = StepOnFailureUnique;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StepOnSuccessUnique = void 0;
|
|
4
|
+
const StepOnSuccessUnique = () => {
|
|
5
|
+
return {
|
|
6
|
+
OnSuccessActionList: {
|
|
7
|
+
enter(onSuccessActionList, { report, location }) {
|
|
8
|
+
if (!onSuccessActionList)
|
|
9
|
+
return;
|
|
10
|
+
const seenSuccessActions = new Set();
|
|
11
|
+
for (const onSuccessAction of onSuccessActionList) {
|
|
12
|
+
if (seenSuccessActions.has(onSuccessAction?.name)) {
|
|
13
|
+
report({
|
|
14
|
+
message: 'The action `name` must be unique amongst listed `onSuccess` actions.',
|
|
15
|
+
location: location.child([onSuccessActionList.indexOf(onSuccessAction)]),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (seenSuccessActions.has(onSuccessAction?.reference)) {
|
|
19
|
+
report({
|
|
20
|
+
message: 'The action `reference` must be unique amongst listed `onSuccess` actions.',
|
|
21
|
+
location: location.child([onSuccessActionList.indexOf(onSuccessAction)]),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
onSuccessAction?.name
|
|
25
|
+
? seenSuccessActions.add(onSuccessAction.name)
|
|
26
|
+
: seenSuccessActions.add(onSuccessAction.reference);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.StepOnSuccessUnique = StepOnSuccessUnique;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StepIdUnique = void 0;
|
|
4
|
+
const StepIdUnique = () => {
|
|
5
|
+
return {
|
|
6
|
+
Workflow: {
|
|
7
|
+
enter(workflow, { report, location }) {
|
|
8
|
+
if (!workflow.steps)
|
|
9
|
+
return;
|
|
10
|
+
const seenSteps = new Set();
|
|
11
|
+
for (const step of workflow.steps) {
|
|
12
|
+
if (!step.stepId)
|
|
13
|
+
return;
|
|
14
|
+
if (seenSteps.has(step.stepId)) {
|
|
15
|
+
report({
|
|
16
|
+
message: 'The `stepId` must be unique amongst all steps described in the workflow.',
|
|
17
|
+
location: location.child(['steps', workflow.steps.indexOf(step)]),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
seenSteps.add(step.stepId);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.StepIdUnique = StepIdUnique;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowDependsOn = void 0;
|
|
4
|
+
const WorkflowDependsOn = () => {
|
|
5
|
+
const seenWorkflow = new Set();
|
|
6
|
+
const existingSourceDescriptions = new Set();
|
|
7
|
+
const existingWorkflowIds = new Set();
|
|
8
|
+
return {
|
|
9
|
+
SourceDescriptions: {
|
|
10
|
+
enter(sourceDescriptions) {
|
|
11
|
+
for (const sourceDescription of sourceDescriptions) {
|
|
12
|
+
existingSourceDescriptions.add(sourceDescription.name);
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
Workflows: {
|
|
17
|
+
enter(workflows) {
|
|
18
|
+
for (const workflow of workflows) {
|
|
19
|
+
existingWorkflowIds.add(workflow.workflowId);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
Workflow: {
|
|
24
|
+
leave(workflow, { report, location }) {
|
|
25
|
+
if (!workflow.dependsOn)
|
|
26
|
+
return;
|
|
27
|
+
for (const item of workflow.dependsOn) {
|
|
28
|
+
// Possible dependsOn workflow pattern: $sourceDescriptions.<name>.<workflowId>
|
|
29
|
+
if (item.startsWith('$sourceDescriptions.')) {
|
|
30
|
+
const sourceDescriptionName = item.split('.')[1];
|
|
31
|
+
if (!existingSourceDescriptions.has(sourceDescriptionName)) {
|
|
32
|
+
report({
|
|
33
|
+
message: `SourceDescription ${sourceDescriptionName} must be defined in sourceDescriptions.`,
|
|
34
|
+
location: location.child([`dependsOn`, workflow.dependsOn.indexOf(item)]),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!item.startsWith('$sourceDescriptions') && !existingWorkflowIds.has(item)) {
|
|
39
|
+
report({
|
|
40
|
+
message: `Workflow ${item} must be defined in workflows.`,
|
|
41
|
+
location: location.child([`dependsOn`, workflow.dependsOn.indexOf(item)]),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (seenWorkflow.has(item)) {
|
|
45
|
+
report({
|
|
46
|
+
message: 'Every workflow in dependsOn must be unique.',
|
|
47
|
+
location: location.child([`dependsOn`]),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
seenWorkflow.add(item);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
exports.WorkflowDependsOn = WorkflowDependsOn;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowIdUnique = void 0;
|
|
4
|
+
const WorkflowIdUnique = () => {
|
|
5
|
+
const seenWorkflow = new Set();
|
|
6
|
+
return {
|
|
7
|
+
Workflow: {
|
|
8
|
+
enter(workflow, { report, location }) {
|
|
9
|
+
if (!workflow.workflowId)
|
|
10
|
+
return;
|
|
11
|
+
if (seenWorkflow.has(workflow.workflowId)) {
|
|
12
|
+
report({
|
|
13
|
+
message: 'Every workflow must have a unique `workflowId`.',
|
|
14
|
+
location: location.child([workflow.workflowId]),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
seenWorkflow.add(workflow.workflowId);
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.WorkflowIdUnique = WorkflowIdUnique;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
3
|
+
exports.ParametersNotInBody = void 0;
|
|
4
|
+
const ParametersNotInBody = () => {
|
|
5
5
|
return {
|
|
6
6
|
Parameter: {
|
|
7
7
|
enter(parameter, { report, location }) {
|
|
@@ -15,4 +15,4 @@ const ParametersNoBodyInsideIn = () => {
|
|
|
15
15
|
},
|
|
16
16
|
};
|
|
17
17
|
};
|
|
18
|
-
exports.
|
|
18
|
+
exports.ParametersNotInBody = ParametersNotInBody;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VersionEnum = void 0;
|
|
4
|
+
const arazzo_1 = require("../../typings/arazzo");
|
|
5
|
+
const utils_1 = require("../../utils");
|
|
6
|
+
const VersionEnum = () => {
|
|
7
|
+
const supportedVersions = arazzo_1.ARAZZO_VERSIONS_SUPPORTED_BY_SPOT.join(', ');
|
|
8
|
+
return {
|
|
9
|
+
Root: {
|
|
10
|
+
enter(root, { report, location }) {
|
|
11
|
+
if (!arazzo_1.ARAZZO_VERSIONS_SUPPORTED_BY_SPOT.includes(root.arazzo)) {
|
|
12
|
+
report({
|
|
13
|
+
message: `Only ${supportedVersions} Arazzo ${(0, utils_1.pluralize)('version is', arazzo_1.ARAZZO_VERSIONS_SUPPORTED_BY_SPOT.length)} supported by Spot.`,
|
|
14
|
+
location: location.child('arazzo'),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
exports.VersionEnum = VersionEnum;
|
package/lib/types/arazzo.js
CHANGED
|
@@ -6,7 +6,7 @@ const oas3_1_1 = require("./oas3_1");
|
|
|
6
6
|
const oas3_1 = require("./oas3");
|
|
7
7
|
const Root = {
|
|
8
8
|
properties: {
|
|
9
|
-
arazzo: { type: 'string'
|
|
9
|
+
arazzo: { type: 'string' },
|
|
10
10
|
info: 'Info',
|
|
11
11
|
sourceDescriptions: 'SourceDescriptions',
|
|
12
12
|
'x-parameters': 'Parameters',
|
|
@@ -93,9 +93,7 @@ const ArazzoSourceDescription = {
|
|
|
93
93
|
const ReusableObject = {
|
|
94
94
|
properties: {
|
|
95
95
|
reference: { type: 'string' },
|
|
96
|
-
value: {
|
|
97
|
-
type: 'string',
|
|
98
|
-
},
|
|
96
|
+
value: {}, // any
|
|
99
97
|
},
|
|
100
98
|
required: ['reference'],
|
|
101
99
|
extensionsPrefix: 'x-',
|
|
@@ -112,11 +110,11 @@ const Parameter = {
|
|
|
112
110
|
const Parameters = {
|
|
113
111
|
properties: {},
|
|
114
112
|
items: (value) => {
|
|
115
|
-
if (value?.
|
|
116
|
-
return '
|
|
113
|
+
if (value?.reference) {
|
|
114
|
+
return 'ReusableObject';
|
|
117
115
|
}
|
|
118
116
|
else {
|
|
119
|
-
return '
|
|
117
|
+
return 'Parameter';
|
|
120
118
|
}
|
|
121
119
|
},
|
|
122
120
|
};
|
|
@@ -127,7 +125,7 @@ const Workflow = {
|
|
|
127
125
|
description: { type: 'string' },
|
|
128
126
|
parameters: 'Parameters',
|
|
129
127
|
dependsOn: { type: 'array', items: { type: 'string' } },
|
|
130
|
-
inputs: '
|
|
128
|
+
inputs: 'Schema',
|
|
131
129
|
outputs: 'Outputs',
|
|
132
130
|
steps: 'Steps',
|
|
133
131
|
successActions: 'OnSuccessActionList',
|
|
@@ -242,7 +240,7 @@ const SuccessActionObject = {
|
|
|
242
240
|
type: { type: 'string', enum: ['goto', 'end'] },
|
|
243
241
|
stepId: { type: 'string' },
|
|
244
242
|
workflowId: { type: 'string' },
|
|
245
|
-
criteria: 'CriterionObject',
|
|
243
|
+
criteria: (0, _1.listOf)('CriterionObject'),
|
|
246
244
|
},
|
|
247
245
|
required: ['type', 'name'],
|
|
248
246
|
};
|
|
@@ -265,7 +263,7 @@ const FailureActionObject = {
|
|
|
265
263
|
stepId: { type: 'string' },
|
|
266
264
|
retryAfter: { type: 'number' },
|
|
267
265
|
retryLimit: { type: 'number' },
|
|
268
|
-
criteria: 'CriterionObject',
|
|
266
|
+
criteria: (0, _1.listOf)('CriterionObject'),
|
|
269
267
|
},
|
|
270
268
|
required: ['type', 'name'],
|
|
271
269
|
};
|
|
@@ -11,7 +11,7 @@ declare const builtInAsync2Rules: readonly ["spec", "info-contact", "info-licens
|
|
|
11
11
|
declare const builtInAsync3Rules: readonly ["spec", "info-contact", "info-license-strict", "operation-operationId", "tag-description", "tags-alphabetical", "channels-kebab-case", "no-channel-trailing-slash"];
|
|
12
12
|
export type BuiltInAsync2RuleId = typeof builtInAsync2Rules[number];
|
|
13
13
|
export type BuiltInAsync3RuleId = typeof builtInAsync3Rules[number];
|
|
14
|
-
declare const builtInArazzoRules: readonly ["spec", "parameters-
|
|
14
|
+
declare const builtInArazzoRules: readonly ["spec", "parameters-not-in-body", "sourceDescription-type", "version-enum", "workflowId-unique", "stepId-unique", "sourceDescription-name-unique", "workflow-dependsOn", "parameters-unique", "step-onSuccess-unique", "step-onFailure-unique", "requestBody-replacements-unique"];
|
|
15
15
|
export type BuiltInArazzoRuleId = typeof builtInArazzoRules[number];
|
|
16
16
|
declare const oas2NodeTypesList: readonly ["Root", "Tag", "TagList", "ExternalDocs", "SecurityRequirement", "SecurityRequirementList", "Info", "Contact", "License", "Paths", "PathItem", "Parameter", "ParameterList", "ParameterItems", "Operation", "Example", "ExamplesMap", "Examples", "Header", "Responses", "Response", "Schema", "Xml", "SchemaProperties", "NamedSchemas", "NamedResponses", "NamedParameters", "NamedSecuritySchemes", "SecurityScheme", "TagGroup", "TagGroups", "EnumDescriptions", "Logo", "XCodeSample", "XCodeSampleList", "XServer", "XServerList"];
|
|
17
17
|
export type Oas2NodeType = typeof oas2NodeTypesList[number];
|
|
@@ -93,7 +93,20 @@ const builtInAsync3Rules = [
|
|
|
93
93
|
'channels-kebab-case',
|
|
94
94
|
'no-channel-trailing-slash',
|
|
95
95
|
];
|
|
96
|
-
const builtInArazzoRules = [
|
|
96
|
+
const builtInArazzoRules = [
|
|
97
|
+
'spec',
|
|
98
|
+
'parameters-not-in-body',
|
|
99
|
+
'sourceDescription-type',
|
|
100
|
+
'version-enum',
|
|
101
|
+
'workflowId-unique',
|
|
102
|
+
'stepId-unique',
|
|
103
|
+
'sourceDescription-name-unique',
|
|
104
|
+
'workflow-dependsOn',
|
|
105
|
+
'parameters-unique',
|
|
106
|
+
'step-onSuccess-unique',
|
|
107
|
+
'step-onFailure-unique',
|
|
108
|
+
'requestBody-replacements-unique',
|
|
109
|
+
];
|
|
97
110
|
const builtInRules = [
|
|
98
111
|
...builtInCommonOASRules,
|
|
99
112
|
...builtInOAS2Rules,
|
package/lib/typings/arazzo.d.ts
CHANGED
package/lib/typings/arazzo.js
CHANGED
package/lib/utils.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare function pushStack<T, P extends Stack<T> = Stack<T>>(head: P, val
|
|
|
12
12
|
prev: P;
|
|
13
13
|
value: T;
|
|
14
14
|
};
|
|
15
|
+
export declare function pluralize(sentence: string, count?: number, inclusive?: boolean): string;
|
|
15
16
|
export declare function popStack<T, P extends Stack<T>>(head: P): StackFrame<T> | null;
|
|
16
17
|
export type BundleOutputFormat = 'json' | 'yml' | 'yaml';
|
|
17
18
|
export declare function loadYaml<T>(filename: string): Promise<T>;
|