Skip to content
This repository was archived by the owner on Nov 8, 2024. It is now read-only.

Commit b4a6fd0

Browse files
committed
fix(oas3): support empty yaml !!map
1 parent 97babae commit b4a6fd0

File tree

3 files changed

+109
-39
lines changed

3 files changed

+109
-39
lines changed

packages/fury-adapter-oas3-parser/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Fury OAS3 Parser Changelog
22

3+
## Master
4+
5+
### Bug Fixes
6+
7+
- Fix handling of empty `!!set` and `!!map` in YAML parsing.
8+
39
## 0.5.2 (19-02-19)
410

511
### Enhancements

packages/fury-adapter-oas3-parser/lib/parser/parseYAML.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,15 @@ function copySourceMap(startMark, endMark, element, namespace) {
2929
}
3030

3131
function yamlToObject(node, annotations, context) {
32-
return new context.namespace.elements.Object(node.value.map((nodes) => {
33-
const key = convert(nodes[0], annotations, context);
34-
const value = convert(nodes[1], annotations, context);
35-
return new context.namespace.elements.Member(key, value);
36-
}));
32+
if (node.value) {
33+
return new context.namespace.elements.Object(node.value.map((nodes) => {
34+
const key = convert(nodes[0], annotations, context);
35+
const value = convert(nodes[1], annotations, context);
36+
return new context.namespace.elements.Member(key, value);
37+
}));
38+
}
39+
40+
return new context.namespace.elements.Object();
3741
}
3842

3943
function yamlToArray(node, annotations, context) {

packages/fury-adapter-oas3-parser/test/unit/parser/parseYAML-test.js

Lines changed: 94 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -128,44 +128,104 @@ describe('#parseYAML', () => {
128128
expect(array.first).to.have.sourceMapEndColumn(9);
129129
});
130130

131-
it('can parse a dictionary into an object element', () => {
132-
const element = parseYAML('key: value', context);
133-
134-
expect(element).to.be.instanceof(namespace.elements.ParseResult);
135-
expect(element.length).to.equal(1);
136-
137-
const object = element.first;
138-
139-
expect(object).to.be.instanceof(namespace.elements.Object);
140-
expect(object.toValue()).to.deep.equal({ key: 'value' });
141-
expect(object).to.have.sourceMapStart(0);
142-
expect(object).to.have.sourceMapOffset(10);
143-
expect(object).to.have.sourceMapStartLine(1);
144-
expect(object).to.have.sourceMapStartColumn(1);
145-
expect(object).to.have.sourceMapEndLine(1);
146-
expect(object).to.have.sourceMapEndColumn(11);
131+
describe('map', () => {
132+
it('can parse a dictionary into an object element', () => {
133+
const element = parseYAML('key: value', context);
134+
135+
expect(element).to.be.instanceof(namespace.elements.ParseResult);
136+
expect(element.length).to.equal(1);
137+
138+
const object = element.first;
139+
140+
expect(object).to.be.instanceof(namespace.elements.Object);
141+
expect(object.toValue()).to.deep.equal({ key: 'value' });
142+
expect(object).to.have.sourceMapStart(0);
143+
expect(object).to.have.sourceMapOffset(10);
144+
expect(object).to.have.sourceMapStartLine(1);
145+
expect(object).to.have.sourceMapStartColumn(1);
146+
expect(object).to.have.sourceMapEndLine(1);
147+
expect(object).to.have.sourceMapEndColumn(11);
148+
149+
const member = object.first;
150+
151+
expect(member).to.be.instanceof(namespace.elements.Member);
152+
153+
expect(member.key).to.be.instanceof(namespace.elements.String);
154+
expect(member.key.toValue()).to.equal('key');
155+
expect(member.key).to.have.sourceMapStart(0);
156+
expect(member.key).to.have.sourceMapOffset(3);
157+
expect(member.key).to.have.sourceMapStartLine(1);
158+
expect(member.key).to.have.sourceMapStartColumn(1);
159+
expect(member.key).to.have.sourceMapEndLine(1);
160+
expect(member.key).to.have.sourceMapEndColumn(4);
161+
162+
expect(member.value).to.be.instanceof(namespace.elements.String);
163+
expect(member.value.toValue()).to.equal('value');
164+
expect(member.value).to.have.sourceMapStart(5);
165+
expect(member.value).to.have.sourceMapOffset(5);
166+
expect(member.value).to.have.sourceMapStartLine(1);
167+
expect(member.value).to.have.sourceMapStartColumn(6);
168+
expect(member.value).to.have.sourceMapEndLine(1);
169+
expect(member.value).to.have.sourceMapEndColumn(11);
170+
});
147171

148-
const member = object.first;
172+
it('can parse a map into an object element', () => {
173+
const parseResult = parseYAML('!!map\n key : value', context);
149174

150-
expect(member).to.be.instanceof(namespace.elements.Member);
175+
expect(parseResult).to.be.instanceof(namespace.elements.ParseResult);
176+
expect(parseResult.length).to.equal(1);
177+
178+
const object = parseResult.first;
179+
180+
expect(object).to.be.instanceof(namespace.elements.Object);
181+
expect(object.toValue()).to.deep.equal({ key: 'value' });
182+
expect(object).to.have.sourceMapStart(0);
183+
expect(object).to.have.sourceMapOffset(19);
184+
expect(object).to.have.sourceMapStartLine(1);
185+
expect(object).to.have.sourceMapStartColumn(1);
186+
expect(object).to.have.sourceMapEndLine(2);
187+
expect(object).to.have.sourceMapEndColumn(14);
188+
189+
const member = object.first;
190+
191+
expect(member).to.be.instanceof(namespace.elements.Member);
192+
193+
expect(member.key).to.be.instanceof(namespace.elements.String);
194+
expect(member.key.toValue()).to.equal('key');
195+
expect(member.key).to.have.sourceMapStart(8);
196+
expect(member.key).to.have.sourceMapOffset(3);
197+
expect(member.key).to.have.sourceMapStartLine(2);
198+
expect(member.key).to.have.sourceMapStartColumn(3);
199+
expect(member.key).to.have.sourceMapEndLine(2);
200+
expect(member.key).to.have.sourceMapEndColumn(6);
201+
202+
expect(member.value).to.be.instanceof(namespace.elements.String);
203+
expect(member.value.toValue()).to.equal('value');
204+
expect(member.value).to.have.sourceMapStart(14);
205+
expect(member.value).to.have.sourceMapOffset(5);
206+
expect(member.value).to.have.sourceMapStartLine(2);
207+
expect(member.value).to.have.sourceMapStartColumn(9);
208+
expect(member.value).to.have.sourceMapEndLine(2);
209+
expect(member.value).to.have.sourceMapEndColumn(14);
210+
});
151211

152-
expect(member.key).to.be.instanceof(namespace.elements.String);
153-
expect(member.key.toValue()).to.equal('key');
154-
expect(member.key).to.have.sourceMapStart(0);
155-
expect(member.key).to.have.sourceMapOffset(3);
156-
expect(member.key).to.have.sourceMapStartLine(1);
157-
expect(member.key).to.have.sourceMapStartColumn(1);
158-
expect(member.key).to.have.sourceMapEndLine(1);
159-
expect(member.key).to.have.sourceMapEndColumn(4);
212+
it('can parse an empty map into an object element', () => {
213+
const parseResult = parseYAML('!!map', context);
160214

161-
expect(member.value).to.be.instanceof(namespace.elements.String);
162-
expect(member.value.toValue()).to.equal('value');
163-
expect(member.value).to.have.sourceMapStart(5);
164-
expect(member.value).to.have.sourceMapOffset(5);
165-
expect(member.value).to.have.sourceMapStartLine(1);
166-
expect(member.value).to.have.sourceMapStartColumn(6);
167-
expect(member.value).to.have.sourceMapEndLine(1);
168-
expect(member.value).to.have.sourceMapEndColumn(11);
215+
expect(parseResult).to.be.instanceof(namespace.elements.ParseResult);
216+
expect(parseResult.length).to.equal(1);
217+
218+
const object = parseResult.first;
219+
220+
expect(object).to.be.instanceof(namespace.elements.Object);
221+
expect(object.length).to.equal(0);
222+
expect(object).to.have.sourceMapStart(0);
223+
expect(object).to.have.sourceMapOffset(5);
224+
expect(object).to.have.sourceMapStartLine(1);
225+
expect(object).to.have.sourceMapStartColumn(1);
226+
expect(object).to.have.sourceMapEndLine(1);
227+
expect(object).to.have.sourceMapEndColumn(6);
228+
});
169229
});
170230

171231
it('can parse a binary into a string element', () => {

0 commit comments

Comments
 (0)