fix(utils): db migration big number default value (#13913)

## Summary

**What** — What changes are introduced in this PR?

Generate db migrations with big number default values

**Why** — Why are these changes relevant or necessary?  



**How** — How have these changes been implemented?



**Testing** — How have these changes been tested, or how can the reviewer test the feature?



---

## Examples

Provide examples or code snippets that demonstrate how this feature works, or how it can be used in practice.  
This helps with documentation and ensures maintainers can quickly understand and verify the change.

```ts
// Example usage
```

---

## Checklist

Please ensure the following before requesting a review:

- [x] I have added a **changeset** for this PR
    - Every non-breaking change should be marked as a **patch**
    - To add a changeset, run `yarn changeset` and follow the prompts
- [x] The changes are covered by relevant **tests**
- [x] I have verified the code works as intended locally
- [ ] I have linked the related issue(s) if applicable

---

## Additional Context

Add any additional context, related issues, or references that might help the reviewer understand this PR.
This commit is contained in:
Carlos R. L. Rodrigues
2025-10-30 12:37:17 -03:00
committed by GitHub
parent d5fc46b222
commit c9701c70da
5 changed files with 72 additions and 6 deletions

View File

@@ -0,0 +1,5 @@
---
"@medusajs/utils": patch
---
fix(utils): db migration big number default value

View File

@@ -564,6 +564,7 @@ describe("Entity builder", () => {
},
raw_spend_limit: {
columnType: "jsonb",
default: '{"value":"500.4","precision":20}',
getter: false,
name: "raw_spend_limit",
fieldName: "raw_spend_limit",
@@ -710,6 +711,7 @@ describe("Entity builder", () => {
},
raw_spend_limit: {
columnType: "jsonb",
default: '{"value":"500.4","precision":20}',
getter: false,
name: "raw_spend_limit",
fieldName: "raw_spend_limit",

View File

@@ -1,4 +1,8 @@
import { DMLSchema } from "@medusajs/types"
import { isBigNumber } from "../../../common/is-big-number"
import { isDefined } from "../../../common/is-defined"
import { trimZeros } from "../../../common/trim-zeros"
import { BigNumber } from "../../../totals/big-number"
import { BigNumberProperty } from "../../properties/big-number"
import { JSONProperty } from "../../properties/json"
import { NullableModifier } from "../../properties/nullable"
@@ -41,9 +45,19 @@ export function createBigNumberProperties<Schema extends DMLSchema>(
continue
}
let defaultValue = parsed.defaultValue
if (isDefined(defaultValue)) {
const bigNumber = isBigNumber(defaultValue)
? (defaultValue as unknown as BigNumber)
: new BigNumber(defaultValue)
bigNumber.raw!.value = trimZeros(bigNumber.raw!.value + "")
defaultValue = bigNumber.raw
}
let jsonProperty = parsed.nullable
? new JSONProperty().nullable()
: new JSONProperty()
? new JSONProperty().default(defaultValue).nullable()
: new JSONProperty().default(defaultValue)
if (parsed.computed) {
jsonProperty = jsonProperty.computed() as unknown as

View File

@@ -1,3 +1,4 @@
import { BigNumber } from "../../totals/big-number"
import { BaseProperty } from "./base"
/**
@@ -12,4 +13,9 @@ export class BigNumberProperty extends BaseProperty<number> {
static isBigNumberProperty(obj: any): obj is BigNumberProperty {
return obj?.dataType?.name === "bigNumber"
}
default(value: number | string | BigNumber) {
super.default(value as number)
return this
}
}

View File

@@ -1,11 +1,12 @@
import { MetadataStorage } from "@medusajs/deps/mikro-orm/core"
import { join } from "path"
import { setTimeout } from "timers/promises"
import { MetadataStorage } from "@medusajs/deps/mikro-orm/core"
import { Migrations } from "../../index"
import { FileSystem } from "../../../common"
import { DmlEntity, mikroORMEntityBuilder, model } from "../../../dml"
import { defineMikroOrmCliConfig } from "../../../modules-sdk"
import { BigNumber } from "../../../totals/big-number"
import { Migrations } from "../../index"
jest.setTimeout(30000)
@@ -39,6 +40,20 @@ describe("Generate migrations", () => {
id: model.id().primaryKey(),
email: model.text().unique(),
fullName: model.text().nullable(),
numericFieldNoDefault: model.number(),
numericField: model.number().default(0),
numericFieldNullable: model.number().default(1).nullable(),
bigNumberFieldNoDefault: model.bigNumber(),
bigNumberField: model
.bigNumber()
.default(
new BigNumber(
"892.87896454789798987789789789541354687681246874956165789639",
{ precision: 50 }
)
),
bigNumberFieldNullable: model.bigNumber().default(3).nullable(),
bigNumberWithString: model.bigNumber().default("5789.6547899").nullable(),
})
const config = defineMikroOrmCliConfig(moduleName, {
@@ -54,8 +69,32 @@ describe("Generate migrations", () => {
const results = await migrations.generate()
expect(await fs.exists(results.fileName))
expect(await fs.contents(results.fileName)).toMatch(
/create table if not exists "user"/
const migrationFile = await fs.contents(results.fileName)
expect(migrationFile).toMatch(/create table if not exists "user"/)
expect(migrationFile).toMatch(/"numericFieldNoDefault" integer not null/)
expect(migrationFile).toMatch(/"numericField" integer not null default 0/)
expect(migrationFile).toMatch(
/"numericFieldNullable" integer null default 1/
)
expect(migrationFile).toMatch(
/"bigNumberWithString" numeric null default '5789\.6547899'/
)
expect(migrationFile).toMatch(
/"bigNumberField" numeric not null default 892\.878964547898/
)
expect(migrationFile).toMatch(
/"bigNumberFieldNullable" numeric null default 3/
)
expect(migrationFile).toMatch(/"bigNumberFieldNoDefault" numeric not null/)
expect(migrationFile).toMatch(
/"raw_bigNumberField" jsonb not null default '{"value":"892\.87896454789798987789789789541354687681246874956","precision":50}'/
)
expect(migrationFile).toMatch(
/"raw_bigNumberFieldNullable" jsonb null default '{"value":"3","precision":20}'/
)
expect(migrationFile).toMatch(
/"raw_bigNumberWithString" jsonb null default '{"value":"5789\.6547899","precision":20}'/
)
})