Skip to content

Commit

Permalink
fix(reflection): fix reflection of embedded array types
Browse files Browse the repository at this point in the history
Closes #3690
  • Loading branch information
B4nan committed Nov 5, 2022
1 parent 115462d commit 786ba42
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 3 deletions.
6 changes: 3 additions & 3 deletions packages/reflection/src/TsMorphMetadataProvider.ts
@@ -1,7 +1,7 @@
import type { PropertyDeclaration, SourceFile } from 'ts-morph';
import { Project, ModuleKind } from 'ts-morph';
import { ModuleKind, Project } from 'ts-morph';
import type { EntityMetadata, EntityProperty } from '@mikro-orm/core';
import { MetadataError, MetadataProvider, MetadataStorage, Utils } from '@mikro-orm/core';
import { MetadataError, MetadataProvider, MetadataStorage, ReferenceType, Utils } from '@mikro-orm/core';

export class TsMorphMetadataProvider extends MetadataProvider {

Expand Down Expand Up @@ -123,7 +123,7 @@ export class TsMorphMetadataProvider extends MetadataProvider {
.replace(/\((.*)\)/, '$1'); // unwrap union types

// keep the array suffix in the type, it is needed in few places in discovery and comparator (`prop.array` is used only for enum arrays)
if (prop.array && !type.includes(' | ')) {
if (prop.array && !type.includes(' | ') && prop.reference === ReferenceType.SCALAR) {
type += '[]';
}

Expand Down
68 changes: 68 additions & 0 deletions tests/features/embeddables/GH3690.test.ts
@@ -0,0 +1,68 @@
import { Embeddable, Embedded, Entity, PrimaryKey, Property, OneToOne, Ref } from '@mikro-orm/core';
import { MikroORM } from '@mikro-orm/sqlite';
import { TsMorphMetadataProvider } from '@mikro-orm/reflection';

@Embeddable()
export class PTE {

@Property()
name!: string;

}

@Entity()
export class BPE {

@PrimaryKey()
id!: number;

@Embedded({ object: true })
titles!: PTE[];

@OneToOne(() => P, p => p.bp, { orphanRemoval: true })
p!: Ref<P> | null;

}

@Entity()
export class P {

@PrimaryKey()
id!: number;

@OneToOne(() => BPE, { orphanRemoval: true })
bp!: Ref<BPE> | null;

}

let orm: MikroORM;

beforeAll(async () => {
orm = await MikroORM.init({
entities: [P, PTE],
dbName: ':memory:',
metadataProvider: TsMorphMetadataProvider,
cache: { enabled: false },
});
await orm.schema.createSchema();
});

afterAll(async () => {
await orm.close(true);
});

test('GH issue 3690', async () => {
const e = orm.em.create(P, {
bp: {
titles: [{ name: 't1' }, { name: 't2' }],
},
});
await orm.em.flush();
orm.em.clear();

const e1 = await orm.em.findOneOrFail(P, e, { populate: ['bp'] });
expect(e1.bp?.$.titles).toEqual([
{ name: 't1' },
{ name: 't2' },
]);
});

0 comments on commit 786ba42

Please sign in to comment.