@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.
- package/dist/auto-type-generator/auto-type-generator.d.ts +10 -4
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/auto-type-generator.js +640 -133
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
- package/dist/auto-type-generator/index.d.ts +8 -1
- package/dist/auto-type-generator/index.d.ts.map +1 -1
- package/dist/auto-type-generator/index.js +3 -0
- package/dist/auto-type-generator/index.js.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.d.ts +13 -5
- package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.js +107 -71
- package/dist/auto-type-generator/inline-enum-collector.js.map +1 -1
- package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.js +22 -0
- package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.js +216 -0
- package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
- package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-types.js +2 -0
- package/dist/auto-type-generator/inline-union-types.js.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.js +329 -0
- package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +18 -1
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
- package/dist/auto-type-generator/naming-convention.js +16 -0
- package/dist/auto-type-generator/naming-convention.js.map +1 -1
- package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
- package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolve-type-generator.js +2 -0
- package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
- package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
- package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
- package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-extractor.js +142 -0
- package/dist/auto-type-generator/typename-extractor.js.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/typename-types.d.ts +43 -0
- package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-types.js +37 -0
- package/dist/auto-type-generator/typename-types.js.map +1 -0
- package/dist/auto-type-generator/typename-validator.d.ts +37 -0
- package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-validator.js +206 -0
- package/dist/auto-type-generator/typename-validator.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/docs.d.ts +51 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +154 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/gen-orchestrator/orchestrator.js +13 -6
- package/dist/gen-orchestrator/orchestrator.js.map +1 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts +19 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +5 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.js +14 -61
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
- package/dist/resolver-extractor/index.d.ts +0 -1
- package/dist/resolver-extractor/index.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +20 -0
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
- package/dist/schema-generator/generate-schema.d.ts +1 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -1
- package/dist/schema-generator/generate-schema.js +72 -3
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +14 -2
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +54 -1
- package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
- package/dist/shared/enum-prefix-detector.d.ts +63 -0
- package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
- package/dist/shared/enum-prefix-detector.js +80 -0
- package/dist/shared/enum-prefix-detector.js.map +1 -0
- package/dist/shared/ignore-fields-detector.d.ts +26 -0
- package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
- package/dist/shared/ignore-fields-detector.js +83 -0
- package/dist/shared/ignore-fields-detector.js.map +1 -0
- package/dist/shared/ignore-fields-validator.d.ts +29 -0
- package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
- package/dist/shared/ignore-fields-validator.js +43 -0
- package/dist/shared/ignore-fields-validator.js.map +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/source-location.d.ts +5 -0
- package/dist/shared/source-location.d.ts.map +1 -1
- package/dist/shared/source-location.js +7 -0
- package/dist/shared/source-location.js.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +21 -7
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.js +42 -3
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.js +88 -23
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
- package/dist/type-extractor/types/diagnostics.d.ts +1 -1
- package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts +10 -2
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.js +8 -2
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -1
- package/dist/type-extractor/types/typescript.d.ts +4 -0
- package/dist/type-extractor/types/typescript.d.ts.map +1 -1
- package/docs/coding-agents.md +64 -0
- package/docs/configuration.md +6 -20
- package/docs/getting-started.md +15 -12
- package/docs/index.md +36 -22
- package/docs/integration/apollo.md +8 -40
- package/docs/integration/drizzle.md +6 -10
- package/docs/integration/prisma.md +196 -0
- package/docs/integration/yoga.md +8 -40
- package/docs/schema/abstract-resolvers.md +117 -0
- package/docs/schema/directives.md +5 -0
- package/docs/schema/documentation.md +5 -0
- package/docs/schema/enums.md +99 -0
- package/docs/schema/fields.md +64 -0
- package/docs/schema/index.md +21 -0
- package/docs/schema/inputs.md +115 -15
- package/docs/schema/interfaces.md +31 -1
- package/docs/schema/objects.md +40 -0
- package/docs/schema/queries-mutations.md +136 -22
- package/docs/schema/scalars.md +5 -0
- package/docs/schema/unions.md +208 -1
- package/docs/what-is-gqlkit.md +13 -8
- package/package.json +6 -4
- package/src/auto-type-generator/auto-type-generator.ts +946 -201
- package/src/auto-type-generator/index.ts +42 -0
- package/src/auto-type-generator/inline-enum-collector.ts +187 -139
- package/src/auto-type-generator/inline-object-traverser.ts +49 -0
- package/src/auto-type-generator/inline-union-collector.ts +402 -0
- package/src/auto-type-generator/inline-union-types.ts +33 -0
- package/src/auto-type-generator/inline-union-validator.ts +482 -0
- package/src/auto-type-generator/naming-convention.ts +38 -1
- package/src/auto-type-generator/resolve-type-generator.ts +21 -0
- package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
- package/src/auto-type-generator/typename-extractor.ts +230 -0
- package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
- package/src/auto-type-generator/typename-types.ts +66 -0
- package/src/auto-type-generator/typename-validator.ts +326 -0
- package/src/cli.ts +2 -0
- package/src/commands/docs.ts +211 -0
- package/src/gen-orchestrator/orchestrator.ts +20 -6
- package/src/resolver-extractor/extract-resolvers.ts +19 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +23 -89
- package/src/resolver-extractor/index.ts +0 -6
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +16 -8
- package/src/schema-generator/emitter/code-emitter.ts +34 -0
- package/src/schema-generator/generate-schema.ts +99 -2
- package/src/schema-generator/integrator/result-integrator.ts +70 -1
- package/src/schema-generator/resolver-collector/resolver-collector.ts +34 -0
- package/src/shared/enum-prefix-detector.ts +99 -0
- package/src/shared/ignore-fields-detector.ts +109 -0
- package/src/shared/ignore-fields-validator.ts +66 -0
- package/src/shared/index.ts +2 -0
- package/src/shared/source-location.ts +11 -0
- package/src/type-extractor/converter/graphql-converter.ts +31 -7
- package/src/type-extractor/extractor/field-type-resolver.ts +48 -3
- package/src/type-extractor/extractor/type-extractor.ts +103 -26
- package/src/type-extractor/types/diagnostics.ts +12 -2
- package/src/type-extractor/types/ts-type-reference-factory.ts +18 -5
- package/src/type-extractor/types/typescript.ts +4 -0
- package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
- package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.js +0 -76
- package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
- package/src/resolver-extractor/validator/only-validator.ts +0 -158
package/docs/getting-started.md
CHANGED
|
@@ -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
|
-
|
|
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):
|
|
8
|
-
- [Getting Started](./getting-started.md): gqlkit
|
|
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
|
-
##
|
|
23
|
+
## CLI
|
|
11
24
|
|
|
12
|
-
- [
|
|
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
|
-
##
|
|
27
|
+
## Schema Definition
|
|
26
28
|
|
|
27
|
-
- [
|
|
28
|
-
- [
|
|
29
|
-
- [
|
|
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
|
-
##
|
|
42
|
+
## Integration
|
|
32
43
|
|
|
33
|
-
- [
|
|
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
|
-
##
|
|
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
|
-
|
|
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)
|
package/docs/integration/yoga.md
CHANGED
|
@@ -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
|
-
##
|
|
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
|
-
|
|
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.
|