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

Commit 6197f8d

Browse files
authored
fix(core): prefer sample/default over undefined props (#556)
Prefer sample/default over Object with undefined property values
1 parent e2a8c75 commit 6197f8d

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

packages/api-elements/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# API Elements (JavaScript) CHANGELOG
22

3+
## 0.3.1 (2020-09-07)
4+
5+
### Bug Fixes
6+
7+
- Generating a value from an element will now prefer sample/default values for
8+
objects which contain only undefined property values.
9+
310
## 0.3.0 (2020-08-05)
411

512
### Bug Fixes

packages/api-elements/lib/define-value-of.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ function findFirstSample(e) {
8686
const isPrimitive = e => (e instanceof StringElement) || (e instanceof NumberElement) || (e instanceof BooleanElement);
8787
const isEnumElement = e => e instanceof EnumElement;
8888
const isArrayElement = e => e instanceof ArrayElement;
89+
const isObjectElement = e => e instanceof ObjectElement;
8990

9091
const hasSample = e => findFirstSample(e) !== null;
9192
const hasDefault = e => findDefault(e) !== null;
@@ -94,6 +95,9 @@ const hasValue = R.anyPass([hasContent, hasSample, hasDefault]);
9495
const hasNoValue = R.complement(hasValue);
9596
const isNoValuePrimitive = R.both(isPrimitive, hasNoValue);
9697
const isNonEmptyArrayElement = e => isArrayElement(e) && e.content && !e.isEmpty;
98+
const isEmptyArray = e => isArrayElement(e) && e.content.every(isNoValuePrimitive);
99+
const isObjectWithUndefinedValues = e => isObjectElement(e)
100+
&& e.content.every(prop => prop.value === undefined || prop.value.content === undefined);
97101

98102

99103
function trivialValue(e) {
@@ -123,7 +127,7 @@ function mapValue(e, options, f, elements) {
123127

124128
const opts = updateTypeAttributes(e, options);
125129

126-
if (e.content && !(isArrayElement(e) && e.content.every(isNoValuePrimitive))) {
130+
if (e.content && !isEmptyArray(e) && !isObjectWithUndefinedValues(e)) {
127131
const result = f(e, opts, elements, 'content');
128132

129133
if (undefined !== result) {
@@ -226,7 +230,7 @@ function reduceValue(e, options, elements) {
226230
return mapValue(e.content, inheritFlags(opts), reduceValue, elements);
227231
}
228232

229-
if (e instanceof ObjectElement) {
233+
if (isObjectElement(e)) {
230234
let result = {};
231235

232236
const isFixed = isFlag(FIXED_FLAG, opts);

packages/api-elements/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "api-elements",
3-
"version": "0.3.0",
3+
"version": "0.3.1",
44
"description": "API Elements JavaScript",
55
"author": "Apiary.io <[email protected]>",
66
"license": "MIT",

packages/api-elements/test/value-of-test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,34 @@ describe('valueOf ObjectElement', () => {
968968
expect(value).to.deep.equal({ gaga: 'bing' });
969969
});
970970

971+
it('prefers samples over undefined property values', () => {
972+
const element = new ObjectElement({ key1: new StringElement(), key2: new StringElement() });
973+
element.attributes.set('default', new ObjectElement({ key1: 'defaultValue', key2: 'otherDefaultValue' }));
974+
element.attributes.set('samples', new ArrayElement([
975+
new ObjectElement({ key1: 'sampleValue', key2: 'otherSampleValue' }),
976+
]));
977+
const value = element.valueOf();
978+
979+
expect(value).to.deep.equal({ key1: 'sampleValue', key2: 'otherSampleValue' });
980+
});
981+
982+
it.only('prefers default over undefined property values', () => {
983+
const defaults = new ObjectElement({ key1: 'defaultValue', key2: 'otherDefaultValue' });
984+
985+
const element1 = new ObjectElement({ key1: new StringElement(), key2: new StringElement() });
986+
element1.attributes.set('default', defaults);
987+
const value1 = element1.valueOf();
988+
989+
const element2 = new ObjectElement([
990+
new MemberElement(), new MemberElement(),
991+
]);
992+
element2.attributes.set('default', defaults);
993+
const value2 = element2.valueOf();
994+
995+
expect(value1).to.deep.equal({ key1: 'defaultValue', key2: 'otherDefaultValue' });
996+
expect(value2).to.deep.equal({ key1: 'defaultValue', key2: 'otherDefaultValue' });
997+
});
998+
971999
it('generates {} if no content, default, samples and not nullable', () => {
9721000
const element = new ObjectElement();
9731001
const value = element.valueOf();

0 commit comments

Comments
 (0)