From 8493071e264deaf53a972649b361d4fcdf779382 Mon Sep 17 00:00:00 2001 From: kiddyu <58631254@qq.com> Date: Fri, 13 Jun 2025 02:38:43 +0800 Subject: [PATCH 1/3] fix: identify JoinClause instances (#73) --- src/soft-deleting-scope.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/soft-deleting-scope.js b/src/soft-deleting-scope.js index e734714..642f042 100644 --- a/src/soft-deleting-scope.js +++ b/src/soft-deleting-scope.js @@ -3,7 +3,7 @@ const { tap } = require('./utils'); const hasJoins = (statements) => { for (const statement of statements) { - if (typeof statement === 'JoinClause' || statement?.grouping === 'join') { + if (statement?.grouping === 'join') { return true; } } From a46501adab72e175e37ef821166e426f78d83760 Mon Sep 17 00:00:00 2001 From: kiddyu <58631254@qq.com> Date: Fri, 13 Jun 2025 02:41:53 +0800 Subject: [PATCH 2/3] fix: align makeVisible/makeHidden behavior with eloquent --- src/concerns/hides-attributes.js | 12 ++++++++--- test/index.test.js | 37 ++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/concerns/hides-attributes.js b/src/concerns/hides-attributes.js index fde8c9b..cc789b7 100644 --- a/src/concerns/hides-attributes.js +++ b/src/concerns/hides-attributes.js @@ -8,7 +8,10 @@ const HidesAttributes = (Model) => { makeVisible(...keys) { const visible = flattenDeep(keys); - this.visible = [...this.visible, ...visible]; + + if (this.visible.length > 0) { + this.visible = [...this.visible, ...visible]; + } this.hidden = difference(this.hidden, visible); return this; @@ -16,9 +19,10 @@ const HidesAttributes = (Model) => { makeHidden(...keys) { const hidden = flattenDeep(keys); - this.hidden = [...this.hidden, ...hidden]; - this.visible = difference(this.visible, hidden); + if (this.hidden.length > 0) { + this.hidden = [...this.hidden, ...hidden]; + } return this; } @@ -32,10 +36,12 @@ const HidesAttributes = (Model) => { setHidden(hidden) { this.hidden = hidden; + return this; } setVisible(visible) { this.visible = visible; + return this; } } } diff --git a/test/index.test.js b/test/index.test.js index 657ef12..8bfd0fe 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -190,7 +190,7 @@ describe('Model', () => { }); it('serializes correctly', () => { - testModel.makeVisible('firstName'); + testModel.setVisible(['firstName']); expect(testModel.toJson()).toBe('{"firstName":"Joe"}'); expect(testModel.toString()).toBe('{"firstName":"Joe"}'); }); @@ -202,32 +202,51 @@ describe('Model', () => { }); it('hides the fields specified in the model\'s "hidden" property', () => { - expect(testModel.makeHidden('firstName').toData()).toEqual({id: 1, lastName: 'Shmoe', address: '123 Main St.'}); + expect(testModel.setHidden(['firstName']).toData()).toEqual({id: 1, lastName: 'Shmoe', address: '123 Main St.'}); + testModel.setHidden(['firstName', 'lastName']).makeVisible('firstName'); + expect(testModel.getHidden()).toEqual(['lastName']); + expect(testModel.toData()).toEqual({id: 1, firstName: 'Joe', address: '123 Main St.'}); }); it('hides the fields specified in the "options.hidden" property', () => { - testModel.makeHidden(['firstName', 'id']); + testModel.setHidden(['firstName', 'id']); expect(testModel.toData()).toEqual({lastName: 'Shmoe', address: '123 Main St.'}); }); it('prioritizes "hidden" if there are conflicts when using both "hidden" and "visible"', () => { - testModel.makeVisible('firstName', 'lastName'); - testModel.makeHidden('lastName'); + testModel.setVisible(['firstName', 'lastName']); + testModel.setHidden(['lastName']); expect(testModel.toData()).toEqual({ firstName: 'Joe' }); }); + it('allows overriding the model\'s "hidden" property with a "setHidden" argument', () => { + testModel.hidden = ['lastName']; + testModel.setHidden(['firstName', 'id']); + const data = testModel.toData(); + expect(data).toEqual({ + lastName: 'Shmoe', + address: '123 Main St.' + }); + }); + it('allows overriding the model\'s "hidden" property with a "makeHidden" argument', () => { testModel.hidden = ['lastName']; - const data = testModel.makeHidden('firstName', 'id').toData(); - expect(data).toEqual({address: '123 Main St.'}); + testModel.makeHidden(['firstName', 'id']); + const data = testModel.toData(); + expect(data).toEqual({ + address: '123 Main St.' + }); }); - it('prioritizes "makeHidden" when overriding both the model\'s "hidden" and "visible" properties with "makeHidden" and "makeVisible" arguments', () => { + it('prioritizes "setHidden" when overriding both the model\'s "hidden" and "visible" properties with "setHidden" and "setVisible" arguments', () => { testModel.visible = ['lastName', 'address']; testModel.hidden = ['address']; - const data = testModel.makeVisible('firstName', 'lastName').makeHidden('lastName').toData(); + const data = testModel.setVisible(['firstName', 'lastName']).setHidden(['lastName']).toData(); expect(data).toEqual({firstName: 'Joe'}); + + const knex = require('knex')({ client: 'mysql' }); + console.log(knex.client.JoinClause); }); it('append virtual attribute', () => { From e6ed97c10b16f856239ae5989b67478687ffc57d Mon Sep 17 00:00:00 2001 From: kiddyu <58631254@qq.com> Date: Fri, 13 Jun 2025 04:36:22 +0800 Subject: [PATCH 3/3] test: fix browser makeVisible/makeHidden testing --- test/browser.test.js | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/test/browser.test.js b/test/browser.test.js index 93f2a06..4c7c51a 100644 --- a/test/browser.test.js +++ b/test/browser.test.js @@ -239,7 +239,7 @@ describe('Model', () => { }); it('serializes correctly', () => { - testModel.makeVisible('firstName'); + testModel.setVisible(['firstName']); expect(testModel.toJson()).toBe('{"firstName":"Joe"}'); expect(testModel.toString()).toBe('{"firstName":"Joe"}'); }); @@ -251,32 +251,51 @@ describe('Model', () => { }); it('hides the fields specified in the model\'s "hidden" property', () => { - expect(testModel.makeHidden('firstName').toData()).toEqual({id: 1, lastName: 'Shmoe', address: '123 Main St.'}); + expect(testModel.setHidden(['firstName']).toData()).toEqual({id: 1, lastName: 'Shmoe', address: '123 Main St.'}); + testModel.setHidden(['firstName', 'lastName']).makeVisible('firstName'); + expect(testModel.getHidden()).toEqual(['lastName']); + expect(testModel.toData()).toEqual({id: 1, firstName: 'Joe', address: '123 Main St.'}); }); it('hides the fields specified in the "options.hidden" property', () => { - testModel.makeHidden(['firstName', 'id']); + testModel.setHidden(['firstName', 'id']); expect(testModel.toData()).toEqual({lastName: 'Shmoe', address: '123 Main St.'}); }); it('prioritizes "hidden" if there are conflicts when using both "hidden" and "visible"', () => { - testModel.makeVisible('firstName', 'lastName'); - testModel.makeHidden('lastName'); + testModel.setVisible(['firstName', 'lastName']); + testModel.setHidden(['lastName']); expect(testModel.toData()).toEqual({ firstName: 'Joe' }); }); + it('allows overriding the model\'s "hidden" property with a "setHidden" argument', () => { + testModel.hidden = ['lastName']; + testModel.setHidden(['firstName', 'id']); + const data = testModel.toData(); + expect(data).toEqual({ + lastName: 'Shmoe', + address: '123 Main St.' + }); + }); + it('allows overriding the model\'s "hidden" property with a "makeHidden" argument', () => { testModel.hidden = ['lastName']; - const data = testModel.makeHidden('firstName', 'id').toData(); - expect(data).toEqual({address: '123 Main St.'}); + testModel.makeHidden(['firstName', 'id']); + const data = testModel.toData(); + expect(data).toEqual({ + address: '123 Main St.' + }); }); - it('prioritizes "makeHidden" when overriding both the model\'s "hidden" and "visible" properties with "makeHidden" and "makeVisible" arguments', () => { + it('prioritizes "setHidden" when overriding both the model\'s "hidden" and "visible" properties with "setHidden" and "setVisible" arguments', () => { testModel.visible = ['lastName', 'address']; testModel.hidden = ['address']; - const data = testModel.makeVisible('firstName', 'lastName').makeHidden('lastName').toData(); + const data = testModel.setVisible(['firstName', 'lastName']).setHidden(['lastName']).toData(); expect(data).toEqual({firstName: 'Joe'}); + + const knex = require('knex')({ client: 'mysql' }); + console.log(knex.client.JoinClause); }); it('append virtual attribute', () => {