@gqlkit-ts/cli 0.1.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 +26 -4
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/auto-type-generator.js +846 -152
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
- package/dist/auto-type-generator/index.d.ts +9 -2
- 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 +39 -0
- package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-enum-collector.js +193 -0
- package/dist/auto-type-generator/inline-enum-collector.js.map +1 -0
- 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 +22 -1
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
- package/dist/auto-type-generator/naming-convention.js +24 -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 +119 -14
- package/dist/gen-orchestrator/orchestrator.js.map +1 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts +28 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +16 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.js +86 -309
- 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 +10 -2
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +39 -4
- 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 +90 -4
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +34 -2
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +96 -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/constants.d.ts +0 -16
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +0 -19
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/directive-detector.d.ts.map +1 -1
- package/dist/shared/directive-detector.js +8 -15
- package/dist/shared/directive-detector.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/file-scanner.d.ts.map +1 -1
- package/dist/shared/file-scanner.js +5 -3
- package/dist/shared/file-scanner.js.map +1 -1
- 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 +3 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -3
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/interface-detector.d.ts +3 -2
- package/dist/shared/interface-detector.d.ts.map +1 -1
- package/dist/shared/interface-detector.js +54 -11
- package/dist/shared/interface-detector.js.map +1 -1
- package/dist/shared/path-utils.d.ts +2 -0
- package/dist/shared/path-utils.d.ts.map +1 -0
- package/dist/shared/path-utils.js +4 -0
- package/dist/shared/path-utils.js.map +1 -0
- 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/shared/type-converter.d.ts.map +1 -1
- package/dist/shared/type-converter.js +11 -0
- package/dist/shared/type-converter.js.map +1 -1
- package/dist/shared/typescript-utils.d.ts +34 -7
- package/dist/shared/typescript-utils.d.ts.map +1 -1
- package/dist/shared/typescript-utils.js +72 -24
- package/dist/shared/typescript-utils.js.map +1 -1
- package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -1
- package/dist/type-extractor/collector/scalar-collector.js +4 -14
- package/dist/type-extractor/collector/scalar-collector.js.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +57 -4
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.d.ts +28 -0
- package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -0
- package/dist/type-extractor/extractor/field-type-resolver.js +433 -0
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts +12 -3
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.js +260 -229
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
- package/dist/type-extractor/extractor/type-name-collector.d.ts +24 -0
- package/dist/type-extractor/extractor/type-name-collector.d.ts.map +1 -0
- package/dist/type-extractor/extractor/type-name-collector.js +102 -0
- package/dist/type-extractor/extractor/type-name-collector.js.map +1 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts +89 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts.map +1 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.js +158 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.js.map +1 -0
- 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/graphql.d.ts +2 -0
- package/dist/type-extractor/types/graphql.d.ts.map +1 -1
- package/dist/type-extractor/types/index.d.ts +2 -1
- package/dist/type-extractor/types/index.d.ts.map +1 -1
- package/dist/type-extractor/types/index.js +1 -1
- package/dist/type-extractor/types/index.js.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts +47 -0
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js +75 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -0
- package/dist/type-extractor/types/typescript.d.ts +25 -1
- package/dist/type-extractor/types/typescript.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.js +1 -1
- package/dist/type-extractor/validator/type-validator.js.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 -21
- package/docs/integration/apollo.md +8 -40
- package/docs/integration/drizzle.md +187 -0
- 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 +307 -0
- package/docs/schema/fields.md +66 -0
- package/docs/schema/index.md +21 -0
- package/docs/schema/inputs.md +117 -15
- package/docs/schema/interfaces.md +31 -1
- package/docs/schema/objects.md +42 -0
- package/docs/schema/queries-mutations.md +138 -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 +14 -5
- package/src/auto-type-generator/auto-type-generator.ts +1670 -0
- package/src/auto-type-generator/index.ts +63 -0
- package/src/auto-type-generator/inline-enum-collector.ts +338 -0
- 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/name-collision-validator.ts +119 -0
- package/src/auto-type-generator/naming-convention.ts +163 -0
- 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 +13 -0
- package/src/commands/docs.ts +211 -0
- package/src/commands/gen.ts +141 -0
- package/src/commands/main.ts +5 -0
- package/src/config/define-config.ts +28 -0
- package/src/config/index.ts +7 -0
- package/src/config/types.ts +144 -0
- package/src/config-loader/index.ts +14 -0
- package/src/config-loader/loader.ts +143 -0
- package/src/config-loader/validator.ts +672 -0
- package/src/gen-orchestrator/hook-executor/hook-executor.ts +117 -0
- package/src/gen-orchestrator/orchestrator.ts +798 -0
- package/src/gen-orchestrator/reporter/diagnostic-reporter.ts +44 -0
- package/src/gen-orchestrator/reporter/progress-reporter.ts +61 -0
- package/src/gen-orchestrator/writer/file-writer.ts +38 -0
- package/src/index.ts +2 -0
- package/src/resolver-extractor/extract-resolvers.ts +82 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +740 -0
- package/src/resolver-extractor/index.ts +13 -0
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +259 -0
- package/src/schema-generator/builder/ast-builder.ts +706 -0
- package/src/schema-generator/emitter/code-emitter.ts +385 -0
- package/src/schema-generator/emitter/sdl-emitter.ts +13 -0
- package/src/schema-generator/generate-schema.ts +267 -0
- package/src/schema-generator/index.ts +19 -0
- package/src/schema-generator/integrator/result-integrator.ts +759 -0
- package/src/schema-generator/pruner/schema-pruner.ts +112 -0
- package/src/schema-generator/resolver-collector/resolver-collector.ts +157 -0
- package/src/shared/constants.ts +122 -0
- package/src/shared/default-value-detector.ts +172 -0
- package/src/shared/diagnostics.ts +35 -0
- package/src/shared/directive-definition-extractor.ts +564 -0
- package/src/shared/directive-detector.ts +556 -0
- package/src/shared/enum-prefix-detector.ts +99 -0
- package/src/shared/file-scanner.ts +170 -0
- package/src/shared/ignore-fields-detector.ts +109 -0
- package/src/shared/ignore-fields-validator.ts +66 -0
- package/src/shared/index.ts +34 -0
- package/src/shared/inline-object-extractor.ts +102 -0
- package/src/shared/inline-object-utils.ts +23 -0
- package/src/shared/interface-detector.ts +176 -0
- package/src/shared/interface-validator.ts +211 -0
- package/src/shared/metadata-detector.ts +443 -0
- package/src/shared/path-utils.ts +3 -0
- package/src/shared/program-factory.ts +51 -0
- package/src/shared/source-location.ts +38 -0
- package/src/shared/tsconfig-loader.ts +126 -0
- package/src/shared/tsdoc-parser.ts +155 -0
- package/src/shared/type-converter.ts +99 -0
- package/src/shared/typescript-utils.ts +246 -0
- package/src/type-extractor/collector/result-collector.ts +57 -0
- package/src/type-extractor/collector/scalar-collector.ts +254 -0
- package/src/type-extractor/converter/field-eligibility.ts +112 -0
- package/src/type-extractor/converter/graphql-converter.ts +483 -0
- package/src/type-extractor/extract-types.ts +1 -0
- package/src/type-extractor/extractor/field-type-resolver.ts +614 -0
- package/src/type-extractor/extractor/type-extractor.ts +1644 -0
- package/src/type-extractor/extractor/type-name-collector.ts +130 -0
- package/src/type-extractor/index.ts +20 -0
- package/src/type-extractor/mapper/scalar-base-type-mapper.ts +265 -0
- package/src/type-extractor/types/diagnostics.ts +109 -0
- package/src/type-extractor/types/graphql.ts +55 -0
- package/src/type-extractor/types/index.ts +37 -0
- package/src/type-extractor/types/ts-type-reference-factory.ts +150 -0
- package/src/type-extractor/types/typescript.ts +137 -0
- package/src/type-extractor/validator/type-validator.ts +77 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts +0 -2
- package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +0 -1
- package/dist/auto-type-generator/auto-type-generator.test.js +0 -613
- package/dist/auto-type-generator/auto-type-generator.test.js.map +0 -1
- package/dist/auto-type-generator/name-collision-validator.test.d.ts +0 -2
- package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +0 -1
- package/dist/auto-type-generator/name-collision-validator.test.js +0 -358
- package/dist/auto-type-generator/name-collision-validator.test.js.map +0 -1
- package/dist/auto-type-generator/naming-convention.test.d.ts +0 -2
- package/dist/auto-type-generator/naming-convention.test.d.ts.map +0 -1
- package/dist/auto-type-generator/naming-convention.test.js +0 -132
- package/dist/auto-type-generator/naming-convention.test.js.map +0 -1
- package/dist/commands/gen.test.d.ts +0 -2
- package/dist/commands/gen.test.d.ts.map +0 -1
- package/dist/commands/gen.test.js +0 -226
- package/dist/commands/gen.test.js.map +0 -1
- package/dist/config-loader/loader.test.d.ts +0 -2
- package/dist/config-loader/loader.test.d.ts.map +0 -1
- package/dist/config-loader/loader.test.js +0 -123
- package/dist/config-loader/loader.test.js.map +0 -1
- package/dist/config-loader/validator.test.d.ts +0 -2
- package/dist/config-loader/validator.test.d.ts.map +0 -1
- package/dist/config-loader/validator.test.js +0 -846
- package/dist/config-loader/validator.test.js.map +0 -1
- package/dist/gen-orchestrator/golden.test.d.ts +0 -2
- package/dist/gen-orchestrator/golden.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/golden.test.js +0 -102
- package/dist/gen-orchestrator/golden.test.js.map +0 -1
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +0 -2
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +0 -167
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +0 -1
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +0 -2
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js +0 -74
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +0 -1
- 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/dist/resolver-extractor/validator/only-validator.test.d.ts +0 -8
- package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.test.js +0 -352
- package/dist/resolver-extractor/validator/only-validator.test.js.map +0 -1
- package/dist/schema-generator/builder/ast-builder.test.d.ts +0 -2
- package/dist/schema-generator/builder/ast-builder.test.d.ts.map +0 -1
- package/dist/schema-generator/builder/ast-builder.test.js +0 -469
- package/dist/schema-generator/builder/ast-builder.test.js.map +0 -1
- package/dist/shared/file-scanner.test.d.ts +0 -2
- package/dist/shared/file-scanner.test.d.ts.map +0 -1
- package/dist/shared/file-scanner.test.js +0 -138
- package/dist/shared/file-scanner.test.js.map +0 -1
- package/dist/shared/interface-validator.test.d.ts +0 -2
- package/dist/shared/interface-validator.test.d.ts.map +0 -1
- package/dist/shared/interface-validator.test.js +0 -145
- package/dist/shared/interface-validator.test.js.map +0 -1
- package/dist/type-extractor/types/typescript.test.d.ts +0 -2
- package/dist/type-extractor/types/typescript.test.d.ts.map +0 -1
- package/dist/type-extractor/types/typescript.test.js +0 -287
- package/dist/type-extractor/types/typescript.test.js.map +0 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Integration with Drizzle ORM
|
|
3
|
+
description: Derive GraphQL types from Drizzle table definitions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Drizzle ORM
|
|
7
|
+
|
|
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.
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
```sh filename="npm"
|
|
13
|
+
npm install drizzle-orm postgres
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```sh filename="pnpm"
|
|
17
|
+
pnpm add drizzle-orm postgres
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```sh filename="yarn"
|
|
21
|
+
yarn add drizzle-orm postgres
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Defining Tables
|
|
25
|
+
|
|
26
|
+
Define your database tables with Drizzle:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// src/db/schema.ts
|
|
30
|
+
import { pgEnum, pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
|
|
31
|
+
|
|
32
|
+
export const userStatusEnum = pgEnum("user_status", [
|
|
33
|
+
"active",
|
|
34
|
+
"inactive",
|
|
35
|
+
"suspended",
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
export const users = pgTable("users", {
|
|
39
|
+
id: uuid().primaryKey().defaultRandom(),
|
|
40
|
+
name: text().notNull(),
|
|
41
|
+
email: text().notNull().unique(),
|
|
42
|
+
status: userStatusEnum().notNull().default("active"),
|
|
43
|
+
createdAt: timestamp().notNull().defaultNow(),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export const posts = pgTable("posts", {
|
|
47
|
+
id: uuid().primaryKey().defaultRandom(),
|
|
48
|
+
title: text().notNull(),
|
|
49
|
+
content: text(),
|
|
50
|
+
priority: text({ enum: ["low", "medium", "high"] }).notNull().default("medium"),
|
|
51
|
+
authorId: uuid()
|
|
52
|
+
.notNull()
|
|
53
|
+
.references(() => users.id),
|
|
54
|
+
createdAt: timestamp().notNull().defaultNow(),
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Both `pgEnum()` and `text({ enum: [...] })` are supported for defining enum columns. gqlkit automatically generates corresponding GraphQL enum types from these definitions.
|
|
59
|
+
|
|
60
|
+
## Defining Custom Scalars
|
|
61
|
+
|
|
62
|
+
Define custom scalar types using `GqlScalar` for fields like timestamps:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// src/gqlkit/schema/scalars.ts
|
|
66
|
+
import type { GqlScalar } from "@gqlkit-ts/runtime";
|
|
67
|
+
|
|
68
|
+
export type DateTime = GqlScalar<"DateTime", Date>;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Exporting GraphQL Types
|
|
72
|
+
|
|
73
|
+
Use Drizzle's type inference utilities to export GraphQL types from your table definitions:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// src/gqlkit/schema/user.ts
|
|
77
|
+
import type { InferSelectModel } from "drizzle-orm";
|
|
78
|
+
import { users as usersTable } from "../../db/schema.js";
|
|
79
|
+
|
|
80
|
+
// Export as GraphQL object type
|
|
81
|
+
export type User = InferSelectModel<typeof usersTable>;
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This generates the following GraphQL schema:
|
|
85
|
+
|
|
86
|
+
```graphql
|
|
87
|
+
enum UserStatus {
|
|
88
|
+
ACTIVE
|
|
89
|
+
INACTIVE
|
|
90
|
+
SUSPENDED
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
type User {
|
|
94
|
+
id: String!
|
|
95
|
+
name: String!
|
|
96
|
+
email: String!
|
|
97
|
+
status: UserStatus!
|
|
98
|
+
createdAt: DateTime!
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Defining Resolvers
|
|
103
|
+
|
|
104
|
+
Define resolvers that use the derived types:
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
// src/gqlkit/schema/user.ts
|
|
108
|
+
import type { NoArgs } from "@gqlkit-ts/runtime";
|
|
109
|
+
import type { InferInsertModel, InferSelectModel } from "drizzle-orm";
|
|
110
|
+
import { eq } from "drizzle-orm";
|
|
111
|
+
import { posts as postsTable, users as usersTable } from "../../db/schema.js";
|
|
112
|
+
import { defineField, defineMutation, defineQuery } from "../gqlkit.js";
|
|
113
|
+
import type { Post } from "./post.js";
|
|
114
|
+
|
|
115
|
+
export type User = InferSelectModel<typeof usersTable>;
|
|
116
|
+
|
|
117
|
+
export const allUsers = defineQuery<NoArgs, User[]>(
|
|
118
|
+
async (_root, _args, ctx) => {
|
|
119
|
+
return ctx.db.select().from(usersTable);
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
export const user = defineQuery<{ id: string }, User | null>(
|
|
124
|
+
async (_root, args, ctx) => {
|
|
125
|
+
const result = await ctx.db
|
|
126
|
+
.select()
|
|
127
|
+
.from(usersTable)
|
|
128
|
+
.where(eq(usersTable.id, args.id));
|
|
129
|
+
return result[0] ?? null;
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
export const createUser = defineMutation<
|
|
134
|
+
{ input: Omit<InferInsertModel<typeof usersTable>, "id" | "createdAt"> },
|
|
135
|
+
User
|
|
136
|
+
>(async (_root, args, ctx) => {
|
|
137
|
+
const result = await ctx.db.insert(usersTable).values(args.input).returning();
|
|
138
|
+
return result[0]!;
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
export const posts = defineField<User, NoArgs, Post[]>(
|
|
142
|
+
async (parent, _args, ctx) => {
|
|
143
|
+
return ctx.db
|
|
144
|
+
.select()
|
|
145
|
+
.from(postsTable)
|
|
146
|
+
.where(eq(postsTable.authorId, parent.id));
|
|
147
|
+
},
|
|
148
|
+
);
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Context with Database
|
|
152
|
+
|
|
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).
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// src/db/db.ts
|
|
157
|
+
import { drizzle } from "drizzle-orm/postgres-js";
|
|
158
|
+
import postgres from "postgres";
|
|
159
|
+
import * as schema from "./schema.js";
|
|
160
|
+
|
|
161
|
+
const client = postgres(process.env.DATABASE_URL!);
|
|
162
|
+
export const db = drizzle(client, { schema, casing: "snake_case" });
|
|
163
|
+
export type Database = typeof db;
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// src/gqlkit/context.ts
|
|
168
|
+
import type { Database } from "../db/db.js";
|
|
169
|
+
|
|
170
|
+
export type Context = {
|
|
171
|
+
db: Database;
|
|
172
|
+
};
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Complete Example
|
|
176
|
+
|
|
177
|
+
See the [examples/with-drizzle](https://github.com/gqlkit/gqlkit/tree/main/examples/with-drizzle) directory for a complete working example with:
|
|
178
|
+
|
|
179
|
+
- PostgreSQL tables with DateTime scalar
|
|
180
|
+
- Enum types using both `pgEnum()` and `text({ enum: [...] })`
|
|
181
|
+
- User and Post types with relationships
|
|
182
|
+
- Query, Mutation, and Field resolvers
|
|
183
|
+
|
|
184
|
+
## Further Reading
|
|
185
|
+
|
|
186
|
+
- [Drizzle ORM Documentation](https://orm.drizzle.team/docs/overview)
|
|
187
|
+
- [Drizzle with PostgreSQL](https://orm.drizzle.team/docs/get-started/postgresql-new)
|
|
@@ -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.
|