deepkit-framework
deepkit-framework copied to clipboard
[Feature] Nullable Embedded Data Field
Currently embedded data fields cannot be nullable, so we have to write if (entity.embedded.field1 && entity.embedded.field2) {}
instead of if (entity.embedded) {}
.
This example will throw a database validation error:
import { Database } from "@deepkit/orm";
import { SQLiteDatabaseAdapter } from "@deepkit/sqlite";
import { AutoIncrement, Embedded, entity, PrimaryKey } from "@deepkit/type";
async function main() {
@entity.name("my-entity")
class MyEntity {
id: number & AutoIncrement & PrimaryKey = 0;
embedded?: Embedded<MyEntityEmbedded>;
}
class MyEntityEmbedded {
prop!: string;
}
const database = new Database(new SQLiteDatabaseAdapter(), [MyEntity]);
await database.migrate();
await database.persist(new MyEntity());
}
main();
/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:164
throw new DatabaseValidationError(classState.classSchema, errors);
^
DatabaseValidationError: Validation error for class my-entity:
embedded(type): Not an object
at DatabaseSessionRound.doPersist (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:164:31)
at DatabaseSessionRound.commit (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:114:24)
at async DatabaseSession.flush (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:519:17)
at async DatabaseSession.commit (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:329:9)
at async Database.persist (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database.ts:325:9)
at async main (/home/char2s/projects/example/src/app.ts:43:3) {
classSchema: ReflectionClass {
type: {
kind: 20,
classType: [Function],
types: [Array],
typeArguments: undefined,
jit: [Object]
},
parent: undefined,
description: '',
data: { 'orm.database': [Database], classState: [ClassState] },
disableConstructor: false,
singleTableInheritance: false,
indexes: [],
propertyNames: [ 'id', 'embedded' ],
methodNames: [],
properties: [ [ReflectionProperty], [ReflectionProperty] ],
methods: [],
references: [],
primaries: [ [ReflectionProperty] ],
autoIncrements: [ [ReflectionProperty] ],
subClasses: [],
name: 'my-entity'
},
errors: [
ValidationErrorItem {
path: 'embedded',
code: 'type',
message: 'Not an object'
}
]
}