Revert "feat: add optional fields" (#10159)
Reverts medusajs/medusa#10150
This commit is contained in:
@@ -12,7 +12,6 @@ describe("Array property", () => {
|
||||
name: "array",
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { PropertyMetadata } from "@medusajs/types"
|
||||
import { expectTypeOf } from "expect-type"
|
||||
import { BaseProperty } from "../properties/base"
|
||||
import { PropertyMetadata } from "@medusajs/types"
|
||||
import { TextProperty } from "../properties/text"
|
||||
|
||||
describe("Base property", () => {
|
||||
@@ -20,7 +20,6 @@ describe("Base property", () => {
|
||||
name: "text",
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -39,7 +38,6 @@ describe("Base property", () => {
|
||||
},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -61,7 +59,6 @@ describe("Base property", () => {
|
||||
name: "text",
|
||||
},
|
||||
nullable: true,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -84,98 +81,6 @@ describe("Base property", () => {
|
||||
},
|
||||
defaultValue: "foo",
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
})
|
||||
|
||||
test("apply optional modifier", () => {
|
||||
class StringProperty extends BaseProperty<string> {
|
||||
protected dataType: PropertyMetadata["dataType"] = {
|
||||
name: "text",
|
||||
}
|
||||
}
|
||||
|
||||
const property = new StringProperty().optional()
|
||||
|
||||
expectTypeOf(property["$dataType"]).toEqualTypeOf<string | undefined>()
|
||||
expect(property.parse("username")).toEqual({
|
||||
fieldName: "username",
|
||||
dataType: {
|
||||
name: "text",
|
||||
},
|
||||
nullable: false,
|
||||
optional: true,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
})
|
||||
|
||||
test("apply optional and nullable modifier", () => {
|
||||
class StringProperty extends BaseProperty<string> {
|
||||
protected dataType: PropertyMetadata["dataType"] = {
|
||||
name: "text",
|
||||
}
|
||||
}
|
||||
|
||||
const property = new StringProperty().optional().nullable()
|
||||
expectTypeOf(property["$dataType"]).toEqualTypeOf<
|
||||
string | undefined | null
|
||||
>()
|
||||
expect(property.parse("username")).toEqual({
|
||||
fieldName: "username",
|
||||
dataType: {
|
||||
name: "text",
|
||||
},
|
||||
nullable: true,
|
||||
optional: true,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
})
|
||||
|
||||
test("apply nullable and optional modifier", () => {
|
||||
class StringProperty extends BaseProperty<string> {
|
||||
protected dataType: PropertyMetadata["dataType"] = {
|
||||
name: "text",
|
||||
}
|
||||
}
|
||||
|
||||
const property = new StringProperty().nullable().optional()
|
||||
expectTypeOf(property["$dataType"]).toEqualTypeOf<
|
||||
string | null | undefined
|
||||
>()
|
||||
expect(property.parse("username")).toEqual({
|
||||
fieldName: "username",
|
||||
dataType: {
|
||||
name: "text",
|
||||
},
|
||||
nullable: true,
|
||||
optional: true,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
})
|
||||
|
||||
test("define default value as a callback", () => {
|
||||
class StringProperty extends BaseProperty<string> {
|
||||
protected dataType: PropertyMetadata["dataType"] = {
|
||||
name: "text",
|
||||
}
|
||||
}
|
||||
|
||||
const property = new StringProperty().default(() => "22")
|
||||
|
||||
expectTypeOf(property["$dataType"]).toEqualTypeOf<string>()
|
||||
expect(property.parse("username")).toEqual({
|
||||
fieldName: "username",
|
||||
dataType: {
|
||||
name: "text",
|
||||
},
|
||||
defaultValue: expect.any(Function),
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -12,7 +12,6 @@ describe("Big Number property", () => {
|
||||
name: "bigNumber",
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -12,7 +12,6 @@ describe("Boolean property", () => {
|
||||
name: "boolean",
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -12,7 +12,6 @@ describe("DateTime property", () => {
|
||||
name: "dateTime",
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -8,7 +8,6 @@ import {
|
||||
toMikroOrmEntities,
|
||||
toMikroORMEntity,
|
||||
} from "../helpers/create-mikro-orm-entity"
|
||||
import { InferTypeOf } from "@medusajs/types"
|
||||
|
||||
describe("Entity builder", () => {
|
||||
beforeEach(() => {
|
||||
@@ -1448,130 +1447,6 @@ describe("Entity builder", () => {
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
test("define a property with default runtime value", () => {
|
||||
const user = model.define("user", {
|
||||
id: model.number(),
|
||||
username: model.text().default((schema) => {
|
||||
const { email } = schema as InferTypeOf<typeof user>
|
||||
return email.replace(/\@.*/, "")
|
||||
}),
|
||||
email: model.text(),
|
||||
spend_limit: model.bigNumber().default(500.4),
|
||||
})
|
||||
|
||||
const User = toMikroORMEntity(user)
|
||||
expectTypeOf(new User()).toMatchTypeOf<{
|
||||
id: number
|
||||
username: string
|
||||
email: string
|
||||
deleted_at: Date | null
|
||||
}>()
|
||||
|
||||
const metaData = MetadataStorage.getMetadataFromDecorator(User)
|
||||
expect(metaData.className).toEqual("User")
|
||||
expect(metaData.path).toEqual("User")
|
||||
|
||||
expect(metaData.filters).toEqual({
|
||||
softDeletable: {
|
||||
name: "softDeletable",
|
||||
cond: expect.any(Function),
|
||||
default: true,
|
||||
args: false,
|
||||
},
|
||||
})
|
||||
|
||||
expect(metaData.properties).toEqual({
|
||||
id: {
|
||||
reference: "scalar",
|
||||
type: "number",
|
||||
columnType: "integer",
|
||||
name: "id",
|
||||
fieldName: "id",
|
||||
nullable: false,
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
username: {
|
||||
reference: "scalar",
|
||||
type: "string",
|
||||
default: expect.any(Function),
|
||||
columnType: "text",
|
||||
name: "username",
|
||||
fieldName: "username",
|
||||
nullable: false,
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
email: {
|
||||
reference: "scalar",
|
||||
type: "string",
|
||||
columnType: "text",
|
||||
name: "email",
|
||||
fieldName: "email",
|
||||
nullable: false,
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
spend_limit: {
|
||||
columnType: "numeric",
|
||||
default: 500.4,
|
||||
getter: true,
|
||||
name: "spend_limit",
|
||||
fieldName: "spend_limit",
|
||||
nullable: false,
|
||||
reference: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
},
|
||||
raw_spend_limit: {
|
||||
columnType: "jsonb",
|
||||
getter: false,
|
||||
name: "raw_spend_limit",
|
||||
fieldName: "raw_spend_limit",
|
||||
nullable: false,
|
||||
reference: "scalar",
|
||||
setter: false,
|
||||
type: "any",
|
||||
},
|
||||
created_at: {
|
||||
reference: "scalar",
|
||||
type: "date",
|
||||
columnType: "timestamptz",
|
||||
name: "created_at",
|
||||
fieldName: "created_at",
|
||||
defaultRaw: "now()",
|
||||
onCreate: expect.any(Function),
|
||||
nullable: false,
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
updated_at: {
|
||||
reference: "scalar",
|
||||
type: "date",
|
||||
columnType: "timestamptz",
|
||||
name: "updated_at",
|
||||
fieldName: "updated_at",
|
||||
defaultRaw: "now()",
|
||||
onCreate: expect.any(Function),
|
||||
onUpdate: expect.any(Function),
|
||||
nullable: false,
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
deleted_at: {
|
||||
reference: "scalar",
|
||||
type: "date",
|
||||
columnType: "timestamptz",
|
||||
name: "deleted_at",
|
||||
fieldName: "deleted_at",
|
||||
nullable: true,
|
||||
getter: false,
|
||||
setter: false,
|
||||
},
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("Entity builder | id", () => {
|
||||
|
||||
@@ -17,7 +17,6 @@ describe("Enum property", () => {
|
||||
},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -43,7 +42,6 @@ describe("Enum property", () => {
|
||||
},
|
||||
},
|
||||
nullable: true,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -68,7 +66,6 @@ describe("Enum property", () => {
|
||||
},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -93,7 +90,6 @@ describe("Enum property", () => {
|
||||
},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -13,7 +13,6 @@ describe("Id property", () => {
|
||||
options: {},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -30,7 +29,6 @@ describe("Id property", () => {
|
||||
options: {},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
primaryKey: true,
|
||||
|
||||
@@ -12,7 +12,6 @@ describe("JSON property", () => {
|
||||
name: "json",
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -31,7 +30,6 @@ describe("JSON property", () => {
|
||||
a: 1,
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -13,7 +13,6 @@ describe("Number property", () => {
|
||||
options: {},
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
|
||||
@@ -13,7 +13,6 @@ describe("Text property", () => {
|
||||
options: { searchable: false },
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
})
|
||||
@@ -30,7 +29,6 @@ describe("Text property", () => {
|
||||
options: { searchable: false },
|
||||
},
|
||||
nullable: false,
|
||||
optional: false,
|
||||
indexes: [],
|
||||
relationships: [],
|
||||
primaryKey: true,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { PropertyMetadata, PropertyType } from "@medusajs/types"
|
||||
import { NullableModifier } from "./nullable"
|
||||
import { OptionalModifier } from "./optional"
|
||||
|
||||
/**
|
||||
* The BaseProperty class offers shared affordances to define
|
||||
@@ -16,7 +15,7 @@ export abstract class BaseProperty<T> implements PropertyType<T> {
|
||||
/**
|
||||
* Default value for the property
|
||||
*/
|
||||
#defaultValue?: T | ((schema: any) => T)
|
||||
#defaultValue?: T
|
||||
|
||||
/**
|
||||
* The runtime dataType for the schema. It is not the same as
|
||||
@@ -49,25 +48,6 @@ export abstract class BaseProperty<T> implements PropertyType<T> {
|
||||
return new NullableModifier<T, this>(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* This method indicates that a property's value can be `optional`.
|
||||
*
|
||||
* @example
|
||||
* import { model } from "@medusajs/framework/utils"
|
||||
*
|
||||
* const MyCustom = model.define("my_custom", {
|
||||
* price: model.bigNumber().optional(),
|
||||
* // ...
|
||||
* })
|
||||
*
|
||||
* export default MyCustom
|
||||
*
|
||||
* @customNamespace Property Configuration Methods
|
||||
*/
|
||||
optional() {
|
||||
return new OptionalModifier<T, this>(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* This method defines an index on a property.
|
||||
*
|
||||
@@ -139,7 +119,7 @@ export abstract class BaseProperty<T> implements PropertyType<T> {
|
||||
*
|
||||
* @customNamespace Property Configuration Methods
|
||||
*/
|
||||
default(value: T | ((schema: any) => T)) {
|
||||
default(value: T) {
|
||||
this.#defaultValue = value
|
||||
return this
|
||||
}
|
||||
@@ -152,7 +132,6 @@ export abstract class BaseProperty<T> implements PropertyType<T> {
|
||||
fieldName,
|
||||
dataType: this.dataType,
|
||||
nullable: false,
|
||||
optional: false,
|
||||
defaultValue: this.#defaultValue,
|
||||
indexes: this.#indexes,
|
||||
relationships: this.#relationships,
|
||||
|
||||
@@ -7,7 +7,6 @@ export * from "./enum"
|
||||
export * from "./id"
|
||||
export * from "./json"
|
||||
export * from "./nullable"
|
||||
export * from "./optional"
|
||||
export * from "./number"
|
||||
export * from "./primary-key"
|
||||
export * from "./text"
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import { PropertyType } from "@medusajs/types"
|
||||
import { OptionalModifier } from "./optional"
|
||||
|
||||
const IsNullableModifier = Symbol.for("isNullableModifier")
|
||||
/**
|
||||
* Nullable modifier marks a schema node as nullable
|
||||
*/
|
||||
export class NullableModifier<T, Schema extends PropertyType<NoInfer<T>>>
|
||||
export class NullableModifier<T, Schema extends PropertyType<T>>
|
||||
implements PropertyType<T | null>
|
||||
{
|
||||
[IsNullableModifier]: true = true
|
||||
@@ -13,7 +12,6 @@ export class NullableModifier<T, Schema extends PropertyType<NoInfer<T>>>
|
||||
static isNullableModifier(obj: any): obj is NullableModifier<any, any> {
|
||||
return !!obj?.[IsNullableModifier]
|
||||
}
|
||||
|
||||
/**
|
||||
* A type-only property to infer the JavScript data-type
|
||||
* of the schema property
|
||||
@@ -30,25 +28,6 @@ export class NullableModifier<T, Schema extends PropertyType<NoInfer<T>>>
|
||||
this.#schema = schema
|
||||
}
|
||||
|
||||
/**
|
||||
* This method indicates that a property's value can be `optional`.
|
||||
*
|
||||
* @example
|
||||
* import { model } from "@medusajs/framework/utils"
|
||||
*
|
||||
* const MyCustom = model.define("my_custom", {
|
||||
* price: model.bigNumber().optional(),
|
||||
* // ...
|
||||
* })
|
||||
*
|
||||
* export default MyCustom
|
||||
*
|
||||
* @customNamespace Property Configuration Methods
|
||||
*/
|
||||
optional() {
|
||||
return new OptionalModifier<T | null, this>(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the serialized metadata
|
||||
*/
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
import { PropertyType } from "@medusajs/types"
|
||||
import { NullableModifier } from "./nullable"
|
||||
|
||||
const IsOptionalModifier = Symbol.for("IsOptionalModifier")
|
||||
|
||||
/**
|
||||
* Nullable modifier marks a schema node as optional and
|
||||
* allows for default values
|
||||
*/
|
||||
export class OptionalModifier<T, Schema extends PropertyType<T>>
|
||||
implements PropertyType<T | undefined>
|
||||
{
|
||||
[IsOptionalModifier]: true = true
|
||||
|
||||
static isOptionalModifier(obj: any): obj is OptionalModifier<any, any> {
|
||||
return !!obj?.[IsOptionalModifier]
|
||||
}
|
||||
|
||||
/**
|
||||
* A type-only property to infer the JavScript data-type
|
||||
* of the schema property
|
||||
*/
|
||||
declare $dataType: T | undefined
|
||||
|
||||
/**
|
||||
* The parent schema on which the nullable modifier is
|
||||
* applied
|
||||
*/
|
||||
#schema: Schema
|
||||
|
||||
constructor(schema: Schema) {
|
||||
this.#schema = schema
|
||||
}
|
||||
|
||||
/**
|
||||
* This method indicates that a property's value can be `null`.
|
||||
*
|
||||
* @example
|
||||
* import { model } from "@medusajs/framework/utils"
|
||||
*
|
||||
* const MyCustom = model.define("my_custom", {
|
||||
* price: model.bigNumber().optional().nullable(),
|
||||
* // ...
|
||||
* })
|
||||
*
|
||||
* export default MyCustom
|
||||
*
|
||||
* @customNamespace Property Configuration Methods
|
||||
*/
|
||||
nullable() {
|
||||
return new NullableModifier<T | undefined, this>(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the serialized metadata
|
||||
*/
|
||||
parse(fieldName: string) {
|
||||
const schema = this.#schema.parse(fieldName)
|
||||
schema.optional = true
|
||||
return schema
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user