From 8410592239f636af6b36785137a429d46caeba37 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Tue, 18 Jun 2024 16:14:09 +0530 Subject: [PATCH] Rename schema to property (#7761) --- .../src/dml/__tests__/base-property.spec.ts | 69 +++++++++++++++++++ .../dml/__tests__/base-relationship.spec.ts | 4 +- .../src/dml/__tests__/base-schema.spec.ts | 69 ------------------- .../dml/__tests__/boolean-property.spec.ts | 19 +++++ .../src/dml/__tests__/boolean-schema.spec.ts | 19 ----- .../dml/__tests__/date-time-property.spec.ts | 19 +++++ .../dml/__tests__/date-time-schema.spec.ts | 19 ----- .../src/dml/__tests__/enum-schema.spec.ts | 22 +++--- .../__tests__/has-many-relationship.spec.ts | 4 +- .../__tests__/has-one-relationship.spec.ts | 6 +- .../src/dml/__tests__/json-property.spec.ts | 19 +++++ .../src/dml/__tests__/json-schema.spec.ts | 19 ----- .../src/dml/__tests__/many-to-many.spec.ts | 4 +- .../src/dml/__tests__/number-property.spec.ts | 19 +++++ .../src/dml/__tests__/number-schema.spec.ts | 19 ----- .../src/dml/__tests__/text-property.spec.ts | 19 +++++ .../src/dml/__tests__/text-schema.spec.ts | 19 ----- packages/core/utils/src/dml/entity-builder.ts | 38 +++++----- packages/core/utils/src/dml/entity.ts | 10 +-- .../dml/helpers/create-mikro-orm-entity.ts | 16 ++--- .../src/dml/{schema => properties}/base.ts | 23 ++++--- .../core/utils/src/dml/properties/boolean.ts | 11 +++ .../utils/src/dml/properties/date-time.ts | 11 +++ .../core/utils/src/dml/properties/enum.ts | 19 +++++ .../core/utils/src/dml/properties/json.ts | 11 +++ .../dml/{schema => properties}/nullable.ts | 13 ++-- .../core/utils/src/dml/properties/number.ts | 11 +++ .../core/utils/src/dml/properties/text.ts | 10 +++ .../core/utils/src/dml/relations/nullable.ts | 2 +- packages/core/utils/src/dml/schema/boolean.ts | 12 ---- .../core/utils/src/dml/schema/date-time.ts | 12 ---- packages/core/utils/src/dml/schema/enum.ts | 19 ----- packages/core/utils/src/dml/schema/json.ts | 12 ---- packages/core/utils/src/dml/schema/number.ts | 12 ---- packages/core/utils/src/dml/schema/text.ts | 11 --- packages/core/utils/src/dml/types.ts | 25 +++---- 36 files changed, 324 insertions(+), 322 deletions(-) create mode 100644 packages/core/utils/src/dml/__tests__/base-property.spec.ts delete mode 100644 packages/core/utils/src/dml/__tests__/base-schema.spec.ts create mode 100644 packages/core/utils/src/dml/__tests__/boolean-property.spec.ts delete mode 100644 packages/core/utils/src/dml/__tests__/boolean-schema.spec.ts create mode 100644 packages/core/utils/src/dml/__tests__/date-time-property.spec.ts delete mode 100644 packages/core/utils/src/dml/__tests__/date-time-schema.spec.ts create mode 100644 packages/core/utils/src/dml/__tests__/json-property.spec.ts delete mode 100644 packages/core/utils/src/dml/__tests__/json-schema.spec.ts create mode 100644 packages/core/utils/src/dml/__tests__/number-property.spec.ts delete mode 100644 packages/core/utils/src/dml/__tests__/number-schema.spec.ts create mode 100644 packages/core/utils/src/dml/__tests__/text-property.spec.ts delete mode 100644 packages/core/utils/src/dml/__tests__/text-schema.spec.ts rename packages/core/utils/src/dml/{schema => properties}/base.ts (68%) create mode 100644 packages/core/utils/src/dml/properties/boolean.ts create mode 100644 packages/core/utils/src/dml/properties/date-time.ts create mode 100644 packages/core/utils/src/dml/properties/enum.ts create mode 100644 packages/core/utils/src/dml/properties/json.ts rename packages/core/utils/src/dml/{schema => properties}/nullable.ts (65%) create mode 100644 packages/core/utils/src/dml/properties/number.ts create mode 100644 packages/core/utils/src/dml/properties/text.ts delete mode 100644 packages/core/utils/src/dml/schema/boolean.ts delete mode 100644 packages/core/utils/src/dml/schema/date-time.ts delete mode 100644 packages/core/utils/src/dml/schema/enum.ts delete mode 100644 packages/core/utils/src/dml/schema/json.ts delete mode 100644 packages/core/utils/src/dml/schema/number.ts delete mode 100644 packages/core/utils/src/dml/schema/text.ts diff --git a/packages/core/utils/src/dml/__tests__/base-property.spec.ts b/packages/core/utils/src/dml/__tests__/base-property.spec.ts new file mode 100644 index 0000000000..d171789ef5 --- /dev/null +++ b/packages/core/utils/src/dml/__tests__/base-property.spec.ts @@ -0,0 +1,69 @@ +import { expectTypeOf } from "expect-type" +import { BaseProperty } from "../properties/base" +import { PropertyMetadata } from "../types" + +describe("Base property", () => { + test("create a property type from base property", () => { + class StringProperty extends BaseProperty { + protected dataType: PropertyMetadata["dataType"] = { + name: "text", + } + } + + const property = new StringProperty() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("username")).toEqual({ + fieldName: "username", + dataType: { + name: "text", + }, + nullable: false, + indexes: [], + relationships: [], + }) + }) + + test("apply nullable modifier", () => { + class StringProperty extends BaseProperty { + protected dataType: PropertyMetadata["dataType"] = { + name: "text", + } + } + + const property = new StringProperty().nullable() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("username")).toEqual({ + fieldName: "username", + dataType: { + name: "text", + }, + nullable: true, + indexes: [], + relationships: [], + }) + }) + + test("define default value", () => { + class StringProperty extends BaseProperty { + protected dataType: PropertyMetadata["dataType"] = { + name: "text", + } + } + + const property = new StringProperty().default("foo") + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("username")).toEqual({ + fieldName: "username", + dataType: { + name: "text", + }, + defaultValue: "foo", + nullable: false, + indexes: [], + relationships: [], + }) + }) +}) diff --git a/packages/core/utils/src/dml/__tests__/base-relationship.spec.ts b/packages/core/utils/src/dml/__tests__/base-relationship.spec.ts index 3f909fc46a..d4df8398c5 100644 --- a/packages/core/utils/src/dml/__tests__/base-relationship.spec.ts +++ b/packages/core/utils/src/dml/__tests__/base-relationship.spec.ts @@ -1,5 +1,5 @@ import { expectTypeOf } from "expect-type" -import { TextSchema } from "../schema/text" +import { TextProperty } from "../properties/text" import { BaseRelationship } from "../relations/base" describe("Base relationship", () => { @@ -9,7 +9,7 @@ describe("Base relationship", () => { } const user = { - username: new TextSchema(), + username: new TextProperty(), } const entityRef = () => user diff --git a/packages/core/utils/src/dml/__tests__/base-schema.spec.ts b/packages/core/utils/src/dml/__tests__/base-schema.spec.ts deleted file mode 100644 index 8a13e2edf8..0000000000 --- a/packages/core/utils/src/dml/__tests__/base-schema.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { expectTypeOf } from "expect-type" -import { BaseSchema } from "../schema/base" -import { SchemaMetadata } from "../types" - -describe("Base schema", () => { - test("create a schema type from base schema", () => { - class StringSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "text", - } - } - - const schema = new StringSchema() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("username")).toEqual({ - fieldName: "username", - dataType: { - name: "text", - }, - nullable: false, - indexes: [], - relationships: [], - }) - }) - - test("apply nullable modifier", () => { - class StringSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "text", - } - } - - const schema = new StringSchema().nullable() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("username")).toEqual({ - fieldName: "username", - dataType: { - name: "text", - }, - nullable: true, - indexes: [], - relationships: [], - }) - }) - - test("define default value", () => { - class StringSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "text", - } - } - - const schema = new StringSchema().default("foo") - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("username")).toEqual({ - fieldName: "username", - dataType: { - name: "text", - }, - defaultValue: "foo", - nullable: false, - indexes: [], - relationships: [], - }) - }) -}) diff --git a/packages/core/utils/src/dml/__tests__/boolean-property.spec.ts b/packages/core/utils/src/dml/__tests__/boolean-property.spec.ts new file mode 100644 index 0000000000..dc3714d081 --- /dev/null +++ b/packages/core/utils/src/dml/__tests__/boolean-property.spec.ts @@ -0,0 +1,19 @@ +import { expectTypeOf } from "expect-type" +import { BooleanProperty } from "../properties/boolean" + +describe("Boolean property", () => { + test("create boolean property type", () => { + const property = new BooleanProperty() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("isAdmin")).toEqual({ + fieldName: "isAdmin", + dataType: { + name: "boolean", + }, + nullable: false, + indexes: [], + relationships: [], + }) + }) +}) diff --git a/packages/core/utils/src/dml/__tests__/boolean-schema.spec.ts b/packages/core/utils/src/dml/__tests__/boolean-schema.spec.ts deleted file mode 100644 index 25679e3350..0000000000 --- a/packages/core/utils/src/dml/__tests__/boolean-schema.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expectTypeOf } from "expect-type" -import { BooleanSchema } from "../schema/boolean" - -describe("Boolean schema", () => { - test("create boolean schema type", () => { - const schema = new BooleanSchema() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("isAdmin")).toEqual({ - fieldName: "isAdmin", - dataType: { - name: "boolean", - }, - nullable: false, - indexes: [], - relationships: [], - }) - }) -}) diff --git a/packages/core/utils/src/dml/__tests__/date-time-property.spec.ts b/packages/core/utils/src/dml/__tests__/date-time-property.spec.ts new file mode 100644 index 0000000000..497d059a43 --- /dev/null +++ b/packages/core/utils/src/dml/__tests__/date-time-property.spec.ts @@ -0,0 +1,19 @@ +import { expectTypeOf } from "expect-type" +import { DateTimeProperty } from "../properties/date-time" + +describe("DateTime property", () => { + test("create datetime property type", () => { + const property = new DateTimeProperty() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("created_at")).toEqual({ + fieldName: "created_at", + dataType: { + name: "dateTime", + }, + nullable: false, + indexes: [], + relationships: [], + }) + }) +}) diff --git a/packages/core/utils/src/dml/__tests__/date-time-schema.spec.ts b/packages/core/utils/src/dml/__tests__/date-time-schema.spec.ts deleted file mode 100644 index c36a76fb8f..0000000000 --- a/packages/core/utils/src/dml/__tests__/date-time-schema.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expectTypeOf } from "expect-type" -import { DateTimeSchema } from "../schema/date-time" - -describe("DateTime schema", () => { - test("create datetime schema type", () => { - const schema = new DateTimeSchema() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("created_at")).toEqual({ - fieldName: "created_at", - dataType: { - name: "dateTime", - }, - nullable: false, - indexes: [], - relationships: [], - }) - }) -}) diff --git a/packages/core/utils/src/dml/__tests__/enum-schema.spec.ts b/packages/core/utils/src/dml/__tests__/enum-schema.spec.ts index 712171637c..7f5300d13f 100644 --- a/packages/core/utils/src/dml/__tests__/enum-schema.spec.ts +++ b/packages/core/utils/src/dml/__tests__/enum-schema.spec.ts @@ -1,14 +1,14 @@ import { expectTypeOf } from "expect-type" -import { EnumSchema } from "../schema/enum" +import { EnumProperty } from "../properties/enum" -describe("Enum schema", () => { - test("create enum schema type", () => { - const schema = new EnumSchema(["admin", "moderator", "editor"]) - expectTypeOf(schema["$dataType"]).toEqualTypeOf< +describe("Enum property", () => { + test("create enum property type", () => { + const property = new EnumProperty(["admin", "moderator", "editor"]) + expectTypeOf(property["$dataType"]).toEqualTypeOf< "admin" | "moderator" | "editor" >() - expect(schema.parse("role")).toEqual({ + expect(property.parse("role")).toEqual({ fieldName: "role", dataType: { name: "enum", @@ -23,13 +23,17 @@ describe("Enum schema", () => { }) test("apply nullable modifier", () => { - const schema = new EnumSchema(["admin", "moderator", "editor"]).nullable() + const property = new EnumProperty([ + "admin", + "moderator", + "editor", + ]).nullable() - expectTypeOf(schema["$dataType"]).toEqualTypeOf< + expectTypeOf(property["$dataType"]).toEqualTypeOf< "admin" | "moderator" | "editor" | null >() - expect(schema.parse("role")).toEqual({ + expect(property.parse("role")).toEqual({ fieldName: "role", dataType: { name: "enum", diff --git a/packages/core/utils/src/dml/__tests__/has-many-relationship.spec.ts b/packages/core/utils/src/dml/__tests__/has-many-relationship.spec.ts index 2ff4d700ff..431980a80f 100644 --- a/packages/core/utils/src/dml/__tests__/has-many-relationship.spec.ts +++ b/packages/core/utils/src/dml/__tests__/has-many-relationship.spec.ts @@ -1,11 +1,11 @@ import { expectTypeOf } from "expect-type" -import { TextSchema } from "../schema/text" +import { TextProperty } from "../properties/text" import { HasMany } from "../relations/has-many" describe("HasMany relationship", () => { test("define hasMany relationship", () => { const user = { - username: new TextSchema(), + username: new TextProperty(), } const entityRef = () => user diff --git a/packages/core/utils/src/dml/__tests__/has-one-relationship.spec.ts b/packages/core/utils/src/dml/__tests__/has-one-relationship.spec.ts index f3ba7b917b..60eb7347b9 100644 --- a/packages/core/utils/src/dml/__tests__/has-one-relationship.spec.ts +++ b/packages/core/utils/src/dml/__tests__/has-one-relationship.spec.ts @@ -1,11 +1,11 @@ import { expectTypeOf } from "expect-type" -import { TextSchema } from "../schema/text" +import { TextProperty } from "../properties/text" import { HasOne } from "../relations/has-one" describe("HasOne relationship", () => { test("define hasOne relationship", () => { const user = { - username: new TextSchema(), + username: new TextProperty(), } const entityRef = () => user @@ -22,7 +22,7 @@ describe("HasOne relationship", () => { test("mark relationship as nullable", () => { const user = { - username: new TextSchema(), + username: new TextProperty(), } const entityRef = () => user diff --git a/packages/core/utils/src/dml/__tests__/json-property.spec.ts b/packages/core/utils/src/dml/__tests__/json-property.spec.ts new file mode 100644 index 0000000000..2a1d0d087e --- /dev/null +++ b/packages/core/utils/src/dml/__tests__/json-property.spec.ts @@ -0,0 +1,19 @@ +import { expectTypeOf } from "expect-type" +import { JSONProperty } from "../properties/json" + +describe("JSON property", () => { + test("create json property type", () => { + const property = new JSONProperty() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("coordinates")).toEqual({ + fieldName: "coordinates", + dataType: { + name: "json", + }, + nullable: false, + indexes: [], + relationships: [], + }) + }) +}) diff --git a/packages/core/utils/src/dml/__tests__/json-schema.spec.ts b/packages/core/utils/src/dml/__tests__/json-schema.spec.ts deleted file mode 100644 index 5888d58c1a..0000000000 --- a/packages/core/utils/src/dml/__tests__/json-schema.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expectTypeOf } from "expect-type" -import { JSONSchema } from "../schema/json" - -describe("JSON schema", () => { - test("create json schema type", () => { - const schema = new JSONSchema() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("coordinates")).toEqual({ - fieldName: "coordinates", - dataType: { - name: "json", - }, - nullable: false, - indexes: [], - relationships: [], - }) - }) -}) diff --git a/packages/core/utils/src/dml/__tests__/many-to-many.spec.ts b/packages/core/utils/src/dml/__tests__/many-to-many.spec.ts index 006ad970aa..310155e9b5 100644 --- a/packages/core/utils/src/dml/__tests__/many-to-many.spec.ts +++ b/packages/core/utils/src/dml/__tests__/many-to-many.spec.ts @@ -1,11 +1,11 @@ import { expectTypeOf } from "expect-type" -import { TextSchema } from "../schema/text" +import { TextProperty } from "../properties/text" import { ManyToMany } from "../relations/many-to-many" describe("ManyToMany relationship", () => { test("define manyToMany relationship", () => { const user = { - username: new TextSchema(), + username: new TextProperty(), } const entityRef = () => user diff --git a/packages/core/utils/src/dml/__tests__/number-property.spec.ts b/packages/core/utils/src/dml/__tests__/number-property.spec.ts new file mode 100644 index 0000000000..04d4b17b2c --- /dev/null +++ b/packages/core/utils/src/dml/__tests__/number-property.spec.ts @@ -0,0 +1,19 @@ +import { expectTypeOf } from "expect-type" +import { NumberProperty } from "../properties/number" + +describe("Number property", () => { + test("create number property type", () => { + const property = new NumberProperty() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("age")).toEqual({ + fieldName: "age", + dataType: { + name: "number", + }, + nullable: false, + indexes: [], + relationships: [], + }) + }) +}) diff --git a/packages/core/utils/src/dml/__tests__/number-schema.spec.ts b/packages/core/utils/src/dml/__tests__/number-schema.spec.ts deleted file mode 100644 index 6da2e431b3..0000000000 --- a/packages/core/utils/src/dml/__tests__/number-schema.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expectTypeOf } from "expect-type" -import { NumberSchema } from "../schema/number" - -describe("Number schema", () => { - test("create number schema type", () => { - const schema = new NumberSchema() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("age")).toEqual({ - fieldName: "age", - dataType: { - name: "number", - }, - nullable: false, - indexes: [], - relationships: [], - }) - }) -}) diff --git a/packages/core/utils/src/dml/__tests__/text-property.spec.ts b/packages/core/utils/src/dml/__tests__/text-property.spec.ts new file mode 100644 index 0000000000..e90223a133 --- /dev/null +++ b/packages/core/utils/src/dml/__tests__/text-property.spec.ts @@ -0,0 +1,19 @@ +import { expectTypeOf } from "expect-type" +import { TextProperty } from "../properties/text" + +describe("Text property", () => { + test("create text property type", () => { + const property = new TextProperty() + + expectTypeOf(property["$dataType"]).toEqualTypeOf() + expect(property.parse("username")).toEqual({ + fieldName: "username", + dataType: { + name: "text", + }, + nullable: false, + indexes: [], + relationships: [], + }) + }) +}) diff --git a/packages/core/utils/src/dml/__tests__/text-schema.spec.ts b/packages/core/utils/src/dml/__tests__/text-schema.spec.ts deleted file mode 100644 index 7399ef5a2a..0000000000 --- a/packages/core/utils/src/dml/__tests__/text-schema.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expectTypeOf } from "expect-type" -import { TextSchema } from "../schema/text" - -describe("String schema", () => { - test("create string schema type", () => { - const schema = new TextSchema() - - expectTypeOf(schema["$dataType"]).toEqualTypeOf() - expect(schema.parse("username")).toEqual({ - fieldName: "username", - dataType: { - name: "text", - }, - nullable: false, - indexes: [], - relationships: [], - }) - }) -}) diff --git a/packages/core/utils/src/dml/entity-builder.ts b/packages/core/utils/src/dml/entity-builder.ts index 09ef93679c..c2bdd8b0de 100644 --- a/packages/core/utils/src/dml/entity-builder.ts +++ b/packages/core/utils/src/dml/entity-builder.ts @@ -1,16 +1,20 @@ import { DmlEntity } from "./entity" -import { TextSchema } from "./schema/text" -import { EnumSchema } from "./schema/enum" -import { JSONSchema } from "./schema/json" +import { TextProperty } from "./properties/text" +import { EnumProperty } from "./properties/enum" +import { JSONProperty } from "./properties/json" import { HasOne } from "./relations/has-one" import { HasMany } from "./relations/has-many" -import { NumberSchema } from "./schema/number" -import { BooleanSchema } from "./schema/boolean" +import { NumberProperty } from "./properties/number" +import { BooleanProperty } from "./properties/boolean" import { BelongsTo } from "./relations/belongs-to" -import { DateTimeSchema } from "./schema/date-time" +import { DateTimeProperty } from "./properties/date-time" import { ManyToMany } from "./relations/many-to-many" -import type { RelationshipOptions, RelationshipType, SchemaType } from "./types" -import { NullableModifier } from "./schema/nullable" +import type { + RelationshipOptions, + RelationshipType, + PropertyType, +} from "./types" +import { NullableModifier } from "./properties/nullable" /** * Entity builder exposes the API to create an entity and define its @@ -22,15 +26,15 @@ export class EntityBuilder { * all the entities. */ define< - Schema extends Record | RelationshipType> + Schema extends Record | RelationshipType> >(name: string, schema: Schema) { return new DmlEntity< Schema & { - deleted_at: NullableModifier + deleted_at: NullableModifier } >(name, { ...schema, - deleted_at: new DateTimeSchema().nullable(), + deleted_at: new DateTimeProperty().nullable(), }) } @@ -38,28 +42,28 @@ export class EntityBuilder { * Define a text/string based column */ text() { - return new TextSchema() + return new TextProperty() } /** * Define a boolean column */ boolean() { - return new BooleanSchema() + return new BooleanProperty() } /** * Define a numeric/integer column */ number() { - return new NumberSchema() + return new NumberProperty() } /** * Define a timestampz column */ dateTime() { - return new DateTimeSchema() + return new DateTimeProperty() } /** @@ -67,7 +71,7 @@ export class EntityBuilder { * JSON string */ json() { - return new JSONSchema() + return new JSONProperty() } /** @@ -75,7 +79,7 @@ export class EntityBuilder { * of values are allowed. */ enum(values: Values[]) { - return new EnumSchema(values) + return new EnumProperty(values) } /** diff --git a/packages/core/utils/src/dml/entity.ts b/packages/core/utils/src/dml/entity.ts index 2b6753a154..9bd8966b5f 100644 --- a/packages/core/utils/src/dml/entity.ts +++ b/packages/core/utils/src/dml/entity.ts @@ -1,6 +1,6 @@ import { BelongsTo } from "./relations/belongs-to" import { - SchemaType, + PropertyType, EntityCascades, RelationshipType, ExtractEntityRelations, @@ -11,7 +11,7 @@ import { * name, its schema and relationships. */ export class DmlEntity< - Schema extends Record | RelationshipType> + Schema extends Record | RelationshipType> > { #cascades: EntityCascades = {} constructor(public name: string, public schema: Schema) {} @@ -21,12 +21,14 @@ export class DmlEntity< */ parse(): { name: string - schema: SchemaType | RelationshipType + schema: PropertyType | RelationshipType cascades: EntityCascades } { return { name: this.name, - schema: this.schema as unknown as SchemaType | RelationshipType, + schema: this.schema as unknown as + | PropertyType + | RelationshipType, cascades: this.#cascades, } } diff --git a/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts b/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts index 8619defc13..bef8c6ec98 100644 --- a/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts +++ b/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts @@ -17,10 +17,10 @@ import { import { upperCaseFirst } from "../../common/upper-case-first" import type { Infer, - SchemaType, + PropertyType, EntityCascades, KnownDataTypes, - SchemaMetadata, + PropertyMetadata, RelationshipType, EntityConstructor, RelationshipMetadata, @@ -90,7 +90,7 @@ export function createMikrORMEntity() { */ function defineProperty( MikroORMEntity: EntityConstructor, - field: SchemaMetadata + field: PropertyMetadata ) { /** * Defining an enum property @@ -124,7 +124,7 @@ export function createMikrORMEntity() { function applyIndexes( MikroORMEntity: EntityConstructor, tableName: string, - field: SchemaMetadata + field: PropertyMetadata ) { field.indexes.forEach((index) => { const name = @@ -149,7 +149,7 @@ export function createMikrORMEntity() { MikroORMEntity: EntityConstructor, relationship: RelationshipMetadata, relatedEntity: DmlEntity< - Record | RelationshipType> + Record | RelationshipType> >, cascades: EntityCascades ) { @@ -173,7 +173,7 @@ export function createMikrORMEntity() { MikroORMEntity: EntityConstructor, relationship: RelationshipMetadata, relatedEntity: DmlEntity< - Record | RelationshipType> + Record | RelationshipType> >, cascades: EntityCascades ) { @@ -203,7 +203,7 @@ export function createMikrORMEntity() { MikroORMEntity: EntityConstructor, relationship: RelationshipMetadata, relatedEntity: DmlEntity< - Record | RelationshipType> + Record | RelationshipType> > ) { const mappedBy = @@ -280,7 +280,7 @@ export function createMikrORMEntity() { MikroORMEntity: EntityConstructor, relationship: RelationshipMetadata, relatedEntity: DmlEntity< - Record | RelationshipType> + Record | RelationshipType> >, cascades: EntityCascades ) { diff --git a/packages/core/utils/src/dml/schema/base.ts b/packages/core/utils/src/dml/properties/base.ts similarity index 68% rename from packages/core/utils/src/dml/schema/base.ts rename to packages/core/utils/src/dml/properties/base.ts index aa620146e1..7f808391b0 100644 --- a/packages/core/utils/src/dml/schema/base.ts +++ b/packages/core/utils/src/dml/properties/base.ts @@ -1,20 +1,27 @@ -import { SchemaMetadata, SchemaType } from "../types" +import { PropertyMetadata, PropertyType } from "../types" import { NullableModifier } from "./nullable" /** - * The base schema class offers shared affordances to define - * schema classes + * The BaseProperty class offers shared affordances to define + * property classes */ -export abstract class BaseSchema implements SchemaType { - #indexes: SchemaMetadata["indexes"] = [] - #relationships: SchemaMetadata["relationships"] = [] +export abstract class BaseProperty implements PropertyType { + /** + * Defined indexes and relationships + */ + #indexes: PropertyMetadata["indexes"] = [] + #relationships: PropertyMetadata["relationships"] = [] + + /** + * Default value for the property + */ #defaultValue?: T /** * The runtime dataType for the schema. It is not the same as * the "$dataType". */ - protected abstract dataType: SchemaMetadata["dataType"] + protected abstract dataType: PropertyMetadata["dataType"] /** * A type-only property to infer the JavScript data-type @@ -56,7 +63,7 @@ export abstract class BaseSchema implements SchemaType { /** * Returns the serialized metadata */ - parse(fieldName: string): SchemaMetadata { + parse(fieldName: string): PropertyMetadata { return { fieldName, dataType: this.dataType, diff --git a/packages/core/utils/src/dml/properties/boolean.ts b/packages/core/utils/src/dml/properties/boolean.ts new file mode 100644 index 0000000000..cbc594bff9 --- /dev/null +++ b/packages/core/utils/src/dml/properties/boolean.ts @@ -0,0 +1,11 @@ +import { BaseProperty } from "./base" + +/** + * The BooleanProperty class is used to define a boolean + * property + */ +export class BooleanProperty extends BaseProperty { + protected dataType = { + name: "boolean", + } as const +} diff --git a/packages/core/utils/src/dml/properties/date-time.ts b/packages/core/utils/src/dml/properties/date-time.ts new file mode 100644 index 0000000000..cd29241d59 --- /dev/null +++ b/packages/core/utils/src/dml/properties/date-time.ts @@ -0,0 +1,11 @@ +import { BaseProperty } from "./base" + +/** + * The DateTimeProperty class is used to define a timestampz + * property + */ +export class DateTimeProperty extends BaseProperty { + protected dataType = { + name: "dateTime", + } as const +} diff --git a/packages/core/utils/src/dml/properties/enum.ts b/packages/core/utils/src/dml/properties/enum.ts new file mode 100644 index 0000000000..3eb79bda31 --- /dev/null +++ b/packages/core/utils/src/dml/properties/enum.ts @@ -0,0 +1,19 @@ +import { BaseProperty } from "./base" + +/** + * The EnumProperty is used to define a property with pre-defined + * list of choices. + */ +export class EnumProperty< + const Values extends unknown +> extends BaseProperty { + protected dataType: { + name: "enum" + options: { choices: Values[] } + } + + constructor(values: Values[]) { + super() + this.dataType = { name: "enum", options: { choices: values } } + } +} diff --git a/packages/core/utils/src/dml/properties/json.ts b/packages/core/utils/src/dml/properties/json.ts new file mode 100644 index 0000000000..0dc748caeb --- /dev/null +++ b/packages/core/utils/src/dml/properties/json.ts @@ -0,0 +1,11 @@ +import { BaseProperty } from "./base" + +/** + * The JSONProperty is used to define a property that stores + * data as a JSON string + */ +export class JSONProperty extends BaseProperty { + protected dataType = { + name: "json", + } as const +} diff --git a/packages/core/utils/src/dml/schema/nullable.ts b/packages/core/utils/src/dml/properties/nullable.ts similarity index 65% rename from packages/core/utils/src/dml/schema/nullable.ts rename to packages/core/utils/src/dml/properties/nullable.ts index 0dee160ba7..d13a2dd03d 100644 --- a/packages/core/utils/src/dml/schema/nullable.ts +++ b/packages/core/utils/src/dml/properties/nullable.ts @@ -1,12 +1,11 @@ -import { RelationshipType, SchemaType } from "../types" +import { PropertyType } from "../types" /** * Nullable modifier marks a schema node as nullable */ -export class NullableModifier< - T, - Schema extends SchemaType | RelationshipType -> { +export class NullableModifier> + implements PropertyType +{ /** * A type-only property to infer the JavScript data-type * of the schema property @@ -26,9 +25,9 @@ export class NullableModifier< /** * Returns the serialized metadata */ - parse(fieldName: string): ReturnType { + parse(fieldName: string) { const schema = this.#schema.parse(fieldName) schema.nullable = true - return schema as ReturnType + return schema } } diff --git a/packages/core/utils/src/dml/properties/number.ts b/packages/core/utils/src/dml/properties/number.ts new file mode 100644 index 0000000000..cf3d2ea73f --- /dev/null +++ b/packages/core/utils/src/dml/properties/number.ts @@ -0,0 +1,11 @@ +import { BaseProperty } from "./base" + +/** + * The NumberProperty is used to define a numeric/integer + * property + */ +export class NumberProperty extends BaseProperty { + protected dataType = { + name: "number", + } as const +} diff --git a/packages/core/utils/src/dml/properties/text.ts b/packages/core/utils/src/dml/properties/text.ts new file mode 100644 index 0000000000..1728336b48 --- /dev/null +++ b/packages/core/utils/src/dml/properties/text.ts @@ -0,0 +1,10 @@ +import { BaseProperty } from "./base" + +/** + * The TextProperty is used to define a textual property + */ +export class TextProperty extends BaseProperty { + protected dataType = { + name: "text", + } as const +} diff --git a/packages/core/utils/src/dml/relations/nullable.ts b/packages/core/utils/src/dml/relations/nullable.ts index 4b467d415f..70fbdd659e 100644 --- a/packages/core/utils/src/dml/relations/nullable.ts +++ b/packages/core/utils/src/dml/relations/nullable.ts @@ -1,4 +1,4 @@ -import { RelationshipType, SchemaType } from "../types" +import { RelationshipType, PropertyType } from "../types" /** * Nullable modifier marks a schema node as nullable diff --git a/packages/core/utils/src/dml/schema/boolean.ts b/packages/core/utils/src/dml/schema/boolean.ts deleted file mode 100644 index 9b87647dd1..0000000000 --- a/packages/core/utils/src/dml/schema/boolean.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SchemaMetadata } from "../types" -import { BaseSchema } from "./base" - -/** - * The BooleanSchema class is used to define a boolean - * property - */ -export class BooleanSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "boolean", - } -} diff --git a/packages/core/utils/src/dml/schema/date-time.ts b/packages/core/utils/src/dml/schema/date-time.ts deleted file mode 100644 index 6faee23037..0000000000 --- a/packages/core/utils/src/dml/schema/date-time.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SchemaMetadata } from "../types" -import { BaseSchema } from "./base" - -/** - * The DateTimeSchema class is used to define a timestampz - * property - */ -export class DateTimeSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "dateTime", - } -} diff --git a/packages/core/utils/src/dml/schema/enum.ts b/packages/core/utils/src/dml/schema/enum.ts deleted file mode 100644 index ca1de451ce..0000000000 --- a/packages/core/utils/src/dml/schema/enum.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { SchemaMetadata } from "../types" -import { BaseSchema } from "./base" - -/** - * The EnumSchema is used to define a property with pre-defined - * list of choices. - */ -export class EnumSchema< - const Values extends unknown -> extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "enum", - } - - constructor(values: Values[]) { - super() - this.dataType.options = { choices: values } - } -} diff --git a/packages/core/utils/src/dml/schema/json.ts b/packages/core/utils/src/dml/schema/json.ts deleted file mode 100644 index 2ad657c822..0000000000 --- a/packages/core/utils/src/dml/schema/json.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SchemaMetadata } from "../types" -import { BaseSchema } from "./base" - -/** - * The JSONSchema is used to define a property that stores - * data as a JSON string - */ -export class JSONSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "json", - } -} diff --git a/packages/core/utils/src/dml/schema/number.ts b/packages/core/utils/src/dml/schema/number.ts deleted file mode 100644 index 9b09a8931b..0000000000 --- a/packages/core/utils/src/dml/schema/number.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SchemaMetadata } from "../types" -import { BaseSchema } from "./base" - -/** - * The NumberSchema is used to define a numeric/integer - * property - */ -export class NumberSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "number", - } -} diff --git a/packages/core/utils/src/dml/schema/text.ts b/packages/core/utils/src/dml/schema/text.ts deleted file mode 100644 index ef6f806fe5..0000000000 --- a/packages/core/utils/src/dml/schema/text.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { SchemaMetadata } from "../types" -import { BaseSchema } from "./base" - -/** - * The NumberSchema is used to define a textual property - */ -export class TextSchema extends BaseSchema { - protected dataType: SchemaMetadata["dataType"] = { - name: "text", - } -} diff --git a/packages/core/utils/src/dml/types.ts b/packages/core/utils/src/dml/types.ts index 3f1bdbbda9..263d639c4c 100644 --- a/packages/core/utils/src/dml/types.ts +++ b/packages/core/utils/src/dml/types.ts @@ -21,22 +21,12 @@ export type RelationshipTypes = | "manyToMany" /** - * Any field that contains "nullable" and "optional" properties - * in their metadata are qualified as maybe fields. - * - * This allows us to wrap them inside "NullableModifier" and - * "OptionalModifier" classes. + * The meta-data returned by the property parse method */ -export type MaybeFieldMetadata = { - nullable: boolean -} - -/** - * The meta-data returned by the schema parse method - */ -export type SchemaMetadata = MaybeFieldMetadata & { +export type PropertyMetadata = { fieldName: string defaultValue?: any + nullable: boolean dataType: { name: KnownDataTypes options?: Record @@ -49,13 +39,13 @@ export type SchemaMetadata = MaybeFieldMetadata & { } /** - * Definition of a schema type. It should have a parse + * Definition of a property type. It should have a parse * method to get the metadata and a type-only property * to get its static type */ -export type SchemaType = { +export type PropertyType = { $dataType: T - parse(fieldName: string): SchemaMetadata + parse(fieldName: string): PropertyMetadata } /** @@ -69,10 +59,11 @@ export type RelationshipOptions = { * The meta-data returned by the relationship parse * method */ -export type RelationshipMetadata = MaybeFieldMetadata & { +export type RelationshipMetadata = { name: string type: RelationshipTypes entity: unknown + nullable: boolean mappedBy?: string }