Skip to content

Commit ea7fc15

Browse files
authored
fix(asyncapi-2-1): fix parsing of Operation.message field (#561)
Co-authored-by: frantuma <frantuma@yahoo.com> Refs #543 Refs asyncapi/spec#603
1 parent eb10719 commit ea7fc15

File tree

11 files changed

+4063
-4132
lines changed

11 files changed

+4063
-4132
lines changed

apidom/packages/apidom-ls/test/openapi-json-async.ts renamed to apidom/packages/apidom-ls/test/asyncapi-json.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,8 @@ describe('apidom-ls-async', function () {
394394
1,
395395
10,
396396
9,
397-
35,
398-
64,
397+
22,
398+
0,
399399
1,
400400
12,
401401
6,

apidom/packages/apidom-ls/test/openapi-yaml-async.ts renamed to apidom/packages/apidom-ls/test/asyncapi-yaml.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,8 @@ describe('apidom-ls-async-yaml', function () {
350350
1,
351351
8,
352352
7,
353-
35,
354-
64,
353+
22,
354+
0,
355355
1,
356356
10,
357357
4,

apidom/packages/apidom-ns-asyncapi-2/src/elements/Operation.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ObjectElement, StringElement, ArrayElement } from 'apidom';
44
import TagsElement from './Tags';
55
import ExternalDocumentationElement from './ExternalDocumentation';
66
import OperationBindingsElement from './OperationBindings';
7+
import MessageElement from './Message';
78
import ReferenceElement from './Reference';
89

910
class Operation extends ObjectElement {
@@ -68,11 +69,11 @@ class Operation extends ObjectElement {
6869
this.set('traits', traits);
6970
}
7071

71-
get message(): ArrayElement | undefined {
72+
get message(): MessageElement | ReferenceElement | ObjectElement | undefined {
7273
return this.get('message');
7374
}
7475

75-
set message(message: ArrayElement | undefined) {
76+
set message(message: MessageElement | ReferenceElement | ObjectElement | undefined) {
7677
this.set('message', message);
7778
}
7879
}

apidom/packages/apidom-ns-asyncapi-2/src/refractor/visitors/async-api-2/operation/MessageVisitor.ts

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,35 @@
11
import stampit from 'stampit';
2-
import { ArrayElement, Element, BREAK } from 'apidom';
2+
import { ObjectElement, ArrayElement, isArrayElement, BREAK } from 'apidom';
33

44
import SpecificationVisitor from '../../SpecificationVisitor';
55
import FallbackVisitor from '../../FallbackVisitor';
66
import { isReferenceLikeElement } from '../../../predicates';
77

88
const MessageVisitor = stampit(SpecificationVisitor, FallbackVisitor, {
9-
init() {
10-
this.element = new ArrayElement();
11-
this.element.classes.push('operation-message');
12-
},
139
methods: {
14-
ArrayElement(arrayElement: ArrayElement) {
15-
arrayElement.forEach((item: Element) => {
16-
let element;
10+
ObjectElement(objectElement: ObjectElement) {
11+
if (isReferenceLikeElement(objectElement)) {
12+
this.element = this.toRefractedElement(['document', 'objects', 'Reference'], objectElement);
13+
} else if (isArrayElement(objectElement.get('oneOf'))) {
14+
this.element = new ArrayElement();
15+
this.element.classes.push('operation-message');
16+
17+
objectElement.get('oneOf').forEach((item: ObjectElement) => {
18+
let element;
1719

18-
if (isReferenceLikeElement(item)) {
19-
element = this.toRefractedElement(['document', 'objects', 'Reference'], item);
20-
element.setMetaProperty('referenced-element', 'message');
21-
} else {
22-
element = this.toRefractedElement(['document', 'objects', 'Message'], item);
23-
}
20+
if (isReferenceLikeElement(item)) {
21+
element = this.toRefractedElement(['document', 'objects', 'Reference'], item);
22+
} else {
23+
element = this.toRefractedElement(['document', 'objects', 'Message'], item);
24+
}
2425

25-
this.element.push(element);
26-
});
26+
this.element.push(element);
27+
});
28+
} else {
29+
this.element = this.toRefractedElement(['document', 'objects', 'Message'], objectElement);
30+
}
2731

28-
this.copyMetaAndAttributes(arrayElement, this.element);
32+
this.copyMetaAndAttributes(objectElement, this.element);
2933

3034
return BREAK;
3135
},

apidom/packages/apidom-ns-asyncapi-2/test/refractor/__snapshots__/index.ts.snap

Lines changed: 3713 additions & 3797 deletions
Large diffs are not rendered by default.

apidom/packages/apidom-ns-asyncapi-2/test/refractor/elements/Operation/__snapshots__/index.ts.snap

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,33 @@ exports[`refractor elements OperationElement given bindings field of type Refere
1717
(StringElement)))))
1818
`;
1919

20-
exports[`refractor elements OperationElement given message field contains list of type MessageElement should refract to semantic ApiDOM tree 1`] = `
20+
exports[`refractor elements OperationElement given message field of \`oneOf\` shape should refract to semantic ApiDOM tree 1`] = `
2121
(OperationElement
2222
(MemberElement
2323
(StringElement)
2424
(ArrayElement
25-
(MessageElement))))
25+
(MessageElement)
26+
(ReferenceElement
27+
(MemberElement
28+
(StringElement)
29+
(StringElement))))))
2630
`;
2731

28-
exports[`refractor elements OperationElement given message field contains list of type ReferenceElement should refract to semantic ApiDOM tree 1`] = `
32+
exports[`refractor elements OperationElement given message field of type MessageElement should refract to semantic ApiDOM tree 1`] = `
2933
(OperationElement
3034
(MemberElement
3135
(StringElement)
32-
(ArrayElement
33-
(ReferenceElement
34-
(MemberElement
35-
(StringElement)
36-
(StringElement))))))
36+
(MessageElement)))
37+
`;
38+
39+
exports[`refractor elements OperationElement given message field of type ReferenceElement should refract to semantic ApiDOM tree 1`] = `
40+
(OperationElement
41+
(MemberElement
42+
(StringElement)
43+
(ReferenceElement
44+
(MemberElement
45+
(StringElement)
46+
(StringElement)))))
3747
`;
3848

3949
exports[`refractor elements OperationElement given traits field contains list of type OperationTraitElement should refract to semantic ApiDOM tree 1`] = `

apidom/packages/apidom-ns-asyncapi-2/test/refractor/elements/Operation/index.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,24 +64,32 @@ describe('refractor', function () {
6464
});
6565
});
6666

67-
context('given message field contains list of type MessageElement', function () {
67+
context('given message field of type MessageElement', function () {
6868
specify('should refract to semantic ApiDOM tree', function () {
6969
const operationElement = OperationElement.refract({
70-
message: [{}],
70+
message: {},
7171
});
7272

7373
expect(sexprs(operationElement)).toMatchSnapshot();
7474
});
7575
});
7676

77-
context('given message field contains list of type ReferenceElement', function () {
77+
context('given message field of type ReferenceElement', function () {
7878
specify('should refract to semantic ApiDOM tree', function () {
7979
const operationElement = OperationElement.refract({
80-
message: [
81-
{
82-
$ref: '#/path/to/message',
83-
},
84-
],
80+
message: { $ref: '#/path/to/message' },
81+
});
82+
83+
expect(sexprs(operationElement)).toMatchSnapshot();
84+
});
85+
});
86+
87+
context('given message field of `oneOf` shape', function () {
88+
specify('should refract to semantic ApiDOM tree', function () {
89+
const operationElement = OperationElement.refract({
90+
message: {
91+
oneOf: [{}, { $ref: '#/path/to/message' }],
92+
},
8593
});
8694

8795
expect(sexprs(operationElement)).toMatchSnapshot();

0 commit comments

Comments
 (0)