From 19e9538ddd351fe6ddafca48de8638fa2175e77d Mon Sep 17 00:00:00 2001 From: daffl Date: Wed, 5 Apr 2023 11:20:15 -0700 Subject: [PATCH] fix(knex): Ensure that columns are selected unambigiously and avoid duplicate id selection --- packages/knex/src/adapter.ts | 3 ++- packages/knex/test/index.test.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/knex/src/adapter.ts b/packages/knex/src/adapter.ts index 05b5d72d3e..3433baa581 100644 --- a/packages/knex/src/adapter.ts +++ b/packages/knex/src/adapter.ts @@ -125,8 +125,9 @@ export class KnexAdapter< // $select uses a specific find syntax, so it has to come first. if (filters.$select) { + const select = filters.$select.map((column) => (column.includes('.') ? column : `${name}.${column}`)) // always select the id field, but make sure we only select it once - builder.select(...new Set([...filters.$select, `${name}.${id}`])) + builder.select(...new Set([...select, `${name}.${id}`])) } else { builder.select(`${name}.*`) } diff --git a/packages/knex/test/index.test.ts b/packages/knex/test/index.test.ts index 28cbbc0a92..90e7ef6bf4 100644 --- a/packages/knex/test/index.test.ts +++ b/packages/knex/test/index.test.ts @@ -678,7 +678,7 @@ describe('Feathers Knex Service', () => { describe('associations', () => { const todoService = app.service('todos') - it('create, query and get with associations', async () => { + it('create, query and get with associations, can unambigiously $select', async () => { const dave = await peopleService.create({ name: 'Dave', age: 133 @@ -696,6 +696,16 @@ describe('Feathers Knex Service', () => { }) const got = await todoService.get(todo.id) + assert.deepStrictEqual( + await todoService.get(todo.id, { + query: { $select: ['id', 'text'] } + }), + { + id: todo.id, + text: todo.text, + personName: 'Dave' + } + ) assert.strictEqual(got.personName, dave.name) assert.deepStrictEqual(got, todo) assert.deepStrictEqual(found, todo)