Skip to content

Commit f205211

Browse files
authored
feat(core): handle RefElement serialization in toValue serializer (#3901)
Refs #3894
1 parent 200031f commit f205211

File tree

4 files changed

+26
-8
lines changed

4 files changed

+26
-8
lines changed

packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-array.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class EphemeralArray {
2-
type = 'EphemeralArray';
2+
public readonly type = 'EphemeralArray';
33

4-
content: any[] = [];
4+
protected readonly content: any[] = [];
55

6-
reference: any = undefined;
6+
protected readonly reference: any = undefined;
77

88
constructor(content: any[]) {
99
this.content = content;

packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-object.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class EphemeralObject {
2-
type = 'EphemeralObject';
2+
public readonly type = 'EphemeralObject';
33

4-
content: any[] = [];
4+
protected readonly content: any[] = [];
55

6-
reference: any = undefined;
6+
protected readonly reference: any = undefined;
77

88
constructor(content: any[]) {
99
this.content = content;

packages/apidom-core/src/transformers/serializers/value/index.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,14 @@ class Visitor {
8585
return null;
8686
}
8787

88-
public RefElement(element: RefElement): unknown {
89-
return element.toValue();
88+
public RefElement(element: RefElement, ...rest: unknown[]) {
89+
const ancestors = rest[3] as (Element | EphemeralArray | EphemeralObject)[];
90+
91+
if (ancestors[ancestors.length - 1]?.type === 'EphemeralObject') {
92+
return Symbol.for('delete-node');
93+
}
94+
95+
return String(element.toValue());
9096
}
9197

9298
public LinkElement(element: LinkElement): string {

packages/apidom-core/test/transformers/serializers/value.ts

+12
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,18 @@ describe('serializers', function () {
154154
assert.deepEqual(serialized, { ref: 'id' });
155155
});
156156
});
157+
158+
context('and included instead of MemberElement', function () {
159+
specify('should remove from serialization', function () {
160+
const object = new ObjectElement({
161+
a: 'b',
162+
});
163+
object.content.push(new RefElement('id'));
164+
const serialized = serializer(object);
165+
166+
assert.deepEqual(serialized, { a: 'b' });
167+
});
168+
});
157169
});
158170

159171
context('given LinkElement', function () {

0 commit comments

Comments
 (0)