Skip to content

Commit b0f12a6

Browse files
committed
Merge remote-tracking branch 'origin/dev' into multiple-files-fixes
2 parents a0cc590 + bebb181 commit b0f12a6

81 files changed

Lines changed: 10299 additions & 702 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ on:
88

99
env:
1010
TELEMETRY_TRACKING_TOKEN: ${{ secrets.TELEMETRY_TRACKING_TOKEN }}
11+
VSCODE_TELEMETRY_TRACKING_TOKEN: ${{ secrets.VSCODE_TELEMETRY_TRACKING_TOKEN }}
1112
DO_NOT_TRACK: '1'
1213

1314
permissions:

packages/cli/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# @zenstackhq/cli
2+
3+
The command-line interface for ZenStack. Provides commands for initializing projects, generating TypeScript code from ZModel schemas, managing database migrations, and etc.
4+
5+
## Key Commands
6+
7+
- `zenstack init` — Initialize ZenStack in an existing project
8+
- `zenstack generate` — Compile ZModel schema to TypeScript
9+
- `zenstack db push` — Sync schema to the database
10+
- `zenstack db pull` — Pull database schema changes into ZModel
11+
- `zenstack migrate dev` — Create and apply database migrations
12+
- `zenstack migrate deploy` — Deploy migrations to production
13+
- `zenstack format` — Format ZModel schema files
14+
- `zenstack proxy|studio` — Start a database proxy server for using studio
15+
16+
## Installation
17+
18+
```bash
19+
npm install -D @zenstackhq/cli
20+
```
21+
22+
## Learn More
23+
24+
- [ZenStack Documentation](https://zenstack.dev/docs)

packages/clients/client-helpers/src/types.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
1+
import type { ClientContract, QueryOptions } from '@zenstackhq/orm';
2+
import type { SchemaDef } from '@zenstackhq/schema';
3+
14
/**
25
* A type that represents either a value of type T or a Promise that resolves to type T.
36
*/
47
export type MaybePromise<T> = T | Promise<T> | PromiseLike<T>;
58

9+
/**
10+
* Infers the schema definition from a client contract type, or passes through a raw SchemaDef.
11+
*/
12+
export type InferSchema<T> = T extends { $schema: infer S extends SchemaDef } ? S : T extends SchemaDef ? T : never;
13+
14+
/**
15+
* Extracts the ExtResult type from a client contract, or defaults to `{}`.
16+
*/
17+
export type InferExtResult<T> = T extends ClientContract<any, any, any, any, infer E> ? E : {};
18+
19+
/**
20+
* Infers query options from a client contract type, or defaults to `QueryOptions<Schema>`.
21+
*/
22+
export type InferOptions<T, Schema extends SchemaDef> = T extends { $options: infer O extends QueryOptions<Schema> }
23+
? O
24+
: QueryOptions<Schema>;
25+
626
/**
727
* List of ORM write actions.
828
*/

packages/clients/tanstack-query/src/common/types.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import type { FetchFn } from '@zenstackhq/client-helpers/fetch';
33
import type {
44
GetProcedureNames,
55
GetSlicedOperations,
6-
OperationsIneligibleForDelegateModels,
6+
ModelAllowsCreate,
7+
OperationsRequiringCreate,
78
ProcedureFunc,
89
QueryOptions,
910
} from '@zenstackhq/orm';
10-
import type { GetModels, IsDelegateModel, SchemaDef } from '@zenstackhq/schema';
11+
import type { GetModels, SchemaDef } from '@zenstackhq/schema';
1112

1213
/**
1314
* Context type for configuring the hooks.
@@ -59,8 +60,8 @@ export type ExtraMutationOptions = {
5960
optimisticDataProvider?: OptimisticDataProvider;
6061
} & QueryContext;
6162

62-
type HooksOperationsIneligibleForDelegateModels = OperationsIneligibleForDelegateModels extends any
63-
? `use${Capitalize<OperationsIneligibleForDelegateModels>}`
63+
type HooksOperationsRequiringCreate = OperationsRequiringCreate extends any
64+
? `use${Capitalize<OperationsRequiringCreate>}`
6465
: never;
6566

6667
type Modifiers = '' | 'Suspense' | 'Infinite' | 'SuspenseInfinite';
@@ -76,12 +77,12 @@ export type TrimSlicedOperations<
7677
> = {
7778
// trim operations based on slicing options
7879
[Key in keyof T as Key extends `use${Modifiers}${Capitalize<GetSlicedOperations<Schema, Model, Options>>}`
79-
? IsDelegateModel<Schema, Model> extends true
80-
? // trim operations ineligible for delegate models
81-
Key extends HooksOperationsIneligibleForDelegateModels
82-
? never
83-
: Key
84-
: Key
80+
? ModelAllowsCreate<Schema, Model> extends true
81+
? Key
82+
: // trim create operations for models that don't allow create
83+
Key extends HooksOperationsRequiringCreate
84+
? never
85+
: Key
8586
: never]: T[Key];
8687
};
8788

packages/clients/tanstack-query/src/react.ts

Lines changed: 94 additions & 68 deletions
Large diffs are not rendered by default.

packages/clients/tanstack-query/src/svelte/index.svelte.ts

Lines changed: 77 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import {
1919
createInvalidator,
2020
createOptimisticUpdater,
2121
DEFAULT_QUERY_ENDPOINT,
22+
type InferExtResult,
23+
type InferOptions,
24+
type InferSchema,
2225
type InvalidationPredicate,
2326
} from '@zenstackhq/client-helpers';
2427
import { fetcher, makeUrl, marshal } from '@zenstackhq/client-helpers/fetch';
@@ -27,6 +30,7 @@ import type {
2730
AggregateArgs,
2831
AggregateResult,
2932
BatchResult,
33+
ClientContract,
3034
CountArgs,
3135
CountResult,
3236
CreateArgs,
@@ -35,6 +39,7 @@ import type {
3539
DeleteArgs,
3640
DeleteManyArgs,
3741
ExistsArgs,
42+
ExtResultBase,
3843
FindFirstArgs,
3944
FindManyArgs,
4045
FindUniqueArgs,
@@ -69,6 +74,8 @@ import type {
6974
WithOptimistic,
7075
} from '../common/types.js';
7176
export type { FetchFn } from '@zenstackhq/client-helpers/fetch';
77+
export type { InferExtResult, InferOptions, InferSchema } from '@zenstackhq/client-helpers';
78+
export type { SchemaDef } from '@zenstackhq/schema';
7279

7380
type ProcedureHookFn<
7481
Schema extends SchemaDef,
@@ -139,15 +146,20 @@ export type ModelMutationModelResult<
139146
TArgs,
140147
Array extends boolean = false,
141148
Options extends QueryOptions<Schema> = QueryOptions<Schema>,
142-
> = Omit<ModelMutationResult<SimplifiedResult<Schema, Model, TArgs, Options, false, Array>, TArgs>, 'mutateAsync'> & {
149+
ExtResult extends ExtResultBase<Schema> = {},
150+
> = Omit<ModelMutationResult<SimplifiedResult<Schema, Model, TArgs, Options, false, Array, ExtResult>, TArgs>, 'mutateAsync'> & {
143151
mutateAsync<T extends TArgs>(
144152
args: T,
145-
options?: ModelMutationOptions<SimplifiedResult<Schema, Model, T, Options, false, Array>, T>,
146-
): Promise<SimplifiedResult<Schema, Model, T, Options, false, Array>>;
153+
options?: ModelMutationOptions<SimplifiedResult<Schema, Model, T, Options, false, Array, ExtResult>, T>,
154+
): Promise<SimplifiedResult<Schema, Model, T, Options, false, Array, ExtResult>>;
147155
};
148156

149-
export type ClientHooks<Schema extends SchemaDef, Options extends QueryOptions<Schema> = QueryOptions<Schema>> = {
150-
[Model in GetSlicedModels<Schema, Options> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model, Options>;
157+
export type ClientHooks<
158+
Schema extends SchemaDef,
159+
Options extends QueryOptions<Schema> = QueryOptions<Schema>,
160+
ExtResult extends ExtResultBase<Schema> = {},
161+
> = {
162+
[Model in GetSlicedModels<Schema, Options> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model, Options, ExtResult>;
151163
} & ProcedureHooks<Schema, Options>;
152164

153165
type ProcedureHookGroup<Schema extends SchemaDef, Options extends QueryOptions<Schema>> = {
@@ -200,65 +212,66 @@ export type ModelQueryHooks<
200212
Schema extends SchemaDef,
201213
Model extends GetModels<Schema>,
202214
Options extends QueryOptions<Schema> = QueryOptions<Schema>,
215+
ExtResult extends ExtResultBase<Schema> = {},
203216
> = TrimSlicedOperations<
204217
Schema,
205218
Model,
206219
Options,
207220
{
208-
useFindUnique<T extends FindUniqueArgs<Schema, Model, Options>>(
209-
args: Accessor<SelectSubset<T, FindUniqueArgs<Schema, Model, Options>>>,
210-
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options> | null>>,
211-
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options> | null>;
221+
useFindUnique<T extends FindUniqueArgs<Schema, Model, Options, {}, ExtResult>>(
222+
args: Accessor<SelectSubset<T, FindUniqueArgs<Schema, Model, Options, {}, ExtResult>>>,
223+
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult> | null>>,
224+
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult> | null>;
212225

213-
useFindFirst<T extends FindFirstArgs<Schema, Model, Options>>(
214-
args?: Accessor<SelectSubset<T, FindFirstArgs<Schema, Model, Options>>>,
215-
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options> | null>>,
216-
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options> | null>;
226+
useFindFirst<T extends FindFirstArgs<Schema, Model, Options, {}, ExtResult>>(
227+
args?: Accessor<SelectSubset<T, FindFirstArgs<Schema, Model, Options, {}, ExtResult>>>,
228+
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult> | null>>,
229+
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult> | null>;
217230

218231
useExists<T extends ExistsArgs<Schema, Model, Options>>(
219232
args?: Accessor<Subset<T, ExistsArgs<Schema, Model, Options>>>,
220233
options?: Accessor<ModelQueryOptions<boolean>>,
221234
): ModelQueryResult<boolean>;
222235

223-
useFindMany<T extends FindManyArgs<Schema, Model, Options>>(
224-
args?: Accessor<SelectSubset<T, FindManyArgs<Schema, Model, Options>>>,
225-
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options>[]>>,
226-
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options>[]>;
236+
useFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>>(
237+
args?: Accessor<SelectSubset<T, FindManyArgs<Schema, Model, Options, {}, ExtResult>>>,
238+
options?: Accessor<ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>,
239+
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>;
227240

228-
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options>>(
229-
args?: Accessor<SelectSubset<T, FindManyArgs<Schema, Model, Options>>>,
230-
options?: Accessor<ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options>[]>>,
231-
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options>[]>>;
241+
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options, {}, ExtResult>>(
242+
args?: Accessor<SelectSubset<T, FindManyArgs<Schema, Model, Options, {}, ExtResult>>>,
243+
options?: Accessor<ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>,
244+
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[]>>;
232245

233-
useCreate<T extends CreateArgs<Schema, Model, Options>>(
234-
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>>,
235-
): ModelMutationModelResult<Schema, Model, T, false, Options>;
246+
useCreate<T extends CreateArgs<Schema, Model, Options, {}, ExtResult>>(
247+
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>>,
248+
): ModelMutationModelResult<Schema, Model, T, false, Options, ExtResult>;
236249

237250
useCreateMany<T extends CreateManyArgs<Schema, Model>>(
238251
options?: Accessor<ModelMutationOptions<BatchResult, T>>,
239252
): ModelMutationResult<BatchResult, T>;
240253

241-
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model, Options>>(
242-
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>[], T>>,
243-
): ModelMutationModelResult<Schema, Model, T, true, Options>;
254+
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model, Options, {}, ExtResult>>(
255+
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], T>>,
256+
): ModelMutationModelResult<Schema, Model, T, true, Options, ExtResult>;
244257

245-
useUpdate<T extends UpdateArgs<Schema, Model, Options>>(
246-
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>>,
247-
): ModelMutationModelResult<Schema, Model, T, false, Options>;
258+
useUpdate<T extends UpdateArgs<Schema, Model, Options, {}, ExtResult>>(
259+
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>>,
260+
): ModelMutationModelResult<Schema, Model, T, false, Options, ExtResult>;
248261
useUpdateMany<T extends UpdateManyArgs<Schema, Model, Options>>(
249262
options?: Accessor<ModelMutationOptions<BatchResult, T>>,
250263
): ModelMutationResult<BatchResult, T>;
251264

252-
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model, Options>>(
253-
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>[], T>>,
254-
): ModelMutationModelResult<Schema, Model, T, true, Options>;
265+
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model, Options, {}, ExtResult>>(
266+
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>[], T>>,
267+
): ModelMutationModelResult<Schema, Model, T, true, Options, ExtResult>;
255268

256-
useUpsert<T extends UpsertArgs<Schema, Model, Options>>(
257-
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>>,
258-
): ModelMutationModelResult<Schema, Model, T, false, Options>;
259-
useDelete<T extends DeleteArgs<Schema, Model, Options>>(
260-
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>>,
261-
): ModelMutationModelResult<Schema, Model, T, false, Options>;
269+
useUpsert<T extends UpsertArgs<Schema, Model, Options, {}, ExtResult>>(
270+
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>>,
271+
): ModelMutationModelResult<Schema, Model, T, false, Options, ExtResult>;
272+
useDelete<T extends DeleteArgs<Schema, Model, Options, {}, ExtResult>>(
273+
options?: Accessor<ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options, ExtResult>, T>>,
274+
): ModelMutationModelResult<Schema, Model, T, false, Options, ExtResult>;
262275

263276
useDeleteMany<T extends DeleteManyArgs<Schema, Model, Options>>(
264277
options?: Accessor<ModelMutationOptions<BatchResult, T>>,
@@ -283,21 +296,36 @@ export type ModelQueryHooks<
283296

284297
/**
285298
* Gets data query hooks for all models in the schema.
299+
*
300+
* Accepts either a raw `SchemaDef` or a `ClientContract` type (e.g. `typeof db`) as the generic parameter.
301+
* When a `ClientContract` type is provided, computed fields from plugins are reflected in the result types.
302+
*
303+
* @example
304+
* ```typescript
305+
* // Basic usage with schema
306+
* const client = useClientQueries(schema)
307+
*
308+
* // With server client type for computed field support
309+
* import type { DbType } from '~/server/db'
310+
* const client = useClientQueries<DbType>(schema)
311+
* ```
286312
*/
287-
export function useClientQueries<Schema extends SchemaDef, Options extends QueryOptions<Schema> = QueryOptions<Schema>>(
288-
schema: Schema,
313+
export function useClientQueries<
314+
SchemaOrClient extends SchemaDef | ClientContract<any, any, any, any, any>,
315+
>(
316+
schema: InferSchema<SchemaOrClient>,
289317
options?: Accessor<QueryContext>,
290-
): ClientHooks<Schema, Options> {
318+
): ClientHooks<InferSchema<SchemaOrClient>, InferOptions<SchemaOrClient, InferSchema<SchemaOrClient>>, InferExtResult<SchemaOrClient> extends ExtResultBase<InferSchema<SchemaOrClient>> ? InferExtResult<SchemaOrClient> : {}> {
291319
const result = Object.keys(schema.models).reduce(
292320
(acc, model) => {
293-
(acc as any)[lowerCaseFirst(model)] = useModelQueries<Schema, GetModels<Schema>, Options>(
294-
schema,
295-
model as GetModels<Schema>,
321+
(acc as any)[lowerCaseFirst(model)] = useModelQueries(
322+
schema as any,
323+
model as any,
296324
options,
297325
);
298326
return acc;
299327
},
300-
{} as ClientHooks<Schema, Options>,
328+
{} as any,
301329
);
302330

303331
const procedures = (schema as any).procedures as Record<string, { mutation?: boolean }> | undefined;
@@ -347,7 +375,8 @@ export function useModelQueries<
347375
Schema extends SchemaDef,
348376
Model extends GetModels<Schema>,
349377
Options extends QueryOptions<Schema>,
350-
>(schema: Schema, model: Model, rootOptions?: Accessor<QueryContext>): ModelQueryHooks<Schema, Model, Options> {
378+
ExtResult extends ExtResultBase<Schema> = {},
379+
>(schema: Schema, model: Model, rootOptions?: Accessor<QueryContext>): ModelQueryHooks<Schema, Model, Options, ExtResult> {
351380
const modelDef = Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());
352381
if (!modelDef) {
353382
throw new Error(`Model "${model}" not found in schema`);
@@ -423,7 +452,7 @@ export function useModelQueries<
423452
useGroupBy: (args: any, options?: any) => {
424453
return useInternalQuery(schema, modelName, 'groupBy', args, options);
425454
},
426-
} as unknown as ModelQueryHooks<Schema, Model, Options>;
455+
} as unknown as ModelQueryHooks<Schema, Model, Options, ExtResult>;
427456
}
428457

429458
export function useInternalQuery<TQueryFnData, TData>(

0 commit comments

Comments
 (0)