@drizzle-graphql-suite/client 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/infer.d.ts +22 -6
  2. package/package.json +1 -1
  3. package/types.d.ts +2 -1
package/infer.d.ts CHANGED
@@ -9,9 +9,10 @@ type ExtractTables<TSchema> = {
9
9
  type FindRelationConfig<TSchema, TTableName extends string> = {
10
10
  [K in keyof TSchema]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;
11
11
  }[keyof TSchema];
12
- type MapRelation<T> = T extends One<infer N, infer _TNullable> ? {
12
+ type MapRelation<T> = T extends One<infer N, infer TIsNullable> ? {
13
13
  entity: N;
14
14
  type: 'one';
15
+ required: TIsNullable;
15
16
  } : T extends Many<infer N> ? {
16
17
  entity: N;
17
18
  type: 'many';
@@ -35,10 +36,25 @@ type ScalarFilterOps<T> = {
35
36
  isNull?: boolean | null;
36
37
  isNotNull?: boolean | null;
37
38
  };
38
- type InferFilters<TFields> = {
39
+ type ScalarColumnFilters<TFields> = {
39
40
  [K in keyof TFields]?: ScalarFilterOps<NonNullable<TFields[K]>>;
40
- } & {
41
- OR?: InferFilters<TFields>[];
41
+ };
42
+ type ManyRelationFilter<TFilter> = {
43
+ some?: TFilter;
44
+ every?: TFilter;
45
+ none?: TFilter;
46
+ };
47
+ type IsResolvableRelation<TSchema, TRel> = TRel extends {
48
+ entity: infer E;
49
+ } ? E extends string ? KeyForDbName<TSchema, E> extends keyof ExtractTables<TSchema> ? true : false : false : false;
50
+ type InferRelationFilterFields<TSchema, TRels> = {
51
+ [K in keyof TRels as IsResolvableRelation<TSchema, TRels[K]> extends true ? K : never]?: TRels[K] extends {
52
+ entity: infer E;
53
+ type: infer TRelType;
54
+ } ? E extends string ? KeyForDbName<TSchema, E> extends infer RK ? RK extends keyof ExtractTables<TSchema> ? ExtractTables<TSchema>[RK] extends infer TTarget ? TTarget extends Table ? TRelType extends 'many' ? ManyRelationFilter<InferEntityFilters<TSchema, TTarget>> : InferEntityFilters<TSchema, TTarget> : never : never : never : never : never : never;
55
+ };
56
+ type InferEntityFilters<TSchema, T extends Table> = ScalarColumnFilters<WireFormat<T['$inferSelect']>> & InferRelationFilterFields<TSchema, InferRelationDefs<TSchema, TableDbName<T>>> & {
57
+ OR?: InferEntityFilters<TSchema, T>[];
42
58
  };
43
59
  type InferInsertInput<T> = T extends Table ? WireFormat<T['$inferInsert']> : never;
44
60
  type InferUpdateInput<T> = T extends Table ? {
@@ -67,7 +83,7 @@ type ResolveRelationDefs<TSchema, TRels> = {
67
83
  [K in keyof TRels]: TRels[K] extends {
68
84
  entity: infer E;
69
85
  type: infer T;
70
- } ? E extends string ? {
86
+ } ? E extends string ? Omit<TRels[K], 'entity'> & {
71
87
  entity: ResolveRelationEntity<TSchema, E>;
72
88
  type: T;
73
89
  } : TRels[K] : TRels[K];
@@ -75,7 +91,7 @@ type ResolveRelationDefs<TSchema, TRels> = {
75
91
  type BuildEntityDef<TSchema, T> = T extends Table ? {
76
92
  fields: WireFormat<T['$inferSelect']>;
77
93
  relations: ResolveRelationDefs<TSchema, InferRelationDefs<TSchema, TableDbName<T>>>;
78
- filters: InferFilters<WireFormat<T['$inferSelect']>>;
94
+ filters: InferEntityFilters<TSchema, T>;
79
95
  insertInput: InferInsertInput<T>;
80
96
  updateInput: InferUpdateInput<T>;
81
97
  orderBy: InferOrderBy<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drizzle-graphql-suite/client",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Type-safe GraphQL client with entity-based API and full Drizzle type inference",
5
5
  "license": "MIT",
6
6
  "author": "https://github.com/dmythro",
package/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export type RelationDef = {
2
2
  entity: string;
3
3
  type: 'one' | 'many';
4
+ required?: boolean;
4
5
  };
5
6
  export type EntityDef = {
6
7
  fields: Record<string, unknown>;
@@ -35,7 +36,7 @@ type Simplify<T> = {
35
36
  export type InferResult<TDefs extends AnyEntityDefs, TEntity extends EntityDef, TSelect> = Simplify<InferScalars<TEntity, TSelect> & InferRelations<TDefs, TEntity, TSelect>>;
36
37
  type InferScalars<TEntity extends EntityDef, TSelect> = Pick<TEntity['fields'], keyof TSelect & keyof TEntity['fields']>;
37
38
  type InferRelations<TDefs extends AnyEntityDefs, TEntity extends EntityDef, TSelect> = {
38
- [K in keyof TSelect & keyof TEntity['relations'] as TSelect[K] extends Record<string, unknown> ? K : never]: TEntity['relations'][K] extends RelationDef ? TEntity['relations'][K]['entity'] extends keyof TDefs ? TEntity['relations'][K]['type'] extends 'many' ? InferResult<TDefs, TDefs[TEntity['relations'][K]['entity']], TSelect[K]>[] : InferResult<TDefs, TDefs[TEntity['relations'][K]['entity']], TSelect[K]> | null : never : never;
39
+ [K in keyof TSelect & keyof TEntity['relations'] as TSelect[K] extends Record<string, unknown> ? K : never]: TEntity['relations'][K] extends RelationDef ? TEntity['relations'][K]['entity'] extends keyof TDefs ? TEntity['relations'][K]['type'] extends 'many' ? InferResult<TDefs, TDefs[TEntity['relations'][K]['entity']], TSelect[K]>[] : TEntity['relations'][K]['required'] extends true ? InferResult<TDefs, TDefs[TEntity['relations'][K]['entity']], TSelect[K]> : InferResult<TDefs, TDefs[TEntity['relations'][K]['entity']], TSelect[K]> | null : never : never;
39
40
  };
40
41
  export type ClientConfig<TSchema extends SchemaDescriptor = SchemaDescriptor> = {
41
42
  url: string | (() => string);