@gqlkit-ts/cli 0.0.1 → 0.1.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/LICENSE +21 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts +46 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.js +353 -0
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts +2 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.test.js +613 -0
- package/dist/auto-type-generator/auto-type-generator.test.js.map +1 -0
- package/dist/auto-type-generator/index.d.ts +4 -0
- package/dist/auto-type-generator/index.d.ts.map +1 -0
- package/dist/auto-type-generator/index.js +3 -0
- package/dist/auto-type-generator/index.js.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.d.ts +17 -0
- package/dist/auto-type-generator/name-collision-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.js +68 -0
- package/dist/auto-type-generator/name-collision-validator.js.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.test.d.ts +2 -0
- package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.test.js +358 -0
- package/dist/auto-type-generator/name-collision-validator.test.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +40 -0
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -0
- package/dist/auto-type-generator/naming-convention.js +59 -0
- package/dist/auto-type-generator/naming-convention.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.test.d.ts +2 -0
- package/dist/auto-type-generator/naming-convention.test.d.ts.map +1 -0
- package/dist/auto-type-generator/naming-convention.test.js +132 -0
- package/dist/auto-type-generator/naming-convention.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/gen.d.ts +32 -0
- package/dist/commands/gen.d.ts.map +1 -0
- package/dist/commands/gen.js +101 -0
- package/dist/commands/gen.js.map +1 -0
- package/dist/commands/gen.test.d.ts +2 -0
- package/dist/commands/gen.test.d.ts.map +1 -0
- package/dist/commands/gen.test.js +226 -0
- package/dist/commands/gen.test.js.map +1 -0
- package/dist/commands/main.d.ts +12 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +5 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/config/define-config.d.ts +26 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +27 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +131 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config-loader/index.d.ts +3 -0
- package/dist/config-loader/index.d.ts.map +1 -0
- package/dist/config-loader/index.js +2 -0
- package/dist/config-loader/index.js.map +1 -0
- package/dist/config-loader/loader.d.ts +50 -0
- package/dist/config-loader/loader.d.ts.map +1 -0
- package/dist/config-loader/loader.js +78 -0
- package/dist/config-loader/loader.js.map +1 -0
- package/dist/config-loader/loader.test.d.ts +2 -0
- package/dist/config-loader/loader.test.d.ts.map +1 -0
- package/dist/config-loader/loader.test.js +123 -0
- package/dist/config-loader/loader.test.js.map +1 -0
- package/dist/config-loader/validator.d.ts +13 -0
- package/dist/config-loader/validator.d.ts.map +1 -0
- package/dist/config-loader/validator.js +497 -0
- package/dist/config-loader/validator.js.map +1 -0
- package/dist/config-loader/validator.test.d.ts +2 -0
- package/dist/config-loader/validator.test.d.ts.map +1 -0
- package/dist/config-loader/validator.test.js +846 -0
- package/dist/config-loader/validator.test.js.map +1 -0
- package/dist/gen-orchestrator/golden.test.d.ts +2 -0
- package/dist/gen-orchestrator/golden.test.d.ts.map +1 -0
- package/dist/gen-orchestrator/golden.test.js +102 -0
- package/dist/gen-orchestrator/golden.test.js.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.d.ts +25 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.d.ts.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.js +68 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.js.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +2 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +167 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +1 -0
- package/dist/gen-orchestrator/orchestrator.d.ts +30 -0
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/gen-orchestrator/orchestrator.js +407 -0
- package/dist/gen-orchestrator/orchestrator.js.map +1 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.d.ts +9 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.d.ts.map +1 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.js +32 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.js.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.d.ts +19 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.d.ts.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.js +38 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.js.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +2 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js +74 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +1 -0
- package/dist/gen-orchestrator/writer/file-writer.d.ts +13 -0
- package/dist/gen-orchestrator/writer/file-writer.d.ts.map +1 -0
- package/dist/gen-orchestrator/writer/file-writer.js +22 -0
- package/dist/gen-orchestrator/writer/file-writer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver-extractor/extract-resolvers.d.ts +40 -0
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -0
- package/dist/resolver-extractor/extract-resolvers.js +2 -0
- package/dist/resolver-extractor/extract-resolvers.js.map +1 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +50 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.js +685 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -0
- package/dist/resolver-extractor/index.d.ts +5 -0
- package/dist/resolver-extractor/index.d.ts.map +1 -0
- package/dist/resolver-extractor/index.js +2 -0
- package/dist/resolver-extractor/index.js.map +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +25 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +172 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.d.ts +61 -0
- package/dist/resolver-extractor/validator/only-validator.d.ts.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.js +76 -0
- package/dist/resolver-extractor/validator/only-validator.js.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.test.d.ts +8 -0
- package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.test.js +352 -0
- package/dist/resolver-extractor/validator/only-validator.test.js.map +1 -0
- package/dist/schema-generator/builder/ast-builder.d.ts +7 -0
- package/dist/schema-generator/builder/ast-builder.d.ts.map +1 -0
- package/dist/schema-generator/builder/ast-builder.js +417 -0
- package/dist/schema-generator/builder/ast-builder.js.map +1 -0
- package/dist/schema-generator/builder/ast-builder.test.d.ts +2 -0
- package/dist/schema-generator/builder/ast-builder.test.d.ts.map +1 -0
- package/dist/schema-generator/builder/ast-builder.test.js +469 -0
- package/dist/schema-generator/builder/ast-builder.test.js.map +1 -0
- package/dist/schema-generator/emitter/code-emitter.d.ts +7 -0
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -0
- package/dist/schema-generator/emitter/code-emitter.js +201 -0
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -0
- package/dist/schema-generator/emitter/sdl-emitter.d.ts +7 -0
- package/dist/schema-generator/emitter/sdl-emitter.d.ts.map +1 -0
- package/dist/schema-generator/emitter/sdl-emitter.js +11 -0
- package/dist/schema-generator/emitter/sdl-emitter.js.map +1 -0
- package/dist/schema-generator/generate-schema.d.ts +26 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -0
- package/dist/schema-generator/generate-schema.js +76 -0
- package/dist/schema-generator/generate-schema.js.map +1 -0
- package/dist/schema-generator/index.d.ts +4 -0
- package/dist/schema-generator/index.d.ts.map +1 -0
- package/dist/schema-generator/index.js +2 -0
- package/dist/schema-generator/index.js.map +1 -0
- package/dist/schema-generator/integrator/result-integrator.d.ts +93 -0
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -0
- package/dist/schema-generator/integrator/result-integrator.js +396 -0
- package/dist/schema-generator/integrator/result-integrator.js.map +1 -0
- package/dist/schema-generator/pruner/schema-pruner.d.ts +16 -0
- package/dist/schema-generator/pruner/schema-pruner.d.ts.map +1 -0
- package/dist/schema-generator/pruner/schema-pruner.js +66 -0
- package/dist/schema-generator/pruner/schema-pruner.js.map +1 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +24 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js +61 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -0
- package/dist/shared/constants.d.ts +70 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +128 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/default-value-detector.d.ts +40 -0
- package/dist/shared/default-value-detector.d.ts.map +1 -0
- package/dist/shared/default-value-detector.js +124 -0
- package/dist/shared/default-value-detector.js.map +1 -0
- package/dist/shared/diagnostics.d.ts +4 -0
- package/dist/shared/diagnostics.d.ts.map +1 -0
- package/dist/shared/diagnostics.js +25 -0
- package/dist/shared/diagnostics.js.map +1 -0
- package/dist/shared/directive-definition-extractor.d.ts +64 -0
- package/dist/shared/directive-definition-extractor.d.ts.map +1 -0
- package/dist/shared/directive-definition-extractor.js +399 -0
- package/dist/shared/directive-definition-extractor.js.map +1 -0
- package/dist/shared/directive-detector.d.ts +102 -0
- package/dist/shared/directive-detector.d.ts.map +1 -0
- package/dist/shared/directive-detector.js +422 -0
- package/dist/shared/directive-detector.js.map +1 -0
- package/dist/shared/file-scanner.d.ts +25 -0
- package/dist/shared/file-scanner.d.ts.map +1 -0
- package/dist/shared/file-scanner.js +99 -0
- package/dist/shared/file-scanner.js.map +1 -0
- package/dist/shared/file-scanner.test.d.ts +2 -0
- package/dist/shared/file-scanner.test.d.ts.map +1 -0
- package/dist/shared/file-scanner.test.js +138 -0
- package/dist/shared/file-scanner.test.js.map +1 -0
- package/dist/shared/index.d.ts +10 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +8 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/inline-object-extractor.d.ts +13 -0
- package/dist/shared/inline-object-extractor.d.ts.map +1 -0
- package/dist/shared/inline-object-extractor.js +65 -0
- package/dist/shared/inline-object-extractor.js.map +1 -0
- package/dist/shared/inline-object-utils.d.ts +7 -0
- package/dist/shared/inline-object-utils.d.ts.map +1 -0
- package/dist/shared/inline-object-utils.js +23 -0
- package/dist/shared/inline-object-utils.js.map +1 -0
- package/dist/shared/interface-detector.d.ts +22 -0
- package/dist/shared/interface-detector.d.ts.map +1 -0
- package/dist/shared/interface-detector.js +90 -0
- package/dist/shared/interface-detector.js.map +1 -0
- package/dist/shared/interface-validator.d.ts +9 -0
- package/dist/shared/interface-validator.d.ts.map +1 -0
- package/dist/shared/interface-validator.js +152 -0
- package/dist/shared/interface-validator.js.map +1 -0
- package/dist/shared/interface-validator.test.d.ts +2 -0
- package/dist/shared/interface-validator.test.d.ts.map +1 -0
- package/dist/shared/interface-validator.test.js +145 -0
- package/dist/shared/interface-validator.test.js.map +1 -0
- package/dist/shared/metadata-detector.d.ts +65 -0
- package/dist/shared/metadata-detector.d.ts.map +1 -0
- package/dist/shared/metadata-detector.js +333 -0
- package/dist/shared/metadata-detector.js.map +1 -0
- package/dist/shared/program-factory.d.ts +14 -0
- package/dist/shared/program-factory.d.ts.map +1 -0
- package/dist/shared/program-factory.js +29 -0
- package/dist/shared/program-factory.js.map +1 -0
- package/dist/shared/source-location.d.ts +11 -0
- package/dist/shared/source-location.d.ts.map +1 -0
- package/dist/shared/source-location.js +15 -0
- package/dist/shared/source-location.js.map +1 -0
- package/dist/shared/tsconfig-loader.d.ts +13 -0
- package/dist/shared/tsconfig-loader.d.ts.map +1 -0
- package/dist/shared/tsconfig-loader.js +90 -0
- package/dist/shared/tsconfig-loader.js.map +1 -0
- package/dist/shared/tsdoc-parser.d.ts +12 -0
- package/dist/shared/tsdoc-parser.d.ts.map +1 -0
- package/dist/shared/tsdoc-parser.js +101 -0
- package/dist/shared/tsdoc-parser.js.map +1 -0
- package/dist/shared/type-converter.d.ts +3 -0
- package/dist/shared/type-converter.d.ts.map +1 -0
- package/dist/shared/type-converter.js +72 -0
- package/dist/shared/type-converter.js.map +1 -0
- package/dist/shared/typescript-utils.d.ts +55 -0
- package/dist/shared/typescript-utils.d.ts.map +1 -0
- package/dist/shared/typescript-utils.js +149 -0
- package/dist/shared/typescript-utils.js.map +1 -0
- package/dist/type-extractor/collector/result-collector.d.ts +7 -0
- package/dist/type-extractor/collector/result-collector.d.ts.map +1 -0
- package/dist/type-extractor/collector/result-collector.js +35 -0
- package/dist/type-extractor/collector/result-collector.js.map +1 -0
- package/dist/type-extractor/collector/scalar-collector.d.ts +108 -0
- package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -0
- package/dist/type-extractor/collector/scalar-collector.js +133 -0
- package/dist/type-extractor/collector/scalar-collector.js.map +1 -0
- package/dist/type-extractor/converter/field-eligibility.d.ts +34 -0
- package/dist/type-extractor/converter/field-eligibility.d.ts.map +1 -0
- package/dist/type-extractor/converter/field-eligibility.js +89 -0
- package/dist/type-extractor/converter/field-eligibility.js.map +1 -0
- package/dist/type-extractor/converter/graphql-converter.d.ts +7 -0
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -0
- package/dist/type-extractor/converter/graphql-converter.js +299 -0
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -0
- package/dist/type-extractor/extract-types.d.ts +2 -0
- package/dist/type-extractor/extract-types.d.ts.map +1 -0
- package/dist/type-extractor/extract-types.js +2 -0
- package/dist/type-extractor/extract-types.js.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts +27 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.js +1116 -0
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -0
- package/dist/type-extractor/index.d.ts +4 -0
- package/dist/type-extractor/index.d.ts.map +1 -0
- package/dist/type-extractor/index.js +2 -0
- package/dist/type-extractor/index.js.map +1 -0
- package/dist/type-extractor/types/diagnostics.d.ts +17 -0
- package/dist/type-extractor/types/diagnostics.d.ts.map +1 -0
- package/dist/type-extractor/types/diagnostics.js +2 -0
- package/dist/type-extractor/types/diagnostics.js.map +1 -0
- package/dist/type-extractor/types/graphql.d.ts +40 -0
- package/dist/type-extractor/types/graphql.d.ts.map +1 -0
- package/dist/type-extractor/types/graphql.js +2 -0
- package/dist/type-extractor/types/graphql.js.map +1 -0
- package/dist/type-extractor/types/index.d.ts +5 -0
- package/dist/type-extractor/types/index.d.ts.map +1 -0
- package/dist/type-extractor/types/index.js +2 -0
- package/dist/type-extractor/types/index.js.map +1 -0
- package/dist/type-extractor/types/typescript.d.ts +86 -0
- package/dist/type-extractor/types/typescript.d.ts.map +1 -0
- package/dist/type-extractor/types/typescript.js +2 -0
- package/dist/type-extractor/types/typescript.js.map +1 -0
- package/dist/type-extractor/types/typescript.test.d.ts +2 -0
- package/dist/type-extractor/types/typescript.test.d.ts.map +1 -0
- package/dist/type-extractor/types/typescript.test.js +287 -0
- package/dist/type-extractor/types/typescript.test.js.map +1 -0
- package/dist/type-extractor/validator/type-validator.d.ts +11 -0
- package/dist/type-extractor/validator/type-validator.d.ts.map +1 -0
- package/dist/type-extractor/validator/type-validator.js +53 -0
- package/dist/type-extractor/validator/type-validator.js.map +1 -0
- package/docs/configuration.md +163 -0
- package/docs/getting-started.md +117 -0
- package/docs/index.md +32 -0
- package/docs/integration/apollo.md +109 -0
- package/docs/integration/yoga.md +108 -0
- package/docs/schema/abstract-resolvers.md +146 -0
- package/docs/schema/directives.md +196 -0
- package/docs/schema/documentation.md +176 -0
- package/docs/schema/enums.md +162 -0
- package/docs/schema/fields.md +184 -0
- package/docs/schema/index.md +38 -0
- package/docs/schema/inputs.md +277 -0
- package/docs/schema/interfaces.md +178 -0
- package/docs/schema/objects.md +186 -0
- package/docs/schema/queries-mutations.md +205 -0
- package/docs/schema/scalars.md +194 -0
- package/docs/schema/unions.md +90 -0
- package/docs/what-is-gqlkit.md +22 -0
- package/package.json +59 -7
- package/README.md +0 -45
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Abstract Type Resolution
|
|
2
|
+
|
|
3
|
+
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.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
When a GraphQL query returns an abstract type, the server needs to determine which concrete type to use. There are two approaches:
|
|
8
|
+
|
|
9
|
+
| Approach | Defined On | Returns | Use Case |
|
|
10
|
+
|----------|------------|---------|----------|
|
|
11
|
+
| `resolveType` | Abstract type (union/interface) | Type name string | Single resolver decides the type |
|
|
12
|
+
| `isTypeOf` | Object type | Boolean | Each type checks if value matches |
|
|
13
|
+
|
|
14
|
+
## Using resolveType
|
|
15
|
+
|
|
16
|
+
Define a `resolveType` resolver on a union or interface type to determine the concrete type.
|
|
17
|
+
|
|
18
|
+
### Union Example
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { defineResolveType } from "../gqlkit";
|
|
22
|
+
|
|
23
|
+
export interface User {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface Post {
|
|
29
|
+
id: string;
|
|
30
|
+
title: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type SearchResult = User | Post;
|
|
34
|
+
|
|
35
|
+
export const searchResultResolveType = defineResolveType<SearchResult>(
|
|
36
|
+
(value) => {
|
|
37
|
+
if ("name" in value) {
|
|
38
|
+
return "User";
|
|
39
|
+
}
|
|
40
|
+
return "Post";
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Interface Example
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { defineResolveType } from "../gqlkit";
|
|
49
|
+
import { type GqlInterface, type IDString } from "@gqlkit-ts/runtime";
|
|
50
|
+
|
|
51
|
+
export type Node = GqlInterface<{
|
|
52
|
+
id: IDString;
|
|
53
|
+
}>;
|
|
54
|
+
|
|
55
|
+
export const nodeResolveType = defineResolveType<Node>((value) => {
|
|
56
|
+
if ("name" in value) {
|
|
57
|
+
return "User";
|
|
58
|
+
}
|
|
59
|
+
if ("title" in value) {
|
|
60
|
+
return "Post";
|
|
61
|
+
}
|
|
62
|
+
throw new Error("Unknown Node type");
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Resolver Function Signature
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
(value: TAbstract, context: TContext, info: GraphQLResolveInfo) => string | Promise<string>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
| Argument | Description |
|
|
73
|
+
|----------|-------------|
|
|
74
|
+
| `value` | The resolved value to determine the type of |
|
|
75
|
+
| `context` | The context object |
|
|
76
|
+
| `info` | GraphQL resolve info |
|
|
77
|
+
|
|
78
|
+
### Type Parameters
|
|
79
|
+
|
|
80
|
+
`defineResolveType<TAbstract>`:
|
|
81
|
+
|
|
82
|
+
| Parameter | Description |
|
|
83
|
+
|-----------|-------------|
|
|
84
|
+
| `TAbstract` | The abstract type (union or interface) to resolve |
|
|
85
|
+
|
|
86
|
+
## Using isTypeOf
|
|
87
|
+
|
|
88
|
+
Define an `isTypeOf` resolver on an object type to check if a value is of that type.
|
|
89
|
+
|
|
90
|
+
### Basic Usage
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { defineIsTypeOf } from "../gqlkit";
|
|
94
|
+
|
|
95
|
+
export interface Dog {
|
|
96
|
+
kind: string;
|
|
97
|
+
name: string;
|
|
98
|
+
breed: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface Cat {
|
|
102
|
+
kind: string;
|
|
103
|
+
name: string;
|
|
104
|
+
indoor: boolean;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export type Animal = Dog | Cat;
|
|
108
|
+
|
|
109
|
+
export const dogIsTypeOf = defineIsTypeOf<Dog>((value) => {
|
|
110
|
+
return (
|
|
111
|
+
typeof value === "object" &&
|
|
112
|
+
value !== null &&
|
|
113
|
+
"kind" in value &&
|
|
114
|
+
value.kind === "dog"
|
|
115
|
+
);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
export const catIsTypeOf = defineIsTypeOf<Cat>((value) => {
|
|
119
|
+
return (
|
|
120
|
+
typeof value === "object" &&
|
|
121
|
+
value !== null &&
|
|
122
|
+
"kind" in value &&
|
|
123
|
+
value.kind === "cat"
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Resolver Function Signature
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
(value: unknown, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
| Argument | Description |
|
|
135
|
+
|----------|-------------|
|
|
136
|
+
| `value` | The value to check (typed as `unknown`) |
|
|
137
|
+
| `context` | The context object |
|
|
138
|
+
| `info` | GraphQL resolve info |
|
|
139
|
+
|
|
140
|
+
### Type Parameters
|
|
141
|
+
|
|
142
|
+
`defineIsTypeOf<TObject>`:
|
|
143
|
+
|
|
144
|
+
| Parameter | Description |
|
|
145
|
+
|-----------|-------------|
|
|
146
|
+
| `TObject` | The object type to check against |
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Custom Directives
|
|
2
|
+
|
|
3
|
+
Define custom directives using the `GqlDirective` utility type and attach them using `GqlField` or `GqlObject`.
|
|
4
|
+
|
|
5
|
+
## Defining Directives
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// src/gqlkit/schema/directives.ts
|
|
9
|
+
import { type GqlDirective } from "@gqlkit-ts/runtime";
|
|
10
|
+
|
|
11
|
+
export type Role = "USER" | "ADMIN";
|
|
12
|
+
|
|
13
|
+
// Directive with typed arguments
|
|
14
|
+
export type AuthDirective<TArgs extends { role: Role[] }> = GqlDirective<
|
|
15
|
+
"auth",
|
|
16
|
+
TArgs,
|
|
17
|
+
"FIELD_DEFINITION"
|
|
18
|
+
>;
|
|
19
|
+
|
|
20
|
+
// Directive with multiple locations
|
|
21
|
+
export type CacheDirective<TArgs extends { maxAge: number }> = GqlDirective<
|
|
22
|
+
"cache",
|
|
23
|
+
TArgs,
|
|
24
|
+
["FIELD_DEFINITION", "OBJECT"]
|
|
25
|
+
>;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Generates:
|
|
29
|
+
|
|
30
|
+
```graphql
|
|
31
|
+
directive @auth(role: [Role!]!) on FIELD_DEFINITION
|
|
32
|
+
directive @cache(maxAge: Float!) on FIELD_DEFINITION | OBJECT
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## GqlDirective Type Parameters
|
|
36
|
+
|
|
37
|
+
`GqlDirective<Name, Args, Location>`:
|
|
38
|
+
|
|
39
|
+
| Parameter | Description |
|
|
40
|
+
|-----------|-------------|
|
|
41
|
+
| `Name` | The directive name (without `@`) |
|
|
42
|
+
| `Args` | The directive arguments type |
|
|
43
|
+
| `Location` | Where the directive can be used (single or array) |
|
|
44
|
+
|
|
45
|
+
### Directive Locations
|
|
46
|
+
|
|
47
|
+
Common directive locations:
|
|
48
|
+
|
|
49
|
+
| Location | Description |
|
|
50
|
+
|----------|-------------|
|
|
51
|
+
| `FIELD_DEFINITION` | Object type fields |
|
|
52
|
+
| `OBJECT` | Object types |
|
|
53
|
+
| `INPUT_FIELD_DEFINITION` | Input type fields |
|
|
54
|
+
| `ARGUMENT_DEFINITION` | Field arguments |
|
|
55
|
+
| `ENUM_VALUE` | Enum values |
|
|
56
|
+
| `INTERFACE` | Interface types |
|
|
57
|
+
|
|
58
|
+
## Attaching Directives to Fields
|
|
59
|
+
|
|
60
|
+
Use `GqlField` to attach directives to object type fields:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { type GqlField, type IDString } from "@gqlkit-ts/runtime";
|
|
64
|
+
import { type AuthDirective } from "./directives.js";
|
|
65
|
+
|
|
66
|
+
export type User = {
|
|
67
|
+
id: IDString;
|
|
68
|
+
name: string;
|
|
69
|
+
// Field with directive
|
|
70
|
+
email: GqlField<string, { directives: [AuthDirective<{ role: ["ADMIN"] }>] }>;
|
|
71
|
+
// Nullable field with directive
|
|
72
|
+
phone: GqlField<string | null, { directives: [AuthDirective<{ role: ["USER"] }>] }>;
|
|
73
|
+
};
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Generates:
|
|
77
|
+
|
|
78
|
+
```graphql
|
|
79
|
+
type User {
|
|
80
|
+
id: ID!
|
|
81
|
+
name: String!
|
|
82
|
+
email: String! @auth(role: [ADMIN])
|
|
83
|
+
phone: String @auth(role: [USER])
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Attaching Directives to Types
|
|
88
|
+
|
|
89
|
+
Use `GqlObject` to attach directives to type definitions:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { type GqlObject, type IDString } from "@gqlkit-ts/runtime";
|
|
93
|
+
import { type CacheDirective } from "./directives.js";
|
|
94
|
+
|
|
95
|
+
export type Post = GqlObject<
|
|
96
|
+
{
|
|
97
|
+
id: IDString;
|
|
98
|
+
title: string;
|
|
99
|
+
},
|
|
100
|
+
{ directives: [CacheDirective<{ maxAge: 60 }>] }
|
|
101
|
+
>;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Generates:
|
|
105
|
+
|
|
106
|
+
```graphql
|
|
107
|
+
type Post @cache(maxAge: 60) {
|
|
108
|
+
id: ID!
|
|
109
|
+
title: String!
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Attaching Directives to Query/Mutation Fields
|
|
114
|
+
|
|
115
|
+
Add a third type parameter to `defineQuery`, `defineMutation`, or `defineField`:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { defineQuery } from "../gqlkit";
|
|
119
|
+
import type { NoArgs } from "@gqlkit-ts/runtime";
|
|
120
|
+
import { type AuthDirective } from "./directives.js";
|
|
121
|
+
import type { User } from "./user.js";
|
|
122
|
+
|
|
123
|
+
// Query field with directive
|
|
124
|
+
export const me = defineQuery<
|
|
125
|
+
NoArgs,
|
|
126
|
+
User,
|
|
127
|
+
[AuthDirective<{ role: ["USER"] }>]
|
|
128
|
+
>((_root, _args, ctx) => ctx.currentUser);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Generates:
|
|
132
|
+
|
|
133
|
+
```graphql
|
|
134
|
+
type Query {
|
|
135
|
+
me: User! @auth(role: [USER])
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Attaching Directives to Field Resolvers
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { defineField } from "../gqlkit";
|
|
143
|
+
import type { NoArgs } from "@gqlkit-ts/runtime";
|
|
144
|
+
import { type AuthDirective } from "./directives.js";
|
|
145
|
+
|
|
146
|
+
export const email = defineField<
|
|
147
|
+
User,
|
|
148
|
+
NoArgs,
|
|
149
|
+
string,
|
|
150
|
+
[AuthDirective<{ role: ["ADMIN"] }>]
|
|
151
|
+
>((parent) => parent.email);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Multiple Directives
|
|
155
|
+
|
|
156
|
+
Attach multiple directives by adding them to the array:
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
export type Post = GqlObject<
|
|
160
|
+
{
|
|
161
|
+
id: IDString;
|
|
162
|
+
title: string;
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
directives: [
|
|
166
|
+
CacheDirective<{ maxAge: 60 }>,
|
|
167
|
+
AuthDirective<{ role: ["USER"] }>
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
>;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Combining with Other Options
|
|
174
|
+
|
|
175
|
+
Combine directives with `implements` and `defaultValue`:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
export type Post = GqlObject<
|
|
179
|
+
{
|
|
180
|
+
id: IDString;
|
|
181
|
+
title: string;
|
|
182
|
+
createdAt: DateTime;
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
implements: [Node, Timestamped],
|
|
186
|
+
directives: [CacheDirective<{ maxAge: 60 }>]
|
|
187
|
+
}
|
|
188
|
+
>;
|
|
189
|
+
|
|
190
|
+
export type CreatePostInput = {
|
|
191
|
+
title: GqlField<string, {
|
|
192
|
+
defaultValue: "Untitled";
|
|
193
|
+
directives: [LengthDirective<{ min: 1; max: 200 }>];
|
|
194
|
+
}>;
|
|
195
|
+
};
|
|
196
|
+
```
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Documentation
|
|
2
|
+
|
|
3
|
+
gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.
|
|
4
|
+
|
|
5
|
+
## Type Descriptions
|
|
6
|
+
|
|
7
|
+
Add descriptions to types using TSDoc/JSDoc comments:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
/**
|
|
11
|
+
* A user in the system
|
|
12
|
+
*/
|
|
13
|
+
export type User = {
|
|
14
|
+
/** Unique identifier */
|
|
15
|
+
id: IDString;
|
|
16
|
+
/** Display name */
|
|
17
|
+
name: string;
|
|
18
|
+
};
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Generates:
|
|
22
|
+
|
|
23
|
+
```graphql
|
|
24
|
+
"""
|
|
25
|
+
A user in the system
|
|
26
|
+
|
|
27
|
+
Defined in: src/gqlkit/schema/user.ts
|
|
28
|
+
"""
|
|
29
|
+
type User {
|
|
30
|
+
"""Unique identifier"""
|
|
31
|
+
id: ID!
|
|
32
|
+
"""Display name"""
|
|
33
|
+
name: String!
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Field Descriptions
|
|
38
|
+
|
|
39
|
+
Add descriptions to individual fields:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
export type User = {
|
|
43
|
+
/** Unique identifier for the user */
|
|
44
|
+
id: IDString;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The user's display name.
|
|
48
|
+
* This is shown in the UI and can be changed by the user.
|
|
49
|
+
*/
|
|
50
|
+
name: string;
|
|
51
|
+
|
|
52
|
+
/** Email address (null if not verified) */
|
|
53
|
+
email: string | null;
|
|
54
|
+
};
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Resolver Descriptions
|
|
58
|
+
|
|
59
|
+
Add descriptions to Query, Mutation, and Field resolvers:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
/** Get the currently authenticated user */
|
|
63
|
+
export const me = defineQuery<NoArgs, User | null>(
|
|
64
|
+
(_root, _args, ctx) => ctx.currentUser
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
/** Create a new user account */
|
|
68
|
+
export const createUser = defineMutation<{ input: CreateUserInput }, User>(
|
|
69
|
+
(_root, args, ctx) => ctx.db.createUser(args.input)
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
/** Get user's profile URL */
|
|
73
|
+
export const profileUrl = defineField<User, NoArgs, string>(
|
|
74
|
+
(parent) => `https://example.com/users/${parent.id}`
|
|
75
|
+
);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## @deprecated Directive
|
|
79
|
+
|
|
80
|
+
Mark fields and enum values as deprecated using the `@deprecated` JSDoc tag:
|
|
81
|
+
|
|
82
|
+
### Deprecating Fields
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
export type User = {
|
|
86
|
+
id: IDString;
|
|
87
|
+
name: string;
|
|
88
|
+
/**
|
|
89
|
+
* Legacy username
|
|
90
|
+
* @deprecated Use `name` field instead
|
|
91
|
+
*/
|
|
92
|
+
username: string | null;
|
|
93
|
+
};
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Generates:
|
|
97
|
+
|
|
98
|
+
```graphql
|
|
99
|
+
type User {
|
|
100
|
+
id: ID!
|
|
101
|
+
name: String!
|
|
102
|
+
"""Legacy username"""
|
|
103
|
+
username: String @deprecated(reason: "Use `name` field instead")
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Deprecating Enum Values
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
export enum UserStatus {
|
|
111
|
+
Active = "ACTIVE",
|
|
112
|
+
/**
|
|
113
|
+
* @deprecated Use `Inactive` instead
|
|
114
|
+
*/
|
|
115
|
+
Pending = "PENDING",
|
|
116
|
+
Inactive = "INACTIVE",
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Generates:
|
|
121
|
+
|
|
122
|
+
```graphql
|
|
123
|
+
enum UserStatus {
|
|
124
|
+
ACTIVE
|
|
125
|
+
PENDING @deprecated(reason: "Use `Inactive` instead")
|
|
126
|
+
INACTIVE
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Deprecating Resolvers
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
/**
|
|
134
|
+
* Get user by username
|
|
135
|
+
* @deprecated Use `user(id: ID!)` instead
|
|
136
|
+
*/
|
|
137
|
+
export const userByUsername = defineQuery<{ username: string }, User | null>(
|
|
138
|
+
(_root, args, ctx) => ctx.db.findUserByUsername(args.username)
|
|
139
|
+
);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Multi-line Descriptions
|
|
143
|
+
|
|
144
|
+
Multi-line comments are preserved:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
/**
|
|
148
|
+
* Represents a blog post.
|
|
149
|
+
*
|
|
150
|
+
* Posts can be in draft or published state.
|
|
151
|
+
* Only published posts are visible to other users.
|
|
152
|
+
*/
|
|
153
|
+
export type Post = {
|
|
154
|
+
id: IDString;
|
|
155
|
+
title: string;
|
|
156
|
+
content: string;
|
|
157
|
+
};
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Generates:
|
|
161
|
+
|
|
162
|
+
```graphql
|
|
163
|
+
"""
|
|
164
|
+
Represents a blog post.
|
|
165
|
+
|
|
166
|
+
Posts can be in draft or published state.
|
|
167
|
+
Only published posts are visible to other users.
|
|
168
|
+
|
|
169
|
+
Defined in: src/gqlkit/schema/post.ts
|
|
170
|
+
"""
|
|
171
|
+
type Post {
|
|
172
|
+
id: ID!
|
|
173
|
+
title: String!
|
|
174
|
+
content: String!
|
|
175
|
+
}
|
|
176
|
+
```
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Enum Types
|
|
2
|
+
|
|
3
|
+
gqlkit converts TypeScript string literal unions and enums to GraphQL enum types.
|
|
4
|
+
|
|
5
|
+
## String Literal Unions
|
|
6
|
+
|
|
7
|
+
String literal unions are automatically converted to GraphQL enum types:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
/**
|
|
11
|
+
* User account status
|
|
12
|
+
*/
|
|
13
|
+
export type UserStatus = "ACTIVE" | "INACTIVE" | "PENDING";
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Generates:
|
|
17
|
+
|
|
18
|
+
```graphql
|
|
19
|
+
"""User account status"""
|
|
20
|
+
enum UserStatus {
|
|
21
|
+
ACTIVE
|
|
22
|
+
INACTIVE
|
|
23
|
+
PENDING
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## TypeScript Enums
|
|
28
|
+
|
|
29
|
+
TypeScript string enums are also supported:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
export enum UserStatus {
|
|
33
|
+
Active = "ACTIVE",
|
|
34
|
+
Inactive = "INACTIVE",
|
|
35
|
+
Pending = "PENDING",
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Generates:
|
|
40
|
+
|
|
41
|
+
```graphql
|
|
42
|
+
enum UserStatus {
|
|
43
|
+
ACTIVE
|
|
44
|
+
INACTIVE
|
|
45
|
+
PENDING
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Deprecating Enum Values
|
|
50
|
+
|
|
51
|
+
Use the `@deprecated` JSDoc tag to mark enum values as deprecated:
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
export enum UserStatus {
|
|
55
|
+
Active = "ACTIVE",
|
|
56
|
+
/**
|
|
57
|
+
* @deprecated Use `Inactive` instead
|
|
58
|
+
*/
|
|
59
|
+
Pending = "PENDING",
|
|
60
|
+
Inactive = "INACTIVE",
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
For string literal unions, use a separate type with JSDoc:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
/**
|
|
68
|
+
* User account status
|
|
69
|
+
*/
|
|
70
|
+
export type UserStatus =
|
|
71
|
+
| "ACTIVE"
|
|
72
|
+
| /** @deprecated Use INACTIVE instead */ "PENDING"
|
|
73
|
+
| "INACTIVE";
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Generates:
|
|
77
|
+
|
|
78
|
+
```graphql
|
|
79
|
+
enum UserStatus {
|
|
80
|
+
ACTIVE
|
|
81
|
+
PENDING @deprecated(reason: "Use INACTIVE instead")
|
|
82
|
+
INACTIVE
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Using Enums in Types
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
export type User = {
|
|
90
|
+
id: string;
|
|
91
|
+
name: string;
|
|
92
|
+
status: UserStatus;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export type UpdateUserInput = {
|
|
96
|
+
status: UserStatus | null;
|
|
97
|
+
};
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Generates:
|
|
101
|
+
|
|
102
|
+
```graphql
|
|
103
|
+
type User {
|
|
104
|
+
id: String!
|
|
105
|
+
name: String!
|
|
106
|
+
status: UserStatus!
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
input UpdateUserInput {
|
|
110
|
+
status: UserStatus
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Invalid Enum Values
|
|
115
|
+
|
|
116
|
+
Enum values that are not valid GraphQL identifiers are automatically skipped with a warning. gqlkit converts enum values to `SCREAMING_SNAKE_CASE`, and the converted name must:
|
|
117
|
+
|
|
118
|
+
- Match the pattern `/^[_A-Za-z][_0-9A-Za-z]*$/`
|
|
119
|
+
- Not start with `__` (reserved for GraphQL introspection)
|
|
120
|
+
|
|
121
|
+
### String Literal Unions
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
export type Status =
|
|
125
|
+
| "active" // ✅ Converts to ACTIVE
|
|
126
|
+
| "inProgress" // ✅ Converts to IN_PROGRESS
|
|
127
|
+
| "0pending" // ⚠️ Skipped: converts to 0PENDING (starts with number)
|
|
128
|
+
| "__internal"; // ⚠️ Skipped: converts to __INTERNAL (starts with __)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Generates:
|
|
132
|
+
|
|
133
|
+
```graphql
|
|
134
|
+
enum Status {
|
|
135
|
+
ACTIVE
|
|
136
|
+
IN_PROGRESS
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### TypeScript Enums
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
export enum Priority {
|
|
144
|
+
HIGH = "HIGH", // ✅ Valid
|
|
145
|
+
MEDIUM = "MEDIUM", // ✅ Valid
|
|
146
|
+
LOW = "LOW", // ✅ Valid
|
|
147
|
+
"0INVALID" = "0INVALID", // ⚠️ Skipped: starts with number
|
|
148
|
+
__RESERVED = "__RESERVED", // ⚠️ Skipped: starts with __
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Generates:
|
|
153
|
+
|
|
154
|
+
```graphql
|
|
155
|
+
enum Priority {
|
|
156
|
+
HIGH
|
|
157
|
+
MEDIUM
|
|
158
|
+
LOW
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
When enum values are skipped, gqlkit outputs a warning with the original name, converted name, and location.
|