From bdfd9c9d179310170c201eac5ab7c48a4c0726ee Mon Sep 17 00:00:00 2001 From: Captain Claw Date: Wed, 11 Feb 2026 20:50:29 +0000 Subject: [PATCH] fix: return DateFieldBuilder from defaultNow() and onUpdateNow() for proper method chaining --- .../src/schema/__tests__/fields.test.ts | 16 ++++++++++++++++ .../src/schema/field-builders-primitive.ts | 8 ++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/mizzle-orm/src/schema/__tests__/fields.test.ts b/packages/mizzle-orm/src/schema/__tests__/fields.test.ts index 9815a12..b40517f 100644 --- a/packages/mizzle-orm/src/schema/__tests__/fields.test.ts +++ b/packages/mizzle-orm/src/schema/__tests__/fields.test.ts @@ -132,6 +132,22 @@ describe('Field Builders', () => { expect(field._config.onUpdateNow).toBe(true); }); + it('should support defaultNow().onUpdateNow() chaining for timestamp fields', () => { + // Regression test: defaultNow() must return DateFieldBuilder so onUpdateNow() is available + // This pattern is common for updatedAt fields that need both default and auto-update behavior + const field = date().defaultNow().onUpdateNow(); + expect(field._config.defaultNow).toBe(true); + expect(field._config.onUpdateNow).toBe(true); + expect(field._config.type).toBe(FieldType.DATE); + }); + + it('should support onUpdateNow().defaultNow() chaining in reverse order', () => { + // Ensure chaining works in either order + const field = date().onUpdateNow().defaultNow(); + expect(field._config.defaultNow).toBe(true); + expect(field._config.onUpdateNow).toBe(true); + }); + it('should support soft delete flag', () => { const field = date().softDeleteFlag(); expect(field._config.isSoftDeleteFlag).toBe(true); diff --git a/packages/mizzle-orm/src/schema/field-builders-primitive.ts b/packages/mizzle-orm/src/schema/field-builders-primitive.ts index 6eb2420..a32afec 100644 --- a/packages/mizzle-orm/src/schema/field-builders-primitive.ts +++ b/packages/mizzle-orm/src/schema/field-builders-primitive.ts @@ -123,12 +123,12 @@ export class DateFieldBuilder extends FieldBuilder> implements IDateFieldBuilder { - constructor() { - super(FieldType.DATE); + constructor(config: Partial> = {}) { + super(FieldType.DATE, config); } defaultNow(): DateFieldBuilder { - return new FieldBuilder(this._config.type, { + return new DateFieldBuilder({ ...this._config, defaultNow: true, defaultValue: () => new Date(), @@ -136,7 +136,7 @@ export class DateFieldBuilder } onUpdateNow(): DateFieldBuilder { - return new FieldBuilder(this._config.type, { + return new DateFieldBuilder({ ...this._config, onUpdateNow: true, }) as any;