@redocly/openapi-core 1.26.1 → 1.27.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 (38) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/lib/config/all.js +2 -3
  3. package/lib/config/minimal.js +1 -2
  4. package/lib/config/recommended-strict.js +2 -3
  5. package/lib/config/recommended.js +2 -3
  6. package/lib/config/rules.js +3 -0
  7. package/lib/config/spec.js +2 -3
  8. package/lib/config/types.d.ts +2 -3
  9. package/lib/rules/arazzo/index.js +2 -4
  10. package/lib/rules/spot/spot-supported-versions.d.ts +2 -0
  11. package/lib/rules/spot/{version-enum.js → spot-supported-versions.js} +3 -3
  12. package/lib/types/redocly-yaml.d.ts +1 -1
  13. package/lib/types/redocly-yaml.js +1 -2
  14. package/lib/visitors.d.ts +3 -0
  15. package/lib/visitors.js +2 -2
  16. package/lib/walk.js +14 -11
  17. package/package.json +1 -1
  18. package/src/__tests__/walk.test.ts +51 -0
  19. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +4 -6
  20. package/src/config/all.ts +2 -3
  21. package/src/config/minimal.ts +1 -2
  22. package/src/config/recommended-strict.ts +2 -3
  23. package/src/config/recommended.ts +2 -3
  24. package/src/config/rules.ts +3 -1
  25. package/src/config/spec.ts +2 -3
  26. package/src/config/types.ts +2 -6
  27. package/src/rules/arazzo/__tests__/{version-enum.test.ts → spot-supported-versions.test.ts} +3 -3
  28. package/src/rules/arazzo/index.ts +2 -4
  29. package/src/rules/spot/{version-enum.ts → spot-supported-versions.ts} +1 -1
  30. package/src/types/redocly-yaml.ts +1 -2
  31. package/src/visitors.ts +5 -2
  32. package/src/walk.ts +20 -11
  33. package/tsconfig.tsbuildinfo +1 -1
  34. package/lib/rules/spot/parameters-not-in-body.d.ts +0 -2
  35. package/lib/rules/spot/parameters-not-in-body.js +0 -18
  36. package/lib/rules/spot/version-enum.d.ts +0 -2
  37. package/src/rules/arazzo/__tests__/parameters-not-in-body.test.ts +0 -73
  38. package/src/rules/spot/parameters-not-in-body.ts +0 -17
@@ -1,9 +1,8 @@
1
1
  import { Struct } from '../common/struct';
2
2
  import { Assertions } from '../common/assertions';
3
- import { ParametersNotInBody } from '../spot/parameters-not-in-body';
4
3
  import { SourceDescriptionType } from '../arazzo/sourceDescription-type';
5
4
  import { SourceDescriptionsNotEmpty } from './sourceDescriptions-not-empty';
6
- import { VersionEnum } from '../spot/version-enum';
5
+ import { SpotSupportedVersions } from '../spot/spot-supported-versions';
7
6
  import { WorkflowIdUnique } from './workflowId-unique';
8
7
  import { StepIdUnique } from './stepId-unique';
9
8
  import { SourceDescriptionsNameUnique } from './sourceDescriptions-name-unique';
@@ -21,9 +20,8 @@ import type { Arazzo1RuleSet } from '../../oas-types';
21
20
  export const rules: Arazzo1RuleSet<'built-in'> = {
22
21
  struct: Struct as Arazzo1Rule,
23
22
  assertions: Assertions as Arazzo1Rule,
24
- 'parameters-not-in-body': ParametersNotInBody,
25
23
  'sourceDescription-type': SourceDescriptionType,
26
- 'version-enum': VersionEnum,
24
+ 'spot-supported-versions': SpotSupportedVersions,
27
25
  'workflowId-unique': WorkflowIdUnique,
28
26
  'stepId-unique': StepIdUnique,
29
27
  'sourceDescription-name-unique': SourceDescriptionsNameUnique,
@@ -4,7 +4,7 @@ import { pluralize } from '../../utils';
4
4
  import type { Arazzo1Rule } from '../../visitors';
5
5
  import type { UserContext } from '../../walk';
6
6
 
7
- export const VersionEnum: Arazzo1Rule = () => {
7
+ export const SpotSupportedVersions: Arazzo1Rule = () => {
8
8
  const supportedVersions = ARAZZO_VERSIONS_SUPPORTED_BY_SPOT.join(', ');
9
9
  return {
10
10
  Root: {
@@ -141,9 +141,7 @@ export type BuiltInAsync2RuleId = typeof builtInAsync2Rules[number];
141
141
  export type BuiltInAsync3RuleId = typeof builtInAsync3Rules[number];
142
142
 
143
143
  const builtInArazzo1Rules = [
144
- 'parameters-not-in-body',
145
144
  'sourceDescription-type',
146
- 'version-enum',
147
145
  'workflowId-unique',
148
146
  'stepId-unique',
149
147
  'sourceDescription-name-unique',
@@ -152,6 +150,7 @@ const builtInArazzo1Rules = [
152
150
  'parameters-unique',
153
151
  'step-onSuccess-unique',
154
152
  'step-onFailure-unique',
153
+ 'spot-supported-versions',
155
154
  'requestBody-replacements-unique',
156
155
  'no-criteria-xpath',
157
156
  'criteria-unique',
package/src/visitors.ts CHANGED
@@ -97,6 +97,7 @@ type VisitFunctionOrObject<T> = VisitFunction<T> | VisitObject<T>;
97
97
  export type VisitorNode<T> = {
98
98
  ruleId: string;
99
99
  severity: ProblemSeverity;
100
+ message?: string;
100
101
  context: VisitorLevelContext | VisitorSkippedLevelContext;
101
102
  depth: number;
102
103
  visit: VisitFunction<T>;
@@ -106,6 +107,7 @@ export type VisitorNode<T> = {
106
107
  type VisitorRefNode = {
107
108
  ruleId: string;
108
109
  severity: ProblemSeverity;
110
+ message?: string;
109
111
  context: VisitorLevelContext;
110
112
  depth: number;
111
113
  visit: VisitRefFunction;
@@ -365,6 +367,7 @@ export type OasDecorator = Oas3Decorator;
365
367
  export type RuleInstanceConfig = {
366
368
  ruleId: string;
367
369
  severity: ProblemSeverity;
370
+ message?: string;
368
371
  };
369
372
 
370
373
  export function normalizeVisitors<T extends BaseVisitor>(
@@ -390,8 +393,8 @@ export function normalizeVisitors<T extends BaseVisitor>(
390
393
  leave: [],
391
394
  };
392
395
 
393
- for (const { ruleId, severity, visitor } of visitorsConfig) {
394
- normalizeVisitorLevel({ ruleId, severity }, visitor, null);
396
+ for (const { ruleId, severity, message, visitor } of visitorsConfig) {
397
+ normalizeVisitorLevel({ ruleId, severity, message }, visitor, null);
395
398
  }
396
399
 
397
400
  for (const v of Object.keys(normalizedVisitors)) {
package/src/walk.ts CHANGED
@@ -165,9 +165,9 @@ export function walkDocument<T extends BaseVisitor>(opts: {
165
165
 
166
166
  if (isRef(node)) {
167
167
  const refEnterVisitors = normalizedVisitors.ref.enter;
168
- for (const { visit: visitor, ruleId, severity, context } of refEnterVisitors) {
168
+ for (const { visit: visitor, ruleId, severity, message, context } of refEnterVisitors) {
169
169
  enteredContexts.add(context);
170
- const report = reportFn.bind(undefined, ruleId, severity);
170
+ const report = reportFn.bind(undefined, ruleId, severity, message);
171
171
  visitor(
172
172
  node,
173
173
  {
@@ -203,7 +203,7 @@ export function walkDocument<T extends BaseVisitor>(opts: {
203
203
 
204
204
  const activatedContexts: Array<VisitorSkippedLevelContext | VisitorLevelContext> = [];
205
205
 
206
- for (const { context, visit, skip, ruleId, severity } of currentEnterVisitors) {
206
+ for (const { context, visit, skip, ruleId, severity, message } of currentEnterVisitors) {
207
207
  if (ignoredNodes.has(`${currentLocation.absolutePointer}${currentLocation.pointer}`)) break;
208
208
 
209
209
  if (context.isSkippedLevel) {
@@ -258,7 +258,7 @@ export function walkDocument<T extends BaseVisitor>(opts: {
258
258
  if (!activatedOn.skipped) {
259
259
  visitedBySome = true;
260
260
  enteredContexts.add(context);
261
- visitWithContext(visit, resolvedNode, node, context, ruleId, severity);
261
+ visitWithContext(visit, resolvedNode, node, context, ruleId, severity, message);
262
262
  }
263
263
  }
264
264
  }
@@ -360,9 +360,9 @@ export function walkDocument<T extends BaseVisitor>(opts: {
360
360
  }
361
361
  }
362
362
 
363
- for (const { context, visit, ruleId, severity } of currentLeaveVisitors) {
363
+ for (const { context, visit, ruleId, severity, message } of currentLeaveVisitors) {
364
364
  if (!context.isSkippedLevel && enteredContexts.has(context)) {
365
- visitWithContext(visit, resolvedNode, node, context, ruleId, severity);
365
+ visitWithContext(visit, resolvedNode, node, context, ruleId, severity, message);
366
366
  }
367
367
  }
368
368
  }
@@ -371,9 +371,9 @@ export function walkDocument<T extends BaseVisitor>(opts: {
371
371
 
372
372
  if (isRef(node)) {
373
373
  const refLeaveVisitors = normalizedVisitors.ref.leave;
374
- for (const { visit: visitor, ruleId, severity, context } of refLeaveVisitors) {
374
+ for (const { visit: visitor, ruleId, severity, context, message } of refLeaveVisitors) {
375
375
  if (enteredContexts.has(context)) {
376
- const report = reportFn.bind(undefined, ruleId, severity);
376
+ const report = reportFn.bind(undefined, ruleId, severity, message);
377
377
  visitor(
378
378
  node,
379
379
  {
@@ -402,9 +402,10 @@ export function walkDocument<T extends BaseVisitor>(opts: {
402
402
  node: unknown,
403
403
  context: VisitorLevelContext,
404
404
  ruleId: string,
405
- severity: ProblemSeverity
405
+ severity: ProblemSeverity,
406
+ customMessage: string | undefined
406
407
  ) {
407
- const report = reportFn.bind(undefined, ruleId, severity);
408
+ const report = reportFn.bind(undefined, ruleId, severity, customMessage);
408
409
  visit(
409
410
  resolvedNode,
410
411
  {
@@ -428,7 +429,12 @@ export function walkDocument<T extends BaseVisitor>(opts: {
428
429
  );
429
430
  }
430
431
 
431
- function reportFn(ruleId: string, severity: ProblemSeverity, opts: Problem) {
432
+ function reportFn(
433
+ ruleId: string,
434
+ severity: ProblemSeverity,
435
+ customMessage: string,
436
+ opts: Problem
437
+ ) {
432
438
  const normalizedLocation = opts.location
433
439
  ? Array.isArray(opts.location)
434
440
  ? opts.location
@@ -445,6 +451,9 @@ export function walkDocument<T extends BaseVisitor>(opts: {
445
451
  ruleId: opts.ruleId || ruleId,
446
452
  severity: ruleSeverity,
447
453
  ...opts,
454
+ message: customMessage
455
+ ? customMessage.replace('{{message}}', opts.message)
456
+ : opts.message,
448
457
  suggest: opts.suggest || [],
449
458
  location,
450
459
  });