Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions packages/runtime/src/client/contract.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Decimal } from 'decimal.js';
import { type GetModels, type ProcedureDef, type SchemaDef } from '../schema';
import type { AuthType } from '../schema/auth';
import type { OrUndefinedIf, UnwrapTuplePromises } from '../utils/type-utils';
import type { OrUndefinedIf, Simplify, UnwrapTuplePromises } from '../utils/type-utils';
import type { TRANSACTION_UNSUPPORTED_METHODS } from './constants';
import type {
AggregateArgs,
Expand Down Expand Up @@ -299,7 +299,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
findMany<T extends FindArgs<Schema, Model, true>>(
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>[]>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;

/**
* Returns a uniquely identified entity.
Expand All @@ -309,7 +309,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
findUnique<T extends FindUniqueArgs<Schema, Model>>(
args?: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T> | null>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>> | null>;

/**
* Returns a uniquely identified entity or throws `NotFoundError` if not found.
Expand All @@ -319,7 +319,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
findUniqueOrThrow<T extends FindUniqueArgs<Schema, Model>>(
args?: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;

/**
* Returns the first entity.
Expand All @@ -329,7 +329,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
findFirst<T extends FindArgs<Schema, Model, true>>(
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T> | null>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>> | null>;

/**
* Returns the first entity or throws `NotFoundError` if not found.
Expand All @@ -339,7 +339,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
findFirstOrThrow<T extends FindArgs<Schema, Model, true>>(
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;

/**
* Creates a new entity.
Expand Down Expand Up @@ -395,7 +395,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
create<T extends CreateArgs<Schema, Model>>(
args: SelectSubset<T, CreateArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;

/**
* Creates multiple entities. Only scalar fields are allowed.
Expand Down Expand Up @@ -446,7 +446,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
createManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(
args?: SelectSubset<T, CreateManyAndReturnArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>[]>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;

/**
* Updates a uniquely identified entity.
Expand Down Expand Up @@ -567,7 +567,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
update<T extends UpdateArgs<Schema, Model>>(
args: SelectSubset<T, UpdateArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;

/**
* Updates multiple entities.
Expand Down Expand Up @@ -617,7 +617,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
updateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(
args: Subset<T, UpdateManyAndReturnArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>[]>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;

/**
* Creates or updates an entity.
Expand All @@ -641,7 +641,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
upsert<T extends UpsertArgs<Schema, Model>>(
args: SelectSubset<T, UpsertArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;

/**
* Deletes a uniquely identifiable entity.
Expand All @@ -664,7 +664,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
delete<T extends DeleteArgs<Schema, Model>>(
args: SelectSubset<T, DeleteArgs<Schema, Model>>,
): ZenStackPromise<Schema, ModelResult<Schema, Model>>;
): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model>>>;

/**
* Deletes multiple entities.
Expand Down Expand Up @@ -709,7 +709,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
count<T extends CountArgs<Schema, Model>>(
args?: Subset<T, CountArgs<Schema, Model>>,
): ZenStackPromise<Schema, CountResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<CountResult<Schema, Model, T>>>;

/**
* Aggregates rows.
Expand All @@ -730,7 +730,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
aggregate<T extends AggregateArgs<Schema, Model>>(
args: Subset<T, AggregateArgs<Schema, Model>>,
): ZenStackPromise<Schema, AggregateResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<AggregateResult<Schema, Model, T>>>;

/**
* Groups rows by columns.
Expand Down Expand Up @@ -766,7 +766,7 @@ export interface ModelOperations<Schema extends SchemaDef, Model extends GetMode
*/
groupBy<T extends GroupByArgs<Schema, Model>>(
args: Subset<T, GroupByArgs<Schema, Model>>,
): ZenStackPromise<Schema, GroupByResult<Schema, Model, T>>;
): ZenStackPromise<Schema, Simplify<GroupByResult<Schema, Model, T>>>;
}

//#endregion
22 changes: 15 additions & 7 deletions packages/runtime/src/client/crud-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,21 @@ type ModelSelectResult<Schema extends SchemaDef, Model extends GetModels<Schema>
RelationFieldType<Schema, Model, Key>,
FieldIsArray<Schema, Model, Key>
>
? ModelResult<
Schema,
RelationFieldType<Schema, Model, Key>,
Select[Key],
FieldIsOptional<Schema, Model, Key>,
FieldIsArray<Schema, Model, Key>
>
? 'select' extends keyof Select[Key]
? ModelResult<
Schema,
RelationFieldType<Schema, Model, Key>,
Pick<Select[Key], 'select'>,
FieldIsOptional<Schema, Model, Key>,
FieldIsArray<Schema, Model, Key>
>
: ModelResult<
Schema,
RelationFieldType<Schema, Model, Key>,
Pick<Select[Key], 'include' | 'omit'>,
FieldIsOptional<Schema, Model, Key>,
FieldIsArray<Schema, Model, Key>
>
: DefaultModelResult<
Schema,
RelationFieldType<Schema, Model, Key>,
Expand Down
20 changes: 15 additions & 5 deletions packages/runtime/src/utils/type-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@ export type NullableIf<T, Condition extends boolean> = Condition extends true ?

export type PartialRecord<K extends string | number | symbol, T> = Partial<Record<K, T>>;

type _Preserve = Date | Function | Decimal | Uint8Array;
type _Depth = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
export type Simplify<T, D extends number = 6> = D extends 0
? T
: T extends object
? T extends _Preserve
? T
: { [K in keyof T]: Simplify<T[K], _Depth[D]> } & {}
: T;

export type WrapType<T, Optional = false, Array = false> = Optional extends true
? T | null
: Array extends true
Expand All @@ -24,17 +34,17 @@ export type MapBaseType<T> = T extends 'String'
? Decimal
: T extends 'DateTime'
? Date
: T extends 'Json'
? JsonValue
: unknown;
: T extends 'Bytes'
? Uint8Array
: T extends 'Json'
? JsonValue
: unknown;

export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;

export type JsonObject = { [key: string]: JsonValue };
export type JsonArray = Array<JsonValue>;

export type Simplify<T> = { [Key in keyof T]: T[Key] } & {};

export function call(code: string) {
return { code };
}
Expand Down
41 changes: 40 additions & 1 deletion packages/runtime/test/typing/verify-typing.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import SQLite from 'better-sqlite3';
import { ZenStackClient } from '../../dist';
import { Role } from './models';
import { schema } from './schema';
import SQLite from 'better-sqlite3';

const client = new ZenStackClient(schema, {
dialectConfig: {
Expand Down Expand Up @@ -147,6 +147,45 @@ async function find() {
},
})
).profile?.region?.city;

(
await client.user.findFirstOrThrow({
select: {
posts: {
where: { title: 'Foo' },
select: {
author: {
select: {
id: true,
},
},
},
},
},
})
).posts[0]?.author?.id;

const u = await client.user.findFirstOrThrow({
select: {
posts: {
where: { title: 'Foo' },
select: {
author: {
include: {
profile: true,
},
omit: {
email: true,
},
},
},
},
},
});
console.log(u.posts[0]?.author?.profile?.age);
console.log(u.posts[0]?.author?.role);
// @ts-expect-error
console.log(u.posts[0]?.author?.email);
}

async function create() {
Expand Down