fix: JSON stringify DML json property default value (#9074)
This commit is contained in:
1 parent
afd0921326
commit
a944226025
3 files changed
+143
-1
No files matched your search
@@ -1344,6 +1344,109 @@ describe("Entity builder", () => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("define JSON property with default value", () => {
|
||||||
|
const user = model.define("user", {
|
||||||
|
id: model.number(),
|
||||||
|
email: model.text(),
|
||||||
|
phones: model.json().default({ number: "22222222" }),
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(user.name).toEqual("user")
|
||||||
|
expect(user.parse().tableName).toEqual("user")
|
||||||
|
|
||||||
|
const User = toMikroORMEntity(user)
|
||||||
|
expectTypeOf(new User()).toMatchTypeOf<{
|
||||||
|
id: number
|
||||||
|
email: string
|
||||||
|
phones: Record<string, unknown>
|
||||||
|
created_at: Date
|
||||||
|
updated_at: Date
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
reference: "scalar",
|
||||||
|
type: "string",
|
||||||
|
columnType: "text",
|
||||||
|
name: "email",
|
||||||
|
fieldName: "email",
|
||||||
|
nullable: false,
|
||||||
|
getter: false,
|
||||||
|
setter: false,
|
||||||
|
},
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
phones: {
|
||||||
|
getter: false,
|
||||||
|
name: "phones",
|
||||||
|
fieldName: "phones",
|
||||||
|
nullable: false,
|
||||||
|
reference: "scalar",
|
||||||
|
default: JSON.stringify({ number: "22222222" }),
|
||||||
|
setter: false,
|
||||||
|
columnType: "jsonb",
|
||||||
|
type: "any",
|
||||||
|
},
|
||||||
|
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", () => {
|
describe("Entity builder | id", () => {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ describe("JSON property", () => {
|
|||||||
test("create json property type", () => {
|
test("create json property type", () => {
|
||||||
const property = new JSONProperty()
|
const property = new JSONProperty()
|
||||||
|
|
||||||
expectTypeOf(property["$dataType"]).toEqualTypeOf<string>()
|
expectTypeOf(property["$dataType"]).toEqualTypeOf<Record<string, unknown>>()
|
||||||
expect(property.parse("coordinates")).toEqual({
|
expect(property.parse("coordinates")).toEqual({
|
||||||
fieldName: "coordinates",
|
fieldName: "coordinates",
|
||||||
dataType: {
|
dataType: {
|
||||||
@@ -16,4 +16,22 @@ describe("JSON property", () => {
|
|||||||
relationships: [],
|
relationships: [],
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("create json property with default value", () => {
|
||||||
|
const property = new JSONProperty().default({ a: 1 })
|
||||||
|
|
||||||
|
expectTypeOf(property["$dataType"]).toEqualTypeOf<Record<string, unknown>>()
|
||||||
|
expect(property.parse("coordinates")).toEqual({
|
||||||
|
fieldName: "coordinates",
|
||||||
|
dataType: {
|
||||||
|
name: "json",
|
||||||
|
},
|
||||||
|
defaultValue: {
|
||||||
|
a: 1,
|
||||||
|
},
|
||||||
|
nullable: false,
|
||||||
|
indexes: [],
|
||||||
|
relationships: [],
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
@@ -214,6 +214,27 @@ export function defineProperty(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handling JSON property separately to stringify its default value
|
||||||
|
*/
|
||||||
|
if (field.dataType.name === "json") {
|
||||||
|
Property({
|
||||||
|
columnType: "jsonb",
|
||||||
|
type: "any",
|
||||||
|
nullable: field.nullable,
|
||||||
|
fieldName: field.fieldName,
|
||||||
|
/**
|
||||||
|
* MikroORM does not ignore undefined values for default when generating
|
||||||
|
* the database schema SQL. Conditionally add it here to prevent undefined
|
||||||
|
* from being set as default value in SQL.
|
||||||
|
*/
|
||||||
|
...(isDefined(field.defaultValue) && {
|
||||||
|
default: JSON.stringify(field.defaultValue),
|
||||||
|
}),
|
||||||
|
})(MikroORMEntity.prototype, field.fieldName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define rest of properties
|
* Define rest of properties
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in new issue
Block a user