diff --git a/.changeset/real-bananas-learn.md b/.changeset/real-bananas-learn.md new file mode 100644 index 0000000000..c7b1fa4316 --- /dev/null +++ b/.changeset/real-bananas-learn.md @@ -0,0 +1,5 @@ +--- +"@medusajs/utils": patch +--- + +fix(utils): db migration big number default value diff --git a/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts b/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts index 1e45d094bb..c5d7e95926 100644 --- a/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts +++ b/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts @@ -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", diff --git a/packages/core/utils/src/dml/helpers/entity-builder/create-big-number-properties.ts b/packages/core/utils/src/dml/helpers/entity-builder/create-big-number-properties.ts index 55c9de8466..074d2f36b9 100644 --- a/packages/core/utils/src/dml/helpers/entity-builder/create-big-number-properties.ts +++ b/packages/core/utils/src/dml/helpers/entity-builder/create-big-number-properties.ts @@ -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( 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 diff --git a/packages/core/utils/src/dml/properties/big-number.ts b/packages/core/utils/src/dml/properties/big-number.ts index 76ebe9aef2..ed951b154d 100644 --- a/packages/core/utils/src/dml/properties/big-number.ts +++ b/packages/core/utils/src/dml/properties/big-number.ts @@ -1,3 +1,4 @@ +import { BigNumber } from "../../totals/big-number" import { BaseProperty } from "./base" /** @@ -12,4 +13,9 @@ export class BigNumberProperty extends BaseProperty { static isBigNumberProperty(obj: any): obj is BigNumberProperty { return obj?.dataType?.name === "bigNumber" } + + default(value: number | string | BigNumber) { + super.default(value as number) + return this + } } diff --git a/packages/core/utils/src/migrations/integration-tests/__tests__/migrations-generate.spec.ts b/packages/core/utils/src/migrations/integration-tests/__tests__/migrations-generate.spec.ts index b0cef88f44..1f793b27e1 100644 --- a/packages/core/utils/src/migrations/integration-tests/__tests__/migrations-generate.spec.ts +++ b/packages/core/utils/src/migrations/integration-tests/__tests__/migrations-generate.spec.ts @@ -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}'/ ) })