From cccc7561f9dc3c90f22ad293fceb7b58a67dabea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Thu, 30 Nov 2023 18:51:53 +0100 Subject: [PATCH] fix(schema): improve json default diffing for down migrations --- packages/knex/src/schema/SchemaComparator.ts | 16 ++++++++++++++-- .../schema-generator/json-diffing.mysql.test.ts | 7 +++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/knex/src/schema/SchemaComparator.ts b/packages/knex/src/schema/SchemaComparator.ts index 339d8ca1aae5..dddd13c6743d 100644 --- a/packages/knex/src/schema/SchemaComparator.ts +++ b/packages/knex/src/schema/SchemaComparator.ts @@ -566,6 +566,18 @@ export class SchemaComparator { return simplify(expr1) !== simplify(expr2); } + parseJsonDefault(defaultValue?: string | null): Dictionary | string | null { + if (!defaultValue) { + return null; + } + + const val = defaultValue + .replace(/^(_\w+\\)?'(.*?)\\?'$/, '$2') + .replace(/^\(?'(.*?)'\)?$/, '$1'); + + return parseJsonSafe(val); + } + hasSameDefaultValue(from: Column, to: Column): boolean { if (from.default == null || from.default.toString().toLowerCase() === 'null' || from.default.toString().startsWith('nextval(')) { return to.default == null || to.default!.toLowerCase() === 'null'; @@ -579,8 +591,8 @@ export class SchemaComparator { } if (to.mappedType instanceof JsonType) { - const defaultValueFrom = parseJsonSafe(from.default.replace(/^(_\w+\\)?'(.*?)\\?'$/, '$2')); - const defaultValueTo = parseJsonSafe(to.default?.replace(/^\(?'(.*?)'\)?$/, '$1')); + const defaultValueFrom = this.parseJsonDefault(from.default); + const defaultValueTo = this.parseJsonDefault(to.default); return Utils.equals(defaultValueFrom, defaultValueTo); } diff --git a/tests/features/schema-generator/json-diffing.mysql.test.ts b/tests/features/schema-generator/json-diffing.mysql.test.ts index 131d242ddd2b..89ace188865b 100644 --- a/tests/features/schema-generator/json-diffing.mysql.test.ts +++ b/tests/features/schema-generator/json-diffing.mysql.test.ts @@ -29,6 +29,9 @@ beforeAll(async () => { afterAll(() => orm.close(true)); test('default values on json columns', async () => { - const diff1 = await orm.schema.getUpdateSchemaSQL({ wrap: false }); - expect(diff1).toBe(''); + const diff1 = await orm.schema.getUpdateSchemaMigrationSQL({ wrap: false }); + expect(diff1).toEqual({ + up: '', + down: '', + }); });