@gqlkit-ts/cli 0.2.0 → 0.3.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 (190) hide show
  1. package/dist/auto-type-generator/auto-type-generator.d.ts +10 -4
  2. package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
  3. package/dist/auto-type-generator/auto-type-generator.js +640 -133
  4. package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
  5. package/dist/auto-type-generator/index.d.ts +8 -1
  6. package/dist/auto-type-generator/index.d.ts.map +1 -1
  7. package/dist/auto-type-generator/index.js +3 -0
  8. package/dist/auto-type-generator/index.js.map +1 -1
  9. package/dist/auto-type-generator/inline-enum-collector.d.ts +13 -5
  10. package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -1
  11. package/dist/auto-type-generator/inline-enum-collector.js +107 -71
  12. package/dist/auto-type-generator/inline-enum-collector.js.map +1 -1
  13. package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
  14. package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
  15. package/dist/auto-type-generator/inline-object-traverser.js +22 -0
  16. package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
  17. package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
  18. package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
  19. package/dist/auto-type-generator/inline-union-collector.js +216 -0
  20. package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
  21. package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
  22. package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
  23. package/dist/auto-type-generator/inline-union-types.js +2 -0
  24. package/dist/auto-type-generator/inline-union-types.js.map +1 -0
  25. package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
  26. package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
  27. package/dist/auto-type-generator/inline-union-validator.js +329 -0
  28. package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
  29. package/dist/auto-type-generator/naming-convention.d.ts +18 -1
  30. package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
  31. package/dist/auto-type-generator/naming-convention.js +16 -0
  32. package/dist/auto-type-generator/naming-convention.js.map +1 -1
  33. package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
  34. package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
  35. package/dist/auto-type-generator/resolve-type-generator.js +2 -0
  36. package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
  37. package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
  38. package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
  39. package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
  40. package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
  41. package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
  42. package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
  43. package/dist/auto-type-generator/typename-extractor.js +142 -0
  44. package/dist/auto-type-generator/typename-extractor.js.map +1 -0
  45. package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
  46. package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
  47. package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
  48. package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
  49. package/dist/auto-type-generator/typename-types.d.ts +43 -0
  50. package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
  51. package/dist/auto-type-generator/typename-types.js +37 -0
  52. package/dist/auto-type-generator/typename-types.js.map +1 -0
  53. package/dist/auto-type-generator/typename-validator.d.ts +37 -0
  54. package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
  55. package/dist/auto-type-generator/typename-validator.js +206 -0
  56. package/dist/auto-type-generator/typename-validator.js.map +1 -0
  57. package/dist/cli.js +2 -0
  58. package/dist/cli.js.map +1 -1
  59. package/dist/commands/docs.d.ts +51 -0
  60. package/dist/commands/docs.d.ts.map +1 -0
  61. package/dist/commands/docs.js +154 -0
  62. package/dist/commands/docs.js.map +1 -0
  63. package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
  64. package/dist/gen-orchestrator/orchestrator.js +13 -6
  65. package/dist/gen-orchestrator/orchestrator.js.map +1 -1
  66. package/dist/resolver-extractor/extract-resolvers.d.ts +19 -1
  67. package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
  68. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +5 -0
  69. package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
  70. package/dist/resolver-extractor/extractor/define-api-extractor.js +14 -61
  71. package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
  72. package/dist/resolver-extractor/index.d.ts +0 -1
  73. package/dist/resolver-extractor/index.d.ts.map +1 -1
  74. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
  75. package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
  76. package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
  77. package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
  78. package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
  79. package/dist/schema-generator/emitter/code-emitter.js +20 -0
  80. package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
  81. package/dist/schema-generator/generate-schema.d.ts +1 -0
  82. package/dist/schema-generator/generate-schema.d.ts.map +1 -1
  83. package/dist/schema-generator/generate-schema.js +72 -3
  84. package/dist/schema-generator/generate-schema.js.map +1 -1
  85. package/dist/schema-generator/integrator/result-integrator.d.ts +14 -2
  86. package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
  87. package/dist/schema-generator/integrator/result-integrator.js +54 -1
  88. package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
  89. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
  90. package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
  91. package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
  92. package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
  93. package/dist/shared/enum-prefix-detector.d.ts +63 -0
  94. package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
  95. package/dist/shared/enum-prefix-detector.js +80 -0
  96. package/dist/shared/enum-prefix-detector.js.map +1 -0
  97. package/dist/shared/ignore-fields-detector.d.ts +26 -0
  98. package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
  99. package/dist/shared/ignore-fields-detector.js +83 -0
  100. package/dist/shared/ignore-fields-detector.js.map +1 -0
  101. package/dist/shared/ignore-fields-validator.d.ts +29 -0
  102. package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
  103. package/dist/shared/ignore-fields-validator.js +43 -0
  104. package/dist/shared/ignore-fields-validator.js.map +1 -0
  105. package/dist/shared/index.d.ts +2 -0
  106. package/dist/shared/index.d.ts.map +1 -1
  107. package/dist/shared/index.js.map +1 -1
  108. package/dist/shared/source-location.d.ts +5 -0
  109. package/dist/shared/source-location.d.ts.map +1 -1
  110. package/dist/shared/source-location.js +7 -0
  111. package/dist/shared/source-location.js.map +1 -1
  112. package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
  113. package/dist/type-extractor/converter/graphql-converter.js +21 -7
  114. package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
  115. package/dist/type-extractor/extractor/field-type-resolver.js +42 -3
  116. package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -1
  117. package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
  118. package/dist/type-extractor/extractor/type-extractor.js +88 -23
  119. package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
  120. package/dist/type-extractor/types/diagnostics.d.ts +1 -1
  121. package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
  122. package/dist/type-extractor/types/ts-type-reference-factory.d.ts +10 -2
  123. package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -1
  124. package/dist/type-extractor/types/ts-type-reference-factory.js +8 -2
  125. package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -1
  126. package/dist/type-extractor/types/typescript.d.ts +4 -0
  127. package/dist/type-extractor/types/typescript.d.ts.map +1 -1
  128. package/docs/coding-agents.md +64 -0
  129. package/docs/configuration.md +6 -20
  130. package/docs/getting-started.md +15 -12
  131. package/docs/index.md +36 -22
  132. package/docs/integration/apollo.md +8 -40
  133. package/docs/integration/drizzle.md +6 -10
  134. package/docs/integration/prisma.md +196 -0
  135. package/docs/integration/yoga.md +8 -40
  136. package/docs/schema/abstract-resolvers.md +117 -0
  137. package/docs/schema/directives.md +5 -0
  138. package/docs/schema/documentation.md +5 -0
  139. package/docs/schema/enums.md +99 -0
  140. package/docs/schema/fields.md +64 -0
  141. package/docs/schema/index.md +21 -0
  142. package/docs/schema/inputs.md +115 -15
  143. package/docs/schema/interfaces.md +31 -1
  144. package/docs/schema/objects.md +40 -0
  145. package/docs/schema/queries-mutations.md +136 -22
  146. package/docs/schema/scalars.md +5 -0
  147. package/docs/schema/unions.md +208 -1
  148. package/docs/what-is-gqlkit.md +13 -8
  149. package/package.json +6 -4
  150. package/src/auto-type-generator/auto-type-generator.ts +946 -201
  151. package/src/auto-type-generator/index.ts +42 -0
  152. package/src/auto-type-generator/inline-enum-collector.ts +187 -139
  153. package/src/auto-type-generator/inline-object-traverser.ts +49 -0
  154. package/src/auto-type-generator/inline-union-collector.ts +402 -0
  155. package/src/auto-type-generator/inline-union-types.ts +33 -0
  156. package/src/auto-type-generator/inline-union-validator.ts +482 -0
  157. package/src/auto-type-generator/naming-convention.ts +38 -1
  158. package/src/auto-type-generator/resolve-type-generator.ts +21 -0
  159. package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
  160. package/src/auto-type-generator/typename-extractor.ts +230 -0
  161. package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
  162. package/src/auto-type-generator/typename-types.ts +66 -0
  163. package/src/auto-type-generator/typename-validator.ts +326 -0
  164. package/src/cli.ts +2 -0
  165. package/src/commands/docs.ts +211 -0
  166. package/src/gen-orchestrator/orchestrator.ts +20 -6
  167. package/src/resolver-extractor/extract-resolvers.ts +19 -0
  168. package/src/resolver-extractor/extractor/define-api-extractor.ts +23 -89
  169. package/src/resolver-extractor/index.ts +0 -6
  170. package/src/resolver-extractor/validator/abstract-resolver-validator.ts +16 -8
  171. package/src/schema-generator/emitter/code-emitter.ts +34 -0
  172. package/src/schema-generator/generate-schema.ts +99 -2
  173. package/src/schema-generator/integrator/result-integrator.ts +70 -1
  174. package/src/schema-generator/resolver-collector/resolver-collector.ts +34 -0
  175. package/src/shared/enum-prefix-detector.ts +99 -0
  176. package/src/shared/ignore-fields-detector.ts +109 -0
  177. package/src/shared/ignore-fields-validator.ts +66 -0
  178. package/src/shared/index.ts +2 -0
  179. package/src/shared/source-location.ts +11 -0
  180. package/src/type-extractor/converter/graphql-converter.ts +31 -7
  181. package/src/type-extractor/extractor/field-type-resolver.ts +48 -3
  182. package/src/type-extractor/extractor/type-extractor.ts +103 -26
  183. package/src/type-extractor/types/diagnostics.ts +12 -2
  184. package/src/type-extractor/types/ts-type-reference-factory.ts +18 -5
  185. package/src/type-extractor/types/typescript.ts +4 -0
  186. package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
  187. package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
  188. package/dist/resolver-extractor/validator/only-validator.js +0 -76
  189. package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
  190. package/src/resolver-extractor/validator/only-validator.ts +0 -158
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Getting Started
3
+ description: Install gqlkit and create your first GraphQL schema from TypeScript.
4
+ ---
5
+
1
6
  # Getting Started
2
7
 
3
8
  ## Installation
@@ -17,6 +22,10 @@ yarn add @gqlkit-ts/runtime @graphql-tools/schema graphql
17
22
  yarn add -D @gqlkit-ts/cli
18
23
  ```
19
24
 
25
+ > [!TIP]
26
+ >
27
+ > If you use AI coding agents like Claude Code or Codex, run `gqlkit docs` to set up gqlkit skills. See [Coding Agents](./coding-agents) for details.
28
+
20
29
  ## Project Structure
21
30
 
22
31
  gqlkit expects your types and resolvers to be in `src/gqlkit/schema/`:
@@ -52,27 +61,21 @@ export const { defineQuery, defineMutation, defineField } =
52
61
  createGqlkitApis<Context>();
53
62
  ```
54
63
 
55
- ## Define Your First Type
64
+ ## Define Your First Type and Query
56
65
 
57
- Create a simple User type in `src/gqlkit/schema/user.ts`:
66
+ Create a simple User type and query in `src/gqlkit/schema/user.ts`:
58
67
 
59
68
  ```typescript
69
+ import { defineQuery } from "../gqlkit";
70
+ import type { NoArgs } from "@gqlkit-ts/runtime";
71
+
60
72
  export type User = {
61
73
  id: string;
62
74
  name: string;
63
75
  email: string | null;
64
76
  };
65
- ```
66
-
67
- ## Define a Query
68
-
69
- Create a query resolver in `src/gqlkit/schema/query.ts`:
70
-
71
- ```typescript
72
- import { defineQuery } from "../gqlkit";
73
- import type { NoArgs } from "@gqlkit-ts/runtime";
74
- import type { User } from "./user";
75
77
 
78
+ // NoArgs indicates this query takes no arguments
76
79
  export const me = defineQuery<NoArgs, User | null>(
77
80
  (_root, _args, ctx) => ctx.currentUser
78
81
  );
package/docs/index.md CHANGED
@@ -1,33 +1,47 @@
1
1
  # gqlkit
2
2
 
3
- > gqlkit is a convention-driven code generator for GraphQL servers in TypeScript. Define GraphQL types and resolver signatures in TypeScript, then `gqlkit gen` generates GraphQL schema AST and a resolver map from your codebase.
3
+ gqlkit generates GraphQL schema and resolver maps from TypeScript types and functions.
4
+
5
+ ## How it works
6
+
7
+ 1. Write TypeScript types in `src/gqlkit/schema/` → become GraphQL types
8
+ 2. Write resolver functions using `defineQuery`, `defineMutation`, `defineField` → become GraphQL resolvers
9
+ 3. Run `gqlkit gen` → outputs `typeDefs` and `resolvers` to `src/gqlkit/__generated__/`
10
+
11
+ ## Design principles
12
+
13
+ - **Implement first**: Write types and resolvers, generate schema when ready. No edit-regenerate-implement loops.
14
+ - **Just types and functions**: Plain TypeScript with a thin API. No decorators, no complex generics.
15
+ - **Type-safe**: TypeScript types become GraphQL types. Resolver signatures checked at compile time.
4
16
 
5
17
  ## Documentation
6
18
 
7
- - [What is gqlkit?](./what-is-gqlkit.md): gqlkit is a convention-driven code generator for GraphQL servers in TypeScript.
8
- - [Getting Started](./getting-started.md): gqlkit expects your types and resolvers to be in `src/gqlkit/schema/`:
19
+ - [What is gqlkit?](./what-is-gqlkit.md): Just types and functions write TypeScript, generate GraphQL.
20
+ - [Getting Started](./getting-started.md): Install gqlkit and create your first GraphQL schema from TypeScript.
21
+ - [Coding Agents](./coding-agents.md): Set up AI coding agents like Claude Code and Codex to understand gqlkit conventions. (skip if reading via `gqlkit-guide` skill)
9
22
 
10
- ## Schema Definition
23
+ ## CLI
11
24
 
12
- - [Schema Definition](./schema.md): gqlkit generates GraphQL schema from your TypeScript types. All exported types from `src/gqlkit/schema/` are automatically scanned and converted to GraphQL types.
13
- - [Object Types](./schema/objects.md): Plain TypeScript type exports become GraphQL Object types.
14
- - [Input Types](./schema/inputs.md): TypeScript types with `Input` suffix are treated as GraphQL input types.
15
- - [Queries & Mutations](./schema/queries-mutations.md): Define Query and Mutation fields using the `@gqlkit-ts/runtime` API.
16
- - [Field Resolvers](./schema/fields.md): Add computed fields to object types using `defineField`. Define them alongside the type.
17
- - [Scalar Types](./schema/scalars.md): gqlkit provides built-in scalar types and supports custom scalar definitions.
18
- - [Enum Types](./schema/enums.md): gqlkit converts TypeScript string literal unions and enums to GraphQL enum types.
19
- - [Union Types](./schema/unions.md): TypeScript union types of object types are converted to GraphQL union types.
20
- - [Interface Types](./schema/interfaces.md): Define GraphQL interface types using the `GqlInterface` utility type.
21
- - [Abstract Type Resolution](./schema/abstract-resolvers.md): GraphQL abstract types (unions and interfaces) require runtime type resolution to determine the concrete type of returned values. gqlkit provides `defineResolveType` and `defineIsTypeOf` to handle this.
22
- - [Documentation](./schema/documentation.md): gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.
23
- - [Custom Directives](./schema/directives.md): Define custom directives using the `GqlDirective` utility type and attach them using `GqlField` or `GqlObject`.
25
+ - [Configuration](./configuration.md): Configure gqlkit via gqlkit.config.ts in your project root.
24
26
 
25
- ## Integration
27
+ ## Schema Definition
26
28
 
27
- - [graphql-yoga](./integration/yoga.md): [graphql-yoga](https://the-guild.dev/graphql/yoga-server) is a batteries-included GraphQL server that works in any JavaScript runtime.
28
- - [Apollo Server](./integration/apollo.md): [Apollo Server](https://www.apollographql.com/docs/apollo-server/) is a popular GraphQL server with extensive features and ecosystem.
29
- - [Drizzle ORM](./integration/drizzle.md): [Drizzle ORM](https://orm.drizzle.team/) is a TypeScript ORM with type-safe schema definitions. gqlkit integrates seamlessly with Drizzle by using `InferSelectModel` and `InferInsertModel` to derive GraphQL types from your table definitions.
29
+ - [Schema Definition](./schema.md): gqlkit generates GraphQL schema from your TypeScript types.
30
+ - [Defining Object Types](./schema/objects.md): Plain TypeScript type exports become GraphQL Object types.
31
+ - [Defining Input Types](./schema/inputs.md): TypeScript types with Input suffix are treated as GraphQL input types.
32
+ - [Defining Queries and Mutations](./schema/queries-mutations.md): Define Query and Mutation fields using the @gqlkit-ts/runtime API.
33
+ - [Defining Field Resolvers](./schema/fields.md): Add computed fields to object types using defineField.
34
+ - [Defining Scalar Types](./schema/scalars.md): gqlkit provides built-in scalar types and supports custom scalar definitions.
35
+ - [Defining Enum Types](./schema/enums.md): gqlkit converts TypeScript string literal unions and enums to GraphQL enum types.
36
+ - [Defining Union Types](./schema/unions.md): TypeScript union types of object types are converted to GraphQL union types.
37
+ - [Defining Interface Types](./schema/interfaces.md): Define GraphQL interface types using the GqlInterface utility type.
38
+ - [Resolving Abstract Types](./schema/abstract-resolvers.md): Handle runtime type resolution for GraphQL unions and interfaces.
39
+ - [Adding Documentation to Schema](./schema/documentation.md): gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.
40
+ - [Defining Custom Directives](./schema/directives.md): Define custom directives using the GqlDirective utility type.
30
41
 
31
- ## Guides
42
+ ## Integration
32
43
 
33
- - [Configuration](./configuration.md): gqlkit can be configured via `gqlkit.config.ts` in your project root.
44
+ - [Integration with graphql-yoga](./integration/yoga.md): Use gqlkit with graphql-yoga, a batteries-included GraphQL server.
45
+ - [Integration with Apollo Server](./integration/apollo.md): Use gqlkit with Apollo Server, a popular GraphQL server.
46
+ - [Integration with Drizzle ORM](./integration/drizzle.md): Derive GraphQL types from Drizzle table definitions.
47
+ - [Integration with Prisma](./integration/prisma.md): Derive GraphQL types from Prisma model types.
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Integration with Apollo Server
3
+ description: Use gqlkit with Apollo Server, a popular GraphQL server.
4
+ ---
5
+
1
6
  # Apollo Server
2
7
 
3
8
  [Apollo Server](https://www.apollographql.com/docs/apollo-server/) is a popular GraphQL server with extensive features and ecosystem.
@@ -16,18 +21,9 @@ pnpm add @apollo/server
16
21
  yarn add @apollo/server
17
22
  ```
18
23
 
19
- ## Creating the Schema
20
-
21
- First, create an executable schema using `makeExecutableSchema`:
22
-
23
- ```typescript
24
- // src/schema.ts
25
- import { makeExecutableSchema } from "@graphql-tools/schema";
26
- import { typeDefs } from "./gqlkit/__generated__/schema";
27
- import { resolvers } from "./gqlkit/__generated__/resolvers";
24
+ ## Prerequisites
28
25
 
29
- export const schema = makeExecutableSchema({ typeDefs, resolvers });
30
- ```
26
+ Create an executable schema following the [Getting Started guide](../getting-started.md#create-graphql-schema).
31
27
 
32
28
  ## Basic Server
33
29
 
@@ -50,35 +46,7 @@ console.log(`Server is running on ${url}`);
50
46
 
51
47
  ## With Context
52
48
 
53
- If your resolvers use a context type, provide a context factory:
54
-
55
- ```typescript
56
- // src/gqlkit/context.ts
57
- export type Context = {
58
- currentUser: User | null;
59
- db: Database;
60
- };
61
- ```
62
-
63
- ```typescript
64
- // src/gqlkit/gqlkit.ts
65
- import { createGqlkitApis } from "@gqlkit-ts/runtime";
66
- import type { Context } from "./context";
67
-
68
- export const { defineQuery, defineMutation, defineField } =
69
- createGqlkitApis<Context>();
70
- ```
71
-
72
- ```typescript
73
- // src/gqlkit/schema/query.ts
74
- import { defineQuery } from "../gqlkit";
75
- import type { NoArgs } from "@gqlkit-ts/runtime";
76
- import type { User } from "./user";
77
-
78
- export const me = defineQuery<NoArgs, User | null>(
79
- (_root, _args, ctx) => ctx.currentUser
80
- );
81
- ```
49
+ If your resolvers use a context type, first [set up context and resolver factories](../getting-started.md#set-up-context-and-resolver-factories), then provide a context factory to your server:
82
50
 
83
51
  ```typescript
84
52
  // src/server.ts
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Integration with Drizzle ORM
3
+ description: Derive GraphQL types from Drizzle table definitions.
4
+ ---
5
+
1
6
  # Drizzle ORM
2
7
 
3
8
  [Drizzle ORM](https://orm.drizzle.team/) is a TypeScript ORM with type-safe schema definitions. gqlkit integrates seamlessly with Drizzle by using `InferSelectModel` and `InferInsertModel` to derive GraphQL types from your table definitions.
@@ -145,7 +150,7 @@ export const posts = defineField<User, NoArgs, Post[]>(
145
150
 
146
151
  ## Context with Database
147
152
 
148
- Set up the context type to include your database instance:
153
+ Set up the context type to include your database instance. For basic setup, see [Set Up Context and Resolver Factories](../getting-started.md#set-up-context-and-resolver-factories).
149
154
 
150
155
  ```typescript
151
156
  // src/db/db.ts
@@ -167,15 +172,6 @@ export type Context = {
167
172
  };
168
173
  ```
169
174
 
170
- ```typescript
171
- // src/gqlkit/gqlkit.ts
172
- import { createGqlkitApis } from "@gqlkit-ts/runtime";
173
- import type { Context } from "./context.js";
174
-
175
- export const { defineQuery, defineMutation, defineField } =
176
- createGqlkitApis<Context>();
177
- ```
178
-
179
175
  ## Complete Example
180
176
 
181
177
  See the [examples/with-drizzle](https://github.com/gqlkit/gqlkit/tree/main/examples/with-drizzle) directory for a complete working example with:
@@ -0,0 +1,196 @@
1
+ ---
2
+ title: Integration with Prisma
3
+ description: Derive GraphQL types from Prisma model types.
4
+ ---
5
+
6
+ # Prisma
7
+
8
+ [Prisma](https://www.prisma.io/) is a next-generation ORM for Node.js and TypeScript. gqlkit integrates seamlessly with Prisma by using its generated model types to derive GraphQL types from your schema definitions.
9
+
10
+ ## Installation
11
+
12
+ ```sh filename="npm"
13
+ npm install prisma @prisma/client
14
+ ```
15
+
16
+ ```sh filename="pnpm"
17
+ pnpm add prisma @prisma/client
18
+ ```
19
+
20
+ ```sh filename="yarn"
21
+ yarn add prisma @prisma/client
22
+ ```
23
+
24
+ ## Defining the Schema
25
+
26
+ Define your database schema in `prisma/schema.prisma`:
27
+
28
+ ```prisma
29
+ // prisma/schema.prisma
30
+ generator client {
31
+ provider = "prisma-client"
32
+ output = "../src/__generated__/prisma"
33
+ }
34
+
35
+ datasource db {
36
+ provider = "sqlite"
37
+ }
38
+
39
+ enum UserStatus {
40
+ active
41
+ inactive
42
+ suspended
43
+ }
44
+
45
+ model User {
46
+ id String @id @default(uuid())
47
+ name String
48
+ email String @unique
49
+ status UserStatus @default(active)
50
+ createdAt DateTime @default(now()) @map("created_at")
51
+ posts Post[]
52
+
53
+ @@map("users")
54
+ }
55
+
56
+ enum PostPriority {
57
+ low
58
+ medium
59
+ high
60
+ }
61
+
62
+ model Post {
63
+ id String @id @default(uuid())
64
+ title String
65
+ content String?
66
+ priority PostPriority @default(medium)
67
+ authorId String @map("author_id")
68
+ createdAt DateTime @default(now()) @map("created_at")
69
+ author User @relation(fields: [authorId], references: [id])
70
+
71
+ @@map("posts")
72
+ }
73
+ ```
74
+
75
+ Enum types defined in the Prisma schema are automatically converted to corresponding GraphQL enum types by gqlkit.
76
+
77
+ ## Defining Custom Scalars
78
+
79
+ Define custom scalar types using `GqlScalar` for fields like timestamps:
80
+
81
+ ```typescript
82
+ // src/gqlkit/schema/scalars.ts
83
+ import type { GqlScalar } from "@gqlkit-ts/runtime";
84
+
85
+ export type DateTime = GqlScalar<"DateTime", Date>;
86
+ ```
87
+
88
+ ## Exporting GraphQL Types
89
+
90
+ Use Prisma's generated model types to export GraphQL types from your schema definitions:
91
+
92
+ ```typescript
93
+ // src/gqlkit/schema/user.ts
94
+ import type { Prisma } from "../../__generated__/prisma/client.js";
95
+
96
+ // Export as GraphQL object type
97
+ export type User = Prisma.UserModel;
98
+ ```
99
+
100
+ This generates the following GraphQL schema:
101
+
102
+ ```graphql
103
+ enum UserStatus {
104
+ ACTIVE
105
+ INACTIVE
106
+ SUSPENDED
107
+ }
108
+
109
+ type User {
110
+ id: String!
111
+ name: String!
112
+ email: String!
113
+ status: UserStatus!
114
+ createdAt: DateTime!
115
+ }
116
+ ```
117
+
118
+ ## Defining Resolvers
119
+
120
+ Define resolvers that use the derived types:
121
+
122
+ ```typescript
123
+ // src/gqlkit/schema/user.ts
124
+ import type { NoArgs } from "@gqlkit-ts/runtime";
125
+ import type { Prisma } from "../../__generated__/prisma/client.js";
126
+ import { defineField, defineMutation, defineQuery } from "../gqlkit.js";
127
+ import type { Post } from "./post.js";
128
+
129
+ export type User = Prisma.UserModel;
130
+
131
+ export const allUsers = defineQuery<NoArgs, User[]>(
132
+ async (_root, _args, ctx) => {
133
+ return ctx.db.user.findMany();
134
+ },
135
+ );
136
+
137
+ export const user = defineQuery<{ id: string }, User | null>(
138
+ async (_root, args, ctx) => {
139
+ return ctx.db.user.findUnique({
140
+ where: { id: args.id },
141
+ });
142
+ },
143
+ );
144
+
145
+ export const createUser = defineMutation<
146
+ { input: Omit<Prisma.UserCreateInput, "id" | "createdAt" | "posts"> },
147
+ User
148
+ >(async (_root, args, ctx) => {
149
+ return ctx.db.user.create({
150
+ data: args.input,
151
+ });
152
+ });
153
+
154
+ export const posts = defineField<User, NoArgs, Post[]>(
155
+ async (parent, _args, ctx) => {
156
+ return ctx.db.post.findMany({
157
+ where: { authorId: parent.id },
158
+ });
159
+ },
160
+ );
161
+ ```
162
+
163
+ ## Context with Database
164
+
165
+ Set up the context type to include your Prisma client instance. For basic setup, see [Set Up Context and Resolver Factories](../getting-started.md#set-up-context-and-resolver-factories).
166
+
167
+ ```typescript
168
+ // src/db/db.ts
169
+ import { PrismaClient } from "../__generated__/prisma/client.js";
170
+
171
+ export const prisma = new PrismaClient();
172
+ export type PrismaDatabase = typeof prisma;
173
+ ```
174
+
175
+ ```typescript
176
+ // src/gqlkit/context.ts
177
+ import type { PrismaDatabase } from "../db/db.js";
178
+
179
+ export type Context = {
180
+ db: PrismaDatabase;
181
+ };
182
+ ```
183
+
184
+ ## Complete Example
185
+
186
+ See the [examples/with-prisma](https://github.com/gqlkit/gqlkit/tree/main/examples/with-prisma) directory for a complete working example with:
187
+
188
+ - SQLite database with DateTime scalar
189
+ - Enum types (`UserStatus`, `PostPriority`)
190
+ - User and Post types with relationships
191
+ - Query, Mutation, and Field resolvers
192
+
193
+ ## Further Reading
194
+
195
+ - [Prisma Documentation](https://www.prisma.io/docs)
196
+ - [Prisma Client API Reference](https://www.prisma.io/docs/orm/reference/prisma-client-reference)
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Integration with graphql-yoga
3
+ description: Use gqlkit with graphql-yoga, a batteries-included GraphQL server.
4
+ ---
5
+
1
6
  # graphql-yoga
2
7
 
3
8
  [graphql-yoga](https://the-guild.dev/graphql/yoga-server) is a batteries-included GraphQL server that works in any JavaScript runtime.
@@ -16,18 +21,9 @@ pnpm add graphql-yoga
16
21
  yarn add graphql-yoga
17
22
  ```
18
23
 
19
- ## Creating the Schema
20
-
21
- First, create an executable schema using `makeExecutableSchema`:
22
-
23
- ```typescript
24
- // src/schema.ts
25
- import { makeExecutableSchema } from "@graphql-tools/schema";
26
- import { typeDefs } from "./gqlkit/__generated__/schema";
27
- import { resolvers } from "./gqlkit/__generated__/resolvers";
24
+ ## Prerequisites
28
25
 
29
- export const schema = makeExecutableSchema({ typeDefs, resolvers });
30
- ```
26
+ Create an executable schema following the [Getting Started guide](../getting-started.md#create-graphql-schema).
31
27
 
32
28
  ## Basic Server
33
29
 
@@ -47,35 +43,7 @@ server.listen(4000, () => {
47
43
 
48
44
  ## With Context
49
45
 
50
- If your resolvers use a context type, provide a context factory:
51
-
52
- ```typescript
53
- // src/gqlkit/context.ts
54
- export type Context = {
55
- currentUser: User | null;
56
- db: Database;
57
- };
58
- ```
59
-
60
- ```typescript
61
- // src/gqlkit/gqlkit.ts
62
- import { createGqlkitApis } from "@gqlkit-ts/runtime";
63
- import type { Context } from "./context";
64
-
65
- export const { defineQuery, defineMutation, defineField } =
66
- createGqlkitApis<Context>();
67
- ```
68
-
69
- ```typescript
70
- // src/gqlkit/schema/query.ts
71
- import { defineQuery } from "../gqlkit";
72
- import type { NoArgs } from "@gqlkit-ts/runtime";
73
- import type { User } from "./user";
74
-
75
- export const me = defineQuery<NoArgs, User | null>(
76
- (_root, _args, ctx) => ctx.currentUser
77
- );
78
- ```
46
+ If your resolvers use a context type, first [set up context and resolver factories](../getting-started.md#set-up-context-and-resolver-factories), then provide a context factory to your server:
79
47
 
80
48
  ```typescript
81
49
  // src/server.ts
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Resolving Abstract Types
3
+ description: Handle runtime type resolution for GraphQL unions and interfaces.
4
+ ---
5
+
1
6
  # Abstract Type Resolution
2
7
 
3
8
  GraphQL abstract types (unions and interfaces) require runtime type resolution to determine the concrete type of returned values. gqlkit provides `defineResolveType` and `defineIsTypeOf` to handle this.
@@ -11,6 +16,118 @@ When a GraphQL query returns an abstract type, the server needs to determine whi
11
16
  | `resolveType` | Abstract type (union/interface) | Type name string | Single resolver decides the type |
12
17
  | `isTypeOf` | Object type | Boolean | Each type checks if value matches |
13
18
 
19
+ ## Automatic resolveType Generation
20
+
21
+ When Union or Interface member types have `__typename` or `$typeName` fields with string literal values, gqlkit automatically generates the `resolveType` function. No manual definition is needed.
22
+
23
+ ### Basic Example
24
+
25
+ ```typescript
26
+ export interface User {
27
+ __typename: "User";
28
+ id: string;
29
+ name: string;
30
+ }
31
+
32
+ export interface Post {
33
+ __typename: "Post";
34
+ id: string;
35
+ title: string;
36
+ }
37
+
38
+ export type SearchResult = User | Post;
39
+ // resolveType is automatically generated: (obj) => obj.__typename
40
+ ```
41
+
42
+ ### Using `$typeName`
43
+
44
+ If you prefer not to use `__typename` (e.g., to avoid conflicts with GraphQL introspection), you can use `$typeName` instead:
45
+
46
+ ```typescript
47
+ export interface User {
48
+ $typeName: "User";
49
+ id: string;
50
+ name: string;
51
+ }
52
+
53
+ export interface Post {
54
+ $typeName: "Post";
55
+ id: string;
56
+ title: string;
57
+ }
58
+
59
+ export type SearchResult = User | Post;
60
+ // resolveType is automatically generated: (obj) => obj.$typeName
61
+ ```
62
+
63
+ ### Priority Rules
64
+
65
+ When both `__typename` and `$typeName` are present, `__typename` takes priority:
66
+
67
+ ```typescript
68
+ export interface User {
69
+ __typename: "User"; // This value is used
70
+ $typeName: "UserType";
71
+ id: string;
72
+ }
73
+ ```
74
+
75
+ ### Mixed Patterns
76
+
77
+ When some members use `__typename` and others use `$typeName`, gqlkit generates a fallback pattern:
78
+
79
+ ```typescript
80
+ export interface User {
81
+ __typename: "User";
82
+ id: string;
83
+ }
84
+
85
+ export interface Post {
86
+ $typeName: "Post";
87
+ id: string;
88
+ }
89
+
90
+ export type SearchResult = User | Post;
91
+ // resolveType: (obj) => obj.__typename ?? obj.$typeName
92
+ ```
93
+
94
+ ### Requirements
95
+
96
+ For automatic generation, the typename field must be:
97
+
98
+ - Named `__typename` or `$typeName`
99
+ - A **non-optional** field
100
+ - A **non-nullable** type
101
+ - A **string literal** type (not `string`)
102
+
103
+ ```typescript
104
+ // ✅ OK: Valid typename fields
105
+ interface Valid {
106
+ __typename: "TypeA"; // string literal, required
107
+ }
108
+
109
+ // ❌ Error: These will not trigger auto-generation
110
+ interface Invalid1 {
111
+ __typename?: "TypeA"; // optional field
112
+ }
113
+
114
+ interface Invalid2 {
115
+ __typename: "TypeA" | null; // nullable type
116
+ }
117
+
118
+ interface Invalid3 {
119
+ __typename: string; // not a string literal
120
+ }
121
+ ```
122
+
123
+ ### When to Use Manual defineResolveType
124
+
125
+ Use `defineResolveType` manually when:
126
+
127
+ - Your types don't have `__typename` or `$typeName` fields
128
+ - You need custom resolution logic (e.g., checking other properties)
129
+ - You want to override the automatic generation
130
+
14
131
  ## Using resolveType
15
132
 
16
133
  Define a `resolveType` resolver on a union or interface type to determine the concrete type.
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Defining Custom Directives
3
+ description: Define custom directives using the GqlDirective utility type.
4
+ ---
5
+
1
6
  # Custom Directives
2
7
 
3
8
  Define custom directives using the `GqlDirective` utility type and attach them using `GqlField` or `GqlObject`.
@@ -1,3 +1,8 @@
1
+ ---
2
+ title: Adding Documentation to Schema
3
+ description: gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.
4
+ ---
5
+
1
6
  # Documentation
2
7
 
3
8
  gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.