chore(): Upgrade mikro orm (#13390)
* chore(): Upgrade mikro orm * handle 'null' value for big number props * 6.5.2 * remove only * fix pricing module rule value * switch select in strategy for balances * revert to select in strategy for order module * fix defining DML ManyToOne * fix define relationship * test fix * more fixes * change order strategy to balanced * change order strategy to balanced * prevent unnecessary manager fork * revert generated www changes * remove unnecessary changes * Create real-cobras-deny.md * address feedback --------- Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
co-authored by
Oli Juhl
parent
fc4d5f0ac9
commit
a095245d71
@@ -26,10 +26,10 @@
|
||||
"author": "Medusa",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@mikro-orm/core": "6.4.3",
|
||||
"@mikro-orm/knex": "6.4.3",
|
||||
"@mikro-orm/migrations": "6.4.3",
|
||||
"@mikro-orm/postgresql": "6.4.3",
|
||||
"@mikro-orm/core": "6.5.2",
|
||||
"@mikro-orm/knex": "6.5.2",
|
||||
"@mikro-orm/migrations": "6.5.2",
|
||||
"@mikro-orm/postgresql": "6.5.2",
|
||||
"@swc/core": "^1.7.28",
|
||||
"@swc/jest": "^0.2.36",
|
||||
"@types/express": "^4.17.21",
|
||||
@@ -37,7 +37,7 @@
|
||||
"expect-type": "^0.20.0",
|
||||
"express": "^4.21.0",
|
||||
"jest": "^29.7.0",
|
||||
"pg": "^8.13.0",
|
||||
"pg": "^8.16.3",
|
||||
"pg-god": "^1.0.12",
|
||||
"rimraf": "^5.0.1",
|
||||
"typescript": "^5.6.2"
|
||||
@@ -60,13 +60,13 @@
|
||||
"zod": "3.25.76"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@mikro-orm/core": "6.4.3",
|
||||
"@mikro-orm/knex": "6.4.3",
|
||||
"@mikro-orm/migrations": "6.4.3",
|
||||
"@mikro-orm/postgresql": "6.4.3",
|
||||
"@mikro-orm/core": "6.5.2",
|
||||
"@mikro-orm/knex": "6.5.2",
|
||||
"@mikro-orm/migrations": "6.5.2",
|
||||
"@mikro-orm/postgresql": "6.5.2",
|
||||
"awilix": "^8.0.1",
|
||||
"express": "^4.21.0",
|
||||
"pg": "^8.13.0"
|
||||
"pg": "^8.16.3"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "rimraf dist && tsc --build",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { BigNumberInput } from "@medusajs/types"
|
||||
import { Property } from "@mikro-orm/core"
|
||||
import { isDefined, isPresent, trimZeros } from "../../common"
|
||||
import { EntityProperty, Platform, Property, Type } from "@mikro-orm/core"
|
||||
import { isDefined, isObject, isPresent, trimZeros } from "../../common"
|
||||
import { BigNumber } from "../../totals/big-number"
|
||||
|
||||
export function MikroOrmBigNumberProperty(
|
||||
@@ -24,6 +24,11 @@ export function MikroOrmBigNumberProperty(
|
||||
return value
|
||||
},
|
||||
set(value: BigNumberInput) {
|
||||
// convert 'null' to null
|
||||
if (value === "null") {
|
||||
value = null as unknown as BigNumberInput
|
||||
}
|
||||
|
||||
if (options?.nullable && !isPresent(value)) {
|
||||
this.__helper.__data[columnName] = null
|
||||
this.__helper.__data[rawColumnName] = null
|
||||
@@ -89,7 +94,7 @@ export function MikroOrmBigNumberProperty(
|
||||
})
|
||||
|
||||
Property({
|
||||
type: "any",
|
||||
type: BigNumberNumeric,
|
||||
columnType: "numeric",
|
||||
trackChanges: false,
|
||||
runtimeType: "any",
|
||||
@@ -97,3 +102,43 @@ export function MikroOrmBigNumberProperty(
|
||||
})(target, columnName)
|
||||
}
|
||||
}
|
||||
|
||||
class BigNumberNumeric extends Type<string | number, string> {
|
||||
constructor(public mode?: "number" | "string") {
|
||||
super()
|
||||
}
|
||||
|
||||
override convertToJSValue(value: string): number | string {
|
||||
if ((this.mode ?? this.prop?.runtimeType) === "number") {
|
||||
return +value
|
||||
}
|
||||
|
||||
if (isObject(value)) {
|
||||
return value // Special case for BigNumberRawValue because the setter will manage the dispatch automatically at a later stage
|
||||
}
|
||||
|
||||
return String(value)
|
||||
}
|
||||
|
||||
override compareValues(a: string, b: string): boolean {
|
||||
return this.format(a) === this.format(b)
|
||||
}
|
||||
|
||||
private format(val: string | number) {
|
||||
/* istanbul ignore next */
|
||||
if (this.prop?.scale == null) {
|
||||
return +val
|
||||
}
|
||||
|
||||
const base = Math.pow(10, this.prop.scale)
|
||||
return Math.round((+val + Number.EPSILON) * base) / base
|
||||
}
|
||||
|
||||
override getColumnType(prop: EntityProperty, platform: Platform) {
|
||||
return platform.getDecimalTypeDeclarationSQL(prop)
|
||||
}
|
||||
|
||||
override compareAsType(): string {
|
||||
return this.mode ?? this.prop?.runtimeType ?? "string"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,11 +64,9 @@ export class MikroOrmBase {
|
||||
transaction?: TManager
|
||||
} = {}
|
||||
): Promise<any> {
|
||||
const freshManager = this.getFreshManager
|
||||
? this.getFreshManager()
|
||||
: this.manager_
|
||||
this.manager_.global = true // this prevent mikro orm from synchronising the transaction manager entity map back to the manager. Also, it will save us from always forking the manager for each transaction while the transacation manager will fork it again for transaction purpose
|
||||
|
||||
return await transactionWrapper(freshManager, task, options).catch(
|
||||
return await transactionWrapper(this.manager_, task, options).catch(
|
||||
dbErrorMapper
|
||||
)
|
||||
}
|
||||
@@ -467,11 +465,7 @@ export function mikroOrmBaseRepositoryFactory<const T extends object>(
|
||||
if (!("strategy" in findOptions_.options)) {
|
||||
if (findOptions_.options.limit != null || findOptions_.options.offset) {
|
||||
Object.assign(findOptions_.options, {
|
||||
strategy: LoadStrategy.SELECT_IN,
|
||||
})
|
||||
} else {
|
||||
Object.assign(findOptions_.options, {
|
||||
strategy: LoadStrategy.JOINED,
|
||||
strategy: LoadStrategy.BALANCED,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ describe("Entity builder", () => {
|
||||
kind: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
type: expect.any(Function),
|
||||
runtimeType: "any",
|
||||
},
|
||||
raw_spend_limit: {
|
||||
@@ -306,7 +306,7 @@ describe("Entity builder", () => {
|
||||
kind: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
type: expect.any(Function),
|
||||
runtimeType: "any",
|
||||
},
|
||||
raw_spend_limit: {
|
||||
@@ -441,7 +441,7 @@ describe("Entity builder", () => {
|
||||
kind: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
type: expect.any(Function),
|
||||
runtimeType: "any",
|
||||
},
|
||||
raw_spend_limit: {
|
||||
@@ -555,7 +555,7 @@ describe("Entity builder", () => {
|
||||
kind: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
type: expect.any(Function),
|
||||
runtimeType: "any",
|
||||
},
|
||||
raw_spend_limit: {
|
||||
@@ -701,7 +701,7 @@ describe("Entity builder", () => {
|
||||
kind: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
type: expect.any(Function),
|
||||
runtimeType: "any",
|
||||
},
|
||||
raw_spend_limit: {
|
||||
@@ -858,7 +858,7 @@ describe("Entity builder", () => {
|
||||
kind: "scalar",
|
||||
setter: true,
|
||||
trackChanges: false,
|
||||
type: "any",
|
||||
type: expect.any(Function),
|
||||
runtimeType: "any",
|
||||
},
|
||||
created_at: {
|
||||
@@ -3916,6 +3916,7 @@ describe("Entity builder", () => {
|
||||
type: "string",
|
||||
},
|
||||
group: {
|
||||
defaultRaw: "",
|
||||
entity: "Group",
|
||||
fieldName: "group_id",
|
||||
name: "group",
|
||||
@@ -4536,6 +4537,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
user: {
|
||||
defaultRaw: "",
|
||||
entity: "User",
|
||||
fieldName: "user_id",
|
||||
name: "user",
|
||||
@@ -5147,6 +5149,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
user: {
|
||||
defaultRaw: "",
|
||||
name: "user",
|
||||
kind: "m:1",
|
||||
entity: "User",
|
||||
@@ -5336,6 +5339,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
user: {
|
||||
defaultRaw: "",
|
||||
name: "user",
|
||||
kind: "m:1",
|
||||
fieldName: "user_id",
|
||||
@@ -5884,6 +5888,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
parent: {
|
||||
defaultRaw: "",
|
||||
name: "parent",
|
||||
fieldName: "parent_id",
|
||||
kind: "m:1",
|
||||
@@ -6135,6 +6140,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -6204,6 +6210,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
inversedBy: "teams",
|
||||
@@ -6316,6 +6323,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -6385,6 +6393,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "User",
|
||||
@@ -6611,6 +6620,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -6680,6 +6690,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "User",
|
||||
@@ -6792,6 +6803,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -6861,6 +6873,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "User",
|
||||
@@ -6991,6 +7004,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -6999,6 +7013,7 @@ describe("Entity builder", () => {
|
||||
mappedBy: "users",
|
||||
},
|
||||
activeTeams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "activeTeams",
|
||||
entity: "Team",
|
||||
@@ -7068,6 +7083,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "User",
|
||||
@@ -7076,6 +7092,7 @@ describe("Entity builder", () => {
|
||||
inversedBy: "teams",
|
||||
},
|
||||
activeTeamsUsers: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "activeTeamsUsers",
|
||||
entity: "User",
|
||||
@@ -7191,6 +7208,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -7261,6 +7279,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "User",
|
||||
@@ -7349,6 +7368,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "TeamSquad",
|
||||
@@ -7418,6 +7438,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "RandomUser",
|
||||
@@ -7533,6 +7554,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
@@ -7602,6 +7624,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
owner: false,
|
||||
@@ -7811,6 +7834,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
users: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "users",
|
||||
entity: "User",
|
||||
@@ -7880,6 +7904,7 @@ describe("Entity builder", () => {
|
||||
setter: false,
|
||||
},
|
||||
teams: {
|
||||
defaultRaw: "",
|
||||
kind: "m:n",
|
||||
name: "teams",
|
||||
entity: "Team",
|
||||
|
||||
@@ -6,7 +6,7 @@ import type {
|
||||
Infer,
|
||||
PropertyType,
|
||||
} from "@medusajs/types"
|
||||
import { Entity, Filter } from "@mikro-orm/core"
|
||||
import { Entity, Filter, MetadataStorage } from "@mikro-orm/core"
|
||||
|
||||
import {
|
||||
mikroOrmFreeTextSearchFilterOptionsFactory,
|
||||
@@ -116,12 +116,16 @@ function createMikrORMEntity() {
|
||||
Filter(mikroOrmFreeTextSearchFilterOptionsFactory(modelName))(
|
||||
MikroORMEntity
|
||||
)
|
||||
const RegisteredEntity = Entity({ tableName })(
|
||||
Filter(mikroOrmSoftDeletableFilterOptions)(MikroORMEntity)
|
||||
) as Infer<T>
|
||||
|
||||
ENTITIES[modelName] = RegisteredEntity
|
||||
return RegisteredEntity
|
||||
Entity({ tableName })(
|
||||
Filter(mikroOrmSoftDeletableFilterOptions)(MikroORMEntity)
|
||||
) as any
|
||||
|
||||
const entityMetadata =
|
||||
MetadataStorage.getMetadataFromDecorator(MikroORMEntity)
|
||||
|
||||
ENTITIES[modelName] = entityMetadata.class as Constructor<any>
|
||||
return entityMetadata.class as Infer<T>
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -294,6 +294,7 @@ export function defineHasManyRelationship(
|
||||
}
|
||||
|
||||
OneToMany(options)(MikroORMEntity.prototype, relationship.name)
|
||||
// MikroORMEntity.prototype[relationship.name] = new Collection(MikroORMEntity)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -466,6 +467,7 @@ export function defineBelongsToRelationship(
|
||||
|
||||
ManyToOne({
|
||||
entity: relatedModelName,
|
||||
defaultRaw: "", // This is a workaround since we are hacking mikro orm default behavior. The default value here is [Object object] which pass the check here and in turns is returned as a returning field -> @mikro-orm/knex/AbstractSqlDriver.js:462
|
||||
fieldName: foreignKeyName,
|
||||
persist: false,
|
||||
nullable: relationship.nullable,
|
||||
@@ -741,6 +743,7 @@ export function defineManyToManyRelationship(
|
||||
const manytoManyOptions = {
|
||||
owner: isOwner,
|
||||
entity: relatedModelName,
|
||||
defaultRaw: "", // This is a workaround since we are hacking mikro orm default behavior. The default value here is [Object object] which pass the check here and in turns is returned as a returning field -> @mikro-orm/knex/AbstractSqlDriver.js:462
|
||||
...(pivotTableName
|
||||
? {
|
||||
pivotTable: pgSchema
|
||||
|
||||
@@ -16,6 +16,7 @@ describe("Internal Module Service Factory", () => {
|
||||
[modelRepositoryName]: {
|
||||
transaction: (task) => task(),
|
||||
getFreshManager: jest.fn().mockReturnThis(),
|
||||
getActiveManager: jest.fn().mockReturnThis(),
|
||||
find: jest.fn(),
|
||||
findAndCount: jest.fn(),
|
||||
create: jest.fn(),
|
||||
@@ -28,6 +29,7 @@ describe("Internal Module Service Factory", () => {
|
||||
[`composite${Model.name}Repository`]: {
|
||||
transaction: (task) => task(),
|
||||
getFreshManager: jest.fn().mockReturnThis(),
|
||||
getActiveManager: jest.fn().mockReturnThis(),
|
||||
find: jest.fn(),
|
||||
findAndCount: jest.fn(),
|
||||
create: jest.fn(),
|
||||
|
||||
@@ -7,6 +7,7 @@ const baseRepoMock = {
|
||||
serialize: jest.fn().mockImplementation((item) => item),
|
||||
transaction: (task) => task("transactionManager"),
|
||||
getFreshManager: jest.fn().mockReturnThis(),
|
||||
getActiveManager: jest.fn().mockReturnThis(),
|
||||
}
|
||||
|
||||
const defaultContext = {
|
||||
|
||||
@@ -52,7 +52,8 @@ export function InjectManager(managerProperty?: string): MethodDecorator {
|
||||
}
|
||||
|
||||
copiedContext.manager =
|
||||
originalContext.manager ?? resourceWithManager.getFreshManager()
|
||||
originalContext.manager ??
|
||||
resourceWithManager.getActiveManager(originalContext)
|
||||
|
||||
if (originalContext?.transactionManager) {
|
||||
copiedContext.transactionManager = originalContext?.transactionManager
|
||||
|
||||
Reference in New Issue
Block a user