From a70a1cbc224bdfda87d92e3b9755184675787374 Mon Sep 17 00:00:00 2001 From: Yiming Cao Date: Tue, 3 Feb 2026 12:18:38 +0800 Subject: [PATCH 1/4] fix(mysql): add native type mapping attributes (#652) --- packages/language/res/stdlib.zmodel | 21 +++++++++++++++++++++ turbo.json | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/language/res/stdlib.zmodel b/packages/language/res/stdlib.zmodel index d0c3c0003..4f473ed78 100644 --- a/packages/language/res/stdlib.zmodel +++ b/packages/language/res/stdlib.zmodel @@ -426,6 +426,9 @@ attribute @db.Uuid() @@@targetField([StringField]) @@@prisma attribute @db.Xml() @@@targetField([StringField]) @@@prisma attribute @db.Inet() @@@targetField([StringField]) @@@prisma attribute @db.Citext() @@@targetField([StringField]) @@@prisma +attribute @db.TinyText() @@@targetField([StringField]) @@@prisma +attribute @db.MediumText() @@@targetField([StringField]) @@@prisma +attribute @db.LongText() @@@targetField([StringField]) @@@prisma // Boolean type modifiers @@ -437,16 +440,26 @@ attribute @db.Int() @@@targetField([IntField]) @@@prisma attribute @db.Integer() @@@targetField([IntField]) @@@prisma attribute @db.SmallInt() @@@targetField([IntField]) @@@prisma attribute @db.Oid() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedInt() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedSmallInt() @@@targetField([IntField]) @@@prisma +attribute @db.MediumInt() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedMediumInt() @@@targetField([IntField]) @@@prisma +attribute @db.TinyInt(_ length: Int?) @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedTinyInt(_ length: Int?) @@@targetField([IntField]) @@@prisma +attribute @db.Year() @@@targetField([IntField]) @@@prisma // BigInt type modifiers attribute @db.BigInt() @@@targetField([BigIntField]) @@@prisma +attribute @db.UnsignedBigInt() @@@targetField([BigIntField]) @@@prisma // Float/Decimal type modifiers attribute @db.DoublePrecision() @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.Real() @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.Decimal(_ p: Int?, _ s: Int?) @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.Money() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Float() @@@targetField([FloatField]) @@@prisma +attribute @db.Double() @@@targetField([FloatField]) @@@prisma // DateTime type modifiers @@ -455,6 +468,8 @@ attribute @db.Timestamptz(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma attribute @db.Date() @@@targetField([DateTimeField]) @@@prisma attribute @db.Time(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma attribute @db.Timetz(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma +attribute @db.DateTime(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma + // Json type modifiers @@ -464,6 +479,12 @@ attribute @db.JsonB() @@@targetField([JsonField]) @@@prisma // Bytes type modifiers attribute @db.ByteA() @@@targetField([BytesField]) @@@prisma +attribute @db.LongBlob() @@@targetField([BytesField]) @@@prisma +attribute @db.Binary(_ n: Int?) @@@targetField([BytesField]) @@@prisma +attribute @db.VarBinary(_ n: Int?) @@@targetField([BytesField]) @@@prisma +attribute @db.TinyBlob() @@@targetField([BytesField]) @@@prisma +attribute @db.Blob() @@@targetField([BytesField]) @@@prisma +attribute @db.MediumBlob() @@@targetField([BytesField]) @@@prisma /** * Specifies the schema to use in a multi-schema PostgreSQL database. diff --git a/turbo.json b/turbo.json index c66313588..6e619eeb7 100644 --- a/turbo.json +++ b/turbo.json @@ -3,7 +3,7 @@ "tasks": { "build": { "dependsOn": ["^build"], - "inputs": ["src/**", "zenstack/*.zmodel"], + "inputs": ["src/**", "samples/**", "zenstack/*.zmodel"], "outputs": ["dist/**"] }, "watch": { From 21659802e2af8b649ef28dd5aae4967f113f737a Mon Sep 17 00:00:00 2001 From: Jiasheng Date: Fri, 6 Feb 2026 16:13:37 +0800 Subject: [PATCH 2/4] fix(proxy): add omit configuration for computed fields in ZenStackClient (#658) * fix(proxy): add omit configuration for computed fields in ZenStackClient * fix typo --- packages/cli/src/actions/proxy.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/actions/proxy.ts b/packages/cli/src/actions/proxy.ts index a38386995..017df190f 100644 --- a/packages/cli/src/actions/proxy.ts +++ b/packages/cli/src/actions/proxy.ts @@ -24,6 +24,7 @@ import { Pool as PgPool } from 'pg'; import { CliError } from '../cli-error'; import { getVersion } from '../utils/version-utils'; import { getOutputPath, getSchemaFile, loadSchemaDocument } from './action-utils'; +import type { SchemaDef } from '@zenstackhq/orm/schema'; type Options = { output?: string; @@ -72,9 +73,25 @@ export async function run(options: Options) { const schemaModule = (await jiti.import(path.join(outputPath, 'schema'))) as any; - const db = new ZenStackClient(schemaModule.schema, { + // Build omit configuration for computed fields + const schema = schemaModule.schema as SchemaDef; + const omit: Record> = {}; + for (const [modelName, modelDef] of Object.entries(schema.models)) { + const computedFields: Record = {}; + for (const [fieldName, fieldDef] of Object.entries(modelDef.fields)) { + if (fieldDef.computed === true) { + computedFields[fieldName] = true; + } + } + if (Object.keys(computedFields).length > 0) { + omit[modelName] = computedFields; + } + } + + const db = new ZenStackClient(schema, { dialect: dialect, log: log && log.length > 0 ? log : undefined, + omit: Object.keys(omit).length > 0 ? omit : undefined, }); // check whether the database is reachable From 274871b858b46d490623436f53f21c1c7752c917 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 16:14:11 +0800 Subject: [PATCH 3/4] chore: bump version 3.3.3 (#659) Co-authored-by: ymc9 <104139426+ymc9@users.noreply.github.com> --- package.json | 2 +- packages/auth-adapters/better-auth/package.json | 2 +- packages/cli/package.json | 2 +- packages/clients/client-helpers/package.json | 2 +- packages/clients/tanstack-query/package.json | 2 +- packages/common-helpers/package.json | 2 +- packages/config/eslint-config/package.json | 2 +- packages/config/typescript-config/package.json | 2 +- packages/config/vitest-config/package.json | 2 +- packages/create-zenstack/package.json | 2 +- packages/ide/vscode/package.json | 2 +- packages/language/package.json | 2 +- packages/orm/package.json | 2 +- packages/plugins/policy/package.json | 2 +- packages/schema/package.json | 2 +- packages/sdk/package.json | 2 +- packages/server/package.json | 2 +- packages/testtools/package.json | 2 +- packages/zod/package.json | 2 +- samples/orm/package.json | 2 +- tests/e2e/package.json | 2 +- tests/regression/package.json | 2 +- tests/runtimes/bun/package.json | 2 +- tests/runtimes/edge-runtime/package.json | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 52eec18af..1bcc178bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-v3", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack", "packageManager": "pnpm@10.23.0", "type": "module", diff --git a/packages/auth-adapters/better-auth/package.json b/packages/auth-adapters/better-auth/package.json index 45ab8a1a1..9be352a67 100644 --- a/packages/auth-adapters/better-auth/package.json +++ b/packages/auth-adapters/better-auth/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/better-auth", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack Better Auth Adapter. This adapter is modified from better-auth's Prisma adapter.", "type": "module", "scripts": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 08e4b3ccd..750de5c68 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack CLI", "description": "FullStack database toolkit with built-in access control and automatic API generation.", - "version": "3.3.2", + "version": "3.3.3", "type": "module", "author": { "name": "ZenStack Team" diff --git a/packages/clients/client-helpers/package.json b/packages/clients/client-helpers/package.json index f48edb620..d1aa2707d 100644 --- a/packages/clients/client-helpers/package.json +++ b/packages/clients/client-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/client-helpers", - "version": "3.3.2", + "version": "3.3.3", "description": "Helpers for implementing clients that consume ZenStack's CRUD service", "type": "module", "scripts": { diff --git a/packages/clients/tanstack-query/package.json b/packages/clients/tanstack-query/package.json index 88157b414..cf174c881 100644 --- a/packages/clients/tanstack-query/package.json +++ b/packages/clients/tanstack-query/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/tanstack-query", - "version": "3.3.2", + "version": "3.3.3", "description": "TanStack Query Client for consuming ZenStack v3's CRUD service", "type": "module", "scripts": { diff --git a/packages/common-helpers/package.json b/packages/common-helpers/package.json index 6beff62fb..84ea919e2 100644 --- a/packages/common-helpers/package.json +++ b/packages/common-helpers/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/common-helpers", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack Common Helpers", "type": "module", "scripts": { diff --git a/packages/config/eslint-config/package.json b/packages/config/eslint-config/package.json index f45304dcf..0e263f3fa 100644 --- a/packages/config/eslint-config/package.json +++ b/packages/config/eslint-config/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/eslint-config", - "version": "3.3.2", + "version": "3.3.3", "type": "module", "private": true, "license": "MIT" diff --git a/packages/config/typescript-config/package.json b/packages/config/typescript-config/package.json index f5af13a1b..10827d50e 100644 --- a/packages/config/typescript-config/package.json +++ b/packages/config/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/typescript-config", - "version": "3.3.2", + "version": "3.3.3", "private": true, "license": "MIT" } diff --git a/packages/config/vitest-config/package.json b/packages/config/vitest-config/package.json index 5c604a30a..df6047150 100644 --- a/packages/config/vitest-config/package.json +++ b/packages/config/vitest-config/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/vitest-config", "type": "module", - "version": "3.3.2", + "version": "3.3.3", "private": true, "license": "MIT", "exports": { diff --git a/packages/create-zenstack/package.json b/packages/create-zenstack/package.json index e5c017d9a..78e5d3705 100644 --- a/packages/create-zenstack/package.json +++ b/packages/create-zenstack/package.json @@ -1,6 +1,6 @@ { "name": "create-zenstack", - "version": "3.3.2", + "version": "3.3.3", "description": "Create a new ZenStack project", "type": "module", "scripts": { diff --git a/packages/ide/vscode/package.json b/packages/ide/vscode/package.json index eb6d2bc6a..1d2cc32ee 100644 --- a/packages/ide/vscode/package.json +++ b/packages/ide/vscode/package.json @@ -1,7 +1,7 @@ { "name": "zenstack-v3", "publisher": "zenstack", - "version": "3.3.2", + "version": "3.3.3", "displayName": "ZenStack V3 Language Tools", "description": "VSCode extension for ZenStack (v3) ZModel language", "private": true, diff --git a/packages/language/package.json b/packages/language/package.json index 38951b1f3..f5bef4ac3 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/language", "description": "ZenStack ZModel language specification", - "version": "3.3.2", + "version": "3.3.3", "license": "MIT", "author": "ZenStack Team", "files": [ diff --git a/packages/orm/package.json b/packages/orm/package.json index 82c85efd6..170062927 100644 --- a/packages/orm/package.json +++ b/packages/orm/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/orm", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack ORM", "type": "module", "scripts": { diff --git a/packages/plugins/policy/package.json b/packages/plugins/policy/package.json index 3c9d6ac26..547fa3009 100644 --- a/packages/plugins/policy/package.json +++ b/packages/plugins/policy/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/plugin-policy", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack Policy Plugin", "type": "module", "scripts": { diff --git a/packages/schema/package.json b/packages/schema/package.json index 3f2397a70..0af386bd7 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/schema", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack Runtime Schema", "type": "module", "scripts": { diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 456920458..cfbb93d9f 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack SDK", "type": "module", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index 5a719ef3f..f441c136c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack automatic CRUD API handlers and server adapters", "type": "module", "scripts": { diff --git a/packages/testtools/package.json b/packages/testtools/package.json index 311fb7839..0197e040b 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "3.3.2", + "version": "3.3.3", "description": "ZenStack Test Tools", "type": "module", "scripts": { diff --git a/packages/zod/package.json b/packages/zod/package.json index fa7f96cdb..4853c6295 100644 --- a/packages/zod/package.json +++ b/packages/zod/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/zod", - "version": "3.3.2", + "version": "3.3.3", "description": "", "type": "module", "main": "index.js", diff --git a/samples/orm/package.json b/samples/orm/package.json index 8ac9bc2a7..18591115b 100644 --- a/samples/orm/package.json +++ b/samples/orm/package.json @@ -1,6 +1,6 @@ { "name": "sample-blog", - "version": "3.3.2", + "version": "3.3.3", "description": "", "main": "index.js", "private": true, diff --git a/tests/e2e/package.json b/tests/e2e/package.json index 0bda86c1e..25cf8d880 100644 --- a/tests/e2e/package.json +++ b/tests/e2e/package.json @@ -1,6 +1,6 @@ { "name": "e2e", - "version": "3.3.2", + "version": "3.3.3", "private": true, "type": "module", "scripts": { diff --git a/tests/regression/package.json b/tests/regression/package.json index de479a140..5efca0c45 100644 --- a/tests/regression/package.json +++ b/tests/regression/package.json @@ -1,6 +1,6 @@ { "name": "regression", - "version": "3.3.2", + "version": "3.3.3", "private": true, "type": "module", "scripts": { diff --git a/tests/runtimes/bun/package.json b/tests/runtimes/bun/package.json index 08f20ff7e..df0257e05 100644 --- a/tests/runtimes/bun/package.json +++ b/tests/runtimes/bun/package.json @@ -1,6 +1,6 @@ { "name": "bun-e2e", - "version": "3.3.2", + "version": "3.3.3", "private": true, "type": "module", "scripts": { diff --git a/tests/runtimes/edge-runtime/package.json b/tests/runtimes/edge-runtime/package.json index 0f97f9281..dc3eebf7a 100644 --- a/tests/runtimes/edge-runtime/package.json +++ b/tests/runtimes/edge-runtime/package.json @@ -1,6 +1,6 @@ { "name": "edge-runtime-e2e", - "version": "3.3.2", + "version": "3.3.3", "private": true, "type": "module", "scripts": { From 080114bb9ad84125a3340d1bad391a98314fefe8 Mon Sep 17 00:00:00 2001 From: Yiming Cao Date: Fri, 6 Feb 2026 20:10:56 +0800 Subject: [PATCH 4/4] fix(orm): properly cast values for array filters for postgres (#662) * fix(orm): properly cast values for array filters for postgres fixes #651 * add missing Array conversion * refactor --- .../src/client/crud/dialects/base-dialect.ts | 8 +- .../orm/src/client/crud/dialects/mysql.ts | 1 + .../src/client/crud/dialects/postgresql.ts | 17 ++- .../orm/src/client/crud/dialects/sqlite.ts | 1 + .../src/client/helpers/schema-db-pusher.ts | 1 + tests/regression/test/issue-651.test.ts | 105 ++++++++++++++++++ 6 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 tests/regression/test/issue-651.test.ts diff --git a/packages/orm/src/client/crud/dialects/base-dialect.ts b/packages/orm/src/client/crud/dialects/base-dialect.ts index 91848d57a..9b273e2b6 100644 --- a/packages/orm/src/client/crud/dialects/base-dialect.ts +++ b/packages/orm/src/client/crud/dialects/base-dialect.ts @@ -513,7 +513,7 @@ export abstract class BaseCrudDialect { } case 'has': { - clauses.push(this.buildArrayContains(receiver, this.eb.val(value))); + clauses.push(this.buildArrayContains(receiver, this.eb.val(value), fieldType)); break; } @@ -1442,7 +1442,11 @@ export abstract class BaseCrudDialect { /** * Builds an expression that checks if an array contains a single value. */ - abstract buildArrayContains(field: Expression, value: Expression): AliasableExpression; + abstract buildArrayContains( + field: Expression, + value: Expression, + elemType?: string, + ): AliasableExpression; /** * Builds an expression that checks if an array contains all values from another array. diff --git a/packages/orm/src/client/crud/dialects/mysql.ts b/packages/orm/src/client/crud/dialects/mysql.ts index 1e0e3f52f..45e4aaea1 100644 --- a/packages/orm/src/client/crud/dialects/mysql.ts +++ b/packages/orm/src/client/crud/dialects/mysql.ts @@ -231,6 +231,7 @@ export class MySqlCrudDialect extends LateralJoinDiale override buildArrayContains( _field: Expression, _value: Expression, + _elemType?: string, ): AliasableExpression { throw createNotSupportedError('MySQL does not support native array operations'); } diff --git a/packages/orm/src/client/crud/dialects/postgresql.ts b/packages/orm/src/client/crud/dialects/postgresql.ts index 9ff53c2e6..62b19d3d6 100644 --- a/packages/orm/src/client/crud/dialects/postgresql.ts +++ b/packages/orm/src/client/crud/dialects/postgresql.ts @@ -284,9 +284,20 @@ export class PostgresCrudDialect extends LateralJoinDi return this.eb.cast(arr, sql`${sql.raw(mappedType)}[]`); } - override buildArrayContains(field: Expression, value: Expression): AliasableExpression { - // PostgreSQL @> operator expects array on both sides, so wrap single value in array - return this.eb(field, '@>', sql`ARRAY[${value}]`); + override buildArrayContains( + field: Expression, + value: Expression, + elemType?: string, + ): AliasableExpression { + // PostgreSQL @> operator expects array on both sides, so wrap single value in a typed array + const arrayExpr = sql`ARRAY[${value}]`; + if (elemType) { + const mappedType = this.getSqlType(elemType); + const typedArray = this.eb.cast(arrayExpr, sql`${sql.raw(mappedType)}[]`); + return this.eb(field, '@>', typedArray); + } else { + return this.eb(field, '@>', arrayExpr); + } } override buildArrayHasEvery(field: Expression, values: Expression): AliasableExpression { diff --git a/packages/orm/src/client/crud/dialects/sqlite.ts b/packages/orm/src/client/crud/dialects/sqlite.ts index ee6de5da0..75dd25dcc 100644 --- a/packages/orm/src/client/crud/dialects/sqlite.ts +++ b/packages/orm/src/client/crud/dialects/sqlite.ts @@ -456,6 +456,7 @@ export class SqliteCrudDialect extends BaseCrudDialect override buildArrayContains( _field: Expression, _value: Expression, + _elemType?: string, ): AliasableExpression { throw createNotSupportedError('SQLite does not support native array operations'); } diff --git a/packages/orm/src/client/helpers/schema-db-pusher.ts b/packages/orm/src/client/helpers/schema-db-pusher.ts index 28701ca1b..9c16e61e2 100644 --- a/packages/orm/src/client/helpers/schema-db-pusher.ts +++ b/packages/orm/src/client/helpers/schema-db-pusher.ts @@ -440,6 +440,7 @@ export class SchemaDbPusher { private get floatType() { return match>(this.schema.provider.type) + .with('postgresql', () => 'double precision') .with('mysql', () => sql.raw('double')) .otherwise(() => 'real'); } diff --git a/tests/regression/test/issue-651.test.ts b/tests/regression/test/issue-651.test.ts new file mode 100644 index 000000000..6259d54f4 --- /dev/null +++ b/tests/regression/test/issue-651.test.ts @@ -0,0 +1,105 @@ +import { createTestClient } from '@zenstackhq/testtools'; +import { describe, expect, it } from 'vitest'; + +describe('Regression for issue 651', () => { + it('float array queries should work with all operators on PostgreSQL', async () => { + const db = await createTestClient( + ` +model User { + id Int @id @default(autoincrement()) + email String @unique + floatArray Float[] +} + `, + { provider: 'postgresql', usePrismaPush: true }, + ); + + // Create test users with different float arrays + const user1 = await db.user.create({ + data: { + email: 'user1@example.com', + floatArray: [1.1, 2.2, 3.3], + }, + }); + + const user2 = await db.user.create({ + data: { + email: 'user2@example.com', + floatArray: [1.1, 2.2, 3.3, 4.4, 5.5], + }, + }); + + const user3 = await db.user.create({ + data: { + email: 'user3@example.com', + floatArray: [], + }, + }); + + // Test 'equals' operator + const equalsResult = await db.user.findMany({ + where: { + floatArray: { + equals: [1.1, 2.2, 3.3], + }, + }, + }); + expect(equalsResult).toHaveLength(1); + expect(equalsResult[0].id).toBe(user1.id); + + // Test 'has' operator - contains single value + const hasResult = await db.user.findMany({ + where: { + floatArray: { + has: 4.4, + }, + }, + }); + expect(hasResult).toHaveLength(1); + expect(hasResult[0].id).toBe(user2.id); + + // Test 'hasSome' operator - contains any of the values + const hasSomeResult = await db.user.findMany({ + where: { + floatArray: { + hasSome: [3.3, 6.6, 7.7], + }, + }, + }); + expect(hasSomeResult).toHaveLength(2); + expect(hasSomeResult.map((u: any) => u.id).sort()).toEqual([user1.id, user2.id].sort()); + + // Test 'hasEvery' operator - contains all values + const hasEveryResult = await db.user.findMany({ + where: { + floatArray: { + hasEvery: [1.1, 2.2], + }, + }, + }); + expect(hasEveryResult).toHaveLength(2); + expect(hasEveryResult.map((u: any) => u.id).sort()).toEqual([user1.id, user2.id].sort()); + + // Test 'isEmpty' operator + const isEmptyResult = await db.user.findMany({ + where: { + floatArray: { + isEmpty: true, + }, + }, + }); + expect(isEmptyResult).toHaveLength(1); + expect(isEmptyResult[0].id).toBe(user3.id); + + // Test 'isEmpty: false' + const notEmptyResult = await db.user.findMany({ + where: { + floatArray: { + isEmpty: false, + }, + }, + }); + expect(notEmptyResult).toHaveLength(2); + expect(notEmptyResult.map((u: any) => u.id).sort()).toEqual([user1.id, user2.id].sort()); + }); +});