@gqlkit-ts/cli 0.0.1 → 0.2.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 +62 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.js +540 -0
- package/dist/auto-type-generator/auto-type-generator.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/inline-enum-collector.d.ts +31 -0
- package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-enum-collector.js +157 -0
- package/dist/auto-type-generator/inline-enum-collector.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/naming-convention.d.ts +44 -0
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -0
- package/dist/auto-type-generator/naming-convention.js +67 -0
- package/dist/auto-type-generator/naming-convention.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/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/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/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/orchestrator.d.ts +30 -0
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/gen-orchestrator/orchestrator.js +505 -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/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 +49 -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 +60 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.js +509 -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/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/emitter/code-emitter.d.ts +15 -0
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -0
- package/dist/schema-generator/emitter/code-emitter.js +216 -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 +93 -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 +113 -0
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -0
- package/dist/schema-generator/integrator/result-integrator.js +438 -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 +54 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +109 -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 +415 -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 +101 -0
- package/dist/shared/file-scanner.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 +6 -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 +23 -0
- package/dist/shared/interface-detector.d.ts.map +1 -0
- package/dist/shared/interface-detector.js +133 -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/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/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/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 +83 -0
- package/dist/shared/type-converter.js.map +1 -0
- package/dist/shared/typescript-utils.d.ts +82 -0
- package/dist/shared/typescript-utils.d.ts.map +1 -0
- package/dist/shared/typescript-utils.js +197 -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 +123 -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 +338 -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/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 +394 -0
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts +36 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.js +1082 -0
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -0
- 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/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/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 +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 +42 -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 +6 -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/ts-type-reference-factory.d.ts +39 -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 +69 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -0
- package/dist/type-extractor/types/typescript.d.ts +106 -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/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 +33 -0
- package/docs/integration/apollo.md +109 -0
- package/docs/integration/drizzle.md +191 -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 +370 -0
- package/docs/schema/fields.md +186 -0
- package/docs/schema/index.md +38 -0
- package/docs/schema/inputs.md +279 -0
- package/docs/schema/interfaces.md +178 -0
- package/docs/schema/objects.md +188 -0
- package/docs/schema/queries-mutations.md +207 -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 +66 -7
- package/src/auto-type-generator/auto-type-generator.ts +925 -0
- package/src/auto-type-generator/index.ts +21 -0
- package/src/auto-type-generator/inline-enum-collector.ts +290 -0
- package/src/auto-type-generator/name-collision-validator.ts +119 -0
- package/src/auto-type-generator/naming-convention.ts +126 -0
- package/src/cli.ts +11 -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 +784 -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 +63 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +806 -0
- package/src/resolver-extractor/index.ts +19 -0
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +251 -0
- package/src/resolver-extractor/validator/only-validator.ts +158 -0
- package/src/schema-generator/builder/ast-builder.ts +706 -0
- package/src/schema-generator/emitter/code-emitter.ts +351 -0
- package/src/schema-generator/emitter/sdl-emitter.ts +13 -0
- package/src/schema-generator/generate-schema.ts +170 -0
- package/src/schema-generator/index.ts +19 -0
- package/src/schema-generator/integrator/result-integrator.ts +690 -0
- package/src/schema-generator/pruner/schema-pruner.ts +112 -0
- package/src/schema-generator/resolver-collector/resolver-collector.ts +123 -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/file-scanner.ts +170 -0
- package/src/shared/index.ts +32 -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 +27 -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 +459 -0
- package/src/type-extractor/extract-types.ts +1 -0
- package/src/type-extractor/extractor/field-type-resolver.ts +569 -0
- package/src/type-extractor/extractor/type-extractor.ts +1567 -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 +99 -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 +137 -0
- package/src/type-extractor/types/typescript.ts +133 -0
- package/src/type-extractor/validator/type-validator.ts +77 -0
- package/README.md +0 -45
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# Input Types
|
|
2
|
+
|
|
3
|
+
TypeScript types with `Input` suffix are treated as GraphQL input types.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
/** Input for creating a new user */
|
|
9
|
+
export interface CreateUserInput {
|
|
10
|
+
name: string;
|
|
11
|
+
email: string | null;
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Generates:
|
|
16
|
+
|
|
17
|
+
```graphql
|
|
18
|
+
"""Input for creating a new user"""
|
|
19
|
+
input CreateUserInput {
|
|
20
|
+
name: String!
|
|
21
|
+
email: String
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Inline Objects
|
|
26
|
+
|
|
27
|
+
Input types can use inline object literals for nested structures. gqlkit automatically generates Input Object types with the naming convention `{ParentTypeNameWithoutInputSuffix}{PascalCaseFieldName}Input`:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import type { GqlField, Int } from "@gqlkit-ts/runtime";
|
|
31
|
+
|
|
32
|
+
export type CreateUserInput = {
|
|
33
|
+
name: string;
|
|
34
|
+
/** Profile information */
|
|
35
|
+
profile: {
|
|
36
|
+
bio: string | null;
|
|
37
|
+
/** User's age with default value */
|
|
38
|
+
age: GqlField<Int | null, { defaultValue: 18 }>;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Generates:
|
|
44
|
+
|
|
45
|
+
```graphql
|
|
46
|
+
input CreateUserInput {
|
|
47
|
+
name: String!
|
|
48
|
+
"""Profile information"""
|
|
49
|
+
profile: CreateUserProfileInput!
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
input CreateUserProfileInput {
|
|
53
|
+
"""User's age with default value"""
|
|
54
|
+
age: Int = 18
|
|
55
|
+
bio: String
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Nested inline objects generate types with concatenated names (e.g., `UserProfileInput.address` → `UserProfileAddressInput`).
|
|
60
|
+
|
|
61
|
+
Similarly, inline string literal unions and external TypeScript enums are automatically converted to GraphQL enum types. See [Inline Enums](./enums.md#inline-enums) for details.
|
|
62
|
+
|
|
63
|
+
## @oneOf Input Objects
|
|
64
|
+
|
|
65
|
+
Union types with `Input` suffix using inline object literals generate `@oneOf` input objects. Each union member must be an inline object literal with exactly one property. Property values can be scalar types, enum types, or references to Input Object types:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
/**
|
|
69
|
+
* Specifies how to identify a product.
|
|
70
|
+
* Exactly one field must be provided.
|
|
71
|
+
*/
|
|
72
|
+
export type ProductInput =
|
|
73
|
+
| { id: string }
|
|
74
|
+
| { name: string }
|
|
75
|
+
| { location: LocationInput };
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Generates:
|
|
79
|
+
|
|
80
|
+
```graphql
|
|
81
|
+
"""
|
|
82
|
+
Specifies how to identify a product.
|
|
83
|
+
Exactly one field must be provided.
|
|
84
|
+
"""
|
|
85
|
+
input ProductInput @oneOf {
|
|
86
|
+
id: String
|
|
87
|
+
location: LocationInput
|
|
88
|
+
name: String
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Each property becomes a nullable field in the generated input type. The `@oneOf` directive ensures exactly one field is provided at runtime.
|
|
93
|
+
|
|
94
|
+
## Default Values
|
|
95
|
+
|
|
96
|
+
Specify default values for Input Object fields using `GqlField` with the `defaultValue` option.
|
|
97
|
+
|
|
98
|
+
### Basic Default Values
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { type GqlField, type Int } from "@gqlkit-ts/runtime";
|
|
102
|
+
|
|
103
|
+
export type PaginationInput = {
|
|
104
|
+
limit: GqlField<Int, { defaultValue: 10 }>;
|
|
105
|
+
offset: GqlField<Int, { defaultValue: 0 }>;
|
|
106
|
+
includeArchived: GqlField<boolean, { defaultValue: false }>;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export type SearchInput = {
|
|
110
|
+
query: string;
|
|
111
|
+
caseSensitive: GqlField<boolean, { defaultValue: true }>;
|
|
112
|
+
maxResults: GqlField<Int | null, { defaultValue: null }>;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export type GreetingInput = {
|
|
116
|
+
name: GqlField<string, { defaultValue: "World" }>;
|
|
117
|
+
prefix: GqlField<string, { defaultValue: "Hello" }>;
|
|
118
|
+
};
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Generates:
|
|
122
|
+
|
|
123
|
+
```graphql
|
|
124
|
+
input PaginationInput {
|
|
125
|
+
limit: Int! = 10
|
|
126
|
+
offset: Int! = 0
|
|
127
|
+
includeArchived: Boolean! = false
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
input SearchInput {
|
|
131
|
+
query: String!
|
|
132
|
+
caseSensitive: Boolean! = true
|
|
133
|
+
maxResults: Int = null
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
input GreetingInput {
|
|
137
|
+
name: String! = "World"
|
|
138
|
+
prefix: String! = "Hello"
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Complex Default Values
|
|
143
|
+
|
|
144
|
+
Default values support arrays, objects, and enum values:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
export type Status = "ACTIVE" | "INACTIVE" | "PENDING";
|
|
148
|
+
|
|
149
|
+
export type Priority = "LOW" | "MEDIUM" | "HIGH";
|
|
150
|
+
|
|
151
|
+
export type NestedConfig = {
|
|
152
|
+
enabled: boolean;
|
|
153
|
+
value: Int;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export type FilterInput = {
|
|
157
|
+
status: GqlField<Status, { defaultValue: "ACTIVE" }>;
|
|
158
|
+
priorities: GqlField<Priority[], { defaultValue: ["MEDIUM", "HIGH"] }>;
|
|
159
|
+
tags: GqlField<string[], { defaultValue: ["default"] }>;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export type SettingsInput = {
|
|
163
|
+
config: GqlField<NestedConfig, { defaultValue: { enabled: true; value: 100 } }>;
|
|
164
|
+
limits: GqlField<Int[], { defaultValue: [10, 20, 30] }>;
|
|
165
|
+
};
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Generates:
|
|
169
|
+
|
|
170
|
+
```graphql
|
|
171
|
+
input FilterInput {
|
|
172
|
+
status: Status! = ACTIVE
|
|
173
|
+
priorities: [Priority!]! = [MEDIUM, HIGH]
|
|
174
|
+
tags: [String!]! = ["default"]
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
input SettingsInput {
|
|
178
|
+
config: NestedConfig! = {enabled: true, value: 100}
|
|
179
|
+
limits: [Int!]! = [10, 20, 30]
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Default Values with Directives
|
|
184
|
+
|
|
185
|
+
You can combine `defaultValue` with `directives`:
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
import { type GqlField, type GqlDirective, type Int } from "@gqlkit-ts/runtime";
|
|
189
|
+
|
|
190
|
+
export type LengthDirective<TArgs extends { min: number; max: number }> =
|
|
191
|
+
GqlDirective<"length", TArgs, "INPUT_FIELD_DEFINITION" | "ARGUMENT_DEFINITION">;
|
|
192
|
+
|
|
193
|
+
export type RangeDirective<TArgs extends { min: number; max: number }> =
|
|
194
|
+
GqlDirective<"range", TArgs, "INPUT_FIELD_DEFINITION" | "ARGUMENT_DEFINITION">;
|
|
195
|
+
|
|
196
|
+
export type CreateUserInput = {
|
|
197
|
+
name: GqlField<string, {
|
|
198
|
+
defaultValue: "Anonymous";
|
|
199
|
+
directives: [LengthDirective<{ min: 1; max: 100 }>];
|
|
200
|
+
}>;
|
|
201
|
+
age: GqlField<Int, {
|
|
202
|
+
defaultValue: 18;
|
|
203
|
+
directives: [RangeDirective<{ min: 0; max: 150 }>];
|
|
204
|
+
}>;
|
|
205
|
+
email: GqlField<string | null, {
|
|
206
|
+
defaultValue: null;
|
|
207
|
+
directives: [LengthDirective<{ min: 5; max: 255 }>];
|
|
208
|
+
}>;
|
|
209
|
+
};
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Generates:
|
|
213
|
+
|
|
214
|
+
```graphql
|
|
215
|
+
input CreateUserInput {
|
|
216
|
+
name: String! = "Anonymous" @length(min: 1, max: 100)
|
|
217
|
+
age: Int! = 18 @range(min: 0, max: 150)
|
|
218
|
+
email: String = null @length(min: 5, max: 255)
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Supported Default Value Types
|
|
223
|
+
|
|
224
|
+
| Value type | Example | GraphQL output |
|
|
225
|
+
|------------|---------|----------------|
|
|
226
|
+
| String | `"hello"` | `"hello"` |
|
|
227
|
+
| Number (Int) | `10` | `10` |
|
|
228
|
+
| Number (Float) | `3.14` | `3.14` |
|
|
229
|
+
| Boolean | `true`, `false` | `true`, `false` |
|
|
230
|
+
| Null | `null` | `null` |
|
|
231
|
+
| Array | `[1, 2, 3]` | `[1, 2, 3]` |
|
|
232
|
+
| Object | `{ key: "value" }` | `{key: "value"}` |
|
|
233
|
+
| Enum | `"ACTIVE"` (when field type is enum) | `ACTIVE` |
|
|
234
|
+
|
|
235
|
+
### Literal Types Required
|
|
236
|
+
|
|
237
|
+
Default values must be specified as TypeScript literal types. Non-literal types will cause a warning:
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
// ✅ OK: Literal types
|
|
241
|
+
export type GoodInput = {
|
|
242
|
+
limit: GqlField<Int, { defaultValue: 10 }>;
|
|
243
|
+
name: GqlField<string, { defaultValue: "default" }>;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
// ❌ Error: Non-literal types
|
|
247
|
+
export type BadInput = {
|
|
248
|
+
limit: GqlField<Int, { defaultValue: number }>; // Warning: must be literal
|
|
249
|
+
name: GqlField<string, { defaultValue: string }>; // Warning: must be literal
|
|
250
|
+
};
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## Invalid Field Names
|
|
254
|
+
|
|
255
|
+
Input field names that are not valid GraphQL identifiers are automatically skipped with a warning. Valid GraphQL names must:
|
|
256
|
+
|
|
257
|
+
- Match the pattern `/^[_A-Za-z][_0-9A-Za-z]*$/`
|
|
258
|
+
- Not start with `__` (reserved for GraphQL introspection)
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
export type CreateUserInput = {
|
|
262
|
+
name: string; // ✅ Valid
|
|
263
|
+
_metadata: string; // ✅ Valid (single underscore is OK)
|
|
264
|
+
"123abc": string; // ⚠️ Skipped: starts with a number
|
|
265
|
+
__private: string; // ⚠️ Skipped: starts with __
|
|
266
|
+
"hyphen-field": string; // ⚠️ Skipped: contains hyphen
|
|
267
|
+
};
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Generates (invalid fields are skipped):
|
|
271
|
+
|
|
272
|
+
```graphql
|
|
273
|
+
input CreateUserInput {
|
|
274
|
+
name: String!
|
|
275
|
+
_metadata: String!
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
When fields are skipped, gqlkit outputs a warning with the field name and location.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Interface Types
|
|
2
|
+
|
|
3
|
+
Define GraphQL interface types using the `GqlInterface` utility type.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// src/gqlkit/schema/node.ts
|
|
9
|
+
import { type GqlInterface, type IDString } from "@gqlkit-ts/runtime";
|
|
10
|
+
import type { DateTime } from "./scalars.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Node interface - represents any entity with a unique identifier.
|
|
14
|
+
*/
|
|
15
|
+
export type Node = GqlInterface<{
|
|
16
|
+
/** Global unique identifier */
|
|
17
|
+
id: IDString;
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Timestamped interface - entities that track creation time.
|
|
22
|
+
*/
|
|
23
|
+
export type Timestamped = GqlInterface<{
|
|
24
|
+
createdAt: DateTime;
|
|
25
|
+
}>;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Generates:
|
|
29
|
+
|
|
30
|
+
```graphql
|
|
31
|
+
"""Node interface - represents any entity with a unique identifier."""
|
|
32
|
+
interface Node {
|
|
33
|
+
"""Global unique identifier"""
|
|
34
|
+
id: ID!
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
"""Timestamped interface - entities that track creation time."""
|
|
38
|
+
interface Timestamped {
|
|
39
|
+
createdAt: DateTime!
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## GqlInterface Type Parameters
|
|
44
|
+
|
|
45
|
+
`GqlInterface<T, Meta?>`:
|
|
46
|
+
|
|
47
|
+
| Parameter | Description |
|
|
48
|
+
|-----------|-------------|
|
|
49
|
+
| `T` | The interface fields definition |
|
|
50
|
+
| `Meta` | Optional: `{ implements: [...] }` for interface inheritance |
|
|
51
|
+
|
|
52
|
+
## Interface Inheritance
|
|
53
|
+
|
|
54
|
+
Interfaces can extend other interfaces:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
/**
|
|
58
|
+
* Entity interface - combines Node and Timestamped.
|
|
59
|
+
*/
|
|
60
|
+
export type Entity = GqlInterface<
|
|
61
|
+
{
|
|
62
|
+
id: IDString;
|
|
63
|
+
createdAt: DateTime;
|
|
64
|
+
},
|
|
65
|
+
{ implements: [Node, Timestamped] }
|
|
66
|
+
>;
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Generates:
|
|
70
|
+
|
|
71
|
+
```graphql
|
|
72
|
+
"""Entity interface - combines Node and Timestamped."""
|
|
73
|
+
interface Entity implements Node & Timestamped {
|
|
74
|
+
id: ID!
|
|
75
|
+
createdAt: DateTime!
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Implementing Interfaces
|
|
80
|
+
|
|
81
|
+
Use `GqlObject` with the `implements` option to declare that a type implements interfaces:
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
import { type GqlObject, type IDString } from "@gqlkit-ts/runtime";
|
|
85
|
+
import type { Node, Timestamped } from "./node.js";
|
|
86
|
+
import type { DateTime } from "./scalars.js";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* A user in the system.
|
|
90
|
+
*/
|
|
91
|
+
export type User = GqlObject<
|
|
92
|
+
{
|
|
93
|
+
id: IDString;
|
|
94
|
+
name: string;
|
|
95
|
+
email: string | null;
|
|
96
|
+
createdAt: DateTime;
|
|
97
|
+
},
|
|
98
|
+
{ implements: [Node, Timestamped] }
|
|
99
|
+
>;
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Generates:
|
|
103
|
+
|
|
104
|
+
```graphql
|
|
105
|
+
"""A user in the system."""
|
|
106
|
+
type User implements Node & Timestamped {
|
|
107
|
+
id: ID!
|
|
108
|
+
name: String!
|
|
109
|
+
email: String
|
|
110
|
+
createdAt: DateTime!
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Combining with Directives
|
|
115
|
+
|
|
116
|
+
You can combine `implements` with `directives`:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import { type GqlObject, type IDString } from "@gqlkit-ts/runtime";
|
|
120
|
+
import type { Node, Timestamped } from "./node.js";
|
|
121
|
+
import type { DateTime } from "./scalars.js";
|
|
122
|
+
import type { CacheDirective } from "./directives.js";
|
|
123
|
+
|
|
124
|
+
export type Post = GqlObject<
|
|
125
|
+
{
|
|
126
|
+
id: IDString;
|
|
127
|
+
title: string;
|
|
128
|
+
createdAt: DateTime;
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
implements: [Node, Timestamped],
|
|
132
|
+
directives: [CacheDirective<{ maxAge: 60 }>]
|
|
133
|
+
}
|
|
134
|
+
>;
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Generates:
|
|
138
|
+
|
|
139
|
+
```graphql
|
|
140
|
+
type Post @cache(maxAge: 60) implements Node & Timestamped {
|
|
141
|
+
id: ID!
|
|
142
|
+
title: String!
|
|
143
|
+
createdAt: DateTime!
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Interface Field Resolvers
|
|
148
|
+
|
|
149
|
+
Add computed fields to interface types using `defineField`:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { defineField } from "../gqlkit";
|
|
153
|
+
import type { NoArgs } from "@gqlkit-ts/runtime";
|
|
154
|
+
import type { Node } from "./node.js";
|
|
155
|
+
|
|
156
|
+
/** Get the typename of a Node */
|
|
157
|
+
export const __typename = defineField<Node, NoArgs, string>(
|
|
158
|
+
(parent) => parent.constructor.name
|
|
159
|
+
);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
See [Object Types](./objects.md) for more details on implementing interfaces.
|
|
163
|
+
|
|
164
|
+
## Runtime Type Resolution
|
|
165
|
+
|
|
166
|
+
When GraphQL executes a query that returns an interface type, it needs to determine the concrete type at runtime. You can use either `defineResolveType` on the interface or `defineIsTypeOf` on each implementing type.
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { defineResolveType } from "../gqlkit";
|
|
170
|
+
|
|
171
|
+
export const nodeResolveType = defineResolveType<Node>((value) => {
|
|
172
|
+
if ("name" in value) return "User";
|
|
173
|
+
if ("title" in value) return "Post";
|
|
174
|
+
throw new Error("Unknown Node type");
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
See [Abstract Type Resolution](./abstract-resolvers.md) for complete documentation.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Object Types
|
|
2
|
+
|
|
3
|
+
Plain TypeScript type exports become GraphQL Object types.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
Export a TypeScript type or interface:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// src/gqlkit/schema/user.ts
|
|
11
|
+
import { defineQuery, defineField } from "../gqlkit";
|
|
12
|
+
import type { IDString, Int, NoArgs } from "@gqlkit-ts/runtime";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A user in the system
|
|
16
|
+
*/
|
|
17
|
+
export type User = {
|
|
18
|
+
/** Unique identifier */
|
|
19
|
+
id: IDString;
|
|
20
|
+
/** Display name */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Age in years */
|
|
23
|
+
age: Int;
|
|
24
|
+
/** Email address (null if not verified) */
|
|
25
|
+
email: string | null;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const me = defineQuery<NoArgs, User | null>((_root, _args, ctx) => {
|
|
29
|
+
return findUserById(ctx.currentUserId);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
/** Get user's profile URL */
|
|
33
|
+
export const profileUrl = defineField<User, NoArgs, string>((parent) => {
|
|
34
|
+
return `https://example.com/users/${parent.id}`;
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Nullability
|
|
39
|
+
|
|
40
|
+
Use union with `null` to make fields nullable:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
export type User = {
|
|
44
|
+
email: string | null; // nullable
|
|
45
|
+
name: string; // non-null
|
|
46
|
+
};
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Generates:
|
|
50
|
+
|
|
51
|
+
```graphql
|
|
52
|
+
type User {
|
|
53
|
+
email: String
|
|
54
|
+
name: String!
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Arrays
|
|
59
|
+
|
|
60
|
+
Arrays are automatically converted to GraphQL lists:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
export type User = {
|
|
64
|
+
tags: string[]; // [String!]!
|
|
65
|
+
posts: Post[] | null; // [Post!]
|
|
66
|
+
};
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Inline Objects
|
|
70
|
+
|
|
71
|
+
Object type fields can use inline object literals for nested structures. gqlkit automatically generates Object types with the naming convention `{ParentTypeName}{PascalCaseFieldName}`:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
export type User = {
|
|
75
|
+
id: string;
|
|
76
|
+
name: string;
|
|
77
|
+
/** User's profile information */
|
|
78
|
+
profile: {
|
|
79
|
+
/** User's biography */
|
|
80
|
+
bio: string;
|
|
81
|
+
age: number;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Generates:
|
|
87
|
+
|
|
88
|
+
```graphql
|
|
89
|
+
type User {
|
|
90
|
+
id: String!
|
|
91
|
+
name: String!
|
|
92
|
+
"""User's profile information"""
|
|
93
|
+
profile: UserProfile!
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
type UserProfile {
|
|
97
|
+
"""User's biography"""
|
|
98
|
+
bio: String!
|
|
99
|
+
age: Float!
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Nested inline objects generate types with concatenated names (e.g., `User.profile.address` → `UserProfileAddress`).
|
|
104
|
+
|
|
105
|
+
Similarly, inline string literal unions and external TypeScript enums are automatically converted to GraphQL enum types. See [Inline Enums](./enums.md#inline-enums) for details.
|
|
106
|
+
|
|
107
|
+
## Implementing Interfaces
|
|
108
|
+
|
|
109
|
+
Use `GqlObject` with the `implements` option to declare that a type implements interfaces:
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { type GqlObject, type IDString } from "@gqlkit-ts/runtime";
|
|
113
|
+
import type { Node, Timestamped } from "./node.js";
|
|
114
|
+
import type { DateTime } from "./scalars.js";
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* A user in the system.
|
|
118
|
+
*/
|
|
119
|
+
export type User = GqlObject<
|
|
120
|
+
{
|
|
121
|
+
id: IDString;
|
|
122
|
+
name: string;
|
|
123
|
+
email: string | null;
|
|
124
|
+
createdAt: DateTime;
|
|
125
|
+
},
|
|
126
|
+
{ implements: [Node, Timestamped] }
|
|
127
|
+
>;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Generates:
|
|
131
|
+
|
|
132
|
+
```graphql
|
|
133
|
+
"""A user in the system."""
|
|
134
|
+
type User implements Node & Timestamped {
|
|
135
|
+
id: ID!
|
|
136
|
+
name: String!
|
|
137
|
+
email: String
|
|
138
|
+
createdAt: DateTime!
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
You can combine `implements` with `directives`:
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
export type Post = GqlObject<
|
|
146
|
+
{
|
|
147
|
+
id: IDString;
|
|
148
|
+
title: string;
|
|
149
|
+
createdAt: DateTime;
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
implements: [Node, Timestamped],
|
|
153
|
+
directives: [CacheDirective<{ maxAge: 60 }>]
|
|
154
|
+
}
|
|
155
|
+
>;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
See [Interfaces](./interfaces.md) for more details on defining interface types.
|
|
159
|
+
|
|
160
|
+
## Invalid Field Names
|
|
161
|
+
|
|
162
|
+
Field names that are not valid GraphQL identifiers are automatically skipped with a warning. Valid GraphQL names must:
|
|
163
|
+
|
|
164
|
+
- Match the pattern `/^[_A-Za-z][_0-9A-Za-z]*$/`
|
|
165
|
+
- Not start with `__` (reserved for GraphQL introspection)
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
export type User = {
|
|
169
|
+
id: string; // ✅ Valid
|
|
170
|
+
userName: string; // ✅ Valid
|
|
171
|
+
_internal: string; // ✅ Valid (single underscore is OK)
|
|
172
|
+
"0invalid": string; // ⚠️ Skipped: starts with a number
|
|
173
|
+
__reserved: string; // ⚠️ Skipped: starts with __
|
|
174
|
+
"field-name": string; // ⚠️ Skipped: contains hyphen
|
|
175
|
+
};
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Generates (invalid fields are skipped):
|
|
179
|
+
|
|
180
|
+
```graphql
|
|
181
|
+
type User {
|
|
182
|
+
id: String!
|
|
183
|
+
userName: String!
|
|
184
|
+
_internal: String!
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
When fields are skipped, gqlkit outputs a warning with the field name and location.
|