diff --git a/packages/core/postgrest-js/src/select-query-parser/utils.ts b/packages/core/postgrest-js/src/select-query-parser/utils.ts index b766454d4..50295015c 100644 --- a/packages/core/postgrest-js/src/select-query-parser/utils.ts +++ b/packages/core/postgrest-js/src/select-query-parser/utils.ts @@ -618,7 +618,7 @@ export type JsonPathToAccessor = Path extends `${infer P1}- export type JsonPathToType = Path extends '' ? T : ContainsNull extends true - ? JsonPathToType, Path> + ? JsonPathToType, Path> | null : Path extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? JsonPathToType diff --git a/packages/core/postgrest-js/test/index.test-d.ts b/packages/core/postgrest-js/test/index.test-d.ts index 93d46e9aa..bcc7233be 100644 --- a/packages/core/postgrest-js/test/index.test-d.ts +++ b/packages/core/postgrest-js/test/index.test-d.ts @@ -195,8 +195,8 @@ const postgrestWithOptions = new PostgrestClient(REST_URL) if (result.error) { throw new Error(result.error.message) } - expectType(result.data.bar) - expectType(result.data.baz) + expectType | null>(result.data.bar) + expectType(result.data.baz) } // PostgrestBuilder's children retains class when using inherited methods @@ -283,11 +283,11 @@ const postgrestWithOptions = new PostgrestClient(REST_URL) TypeEqual< typeof result.data, { - baz: number - en: 'ONE' | 'TWO' | 'THREE' + baz: number | null + en: 'ONE' | 'TWO' | 'THREE' | null bar: { baz: number - } + } | null }[] > >(true) @@ -312,7 +312,7 @@ const postgrestWithOptions = new PostgrestClient(REST_URL) expectType< { baz: string - en: 'ONE' | 'TWO' | 'THREE' + en: string bar: string }[] >(result.data) diff --git a/packages/core/postgrest-js/test/issue-1354.test-d.ts b/packages/core/postgrest-js/test/issue-1354.test-d.ts index 031c974ee..16ed4e036 100644 --- a/packages/core/postgrest-js/test/issue-1354.test-d.ts +++ b/packages/core/postgrest-js/test/issue-1354.test-d.ts @@ -10,7 +10,7 @@ export type Database = { foo: { Row: { created_at: string | null - bar: Json + bar: Record id: string baz: Json game_id: string @@ -19,7 +19,7 @@ export type Database = { } Insert: { created_at?: string | null - bar: Json + bar: Record id?: string baz: Json game_id: string @@ -28,7 +28,7 @@ export type Database = { } Update: { created_at?: string | null - bar?: Json + bar?: Record id?: string baz?: Json game_id?: string @@ -195,7 +195,7 @@ const postgrestOverrideTypes = new PostgrestClient('http://loc { const res = await postgrest.from('foo').select('id, bar, baz').eq('bar->version', 31).single() - const bar = {} as Json + const bar = {} as Record const baz = {} as Json if (res.error) { throw new Error(res.error.message) @@ -217,7 +217,7 @@ const postgrestOverrideTypes = new PostgrestClient('http://loc if (resIn.error) { throw new Error(resIn.error.message) } - expectType<{ id: string; bar: Json; baz: Json }>(resIn.data) + expectType<{ id: string; bar: Record; baz: Json }>(resIn.data) } // extended types diff --git a/packages/core/postgrest-js/test/override-types.test-d.ts b/packages/core/postgrest-js/test/override-types.test-d.ts index 367e25b76..6ddc6c891 100644 --- a/packages/core/postgrest-js/test/override-types.test-d.ts +++ b/packages/core/postgrest-js/test/override-types.test-d.ts @@ -343,7 +343,7 @@ const postgrest = new PostgrestClient(REST_URL) { username: string data: { - foo: string + foo: { bar: Record } bar: { baz: number; newBaz: string } en: 'FOUR' // Overridden enum value record: Record | null @@ -373,7 +373,7 @@ const postgrest = new PostgrestClient(REST_URL) { username: string data: { - foo: string + foo: { bar: Record } bar: { baz: number } diff --git a/packages/core/postgrest-js/test/relationships.test.ts b/packages/core/postgrest-js/test/relationships.test.ts index 6201f94fc..44206ad60 100644 --- a/packages/core/postgrest-js/test/relationships.test.ts +++ b/packages/core/postgrest-js/test/relationships.test.ts @@ -397,13 +397,13 @@ test('select JSON accessor', async () => { `) let result: Exclude const ExpectedSchema = z.object({ - bar: z.unknown(), + bar: z.record(z.string(), z.unknown()).nullable(), baz: z.string(), }) // Cannot have a zod schema that match the Json type // TODO: refactor the Json type to be unknown let expected: { - bar: Json + bar: Record | null baz: string } expectType>(true) diff --git a/packages/core/postgrest-js/test/select-query-parser/json-path.test-d.ts b/packages/core/postgrest-js/test/select-query-parser/json-path.test-d.ts new file mode 100644 index 000000000..3e75164c8 --- /dev/null +++ b/packages/core/postgrest-js/test/select-query-parser/json-path.test-d.ts @@ -0,0 +1,50 @@ +import { expectType, TypeEqual } from '../types' +import { JsonPathToType } from '../../src/select-query-parser/utils' + +// Test JsonPathToType with non-nullable JSON +{ + type Data = { + a: { + b: number + } + } + + type result = JsonPathToType + expectType>(true) +} + +// Test JsonPathToType with nullable JSON +{ + type Data = { + a: { + b: number + } + } | null + + type result = JsonPathToType + expectType>(true) +} + +// Test JsonPathToType with nested nullable JSON +{ + type Data = { + a: { + b: { + c: string + } | null + } + } + + type result = JsonPathToType + expectType>(true) +} + +// Test JsonPathToType with nullable root and path +{ + type Data = { + key: string + } | null + + type result = JsonPathToType + expectType>(true) +} diff --git a/packages/core/postgrest-js/test/types.override.ts b/packages/core/postgrest-js/test/types.override.ts index df1047891..d428aa64f 100644 --- a/packages/core/postgrest-js/test/types.override.ts +++ b/packages/core/postgrest-js/test/types.override.ts @@ -4,7 +4,7 @@ import { MergeDeep } from 'type-fest' import { z } from 'zod' export const CustomUserDataTypeSchema = z.object({ - foo: z.string(), + foo: z.object({ bar: z.record(z.string(), z.unknown()) }), bar: z.object({ baz: z.number(), }),