diff --git a/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-array.ts b/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-array.ts index d2e41a866..0d9606dd5 100644 --- a/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-array.ts +++ b/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-array.ts @@ -1,9 +1,9 @@ class EphemeralArray { - type = 'EphemeralArray'; + public readonly type = 'EphemeralArray'; - content: any[] = []; + protected readonly content: any[] = []; - reference: any = undefined; + protected readonly reference: any = undefined; constructor(content: any[]) { this.content = content; diff --git a/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-object.ts b/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-object.ts index afb94aa30..4329ad4fd 100644 --- a/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-object.ts +++ b/packages/apidom-core/src/transformers/serializers/value/ast/ephemeral-object.ts @@ -1,9 +1,9 @@ class EphemeralObject { - type = 'EphemeralObject'; + public readonly type = 'EphemeralObject'; - content: any[] = []; + protected readonly content: any[] = []; - reference: any = undefined; + protected readonly reference: any = undefined; constructor(content: any[]) { this.content = content; diff --git a/packages/apidom-core/src/transformers/serializers/value/index.ts b/packages/apidom-core/src/transformers/serializers/value/index.ts index d49e67dfa..a5d748f04 100644 --- a/packages/apidom-core/src/transformers/serializers/value/index.ts +++ b/packages/apidom-core/src/transformers/serializers/value/index.ts @@ -85,8 +85,14 @@ class Visitor { return null; } - public RefElement(element: RefElement): unknown { - return element.toValue(); + public RefElement(element: RefElement, ...rest: unknown[]) { + const ancestors = rest[3] as (Element | EphemeralArray | EphemeralObject)[]; + + if (ancestors[ancestors.length - 1]?.type === 'EphemeralObject') { + return Symbol.for('delete-node'); + } + + return String(element.toValue()); } public LinkElement(element: LinkElement): string { diff --git a/packages/apidom-core/test/transformers/serializers/value.ts b/packages/apidom-core/test/transformers/serializers/value.ts index 69c65a0c8..74f99c3bf 100644 --- a/packages/apidom-core/test/transformers/serializers/value.ts +++ b/packages/apidom-core/test/transformers/serializers/value.ts @@ -154,6 +154,18 @@ describe('serializers', function () { assert.deepEqual(serialized, { ref: 'id' }); }); }); + + context('and included instead of MemberElement', function () { + specify('should remove from serialization', function () { + const object = new ObjectElement({ + a: 'b', + }); + object.content.push(new RefElement('id')); + const serialized = serializer(object); + + assert.deepEqual(serialized, { a: 'b' }); + }); + }); }); context('given LinkElement', function () {