@redocly/openapi-core 1.21.0 → 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.
Files changed (72) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/lib/config/all.js +14 -1
  3. package/lib/config/minimal.js +11 -1
  4. package/lib/config/recommended-strict.js +11 -1
  5. package/lib/config/recommended.js +11 -1
  6. package/lib/oas-types.js +2 -1
  7. package/lib/rules/arazzo/index.js +22 -2
  8. package/lib/rules/arazzo/parameters-unique.d.ts +2 -0
  9. package/lib/rules/arazzo/parameters-unique.js +32 -0
  10. package/lib/rules/arazzo/requestBody-replacements-unique.d.ts +2 -0
  11. package/lib/rules/arazzo/requestBody-replacements-unique.js +28 -0
  12. package/lib/rules/arazzo/source-description-type.d.ts +2 -0
  13. package/lib/rules/arazzo/source-description-type.js +20 -0
  14. package/lib/rules/arazzo/sourceDescriptions-name-unique.d.ts +2 -0
  15. package/lib/rules/arazzo/sourceDescriptions-name-unique.js +24 -0
  16. package/lib/rules/arazzo/step-onFailure-unique.d.ts +2 -0
  17. package/lib/rules/arazzo/step-onFailure-unique.js +32 -0
  18. package/lib/rules/arazzo/step-onSuccess-unique.d.ts +2 -0
  19. package/lib/rules/arazzo/step-onSuccess-unique.js +32 -0
  20. package/lib/rules/arazzo/stepId-unique.d.ts +2 -0
  21. package/lib/rules/arazzo/stepId-unique.js +26 -0
  22. package/lib/rules/arazzo/workflow-dependsOn.d.ts +2 -0
  23. package/lib/rules/arazzo/workflow-dependsOn.js +56 -0
  24. package/lib/rules/arazzo/workflowId-unique.d.ts +2 -0
  25. package/lib/rules/arazzo/workflowId-unique.js +22 -0
  26. package/lib/rules/spot/parameters-not-in-body.d.ts +2 -0
  27. package/lib/rules/spot/{parameters-no-body-inside-in.js → parameters-not-in-body.js} +3 -3
  28. package/lib/rules/spot/version-enum.d.ts +2 -0
  29. package/lib/rules/spot/version-enum.js +21 -0
  30. package/lib/types/arazzo.js +8 -10
  31. package/lib/types/redocly-yaml.d.ts +1 -1
  32. package/lib/types/redocly-yaml.js +14 -1
  33. package/lib/typings/arazzo.d.ts +2 -0
  34. package/lib/typings/arazzo.js +3 -0
  35. package/lib/utils.d.ts +1 -0
  36. package/lib/utils.js +8 -0
  37. package/package.json +2 -2
  38. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +22 -2
  39. package/src/config/all.ts +14 -1
  40. package/src/config/minimal.ts +11 -1
  41. package/src/config/recommended-strict.ts +11 -1
  42. package/src/config/recommended.ts +11 -1
  43. package/src/oas-types.ts +2 -1
  44. package/src/rules/arazzo/__tests__/{parameters-no-body-inside-in.test.ts → parameters-not-in-body.test.ts} +3 -5
  45. package/src/rules/arazzo/__tests__/parameters-unique.test.ts +114 -0
  46. package/src/rules/arazzo/__tests__/requestBody-replacements-unique.test.ts +109 -0
  47. package/src/rules/arazzo/__tests__/source-description-type.test.ts +80 -0
  48. package/src/rules/arazzo/__tests__/sourceDescription-name-unique.test.ts +79 -0
  49. package/src/rules/arazzo/__tests__/step-onFailure-unique.test.ts +111 -0
  50. package/src/rules/arazzo/__tests__/step-onSuccess-unique.test.ts +111 -0
  51. package/src/rules/arazzo/__tests__/stepId-unique.test.ts +95 -0
  52. package/src/rules/arazzo/__tests__/version-enum.test.ts +76 -0
  53. package/src/rules/arazzo/__tests__/workflow-dependsOn.test.ts +212 -0
  54. package/src/rules/arazzo/__tests__/workflowId-unique.test.ts +90 -0
  55. package/src/rules/arazzo/index.ts +22 -2
  56. package/src/rules/arazzo/parameters-unique.ts +33 -0
  57. package/src/rules/arazzo/requestBody-replacements-unique.ts +28 -0
  58. package/src/rules/arazzo/source-description-type.ts +20 -0
  59. package/src/rules/arazzo/sourceDescriptions-name-unique.ts +23 -0
  60. package/src/rules/arazzo/step-onFailure-unique.ts +33 -0
  61. package/src/rules/arazzo/step-onSuccess-unique.ts +33 -0
  62. package/src/rules/arazzo/stepId-unique.ts +24 -0
  63. package/src/rules/arazzo/workflow-dependsOn.ts +56 -0
  64. package/src/rules/arazzo/workflowId-unique.ts +21 -0
  65. package/src/rules/spot/{parameters-no-body-inside-in.ts → parameters-not-in-body.ts} +1 -1
  66. package/src/rules/spot/version-enum.ts +24 -0
  67. package/src/types/arazzo.ts +8 -10
  68. package/src/types/redocly-yaml.ts +14 -1
  69. package/src/typings/arazzo.ts +4 -0
  70. package/src/utils.ts +8 -0
  71. package/tsconfig.tsbuildinfo +1 -1
  72. package/lib/rules/spot/parameters-no-body-inside-in.d.ts +0 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
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
+
14
+ ## 1.21.1
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated @redocly/config to v0.10.0.
19
+
3
20
  ## 1.21.0
4
21
 
5
22
  ## 1.20.1
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: { spec: 'error', 'parameters-no-body-inside-in': 'off' },
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;
@@ -110,7 +110,17 @@ const minimal = {
110
110
  },
111
111
  arazzoRules: {
112
112
  spec: 'error',
113
- 'parameters-no-body-inside-in': 'off',
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-no-body-inside-in': 'off',
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-no-body-inside-in': 'off',
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' && root.arazzo.startsWith('1.')) {
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 parameters_no_body_inside_in_1 = require("../spot/parameters-no-body-inside-in");
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-no-body-inside-in': parameters_no_body_inside_in_1.ParametersNoBodyInsideIn,
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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const ParametersUnique: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const RequestBodyReplacementsUnique: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const SourceDescriptionType: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const SourceDescriptionsNameUnique: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const StepOnFailureUnique: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const StepOnSuccessUnique: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const StepIdUnique: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const WorkflowDependsOn: ArazzoRule;
@@ -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,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const WorkflowIdUnique: ArazzoRule;
@@ -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;
@@ -0,0 +1,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const ParametersNotInBody: ArazzoRule;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ParametersNoBodyInsideIn = void 0;
4
- const ParametersNoBodyInsideIn = () => {
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.ParametersNoBodyInsideIn = ParametersNoBodyInsideIn;
18
+ exports.ParametersNotInBody = ParametersNotInBody;
@@ -0,0 +1,2 @@
1
+ import type { ArazzoRule } from '../../visitors';
2
+ export declare const VersionEnum: ArazzoRule;
@@ -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;
@@ -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', enum: ['1.0.0'] },
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?.in) {
116
- return 'Parameter';
113
+ if (value?.reference) {
114
+ return 'ReusableObject';
117
115
  }
118
116
  else {
119
- return 'ReusableObject';
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: 'NamedInputs',
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-no-body-inside-in"];
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 = ['spec', 'parameters-no-body-inside-in'];
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,
@@ -146,3 +146,5 @@ export interface ArazzoDefinition {
146
146
  };
147
147
  };
148
148
  }
149
+ export declare const VERSION_PATTERN: RegExp;
150
+ export declare const ARAZZO_VERSIONS_SUPPORTED_BY_SPOT: string[];
@@ -1,2 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ARAZZO_VERSIONS_SUPPORTED_BY_SPOT = exports.VERSION_PATTERN = void 0;
4
+ exports.VERSION_PATTERN = /^1\.0\.\d+(-.+)?$/;
5
+ exports.ARAZZO_VERSIONS_SUPPORTED_BY_SPOT = ['1.0.0'];
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>;