From 4df9639ea02c02038fb3e1a906ab679e0a7e721c Mon Sep 17 00:00:00 2001 From: Hieuzest Date: Sat, 14 Sep 2024 19:13:09 +0800 Subject: [PATCH] feat: support spread in nested $.object --- packages/core/src/eval.ts | 4 +++- packages/tests/src/json.ts | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/core/src/eval.ts b/packages/core/src/eval.ts index f53756ea..5eac8ff9 100644 --- a/packages/core/src/eval.ts +++ b/packages/core/src/eval.ts @@ -1,4 +1,4 @@ -import { defineProperty, isNullable, mapValues } from 'cosmokit' +import { defineProperty, filterKeys, isNullable, mapValues } from 'cosmokit' import { AtomicTypes, Comparable, Flatten, isComparable, isEmpty, makeRegExp, Row, Values } from './utils.ts' import { Type } from './type.ts' import { Field, Relation } from './model.ts' @@ -320,6 +320,8 @@ Eval.object = (fields: any) => { .map(([k]) => [k.slice(prefix.length), fields[k.slice(prefix.length)]])) return Object.assign(Eval('object', fields, Type.Object(mapValues(fields, (value) => Type.fromTerm(value)))), fields) } + // filter out nested spread $object + fields = filterKeys(fields, key => key !== '$object') return Object.assign(Eval('object', fields, Type.Object(mapValues(fields, (value) => Type.fromTerm(value)))), fields) } diff --git a/packages/tests/src/json.ts b/packages/tests/src/json.ts index 1b0fe56f..d516fbcb 100644 --- a/packages/tests/src/json.ts +++ b/packages/tests/src/json.ts @@ -155,6 +155,24 @@ namespace JsonTests { ]) }) + it('$.object using spread', async () => { + const res = await database.select('foo') + .project({ + obj: row => $.object({ + id2: row.id, + ...row, + }) + }) + .orderBy(row => row.obj.id) + .execute() + + expect(res).to.deep.equal([ + { obj: { id2: 1, id: 1, value: 0 } }, + { obj: { id2: 2, id: 2, value: 2 } }, + { obj: { id2: 3, id: 3, value: 2 } }, + ]) + }) + it('$.object in json', async () => { const res = await database.select('bar') .project({