From 0b92b1cfd03bea5035f284b07d358b50eb53d065 Mon Sep 17 00:00:00 2001 From: Ben <4991309+NuroDev@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:10:03 +0000 Subject: [PATCH] Allow for passing model entities as objects (#52) * Bumped `@ronin/compiler` package to `0.17.1` * Updated model `indexes` & `triggers` record value types * Bumped `@ronin/compiler` package to `0.17.2` * Removed `fields` & `presets` formatting from `getSyntaxProxy` * Refactored tests model properties from arrays to objects * Updated model `presets` type to use `ModelPreset['instructions']` --- bun.lockb | Bin 53684 -> 53684 bytes package.json | 2 +- src/queries/index.ts | 50 +------- src/schema/model.ts | 4 +- tests/helpers/expressions.test.ts | 92 +++++++-------- tests/queries/index.test.ts | 28 ++--- tests/schema/model.test.ts | 186 +++++++++++++----------------- 7 files changed, 142 insertions(+), 220 deletions(-) diff --git a/bun.lockb b/bun.lockb index 376953dc7af236e35b514ed301a2bd35875900a7..b9e96e67c0763c67c05741a31a1c5a739753d4e6 100755 GIT binary patch delta 137 zcmV;40CxYhqXV>~1CTBtalKyQd&U;mHEw#CQSX2C%8d1G2oF()8G6TiY}X8}u}+F9 zlav)GvMR+lKyO-K?H)~bs%-1y$?Neaz|mTB*PSQ~1CTBtP{dupEU9@uEqBRbFCa-7KsWxW5|>7i%1GLn1g2J^u}+F9 zlSBz9vMR+lKrQqPJx+V2%?M3OqE2(?gaHrT2+KY21wL!YtaJ4ZJbnMN>KYP?zifQr rNZVIVfWL3Gzgps0MWZ+9Pq+X+N3#WDBrgFlvnr8gJOMDXkj*3n=WIH( diff --git a/package.json b/package.json index e080c17..db393a4 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "license": "Apache-2.0", "devDependencies": { "@biomejs/biome": "1.9.4", - "@ronin/compiler": "0.17.0", + "@ronin/compiler": "0.17.2", "@types/bun": "1.2.1", "tsup": "8.3.6", "typescript": "5.7.3" diff --git a/src/queries/index.ts b/src/queries/index.ts index 555ad60..fc59cb0 100644 --- a/src/queries/index.ts +++ b/src/queries/index.ts @@ -1,7 +1,6 @@ import type { DeepCallable, ResultRecord } from '@/src/queries/types'; -import type { Model } from '@/src/schema'; import { isPlainObject, mutateStructure, setProperty } from '@/src/utils'; -import { type ModelField, QUERY_SYMBOLS, type Query } from '@ronin/compiler'; +import { QUERY_SYMBOLS, type Query } from '@ronin/compiler'; /** * Utility type to convert a tuple of promises into a tuple of their resolved types. @@ -102,53 +101,6 @@ export const getSyntaxProxy = (config?: { setProperty(structure, pathJoined, value); - const isModelQuery = config?.root === `${QUERY_SYMBOLS.QUERY}.create`; - const modelQueryValue = (structure as any)?.[QUERY_SYMBOLS.QUERY]?.create?.model; - - // If a `create.model` query was provided or a `model` is being constructed, - // serialize the model structure. - if ((isModelQuery && modelQueryValue) || config?.modelType) { - const createdModel = isModelQuery ? modelQueryValue : structure; - const newModel = { ...createdModel }; - - if (newModel.fields) { - const formatFields = ( - fields: Record, - parent?: string, - ): Array => { - return Object.entries(fields).flatMap(([slug, rest]) => { - if (rest.type) { - return [ - { slug: parent ? `${parent}.${slug}` : slug, ...(rest as object) }, - ]; - } - - return formatFields(rest as unknown as Record, slug); - }); - }; - - newModel.fields = formatFields(newModel.fields); - } - - if (newModel.presets) { - newModel.presets = Object.entries(newModel.presets).map( - ([slug, instructions]) => ({ - slug, - instructions, - }), - ); - } - - if (isModelQuery) { - (structure as any)[QUERY_SYMBOLS.QUERY].create.model = newModel; - } else { - const model = structure as Model; - - if (newModel.fields) model.fields = newModel.fields; - if (newModel.presets) model.presets = newModel.presets; - } - } - // If the function call is happening inside a batch, return a new proxy, to // allow for continuing to chain `get` accessors and function calls after // existing function calls in the same query. diff --git a/src/schema/model.ts b/src/schema/model.ts index 1ea4653..4dead00 100644 --- a/src/schema/model.ts +++ b/src/schema/model.ts @@ -82,12 +82,12 @@ export interface Model> /** * Database indexes to optimize query performance. */ - indexes?: Record>>; + indexes?: Record>, 'slug'>>; /** * Queries that run automatically in response to other queries. */ - triggers?: Record>>; + triggers?: Record>, 'slug'>>; /** * Predefined query instructions that can be reused across multiple different queries. diff --git a/tests/helpers/expressions.test.ts b/tests/helpers/expressions.test.ts index 086a15e..ecab75d 100644 --- a/tests/helpers/expressions.test.ts +++ b/tests/helpers/expressions.test.ts @@ -22,7 +22,7 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.test.defaultValue).toEqual({ __RONIN_EXPRESSION: "UPPER('test')", }); }); @@ -36,7 +36,7 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.stringConcat.defaultValue).toEqual({ __RONIN_EXPRESSION: "('Hello' || 'World')", }); }); @@ -50,7 +50,7 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.add.defaultValue).toEqual({ __RONIN_EXPRESSION: '(1 + 2)', }); }); @@ -63,7 +63,7 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.subtract.defaultValue).toEqual({ __RONIN_EXPRESSION: '(5 - 3)', }); }); @@ -76,7 +76,7 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.multiply.defaultValue).toEqual({ __RONIN_EXPRESSION: '(4 * 2)', }); }); @@ -89,7 +89,7 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.divide.defaultValue).toEqual({ __RONIN_EXPRESSION: '(10 / 2)', }); }); @@ -102,7 +102,7 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.modulo.defaultValue).toEqual({ __RONIN_EXPRESSION: '(7 % 3)', }); }); @@ -118,11 +118,11 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].check).toEqual({ + expect(Test.fields.equals.check).toEqual({ __RONIN_EXPRESSION: "(__RONIN_FIELD_equals = 'test')", }); // @ts-expect-error This exists - expect(Test.fields[1].check).toEqual({ + expect(Test.fields.equalsRight.check).toEqual({ __RONIN_EXPRESSION: "('test' = __RONIN_FIELD_equalsRight)", }); }); @@ -138,11 +138,11 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].check).toEqual({ + expect(Test.fields.notEquals.check).toEqual({ __RONIN_EXPRESSION: "(__RONIN_FIELD_notEquals != 'test')", }); // @ts-expect-error This exists - expect(Test.fields[1].check).toEqual({ + expect(Test.fields.notEqualsRight.check).toEqual({ __RONIN_EXPRESSION: "('test' != (__RONIN_FIELD_notEqualsRight != 'test'))", }); }); @@ -158,11 +158,11 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].check).toEqual({ + expect(Test.fields.greaterThan.check).toEqual({ __RONIN_EXPRESSION: '(__RONIN_FIELD_greaterThan > 5)', }); // @ts-expect-error This exists - expect(Test.fields[1].check).toEqual({ + expect(Test.fields.greaterThanRight.check).toEqual({ __RONIN_EXPRESSION: '(5 > __RONIN_FIELD_greaterThanRight)', }); }); @@ -180,12 +180,12 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].check).toEqual({ + expect(Test.fields.lessThan.check).toEqual({ __RONIN_EXPRESSION: '((__RONIN_FIELD_lessThan < 5) < (__RONIN_FIELD_lessThan < 5))', }); // @ts-expect-error This exists - expect(Test.fields[1].check).toEqual({ + expect(Test.fields.lessThanRight.check).toEqual({ __RONIN_EXPRESSION: '((5 < __RONIN_FIELD_lessThanRight) < (5 < __RONIN_FIELD_lessThanRight))', }); @@ -204,11 +204,11 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].check).toEqual({ + expect(Test.fields.greaterThanEqual.check).toEqual({ __RONIN_EXPRESSION: '(__RONIN_FIELD_greaterThanEqual >= 5)', }); // @ts-expect-error This exists - expect(Test.fields[1].check).toEqual({ + expect(Test.fields.greaterThanEqualRight.check).toEqual({ __RONIN_EXPRESSION: '(5 >= __RONIN_FIELD_greaterThanEqualRight)', }); }); @@ -224,11 +224,11 @@ describe('expressions', () => { }, }); // @ts-expect-error This exists - expect(Test.fields[0].check).toEqual({ + expect(Test.fields.lessThanEqual.check).toEqual({ __RONIN_EXPRESSION: '(__RONIN_FIELD_lessThanEqual <= 5)', }); // @ts-expect-error This exists - expect(Test.fields[1].check).toEqual({ + expect(Test.fields.lessThanEqualRight.check).toEqual({ __RONIN_EXPRESSION: '(5 <= __RONIN_FIELD_lessThanEqualRight)', }); }); @@ -259,43 +259,43 @@ describe('expressions', () => { expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.stringConcat.defaultValue).toEqual({ __RONIN_EXPRESSION: "('Hello' || 'World')", }); // @ts-expect-error This exists - expect(Test.fields[1].defaultValue).toEqual({ + expect(Test.fields.numberAdd.defaultValue).toEqual({ __RONIN_EXPRESSION: '(1 + 2)', }); // @ts-expect-error This exists - expect(Test.fields[2].defaultValue).toEqual({ + expect(Test.fields.numberSubtract.defaultValue).toEqual({ __RONIN_EXPRESSION: '(5 - 3)', }); // @ts-expect-error This exists - expect(Test.fields[3].defaultValue).toEqual({ + expect(Test.fields.numberMultiply.defaultValue).toEqual({ __RONIN_EXPRESSION: '(4 * 2)', }); // @ts-expect-error This exists - expect(Test.fields[4].defaultValue).toEqual({ + expect(Test.fields.numberDivide.defaultValue).toEqual({ __RONIN_EXPRESSION: '(10 / 2)', }); // @ts-expect-error This exists - expect(Test.fields[5].defaultValue).toEqual({ + expect(Test.fields.numberModulo.defaultValue).toEqual({ __RONIN_EXPRESSION: '(7 % 3)', }); // @ts-expect-error This exists - expect(Test.fields[6].check).toEqual({ + expect(Test.fields.stringCompare.check).toEqual({ __RONIN_EXPRESSION: "(__RONIN_FIELD_stringConcat = 'HelloWorld')", }); // @ts-expect-error This exists - expect(Test.fields[7].check).toEqual({ + expect(Test.fields.numberCompare.check).toEqual({ __RONIN_EXPRESSION: '(__RONIN_FIELD_numberAdd >= 3)', }); // @ts-expect-error This exists - expect(Test.fields[8].check).toEqual({ + expect(Test.fields.rightSideField.check).toEqual({ __RONIN_EXPRESSION: "('Hello' = __RONIN_FIELD_stringConcat)", }); // @ts-expect-error This exists - expect(Test.fields[9].computedAs).toEqual({ + expect(Test.fields.computedAs.computedAs).toEqual({ kind: 'VIRTUAL', value: { __RONIN_EXPRESSION: '(__RONIN_FIELD_numberAdd || __RONIN_FIELD_numberSubtract)', @@ -317,17 +317,17 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual('test'); + expect(Test.fields.test1.defaultValue).toEqual('test'); // @ts-expect-error This exists - expect(Test.fields[1].defaultValue).toEqual({ + expect(Test.fields.test2.defaultValue).toEqual({ __RONIN_EXPRESSION: "('Hello' || 'World')", }); // @ts-expect-error This exists - expect(Test.fields[2].defaultValue).toEqual({ + expect(Test.fields.test3.defaultValue).toEqual({ __RONIN_EXPRESSION: "(('Hello' || 'World') || 'test')", }); // @ts-expect-error This exists - expect(Test.fields[3].defaultValue).toEqual({ + expect(Test.fields.test4.defaultValue).toEqual({ __RONIN_EXPRESSION: "(('Hello' || 'World') || ('Hello' || 'World'))", }); }); @@ -341,7 +341,7 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.test.defaultValue).toEqual({ __RONIN_EXPRESSION: 'random()', }); }); @@ -357,12 +357,12 @@ describe('expressions', () => { expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.numberAbs.defaultValue).toEqual({ __RONIN_EXPRESSION: 'abs(-42)', }); // @ts-expect-error This exists - expect(Test.fields[1].defaultValue).toEqual({ + expect(Test.fields.expressionAbs.defaultValue).toEqual({ __RONIN_EXPRESSION: 'abs((1 - 5))', }); }); @@ -377,11 +377,11 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.currentDate.defaultValue).toEqual({ __RONIN_EXPRESSION: "strftime('%Y-%m-%d', 'now')", }); // @ts-expect-error This exists - expect(Test.fields[1].defaultValue).toEqual({ + expect(Test.fields.customFormat.defaultValue).toEqual({ __RONIN_EXPRESSION: "strftime('%H:%M:%S', 'now')", }); }); @@ -406,22 +406,22 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.jsonPatch.defaultValue).toEqual({ __RONIN_EXPRESSION: 'json_patch(\'{"op": "add", "path": "/foo", "value": "qux"}\', \'{"foo": "bar"}\')', }); // @ts-expect-error This exists - expect(Test.fields[1].defaultValue).toEqual({ + expect(Test.fields.jsonSet.defaultValue).toEqual({ __RONIN_EXPRESSION: 'json_set(\'{"foo": "bar", "baz": "qux"}\', \'$.foo\', \'"updated"\')', }); // @ts-expect-error This exists - expect(Test.fields[2].defaultValue).toEqual({ + expect(Test.fields.jsonReplace.defaultValue).toEqual({ __RONIN_EXPRESSION: 'json_replace(\'{"foo": "bar", "baz": "qux"}\', \'$.foo\', \'"replaced"\')', }); // @ts-expect-error This exists - expect(Test.fields[3].defaultValue).toEqual({ + expect(Test.fields.jsonInsert.defaultValue).toEqual({ __RONIN_EXPRESSION: 'json_insert(\'{"foo": "bar"}\', \'$.newKey\', \'"inserted"\')', }); }); @@ -439,15 +439,15 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.randomPlusTwo.defaultValue).toEqual({ __RONIN_EXPRESSION: '(random() + 2)', }); // @ts-expect-error This exists - expect(Test.fields[1].defaultValue).toEqual({ + expect(Test.fields.absOfRandom.defaultValue).toEqual({ __RONIN_EXPRESSION: 'abs(random())', }); // @ts-expect-error This exists - expect(Test.fields[2].defaultValue).toEqual({ + expect(Test.fields.complexNesting.defaultValue).toEqual({ __RONIN_EXPRESSION: 'abs((random() * (2 + 3)))', }); }); @@ -463,7 +463,7 @@ describe('expressions', () => { }); expect(Test).toBeTypeOf('object'); // @ts-expect-error This exists - expect(Test.fields[0].defaultValue).toEqual({ + expect(Test.fields.test.defaultValue).toEqual({ __RONIN_EXPRESSION: "(('Hello' || 'World') || ('Hello' || 'World'))", }); }); diff --git a/tests/queries/index.test.ts b/tests/queries/index.test.ts index 64aab22..33a4acc 100644 --- a/tests/queries/index.test.ts +++ b/tests/queries/index.test.ts @@ -289,15 +289,14 @@ describe('syntax proxy', () => { create: { model: { slug: 'account', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', defaultValue: { __RONIN_EXPRESSION: "('Hello' || 'World')", }, }, - ], + }, }, }, }, @@ -328,15 +327,14 @@ describe('syntax proxy', () => { create: { model: { slug: 'account', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', check: { __RONIN_EXPRESSION: "(__RONIN_FIELD_name = 'World')", }, }, - ], + }, }, }, }, @@ -370,9 +368,8 @@ describe('syntax proxy', () => { create: { model: { slug: 'account', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', computedAs: { kind: 'VIRTUAL', @@ -381,7 +378,7 @@ describe('syntax proxy', () => { }, }, }, - ], + }, }, }, }, @@ -758,13 +755,12 @@ describe('syntax proxy', () => { create: { model: { slug: 'account', - fields: [ - { + fields: { + handle: { type: 'string', - slug: 'handle', required: true, }, - ], + }, }, }, }, diff --git a/tests/schema/model.test.ts b/tests/schema/model.test.ts index ca9587e..8cca178 100644 --- a/tests/schema/model.test.ts +++ b/tests/schema/model.test.ts @@ -71,7 +71,7 @@ describe('models', () => { // @ts-expect-error: The Account object has 'slug'. slug: 'account', name: 'Account', - fields: [], + fields: {}, }); }); @@ -91,7 +91,7 @@ describe('models', () => { pluralSlug: 'accounts', name: 'Account', pluralName: 'Accounts', - fields: [], + fields: {}, }); }); @@ -117,7 +117,7 @@ describe('models', () => { name: 'Account', slug: 'account', }, - fields: [], + fields: {}, }); }); @@ -135,7 +135,7 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', idPrefix: 'acc_', - fields: [], + fields: {}, }); }); @@ -155,13 +155,12 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - ], + }, }); }); @@ -182,17 +181,15 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - { - slug: 'avatar', + avatar: { type: 'blob', }, - ], + }, }); }); @@ -213,17 +210,15 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - { - slug: 'bio', + bio: { type: 'json', }, - ], + }, }); }); @@ -244,17 +239,15 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - { - slug: 'birthday', + birthday: { type: 'date', }, - ], + }, }); }); @@ -274,14 +267,13 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { name: 'CusToM NaMe', type: 'string', required: true, }, - ], + }, }); }); @@ -301,13 +293,12 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'createdAt', + fields: { + createdAt: { type: 'string', required: true, }, - ], + }, }); }); @@ -332,29 +323,24 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - { - slug: 'email', + email: { type: 'string', }, - { - slug: 'emailVerified', + emailVerified: { type: 'boolean', }, - { - slug: 'password', + password: { type: 'string', }, - { - slug: 'follower', + follower: { type: 'number', }, - ], + }, }); }); @@ -375,13 +361,12 @@ describe('models', () => { slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', unique: true, }, - ], + }, }); }); @@ -416,13 +401,12 @@ describe('models', () => { // @ts-expect-error: The Account object has 'slug'. slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - ], + }, }); expect(Post).toBeTypeOf('object'); @@ -432,9 +416,8 @@ describe('models', () => { slug: 'post', pluralSlug: 'posts', - fields: [ - { - slug: 'author', + fields: { + author: { type: 'link', target: 'account', actions: { @@ -442,7 +425,7 @@ describe('models', () => { onUpdate: 'CASCADE', }, }, - ], + }, }); }); @@ -462,20 +445,19 @@ describe('models', () => { }); expect(Account).toBeTypeOf('object'); // @ts-expect-error: The Account object has 'fields'. - expect(Account.fields).toHaveLength(1); + expect(Object.keys(Account.fields)).toHaveLength(1); expect(Account).toEqual({ // @ts-expect-error: The Account object has 'slug'. slug: 'account', pluralSlug: 'accounts', name: 'Account', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - ], + }, indexes: { name: { fields: [{ slug: 'name', order: 'ASC', collation: 'BINARY' }], @@ -556,20 +538,19 @@ describe('models', () => { expect(Account).toBeTypeOf('object'); // @ts-expect-error: The Account object has 'fields'. - expect(Account.fields).toHaveLength(1); + expect(Object.keys(Account.fields)).toHaveLength(1); expect(Account).toEqual({ // @ts-expect-error: The Account object has 'slug'. slug: 'account', pluralSlug: 'accounts', name: 'Account', - fields: [ - { - slug: 'name', + fields: { + name: { type: 'string', required: true, }, - ], + }, triggers: { afterInsert: { action: 'INSERT', @@ -611,19 +592,16 @@ describe('models', () => { expect(Account).toEqual({ // @ts-expect-error: The Account object has 'slug'. slug: 'account', - presets: [ - { - slug: 'onlyName', - instructions: { - with: { - space: { - being: 'spa_m9h8oha94helaji', - }, + presets: { + onlyName: { + with: { + space: { + being: 'spa_m9h8oha94helaji', }, - selecting: ['name'], }, + selecting: ['name'], }, - ], + }, }); }); @@ -648,25 +626,21 @@ describe('models', () => { expect(Member).toEqual({ // @ts-expect-error: The Account object has 'slug'. slug: 'member', - fields: [ - { - slug: 'account', + fields: { + account: { type: 'string', }, - ], - presets: [ - { - slug: 'account', - instructions: { - including: { - account: { - [QUERY_SYMBOLS.QUERY]: { - get: { - account: { - with: { - id: { - [QUERY_SYMBOLS.EXPRESSION]: `${QUERY_SYMBOLS.FIELD}account`, - }, + }, + presets: { + account: { + including: { + account: { + [QUERY_SYMBOLS.QUERY]: { + get: { + account: { + with: { + id: { + [QUERY_SYMBOLS.EXPRESSION]: `${QUERY_SYMBOLS.FIELD}account`, }, }, }, @@ -675,7 +649,7 @@ describe('models', () => { }, }, }, - ], + }, }); }); @@ -697,17 +671,17 @@ describe('models', () => { // @ts-expect-error: The Account object has 'slug'. slug: 'account', pluralSlug: 'accounts', - fields: [ - { - slug: 'address.country', - type: 'string', - required: true, - }, - { - slug: 'address.city', - type: 'string', + fields: { + address: { + country: { + type: 'string', + required: true, + }, + city: { + type: 'string', + }, }, - ], + }, }); }); });