@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,53 @@
|
|
|
1
|
+
import { BUILT_IN_SCALARS } from "../../shared/constants.js";
|
|
2
|
+
const PLACEHOLDER_TYPES = new Set(["__INLINE_OBJECT__"]);
|
|
3
|
+
function isOptionsObject(arg) {
|
|
4
|
+
return !Array.isArray(arg) && "types" in arg;
|
|
5
|
+
}
|
|
6
|
+
export function validateTypes(typesOrOptions) {
|
|
7
|
+
const types = isOptionsObject(typesOrOptions)
|
|
8
|
+
? typesOrOptions.types
|
|
9
|
+
: typesOrOptions;
|
|
10
|
+
const customScalarNames = isOptionsObject(typesOrOptions)
|
|
11
|
+
? typesOrOptions.customScalarNames
|
|
12
|
+
: undefined;
|
|
13
|
+
const diagnostics = [];
|
|
14
|
+
const typeNames = new Set(types.map((t) => t.name));
|
|
15
|
+
const knownScalars = new Set([
|
|
16
|
+
...BUILT_IN_SCALARS,
|
|
17
|
+
...(customScalarNames ?? []),
|
|
18
|
+
]);
|
|
19
|
+
for (const type of types) {
|
|
20
|
+
if (type.kind === "Object" && type.fields) {
|
|
21
|
+
for (const field of type.fields) {
|
|
22
|
+
const typeName = field.type.typeName;
|
|
23
|
+
if (!typeNames.has(typeName) &&
|
|
24
|
+
!knownScalars.has(typeName) &&
|
|
25
|
+
!PLACEHOLDER_TYPES.has(typeName)) {
|
|
26
|
+
diagnostics.push({
|
|
27
|
+
code: "UNRESOLVED_REFERENCE",
|
|
28
|
+
message: `Field '${field.name}' references unresolved type '${typeName}'`,
|
|
29
|
+
severity: "error",
|
|
30
|
+
location: { file: type.sourceFile, line: 1, column: 1 },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (type.kind === "Union" && type.unionMembers) {
|
|
36
|
+
for (const member of type.unionMembers) {
|
|
37
|
+
if (!typeNames.has(member) && !knownScalars.has(member)) {
|
|
38
|
+
diagnostics.push({
|
|
39
|
+
code: "UNRESOLVED_REFERENCE",
|
|
40
|
+
message: `Union '${type.name}' references unresolved type '${member}'`,
|
|
41
|
+
severity: "error",
|
|
42
|
+
location: { file: type.sourceFile, line: 1, column: 1 },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
valid: diagnostics.length === 0,
|
|
50
|
+
diagnostics,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=type-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-validator.js","sourceRoot":"","sources":["../../../src/type-extractor/validator/type-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAY7D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAEzD,SAAS,eAAe,CACtB,GAA0D;IAE1D,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,cAAqE;IAErE,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC;QAC3C,CAAC,CAAC,cAAc,CAAC,KAAK;QACtB,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,iBAAiB,GAAG,eAAe,CAAC,cAAc,CAAC;QACvD,CAAC,CAAC,cAAc,CAAC,iBAAiB;QAClC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;QAC3B,GAAG,gBAAgB;QACnB,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;KAC7B,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAErC,IACE,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACxB,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC3B,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAChC,CAAC;oBACD,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,UAAU,KAAK,CAAC,IAAI,iCAAiC,QAAQ,GAAG;wBACzE,QAAQ,EAAE,OAAO;wBACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACxD,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,UAAU,IAAI,CAAC,IAAI,iCAAiC,MAAM,GAAG;wBACtE,QAAQ,EAAE,OAAO;wBACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAC/B,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
gqlkit can be configured via `gqlkit.config.ts` in your project root.
|
|
4
|
+
|
|
5
|
+
## Basic Configuration
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
// gqlkit.config.ts
|
|
9
|
+
import { defineConfig } from "@gqlkit-ts/cli";
|
|
10
|
+
|
|
11
|
+
export default defineConfig({
|
|
12
|
+
// Source directory (default: "src/gqlkit/schema")
|
|
13
|
+
sourceDir: "src/gqlkit/schema",
|
|
14
|
+
|
|
15
|
+
// Glob patterns to exclude from scanning
|
|
16
|
+
sourceIgnoreGlobs: ["**/*.test.ts"],
|
|
17
|
+
|
|
18
|
+
// Custom scalar mappings (config-based approach)
|
|
19
|
+
scalars: [
|
|
20
|
+
{
|
|
21
|
+
name: "DateTime",
|
|
22
|
+
tsType: { from: "./src/gqlkit/schema/scalars", name: "DateTime" },
|
|
23
|
+
description: "ISO 8601 datetime",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "UUID",
|
|
27
|
+
tsType: { name: "string" }, // Global type
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
|
|
31
|
+
// Output paths
|
|
32
|
+
output: {
|
|
33
|
+
typeDefsPath: "src/gqlkit/__generated__/typeDefs.ts",
|
|
34
|
+
resolversPath: "src/gqlkit/__generated__/resolvers.ts",
|
|
35
|
+
schemaPath: "src/gqlkit/__generated__/schema.graphql",
|
|
36
|
+
// Set to null to disable output:
|
|
37
|
+
// schemaPath: null,
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// Hooks
|
|
41
|
+
hooks: {
|
|
42
|
+
// Run after all files are written (e.g., formatting)
|
|
43
|
+
afterAllFileWrite: "prettier --write",
|
|
44
|
+
// Or multiple commands:
|
|
45
|
+
// afterAllFileWrite: ["prettier --write", "eslint --fix"],
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Custom Scalar Types
|
|
51
|
+
|
|
52
|
+
Map TypeScript types to GraphQL custom scalars via config:
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
export default defineConfig({
|
|
56
|
+
scalars: [
|
|
57
|
+
{
|
|
58
|
+
name: "DateTime",
|
|
59
|
+
tsType: { from: "./src/gqlkit/schema/scalars", name: "DateTime" },
|
|
60
|
+
description: "ISO 8601 datetime string",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "UUID",
|
|
64
|
+
tsType: { name: "string" },
|
|
65
|
+
only: "input", // Input-only scalar
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Scalar Options
|
|
72
|
+
|
|
73
|
+
| Option | Type | Description |
|
|
74
|
+
|--------|------|-------------|
|
|
75
|
+
| `name` | `string` | The GraphQL scalar name |
|
|
76
|
+
| `tsType.name` | `string` | The TypeScript type name |
|
|
77
|
+
| `tsType.from` | `string` (optional) | Import path for the type (omit for global types) |
|
|
78
|
+
| `description` | `string` (optional) | Description for the GraphQL schema |
|
|
79
|
+
| `only` | `"input"` \| `"output"` (optional) | Restrict scalar to input or output positions |
|
|
80
|
+
|
|
81
|
+
> [!TIP]
|
|
82
|
+
>
|
|
83
|
+
> You can also define custom scalars using the `GqlScalar` utility type directly in your schema files. See [Scalars](/schema/scalars) for more details.
|
|
84
|
+
|
|
85
|
+
## Output Paths
|
|
86
|
+
|
|
87
|
+
Customize output file locations or disable specific outputs:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
export default defineConfig({
|
|
91
|
+
output: {
|
|
92
|
+
typeDefsPath: "generated/schema.ts", // Custom path
|
|
93
|
+
resolversPath: "generated/resolvers.ts",
|
|
94
|
+
schemaPath: null, // Disable SDL output
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Output Options
|
|
100
|
+
|
|
101
|
+
| Option | Type | Default | Description |
|
|
102
|
+
|--------|------|---------|-------------|
|
|
103
|
+
| `typeDefsPath` | `string` \| `null` | `"src/gqlkit/__generated__/typeDefs.ts"` | Path for the TypeDefs output |
|
|
104
|
+
| `resolversPath` | `string` \| `null` | `"src/gqlkit/__generated__/resolvers.ts"` | Path for the resolvers output |
|
|
105
|
+
| `schemaPath` | `string` \| `null` | `"src/gqlkit/__generated__/schema.graphql"` | Path for the SDL output |
|
|
106
|
+
|
|
107
|
+
Set any path to `null` to disable that output.
|
|
108
|
+
|
|
109
|
+
## Hooks
|
|
110
|
+
|
|
111
|
+
Execute commands after file generation:
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
export default defineConfig({
|
|
115
|
+
hooks: {
|
|
116
|
+
// Single command
|
|
117
|
+
afterAllFileWrite: "prettier --write",
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
You can also specify multiple commands to run sequentially:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
export default defineConfig({
|
|
126
|
+
hooks: {
|
|
127
|
+
// Multiple commands (executed sequentially)
|
|
128
|
+
afterAllFileWrite: ["prettier --write", "eslint --fix"],
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Available Hooks
|
|
134
|
+
|
|
135
|
+
| Hook | Description |
|
|
136
|
+
|------|-------------|
|
|
137
|
+
| `afterAllFileWrite` | Runs after all generated files are written. Receives the list of written file paths. |
|
|
138
|
+
|
|
139
|
+
## Source Directory
|
|
140
|
+
|
|
141
|
+
By default, gqlkit scans `src/gqlkit/schema` for types and resolvers.
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
export default defineConfig({
|
|
145
|
+
sourceDir: "src/graphql/schema", // Custom source directory
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
All TypeScript files (`.ts`, `.cts`, `.mts`) under this directory are scanned.
|
|
150
|
+
|
|
151
|
+
## Ignore Patterns
|
|
152
|
+
|
|
153
|
+
Exclude files from scanning using glob patterns:
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
export default defineConfig({
|
|
157
|
+
sourceIgnoreGlobs: [
|
|
158
|
+
"**/*.test.ts",
|
|
159
|
+
"**/*.spec.ts",
|
|
160
|
+
"**/testdata/**",
|
|
161
|
+
],
|
|
162
|
+
});
|
|
163
|
+
```
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
## Installation
|
|
4
|
+
|
|
5
|
+
```sh filename="npm"
|
|
6
|
+
npm install @gqlkit-ts/runtime @graphql-tools/schema graphql
|
|
7
|
+
npm install -D @gqlkit-ts/cli
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
```sh filename="pnpm"
|
|
11
|
+
pnpm add @gqlkit-ts/runtime @graphql-tools/schema graphql
|
|
12
|
+
pnpm add -D @gqlkit-ts/cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```sh filename="yarn"
|
|
16
|
+
yarn add @gqlkit-ts/runtime @graphql-tools/schema graphql
|
|
17
|
+
yarn add -D @gqlkit-ts/cli
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Project Structure
|
|
21
|
+
|
|
22
|
+
gqlkit expects your types and resolvers to be in `src/gqlkit/schema/`:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
src/
|
|
26
|
+
└── gqlkit/
|
|
27
|
+
├── context.ts # Context type definition
|
|
28
|
+
├── gqlkit.ts # Resolver factories
|
|
29
|
+
└── schema/
|
|
30
|
+
├── user.ts # User type and resolvers
|
|
31
|
+
├── post.ts # Post type and resolvers
|
|
32
|
+
└── query.ts # Query resolvers
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Set Up Context and Resolver Factories
|
|
36
|
+
|
|
37
|
+
Create `src/gqlkit/context.ts` to define your context type:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
export type Context = {
|
|
41
|
+
currentUser: { id: string; name: string; email: string | null } | null;
|
|
42
|
+
};
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Create `src/gqlkit/gqlkit.ts` to export resolver factories:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { createGqlkitApis } from "@gqlkit-ts/runtime";
|
|
49
|
+
import type { Context } from "./context";
|
|
50
|
+
|
|
51
|
+
export const { defineQuery, defineMutation, defineField } =
|
|
52
|
+
createGqlkitApis<Context>();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Define Your First Type
|
|
56
|
+
|
|
57
|
+
Create a simple User type in `src/gqlkit/schema/user.ts`:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
export type User = {
|
|
61
|
+
id: string;
|
|
62
|
+
name: string;
|
|
63
|
+
email: string | null;
|
|
64
|
+
};
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Define a Query
|
|
68
|
+
|
|
69
|
+
Create a query resolver in `src/gqlkit/schema/query.ts`:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { defineQuery } from "../gqlkit";
|
|
73
|
+
import type { NoArgs } from "@gqlkit-ts/runtime";
|
|
74
|
+
import type { User } from "./user";
|
|
75
|
+
|
|
76
|
+
export const me = defineQuery<NoArgs, User | null>(
|
|
77
|
+
(_root, _args, ctx) => ctx.currentUser
|
|
78
|
+
);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Generate Schema
|
|
82
|
+
|
|
83
|
+
Run the generator:
|
|
84
|
+
|
|
85
|
+
```sh filename="npm"
|
|
86
|
+
npm exec gqlkit gen
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```sh filename="pnpm"
|
|
90
|
+
pnpm gqlkit gen
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
```sh filename="yarn"
|
|
94
|
+
yarn gqlkit gen
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
This will create files in `src/gqlkit/__generated__/`:
|
|
98
|
+
- `schema.ts` - GraphQL schema AST (DocumentNode)
|
|
99
|
+
- `resolvers.ts` - Resolver map
|
|
100
|
+
|
|
101
|
+
## Create GraphQL Schema
|
|
102
|
+
|
|
103
|
+
Use `@graphql-tools/schema` to combine the generated outputs into an executable schema:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
107
|
+
import { typeDefs } from "./gqlkit/__generated__/schema";
|
|
108
|
+
import { resolvers } from "./gqlkit/__generated__/resolvers";
|
|
109
|
+
|
|
110
|
+
export const schema = makeExecutableSchema({ typeDefs, resolvers });
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Next Steps
|
|
114
|
+
|
|
115
|
+
- [HTTP Server Integration](./integration/yoga) - Connect your schema to graphql-yoga, Apollo Server, or other HTTP servers
|
|
116
|
+
- [Object Types](./schema/objects) - Learn more about defining types
|
|
117
|
+
- [Queries & Mutations](./schema/queries-mutations) - Advanced resolver patterns
|
package/docs/index.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# gqlkit
|
|
2
|
+
|
|
3
|
+
> gqlkit is a convention-driven code generator for GraphQL servers in TypeScript. Define GraphQL types and resolver signatures in TypeScript, then `gqlkit gen` generates GraphQL schema AST and a resolver map from your codebase.
|
|
4
|
+
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
- [What is gqlkit?](./what-is-gqlkit.md): gqlkit is a convention-driven code generator for GraphQL servers in TypeScript.
|
|
8
|
+
- [Getting Started](./getting-started.md): gqlkit expects your types and resolvers to be in `src/gqlkit/schema/`:
|
|
9
|
+
|
|
10
|
+
## Schema Definition
|
|
11
|
+
|
|
12
|
+
- [Schema Definition](./schema.md): gqlkit generates GraphQL schema from your TypeScript types. All exported types from `src/gqlkit/schema/` are automatically scanned and converted to GraphQL types.
|
|
13
|
+
- [Object Types](./schema/objects.md): Plain TypeScript type exports become GraphQL Object types.
|
|
14
|
+
- [Input Types](./schema/inputs.md): TypeScript types with `Input` suffix are treated as GraphQL input types.
|
|
15
|
+
- [Queries & Mutations](./schema/queries-mutations.md): Define Query and Mutation fields using the `@gqlkit-ts/runtime` API.
|
|
16
|
+
- [Field Resolvers](./schema/fields.md): Add computed fields to object types using `defineField`. Define them alongside the type.
|
|
17
|
+
- [Scalar Types](./schema/scalars.md): gqlkit provides built-in scalar types and supports custom scalar definitions.
|
|
18
|
+
- [Enum Types](./schema/enums.md): gqlkit converts TypeScript string literal unions and enums to GraphQL enum types.
|
|
19
|
+
- [Union Types](./schema/unions.md): TypeScript union types of object types are converted to GraphQL union types.
|
|
20
|
+
- [Interface Types](./schema/interfaces.md): Define GraphQL interface types using the `GqlInterface` utility type.
|
|
21
|
+
- [Abstract Type Resolution](./schema/abstract-resolvers.md): GraphQL abstract types (unions and interfaces) require runtime type resolution to determine the concrete type of returned values. gqlkit provides `defineResolveType` and `defineIsTypeOf` to handle this.
|
|
22
|
+
- [Documentation](./schema/documentation.md): gqlkit extracts TSDoc/JSDoc comments and converts them to GraphQL descriptions.
|
|
23
|
+
- [Custom Directives](./schema/directives.md): Define custom directives using the `GqlDirective` utility type and attach them using `GqlField` or `GqlObject`.
|
|
24
|
+
|
|
25
|
+
## Integration
|
|
26
|
+
|
|
27
|
+
- [graphql-yoga](./integration/yoga.md): [graphql-yoga](https://the-guild.dev/graphql/yoga-server) is a batteries-included GraphQL server that works in any JavaScript runtime.
|
|
28
|
+
- [Apollo Server](./integration/apollo.md): [Apollo Server](https://www.apollographql.com/docs/apollo-server/) is a popular GraphQL server with extensive features and ecosystem.
|
|
29
|
+
|
|
30
|
+
## Guides
|
|
31
|
+
|
|
32
|
+
- [Configuration](./configuration.md): gqlkit can be configured via `gqlkit.config.ts` in your project root.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Apollo Server
|
|
2
|
+
|
|
3
|
+
[Apollo Server](https://www.apollographql.com/docs/apollo-server/) is a popular GraphQL server with extensive features and ecosystem.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```sh filename="npm"
|
|
8
|
+
npm install @apollo/server
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```sh filename="pnpm"
|
|
12
|
+
pnpm add @apollo/server
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```sh filename="yarn"
|
|
16
|
+
yarn add @apollo/server
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Creating the Schema
|
|
20
|
+
|
|
21
|
+
First, create an executable schema using `makeExecutableSchema`:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// src/schema.ts
|
|
25
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
26
|
+
import { typeDefs } from "./gqlkit/__generated__/schema";
|
|
27
|
+
import { resolvers } from "./gqlkit/__generated__/resolvers";
|
|
28
|
+
|
|
29
|
+
export const schema = makeExecutableSchema({ typeDefs, resolvers });
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Basic Server
|
|
33
|
+
|
|
34
|
+
Using the standalone server:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// src/server.ts
|
|
38
|
+
import { ApolloServer } from "@apollo/server";
|
|
39
|
+
import { startStandaloneServer } from "@apollo/server/standalone";
|
|
40
|
+
import { schema } from "./schema";
|
|
41
|
+
|
|
42
|
+
const server = new ApolloServer({ schema });
|
|
43
|
+
|
|
44
|
+
const { url } = await startStandaloneServer(server, {
|
|
45
|
+
listen: { port: 4000 },
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
console.log(`Server is running on ${url}`);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## With Context
|
|
52
|
+
|
|
53
|
+
If your resolvers use a context type, provide a context factory:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// src/gqlkit/context.ts
|
|
57
|
+
export type Context = {
|
|
58
|
+
currentUser: User | null;
|
|
59
|
+
db: Database;
|
|
60
|
+
};
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// src/gqlkit/gqlkit.ts
|
|
65
|
+
import { createGqlkitApis } from "@gqlkit-ts/runtime";
|
|
66
|
+
import type { Context } from "./context";
|
|
67
|
+
|
|
68
|
+
export const { defineQuery, defineMutation, defineField } =
|
|
69
|
+
createGqlkitApis<Context>();
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// src/gqlkit/schema/query.ts
|
|
74
|
+
import { defineQuery } from "../gqlkit";
|
|
75
|
+
import type { NoArgs } from "@gqlkit-ts/runtime";
|
|
76
|
+
import type { User } from "./user";
|
|
77
|
+
|
|
78
|
+
export const me = defineQuery<NoArgs, User | null>(
|
|
79
|
+
(_root, _args, ctx) => ctx.currentUser
|
|
80
|
+
);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// src/server.ts
|
|
85
|
+
import { ApolloServer } from "@apollo/server";
|
|
86
|
+
import { startStandaloneServer } from "@apollo/server/standalone";
|
|
87
|
+
import { schema } from "./schema";
|
|
88
|
+
import type { Context } from "./gqlkit/context";
|
|
89
|
+
|
|
90
|
+
const server = new ApolloServer<Context>({ schema });
|
|
91
|
+
|
|
92
|
+
const { url } = await startStandaloneServer(server, {
|
|
93
|
+
listen: { port: 4000 },
|
|
94
|
+
context: async ({ req }) => {
|
|
95
|
+
const user = await getUserFromRequest(req);
|
|
96
|
+
return {
|
|
97
|
+
currentUser: user,
|
|
98
|
+
db: database,
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
console.log(`Server is running on ${url}`);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Further Reading
|
|
107
|
+
|
|
108
|
+
- [Apollo Server Documentation](https://www.apollographql.com/docs/apollo-server/)
|
|
109
|
+
- [Apollo Server Plugins](https://www.apollographql.com/docs/apollo-server/builtin-plugins)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# graphql-yoga
|
|
2
|
+
|
|
3
|
+
[graphql-yoga](https://the-guild.dev/graphql/yoga-server) is a batteries-included GraphQL server that works in any JavaScript runtime.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```sh filename="npm"
|
|
8
|
+
npm install graphql-yoga
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```sh filename="pnpm"
|
|
12
|
+
pnpm add graphql-yoga
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```sh filename="yarn"
|
|
16
|
+
yarn add graphql-yoga
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Creating the Schema
|
|
20
|
+
|
|
21
|
+
First, create an executable schema using `makeExecutableSchema`:
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// src/schema.ts
|
|
25
|
+
import { makeExecutableSchema } from "@graphql-tools/schema";
|
|
26
|
+
import { typeDefs } from "./gqlkit/__generated__/schema";
|
|
27
|
+
import { resolvers } from "./gqlkit/__generated__/resolvers";
|
|
28
|
+
|
|
29
|
+
export const schema = makeExecutableSchema({ typeDefs, resolvers });
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Basic Server
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// src/server.ts
|
|
36
|
+
import { createServer } from "node:http";
|
|
37
|
+
import { createYoga } from "graphql-yoga";
|
|
38
|
+
import { schema } from "./schema";
|
|
39
|
+
|
|
40
|
+
const yoga = createYoga({ schema });
|
|
41
|
+
const server = createServer(yoga);
|
|
42
|
+
|
|
43
|
+
server.listen(4000, () => {
|
|
44
|
+
console.log("Server is running on http://localhost:4000/graphql");
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## With Context
|
|
49
|
+
|
|
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
|
+
```
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// src/server.ts
|
|
82
|
+
import { createServer } from "node:http";
|
|
83
|
+
import { createYoga } from "graphql-yoga";
|
|
84
|
+
import { schema } from "./schema";
|
|
85
|
+
import type { Context } from "./gqlkit/context";
|
|
86
|
+
|
|
87
|
+
const yoga = createYoga<{}, Context>({
|
|
88
|
+
schema,
|
|
89
|
+
context: async ({ request }) => {
|
|
90
|
+
const user = await getUserFromRequest(request);
|
|
91
|
+
return {
|
|
92
|
+
currentUser: user,
|
|
93
|
+
db: database,
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const server = createServer(yoga);
|
|
99
|
+
|
|
100
|
+
server.listen(4000, () => {
|
|
101
|
+
console.log("Server is running on http://localhost:4000/graphql");
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Further Reading
|
|
106
|
+
|
|
107
|
+
- [graphql-yoga Documentation](https://the-guild.dev/graphql/yoga-server/docs)
|
|
108
|
+
- [Envelop Plugins](https://the-guild.dev/graphql/envelop/plugins)
|