@gqlkit-ts/cli 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-type-generator/auto-type-generator.d.ts +26 -4
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/auto-type-generator.js +846 -152
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
- package/dist/auto-type-generator/index.d.ts +9 -2
- package/dist/auto-type-generator/index.d.ts.map +1 -1
- package/dist/auto-type-generator/index.js +3 -0
- package/dist/auto-type-generator/index.js.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.d.ts +39 -0
- package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-enum-collector.js +193 -0
- package/dist/auto-type-generator/inline-enum-collector.js.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.js +22 -0
- package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.js +216 -0
- package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
- package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-types.js +2 -0
- package/dist/auto-type-generator/inline-union-types.js.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.js +329 -0
- package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +22 -1
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
- package/dist/auto-type-generator/naming-convention.js +24 -0
- package/dist/auto-type-generator/naming-convention.js.map +1 -1
- package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
- package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolve-type-generator.js +2 -0
- package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
- package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
- package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
- package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-extractor.js +142 -0
- package/dist/auto-type-generator/typename-extractor.js.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/typename-types.d.ts +43 -0
- package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-types.js +37 -0
- package/dist/auto-type-generator/typename-types.js.map +1 -0
- package/dist/auto-type-generator/typename-validator.d.ts +37 -0
- package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-validator.js +206 -0
- package/dist/auto-type-generator/typename-validator.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/docs.d.ts +51 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +154 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/gen-orchestrator/orchestrator.js +119 -14
- package/dist/gen-orchestrator/orchestrator.js.map +1 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts +28 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +16 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.js +86 -309
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
- package/dist/resolver-extractor/index.d.ts +0 -1
- package/dist/resolver-extractor/index.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.d.ts +10 -2
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +39 -4
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
- package/dist/schema-generator/generate-schema.d.ts +1 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -1
- package/dist/schema-generator/generate-schema.js +90 -4
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +34 -2
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +96 -1
- package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
- package/dist/shared/constants.d.ts +0 -16
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +0 -19
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/directive-detector.d.ts.map +1 -1
- package/dist/shared/directive-detector.js +8 -15
- package/dist/shared/directive-detector.js.map +1 -1
- package/dist/shared/enum-prefix-detector.d.ts +63 -0
- package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
- package/dist/shared/enum-prefix-detector.js +80 -0
- package/dist/shared/enum-prefix-detector.js.map +1 -0
- package/dist/shared/file-scanner.d.ts.map +1 -1
- package/dist/shared/file-scanner.js +5 -3
- package/dist/shared/file-scanner.js.map +1 -1
- package/dist/shared/ignore-fields-detector.d.ts +26 -0
- package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
- package/dist/shared/ignore-fields-detector.js +83 -0
- package/dist/shared/ignore-fields-detector.js.map +1 -0
- package/dist/shared/ignore-fields-validator.d.ts +29 -0
- package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
- package/dist/shared/ignore-fields-validator.js +43 -0
- package/dist/shared/ignore-fields-validator.js.map +1 -0
- package/dist/shared/index.d.ts +3 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -3
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/interface-detector.d.ts +3 -2
- package/dist/shared/interface-detector.d.ts.map +1 -1
- package/dist/shared/interface-detector.js +54 -11
- package/dist/shared/interface-detector.js.map +1 -1
- package/dist/shared/path-utils.d.ts +2 -0
- package/dist/shared/path-utils.d.ts.map +1 -0
- package/dist/shared/path-utils.js +4 -0
- package/dist/shared/path-utils.js.map +1 -0
- package/dist/shared/source-location.d.ts +5 -0
- package/dist/shared/source-location.d.ts.map +1 -1
- package/dist/shared/source-location.js +7 -0
- package/dist/shared/source-location.js.map +1 -1
- package/dist/shared/type-converter.d.ts.map +1 -1
- package/dist/shared/type-converter.js +11 -0
- package/dist/shared/type-converter.js.map +1 -1
- package/dist/shared/typescript-utils.d.ts +34 -7
- package/dist/shared/typescript-utils.d.ts.map +1 -1
- package/dist/shared/typescript-utils.js +72 -24
- package/dist/shared/typescript-utils.js.map +1 -1
- package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -1
- package/dist/type-extractor/collector/scalar-collector.js +4 -14
- package/dist/type-extractor/collector/scalar-collector.js.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +57 -4
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.d.ts +28 -0
- package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -0
- package/dist/type-extractor/extractor/field-type-resolver.js +433 -0
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts +12 -3
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.js +260 -229
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
- package/dist/type-extractor/extractor/type-name-collector.d.ts +24 -0
- package/dist/type-extractor/extractor/type-name-collector.d.ts.map +1 -0
- package/dist/type-extractor/extractor/type-name-collector.js +102 -0
- package/dist/type-extractor/extractor/type-name-collector.js.map +1 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts +89 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts.map +1 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.js +158 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.js.map +1 -0
- package/dist/type-extractor/types/diagnostics.d.ts +1 -1
- package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
- package/dist/type-extractor/types/graphql.d.ts +2 -0
- package/dist/type-extractor/types/graphql.d.ts.map +1 -1
- package/dist/type-extractor/types/index.d.ts +2 -1
- package/dist/type-extractor/types/index.d.ts.map +1 -1
- package/dist/type-extractor/types/index.js +1 -1
- package/dist/type-extractor/types/index.js.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts +47 -0
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js +75 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -0
- package/dist/type-extractor/types/typescript.d.ts +25 -1
- package/dist/type-extractor/types/typescript.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.js +1 -1
- package/dist/type-extractor/validator/type-validator.js.map +1 -1
- package/docs/coding-agents.md +64 -0
- package/docs/configuration.md +6 -20
- package/docs/getting-started.md +15 -12
- package/docs/index.md +36 -21
- package/docs/integration/apollo.md +8 -40
- package/docs/integration/drizzle.md +187 -0
- package/docs/integration/prisma.md +196 -0
- package/docs/integration/yoga.md +8 -40
- package/docs/schema/abstract-resolvers.md +117 -0
- package/docs/schema/directives.md +5 -0
- package/docs/schema/documentation.md +5 -0
- package/docs/schema/enums.md +307 -0
- package/docs/schema/fields.md +66 -0
- package/docs/schema/index.md +21 -0
- package/docs/schema/inputs.md +117 -15
- package/docs/schema/interfaces.md +31 -1
- package/docs/schema/objects.md +42 -0
- package/docs/schema/queries-mutations.md +138 -22
- package/docs/schema/scalars.md +5 -0
- package/docs/schema/unions.md +208 -1
- package/docs/what-is-gqlkit.md +13 -8
- package/package.json +14 -5
- package/src/auto-type-generator/auto-type-generator.ts +1670 -0
- package/src/auto-type-generator/index.ts +63 -0
- package/src/auto-type-generator/inline-enum-collector.ts +338 -0
- package/src/auto-type-generator/inline-object-traverser.ts +49 -0
- package/src/auto-type-generator/inline-union-collector.ts +402 -0
- package/src/auto-type-generator/inline-union-types.ts +33 -0
- package/src/auto-type-generator/inline-union-validator.ts +482 -0
- package/src/auto-type-generator/name-collision-validator.ts +119 -0
- package/src/auto-type-generator/naming-convention.ts +163 -0
- package/src/auto-type-generator/resolve-type-generator.ts +21 -0
- package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
- package/src/auto-type-generator/typename-extractor.ts +230 -0
- package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
- package/src/auto-type-generator/typename-types.ts +66 -0
- package/src/auto-type-generator/typename-validator.ts +326 -0
- package/src/cli.ts +13 -0
- package/src/commands/docs.ts +211 -0
- package/src/commands/gen.ts +141 -0
- package/src/commands/main.ts +5 -0
- package/src/config/define-config.ts +28 -0
- package/src/config/index.ts +7 -0
- package/src/config/types.ts +144 -0
- package/src/config-loader/index.ts +14 -0
- package/src/config-loader/loader.ts +143 -0
- package/src/config-loader/validator.ts +672 -0
- package/src/gen-orchestrator/hook-executor/hook-executor.ts +117 -0
- package/src/gen-orchestrator/orchestrator.ts +798 -0
- package/src/gen-orchestrator/reporter/diagnostic-reporter.ts +44 -0
- package/src/gen-orchestrator/reporter/progress-reporter.ts +61 -0
- package/src/gen-orchestrator/writer/file-writer.ts +38 -0
- package/src/index.ts +2 -0
- package/src/resolver-extractor/extract-resolvers.ts +82 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +740 -0
- package/src/resolver-extractor/index.ts +13 -0
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +259 -0
- package/src/schema-generator/builder/ast-builder.ts +706 -0
- package/src/schema-generator/emitter/code-emitter.ts +385 -0
- package/src/schema-generator/emitter/sdl-emitter.ts +13 -0
- package/src/schema-generator/generate-schema.ts +267 -0
- package/src/schema-generator/index.ts +19 -0
- package/src/schema-generator/integrator/result-integrator.ts +759 -0
- package/src/schema-generator/pruner/schema-pruner.ts +112 -0
- package/src/schema-generator/resolver-collector/resolver-collector.ts +157 -0
- package/src/shared/constants.ts +122 -0
- package/src/shared/default-value-detector.ts +172 -0
- package/src/shared/diagnostics.ts +35 -0
- package/src/shared/directive-definition-extractor.ts +564 -0
- package/src/shared/directive-detector.ts +556 -0
- package/src/shared/enum-prefix-detector.ts +99 -0
- package/src/shared/file-scanner.ts +170 -0
- package/src/shared/ignore-fields-detector.ts +109 -0
- package/src/shared/ignore-fields-validator.ts +66 -0
- package/src/shared/index.ts +34 -0
- package/src/shared/inline-object-extractor.ts +102 -0
- package/src/shared/inline-object-utils.ts +23 -0
- package/src/shared/interface-detector.ts +176 -0
- package/src/shared/interface-validator.ts +211 -0
- package/src/shared/metadata-detector.ts +443 -0
- package/src/shared/path-utils.ts +3 -0
- package/src/shared/program-factory.ts +51 -0
- package/src/shared/source-location.ts +38 -0
- package/src/shared/tsconfig-loader.ts +126 -0
- package/src/shared/tsdoc-parser.ts +155 -0
- package/src/shared/type-converter.ts +99 -0
- package/src/shared/typescript-utils.ts +246 -0
- package/src/type-extractor/collector/result-collector.ts +57 -0
- package/src/type-extractor/collector/scalar-collector.ts +254 -0
- package/src/type-extractor/converter/field-eligibility.ts +112 -0
- package/src/type-extractor/converter/graphql-converter.ts +483 -0
- package/src/type-extractor/extract-types.ts +1 -0
- package/src/type-extractor/extractor/field-type-resolver.ts +614 -0
- package/src/type-extractor/extractor/type-extractor.ts +1644 -0
- package/src/type-extractor/extractor/type-name-collector.ts +130 -0
- package/src/type-extractor/index.ts +20 -0
- package/src/type-extractor/mapper/scalar-base-type-mapper.ts +265 -0
- package/src/type-extractor/types/diagnostics.ts +109 -0
- package/src/type-extractor/types/graphql.ts +55 -0
- package/src/type-extractor/types/index.ts +37 -0
- package/src/type-extractor/types/ts-type-reference-factory.ts +150 -0
- package/src/type-extractor/types/typescript.ts +137 -0
- package/src/type-extractor/validator/type-validator.ts +77 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts +0 -2
- package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +0 -1
- package/dist/auto-type-generator/auto-type-generator.test.js +0 -613
- package/dist/auto-type-generator/auto-type-generator.test.js.map +0 -1
- package/dist/auto-type-generator/name-collision-validator.test.d.ts +0 -2
- package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +0 -1
- package/dist/auto-type-generator/name-collision-validator.test.js +0 -358
- package/dist/auto-type-generator/name-collision-validator.test.js.map +0 -1
- package/dist/auto-type-generator/naming-convention.test.d.ts +0 -2
- package/dist/auto-type-generator/naming-convention.test.d.ts.map +0 -1
- package/dist/auto-type-generator/naming-convention.test.js +0 -132
- package/dist/auto-type-generator/naming-convention.test.js.map +0 -1
- package/dist/commands/gen.test.d.ts +0 -2
- package/dist/commands/gen.test.d.ts.map +0 -1
- package/dist/commands/gen.test.js +0 -226
- package/dist/commands/gen.test.js.map +0 -1
- package/dist/config-loader/loader.test.d.ts +0 -2
- package/dist/config-loader/loader.test.d.ts.map +0 -1
- package/dist/config-loader/loader.test.js +0 -123
- package/dist/config-loader/loader.test.js.map +0 -1
- package/dist/config-loader/validator.test.d.ts +0 -2
- package/dist/config-loader/validator.test.d.ts.map +0 -1
- package/dist/config-loader/validator.test.js +0 -846
- package/dist/config-loader/validator.test.js.map +0 -1
- package/dist/gen-orchestrator/golden.test.d.ts +0 -2
- package/dist/gen-orchestrator/golden.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/golden.test.js +0 -102
- package/dist/gen-orchestrator/golden.test.js.map +0 -1
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +0 -2
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +0 -167
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +0 -1
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +0 -2
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js +0 -74
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
- package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.js +0 -76
- package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.test.d.ts +0 -8
- package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.test.js +0 -352
- package/dist/resolver-extractor/validator/only-validator.test.js.map +0 -1
- package/dist/schema-generator/builder/ast-builder.test.d.ts +0 -2
- package/dist/schema-generator/builder/ast-builder.test.d.ts.map +0 -1
- package/dist/schema-generator/builder/ast-builder.test.js +0 -469
- package/dist/schema-generator/builder/ast-builder.test.js.map +0 -1
- package/dist/shared/file-scanner.test.d.ts +0 -2
- package/dist/shared/file-scanner.test.d.ts.map +0 -1
- package/dist/shared/file-scanner.test.js +0 -138
- package/dist/shared/file-scanner.test.js.map +0 -1
- package/dist/shared/interface-validator.test.d.ts +0 -2
- package/dist/shared/interface-validator.test.d.ts.map +0 -1
- package/dist/shared/interface-validator.test.js +0 -145
- package/dist/shared/interface-validator.test.js.map +0 -1
- package/dist/type-extractor/types/typescript.test.d.ts +0 -2
- package/dist/type-extractor/types/typescript.test.d.ts.map +0 -1
- package/dist/type-extractor/types/typescript.test.js +0 -287
- package/dist/type-extractor/types/typescript.test.js.map +0 -1
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import type { AutoGeneratedResolveType } from "../../auto-type-generator/resolve-type-generator.js";
|
|
3
|
+
import { TYPENAME_FIELD_NAMES } from "../../auto-type-generator/typename-types.js";
|
|
4
|
+
import { toPosixPath } from "../../shared/index.js";
|
|
5
|
+
import type { CollectedScalarType } from "../../type-extractor/collector/scalar-collector.js";
|
|
6
|
+
import {
|
|
7
|
+
type BuildDocumentOptions,
|
|
8
|
+
buildDocumentNode,
|
|
9
|
+
} from "../builder/ast-builder.js";
|
|
10
|
+
import type {
|
|
11
|
+
IntegratedResult,
|
|
12
|
+
NumericEnumInfo,
|
|
13
|
+
StringEnumMappingInfo,
|
|
14
|
+
} from "../integrator/result-integrator.js";
|
|
15
|
+
import type {
|
|
16
|
+
AbstractTypeResolverInfo,
|
|
17
|
+
ResolverInfo,
|
|
18
|
+
TypeResolvers,
|
|
19
|
+
} from "../resolver-collector/resolver-collector.js";
|
|
20
|
+
|
|
21
|
+
const GENERATED_FILE_HEADER =
|
|
22
|
+
"// This file is auto-generated by gqlkit. DO NOT EDIT.";
|
|
23
|
+
|
|
24
|
+
function formatDocumentNodeAsCode(
|
|
25
|
+
integratedResult: IntegratedResult,
|
|
26
|
+
options?: BuildDocumentOptions,
|
|
27
|
+
): string {
|
|
28
|
+
const doc = buildDocumentNode(integratedResult, options);
|
|
29
|
+
|
|
30
|
+
return JSON.stringify(doc, null, 2);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function emitTypeDefsCode(
|
|
34
|
+
integratedResult: IntegratedResult,
|
|
35
|
+
options?: BuildDocumentOptions,
|
|
36
|
+
): string {
|
|
37
|
+
const documentNodeCode = formatDocumentNodeAsCode(integratedResult, options);
|
|
38
|
+
|
|
39
|
+
return `${GENERATED_FILE_HEADER}
|
|
40
|
+
|
|
41
|
+
import type { DocumentNode } from "graphql";
|
|
42
|
+
|
|
43
|
+
export const typeDefs: DocumentNode = ${documentNodeCode} as DocumentNode;
|
|
44
|
+
`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function computeRelativeImportPath(fromDir: string, toFile: string): string {
|
|
48
|
+
const relativePath = toPosixPath(path.relative(fromDir, toFile));
|
|
49
|
+
const withoutExt = relativePath.replace(/\.ts$/, ".js");
|
|
50
|
+
if (!withoutExt.startsWith(".")) {
|
|
51
|
+
return `./${withoutExt}`;
|
|
52
|
+
}
|
|
53
|
+
return withoutExt;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface ScalarTypeImport {
|
|
57
|
+
readonly typeName: string;
|
|
58
|
+
readonly sourceFile: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function collectScalarTypeImports(
|
|
62
|
+
customScalars: ReadonlyArray<CollectedScalarType>,
|
|
63
|
+
): ScalarTypeImport[] {
|
|
64
|
+
const imports: ScalarTypeImport[] = [];
|
|
65
|
+
const seen = new Set<string>();
|
|
66
|
+
|
|
67
|
+
for (const scalar of customScalars) {
|
|
68
|
+
if (
|
|
69
|
+
scalar.inputType &&
|
|
70
|
+
scalar.inputType.sourceFile !== "" &&
|
|
71
|
+
!seen.has(scalar.inputType.typeName)
|
|
72
|
+
) {
|
|
73
|
+
imports.push({
|
|
74
|
+
typeName: scalar.inputType.typeName,
|
|
75
|
+
sourceFile: scalar.inputType.sourceFile,
|
|
76
|
+
});
|
|
77
|
+
seen.add(scalar.inputType.typeName);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
for (const outputType of scalar.outputTypes) {
|
|
81
|
+
if (outputType.sourceFile !== "" && !seen.has(outputType.typeName)) {
|
|
82
|
+
imports.push({
|
|
83
|
+
typeName: outputType.typeName,
|
|
84
|
+
sourceFile: outputType.sourceFile,
|
|
85
|
+
});
|
|
86
|
+
seen.add(outputType.typeName);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return imports;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function buildScalarTypeImports(
|
|
95
|
+
scalarTypeImports: ScalarTypeImport[],
|
|
96
|
+
outputDir: string,
|
|
97
|
+
): string[] {
|
|
98
|
+
const importsByFile = new Map<string, string[]>();
|
|
99
|
+
|
|
100
|
+
for (const imp of scalarTypeImports) {
|
|
101
|
+
const existing = importsByFile.get(imp.sourceFile) ?? [];
|
|
102
|
+
existing.push(imp.typeName);
|
|
103
|
+
importsByFile.set(imp.sourceFile, existing);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const imports: string[] = [];
|
|
107
|
+
const sortedFiles = [...importsByFile.keys()].sort();
|
|
108
|
+
|
|
109
|
+
for (const sourceFile of sortedFiles) {
|
|
110
|
+
const typeNames = importsByFile.get(sourceFile) ?? [];
|
|
111
|
+
const importPath = computeRelativeImportPath(outputDir, sourceFile);
|
|
112
|
+
imports.push(
|
|
113
|
+
`import type { ${typeNames.sort().join(", ")} } from "${importPath}";`,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return imports;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function buildScalarTypeParameter(scalar: CollectedScalarType): string {
|
|
121
|
+
const inputTypeName = scalar.inputType?.typeName ?? "unknown";
|
|
122
|
+
const outputTypeNames = scalar.outputTypes.map((t) => t.typeName);
|
|
123
|
+
const outputTypeUnion =
|
|
124
|
+
outputTypeNames.length > 0 ? outputTypeNames.join(" | ") : "unknown";
|
|
125
|
+
return `GraphQLScalarType<${inputTypeName}, ${outputTypeUnion}>`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function buildScalarsArgumentType(
|
|
129
|
+
customScalars: ReadonlyArray<CollectedScalarType>,
|
|
130
|
+
): string {
|
|
131
|
+
const entries = customScalars
|
|
132
|
+
.map((scalar) => {
|
|
133
|
+
const typeParam = buildScalarTypeParameter(scalar);
|
|
134
|
+
return ` ${scalar.scalarName}: ${typeParam};`;
|
|
135
|
+
})
|
|
136
|
+
.join("\n");
|
|
137
|
+
|
|
138
|
+
return `{\n scalars: {\n${entries}\n };\n}`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function buildScalarResolverEntries(
|
|
142
|
+
customScalars: ReadonlyArray<CollectedScalarType>,
|
|
143
|
+
): string[] {
|
|
144
|
+
return customScalars.map(
|
|
145
|
+
(scalar) => ` ${scalar.scalarName}: scalars.${scalar.scalarName},`,
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function collectResolverImportsByFile(
|
|
150
|
+
resolverInfo: ResolverInfo,
|
|
151
|
+
): Map<string, Set<string>> {
|
|
152
|
+
const importsByFile = new Map<string, Set<string>>();
|
|
153
|
+
|
|
154
|
+
for (const type of resolverInfo.types) {
|
|
155
|
+
for (const field of type.fields) {
|
|
156
|
+
const existing = importsByFile.get(field.sourceFile) ?? new Set<string>();
|
|
157
|
+
existing.add(field.resolverValueName);
|
|
158
|
+
importsByFile.set(field.sourceFile, existing);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
for (const abstractResolver of resolverInfo.abstractTypeResolvers) {
|
|
163
|
+
const existing =
|
|
164
|
+
importsByFile.get(abstractResolver.sourceFile) ?? new Set<string>();
|
|
165
|
+
existing.add(abstractResolver.exportName);
|
|
166
|
+
importsByFile.set(abstractResolver.sourceFile, existing);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return importsByFile;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function buildResolverImports(
|
|
173
|
+
importsByFile: Map<string, Set<string>>,
|
|
174
|
+
outputDir: string,
|
|
175
|
+
): string[] {
|
|
176
|
+
const imports: string[] = [];
|
|
177
|
+
const sortedFiles = [...importsByFile.keys()].sort();
|
|
178
|
+
|
|
179
|
+
for (const sourceFile of sortedFiles) {
|
|
180
|
+
const valueNames = importsByFile.get(sourceFile) ?? new Set<string>();
|
|
181
|
+
const importPath = computeRelativeImportPath(outputDir, sourceFile);
|
|
182
|
+
const sortedValues = [...valueNames].sort();
|
|
183
|
+
|
|
184
|
+
if (sortedValues.length > 0) {
|
|
185
|
+
imports.push(
|
|
186
|
+
`import { ${sortedValues.join(", ")} } from "${importPath}";`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return imports;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function buildAbstractOnlyTypeEntry(
|
|
195
|
+
abstractResolver: AbstractTypeResolverInfo,
|
|
196
|
+
): string {
|
|
197
|
+
return ` ${abstractResolver.typeName}: {\n ${abstractResolver.resolverKey}: ${abstractResolver.exportName},\n },`;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function buildNumericEnumResolver(enumInfo: NumericEnumInfo): string {
|
|
201
|
+
const entries = enumInfo.members
|
|
202
|
+
.map((member) => ` ${member.name}: ${member.numericValue},`)
|
|
203
|
+
.join("\n");
|
|
204
|
+
return ` ${enumInfo.enumName}: {\n${entries}\n },`;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function buildNumericEnumResolvers(
|
|
208
|
+
numericEnums: ReadonlyArray<NumericEnumInfo>,
|
|
209
|
+
): string[] {
|
|
210
|
+
return numericEnums.map(buildNumericEnumResolver);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function buildStringEnumResolver(enumInfo: StringEnumMappingInfo): string {
|
|
214
|
+
const entries = enumInfo.members
|
|
215
|
+
.map(
|
|
216
|
+
(member) => ` ${member.graphqlValue}: "${member.typescriptValue}",`,
|
|
217
|
+
)
|
|
218
|
+
.join("\n");
|
|
219
|
+
return ` ${enumInfo.enumName}: {\n${entries}\n },`;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function buildStringEnumResolvers(
|
|
223
|
+
stringEnumMappings: ReadonlyArray<StringEnumMappingInfo>,
|
|
224
|
+
): string[] {
|
|
225
|
+
return stringEnumMappings.map(buildStringEnumResolver);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function buildTypeResolverEntry(
|
|
229
|
+
type: TypeResolvers,
|
|
230
|
+
abstractResolverForType: AbstractTypeResolverInfo | null,
|
|
231
|
+
): string {
|
|
232
|
+
const entries: string[] = [];
|
|
233
|
+
|
|
234
|
+
for (const field of type.fields) {
|
|
235
|
+
if (field.isDirectExport) {
|
|
236
|
+
entries.push(` ${field.fieldName}: ${field.resolverValueName},`);
|
|
237
|
+
} else {
|
|
238
|
+
entries.push(
|
|
239
|
+
` ${field.fieldName}: ${field.resolverValueName}.${field.fieldName},`,
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (abstractResolverForType !== null) {
|
|
245
|
+
entries.push(
|
|
246
|
+
` ${abstractResolverForType.resolverKey}: ${abstractResolverForType.exportName},`,
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return ` ${type.typeName}: {\n${entries.join("\n")}\n },`;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function getResolveTypeExpression(
|
|
254
|
+
fieldPattern: AutoGeneratedResolveType["fieldPattern"],
|
|
255
|
+
): string {
|
|
256
|
+
const { usedFieldNames } = fieldPattern;
|
|
257
|
+
|
|
258
|
+
if (usedFieldNames.size === 1) {
|
|
259
|
+
const fieldName = [...usedFieldNames][0]!;
|
|
260
|
+
return `obj.${fieldName}`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const expressions = TYPENAME_FIELD_NAMES.filter((name) =>
|
|
264
|
+
usedFieldNames.has(name),
|
|
265
|
+
).map((name) => `obj.${name}`);
|
|
266
|
+
|
|
267
|
+
return expressions.join(" ?? ");
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function buildAutoResolveTypeEntry(
|
|
271
|
+
autoResolveType: AutoGeneratedResolveType,
|
|
272
|
+
): string {
|
|
273
|
+
const expression = getResolveTypeExpression(autoResolveType.fieldPattern);
|
|
274
|
+
return ` ${autoResolveType.unionTypeName}: {\n __resolveType: (obj) => ${expression},\n },`;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function buildTypeEntries(
|
|
278
|
+
resolverInfo: ResolverInfo,
|
|
279
|
+
customScalars: ReadonlyArray<CollectedScalarType>,
|
|
280
|
+
): string[] {
|
|
281
|
+
const typeEntries: string[] = [];
|
|
282
|
+
const hasCustomScalars = customScalars.length > 0;
|
|
283
|
+
|
|
284
|
+
if (hasCustomScalars) {
|
|
285
|
+
typeEntries.push(...buildScalarResolverEntries(customScalars));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const typesWithFields = new Map<string, TypeResolvers>();
|
|
289
|
+
for (const type of resolverInfo.types) {
|
|
290
|
+
typesWithFields.set(type.typeName, type);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const abstractResolversByType = new Map<string, AbstractTypeResolverInfo>();
|
|
294
|
+
for (const abstractResolver of resolverInfo.abstractTypeResolvers) {
|
|
295
|
+
abstractResolversByType.set(abstractResolver.typeName, abstractResolver);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
const autoResolveTypeByUnion = new Map<string, AutoGeneratedResolveType>(
|
|
299
|
+
resolverInfo.autoGeneratedResolveTypes.map((r) => [r.unionTypeName, r]),
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
const allTypeNames = new Set<string>([
|
|
303
|
+
...typesWithFields.keys(),
|
|
304
|
+
...abstractResolversByType.keys(),
|
|
305
|
+
...autoResolveTypeByUnion.keys(),
|
|
306
|
+
]);
|
|
307
|
+
const sortedTypeNames = [...allTypeNames].sort();
|
|
308
|
+
|
|
309
|
+
for (const typeName of sortedTypeNames) {
|
|
310
|
+
const typeWithFields = typesWithFields.get(typeName);
|
|
311
|
+
const abstractResolver = abstractResolversByType.get(typeName) ?? null;
|
|
312
|
+
const autoResolveType = autoResolveTypeByUnion.get(typeName);
|
|
313
|
+
|
|
314
|
+
if (typeWithFields !== undefined) {
|
|
315
|
+
typeEntries.push(
|
|
316
|
+
buildTypeResolverEntry(typeWithFields, abstractResolver),
|
|
317
|
+
);
|
|
318
|
+
} else if (abstractResolver !== null) {
|
|
319
|
+
typeEntries.push(buildAbstractOnlyTypeEntry(abstractResolver));
|
|
320
|
+
} else if (autoResolveType !== undefined) {
|
|
321
|
+
typeEntries.push(buildAutoResolveTypeEntry(autoResolveType));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return typeEntries;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
interface EmitResolversCodeParams {
|
|
329
|
+
readonly resolverInfo: ResolverInfo;
|
|
330
|
+
readonly outputDir: string;
|
|
331
|
+
readonly customScalars: ReadonlyArray<CollectedScalarType>;
|
|
332
|
+
readonly numericEnums: ReadonlyArray<NumericEnumInfo>;
|
|
333
|
+
readonly stringEnumMappings: ReadonlyArray<StringEnumMappingInfo>;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export function emitResolversCode(params: EmitResolversCodeParams): string {
|
|
337
|
+
const {
|
|
338
|
+
resolverInfo,
|
|
339
|
+
outputDir,
|
|
340
|
+
customScalars,
|
|
341
|
+
numericEnums,
|
|
342
|
+
stringEnumMappings,
|
|
343
|
+
} = params;
|
|
344
|
+
const hasCustomScalars = customScalars.length > 0;
|
|
345
|
+
const imports: string[] = [];
|
|
346
|
+
|
|
347
|
+
if (hasCustomScalars) {
|
|
348
|
+
imports.push('import { GraphQLScalarType } from "graphql";');
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const importsByFile = collectResolverImportsByFile(resolverInfo);
|
|
352
|
+
imports.push(...buildResolverImports(importsByFile, outputDir));
|
|
353
|
+
|
|
354
|
+
if (hasCustomScalars) {
|
|
355
|
+
const scalarTypeImports = collectScalarTypeImports(customScalars);
|
|
356
|
+
const scalarImports = buildScalarTypeImports(scalarTypeImports, outputDir);
|
|
357
|
+
imports.push(...scalarImports);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const numericEnumResolverEntries = buildNumericEnumResolvers(numericEnums);
|
|
361
|
+
const stringEnumResolverEntries =
|
|
362
|
+
buildStringEnumResolvers(stringEnumMappings);
|
|
363
|
+
const typeEntries = buildTypeEntries(resolverInfo, customScalars);
|
|
364
|
+
|
|
365
|
+
const allEntries = [
|
|
366
|
+
...numericEnumResolverEntries,
|
|
367
|
+
...stringEnumResolverEntries,
|
|
368
|
+
...typeEntries,
|
|
369
|
+
];
|
|
370
|
+
|
|
371
|
+
const functionSignature = hasCustomScalars
|
|
372
|
+
? `export function createResolvers({ scalars }: ${buildScalarsArgumentType(customScalars)})`
|
|
373
|
+
: "export function createResolvers()";
|
|
374
|
+
|
|
375
|
+
const importSection = imports.length > 0 ? `${imports.join("\n")}\n\n` : "";
|
|
376
|
+
|
|
377
|
+
return `${GENERATED_FILE_HEADER}
|
|
378
|
+
|
|
379
|
+
${importSection}${functionSignature} {
|
|
380
|
+
return {
|
|
381
|
+
${allEntries.join("\n")}
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
`;
|
|
385
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DocumentNode, print } from "graphql";
|
|
2
|
+
|
|
3
|
+
const GENERATED_FILE_HEADER =
|
|
4
|
+
"# This file is auto-generated by gqlkit. DO NOT EDIT.";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* DocumentNode を SDL 形式の文字列に変換する。
|
|
8
|
+
* graphql パッケージの print() 関数を使用して SDL を生成する。
|
|
9
|
+
*/
|
|
10
|
+
export function emitSdlContent(documentNode: DocumentNode): string {
|
|
11
|
+
const sdl = print(documentNode);
|
|
12
|
+
return `${GENERATED_FILE_HEADER}\n\n${sdl}`;
|
|
13
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectTypenameExtractions,
|
|
3
|
+
collectTypenameResolveTypes,
|
|
4
|
+
generateAutoTypes,
|
|
5
|
+
validateNameCollisions,
|
|
6
|
+
validateSchemaTypenames,
|
|
7
|
+
validateTypenames,
|
|
8
|
+
} from "../auto-type-generator/index.js";
|
|
9
|
+
import type { ExtractResolversResult } from "../resolver-extractor/index.js";
|
|
10
|
+
import type { DirectiveDefinitionInfo } from "../shared/directive-definition-extractor.js";
|
|
11
|
+
import type { CollectedScalarType } from "../type-extractor/collector/scalar-collector.js";
|
|
12
|
+
import { convertToGraphQL } from "../type-extractor/converter/graphql-converter.js";
|
|
13
|
+
import type { ExtractTypesResult } from "../type-extractor/index.js";
|
|
14
|
+
import type {
|
|
15
|
+
Diagnostic,
|
|
16
|
+
ExtractedTypeInfo,
|
|
17
|
+
} from "../type-extractor/types/index.js";
|
|
18
|
+
import { buildDocumentNode } from "./builder/ast-builder.js";
|
|
19
|
+
import { emitResolversCode, emitTypeDefsCode } from "./emitter/code-emitter.js";
|
|
20
|
+
import { emitSdlContent } from "./emitter/sdl-emitter.js";
|
|
21
|
+
import { integrate } from "./integrator/result-integrator.js";
|
|
22
|
+
import { pruneDocumentNode } from "./pruner/schema-pruner.js";
|
|
23
|
+
import { collectResolverInfo } from "./resolver-collector/resolver-collector.js";
|
|
24
|
+
|
|
25
|
+
export interface GenerateSchemaInput {
|
|
26
|
+
readonly typesResult: ExtractTypesResult;
|
|
27
|
+
readonly extractedTypes: ReadonlyArray<ExtractedTypeInfo>;
|
|
28
|
+
readonly resolversResult: ExtractResolversResult;
|
|
29
|
+
readonly outputDir: string;
|
|
30
|
+
readonly customScalarNames: ReadonlyArray<string> | null;
|
|
31
|
+
readonly customScalars: ReadonlyArray<CollectedScalarType> | null;
|
|
32
|
+
readonly directiveDefinitions: ReadonlyArray<DirectiveDefinitionInfo> | null;
|
|
33
|
+
readonly enablePruning: boolean | null;
|
|
34
|
+
readonly sourceRoot: string | null;
|
|
35
|
+
readonly knownTypeNames: ReadonlySet<string> | null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface GenerateSchemaResult {
|
|
39
|
+
readonly typeDefsCode: string;
|
|
40
|
+
readonly sdlContent: string;
|
|
41
|
+
readonly resolversCode: string;
|
|
42
|
+
readonly diagnostics: ReadonlyArray<Diagnostic>;
|
|
43
|
+
readonly hasErrors: boolean;
|
|
44
|
+
readonly prunedTypes: ReadonlyArray<string> | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function generateSchema(
|
|
48
|
+
input: GenerateSchemaInput,
|
|
49
|
+
): GenerateSchemaResult {
|
|
50
|
+
const {
|
|
51
|
+
typesResult,
|
|
52
|
+
extractedTypes,
|
|
53
|
+
resolversResult,
|
|
54
|
+
outputDir,
|
|
55
|
+
customScalarNames,
|
|
56
|
+
customScalars,
|
|
57
|
+
directiveDefinitions,
|
|
58
|
+
enablePruning,
|
|
59
|
+
sourceRoot,
|
|
60
|
+
knownTypeNames,
|
|
61
|
+
} = input;
|
|
62
|
+
|
|
63
|
+
const autoTypeResult = generateAutoTypes({
|
|
64
|
+
extractedTypes,
|
|
65
|
+
resolversResult,
|
|
66
|
+
knownTypeNames: knownTypeNames ?? new Set(),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const autoTypeErrors = autoTypeResult.diagnostics.filter(
|
|
70
|
+
(d) => d.severity === "error",
|
|
71
|
+
);
|
|
72
|
+
if (autoTypeErrors.length > 0) {
|
|
73
|
+
return {
|
|
74
|
+
typeDefsCode: "",
|
|
75
|
+
sdlContent: "",
|
|
76
|
+
resolversCode: "",
|
|
77
|
+
diagnostics: autoTypeResult.diagnostics,
|
|
78
|
+
hasErrors: true,
|
|
79
|
+
prunedTypes: null,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const userDefinedTypes = extractedTypes.map((t) => ({
|
|
84
|
+
name: t.metadata.name,
|
|
85
|
+
sourceLocation: t.metadata.sourceLocation,
|
|
86
|
+
}));
|
|
87
|
+
|
|
88
|
+
const collisionResult = validateNameCollisions({
|
|
89
|
+
userDefinedTypes,
|
|
90
|
+
autoGeneratedTypes: autoTypeResult.autoGeneratedTypes,
|
|
91
|
+
sourceRoot,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
if (collisionResult.hasCollisions) {
|
|
95
|
+
return {
|
|
96
|
+
typeDefsCode: "",
|
|
97
|
+
sdlContent: "",
|
|
98
|
+
resolversCode: "",
|
|
99
|
+
diagnostics: collisionResult.diagnostics,
|
|
100
|
+
hasErrors: true,
|
|
101
|
+
prunedTypes: null,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Re-convert to GraphQL types using updated extracted types
|
|
106
|
+
// This resolves __INLINE_OBJECT__ references to auto-generated type names
|
|
107
|
+
const updatedConversionResult = convertToGraphQL(
|
|
108
|
+
autoTypeResult.updatedExtractedTypes,
|
|
109
|
+
);
|
|
110
|
+
const updatedTypesResult: ExtractTypesResult = {
|
|
111
|
+
types: updatedConversionResult.types,
|
|
112
|
+
diagnostics: {
|
|
113
|
+
errors: [
|
|
114
|
+
...typesResult.diagnostics.errors,
|
|
115
|
+
...updatedConversionResult.diagnostics.filter(
|
|
116
|
+
(d) => d.severity === "error",
|
|
117
|
+
),
|
|
118
|
+
...autoTypeResult.diagnostics.filter((d) => d.severity === "error"),
|
|
119
|
+
],
|
|
120
|
+
warnings: [
|
|
121
|
+
...typesResult.diagnostics.warnings,
|
|
122
|
+
...updatedConversionResult.diagnostics.filter(
|
|
123
|
+
(d) => d.severity === "warning",
|
|
124
|
+
),
|
|
125
|
+
...autoTypeResult.diagnostics.filter((d) => d.severity === "warning"),
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const typeMap = new Map(
|
|
131
|
+
autoTypeResult.updatedExtractedTypes.map((t) => [t.metadata.name, t]),
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const manualResolveTypeNames = new Set(
|
|
135
|
+
autoTypeResult.updatedResolversResult.abstractTypeResolvers
|
|
136
|
+
.filter((r) => r.kind === "resolveType")
|
|
137
|
+
.map((r) => r.targetTypeName),
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const typenameResolveTypesResult = collectTypenameResolveTypes({
|
|
141
|
+
extractedTypes: autoTypeResult.updatedExtractedTypes,
|
|
142
|
+
typeMap,
|
|
143
|
+
manualResolveTypeNames,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const typenameExtractions = collectTypenameExtractions({
|
|
147
|
+
extractedTypes: autoTypeResult.updatedExtractedTypes,
|
|
148
|
+
typeMap,
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const typenameValidationDiagnostics: Diagnostic[] = [];
|
|
152
|
+
|
|
153
|
+
for (const extraction of typenameExtractions) {
|
|
154
|
+
const abstractType = typeMap.get(extraction.abstractTypeName);
|
|
155
|
+
if (!abstractType) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const validationResult = validateTypenames({
|
|
159
|
+
extractionResult: extraction,
|
|
160
|
+
sourceLocation: abstractType.metadata.sourceLocation,
|
|
161
|
+
inlineObjectMembers: abstractType.inlineObjectMembers,
|
|
162
|
+
});
|
|
163
|
+
typenameValidationDiagnostics.push(...validationResult.diagnostics);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const schemaTypenameValidationResult = validateSchemaTypenames({
|
|
167
|
+
objectTypes: autoTypeResult.updatedExtractedTypes,
|
|
168
|
+
typeMap,
|
|
169
|
+
});
|
|
170
|
+
typenameValidationDiagnostics.push(
|
|
171
|
+
...schemaTypenameValidationResult.diagnostics,
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
if (typenameValidationDiagnostics.length > 0) {
|
|
175
|
+
return {
|
|
176
|
+
typeDefsCode: "",
|
|
177
|
+
sdlContent: "",
|
|
178
|
+
resolversCode: "",
|
|
179
|
+
diagnostics: typenameValidationDiagnostics,
|
|
180
|
+
hasErrors: true,
|
|
181
|
+
prunedTypes: null,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const generatedInlineObjectTypes =
|
|
186
|
+
typenameResolveTypesResult.generatedInlineObjectTypes;
|
|
187
|
+
|
|
188
|
+
const updatedTypesForIntegration: ExtractTypesResult =
|
|
189
|
+
generatedInlineObjectTypes.length > 0
|
|
190
|
+
? {
|
|
191
|
+
types: updatedTypesResult.types.map((type) => {
|
|
192
|
+
if (type.kind !== "Union") {
|
|
193
|
+
return type;
|
|
194
|
+
}
|
|
195
|
+
const inlineTypes = generatedInlineObjectTypes.filter(
|
|
196
|
+
(g) => g.abstractTypeName === type.name,
|
|
197
|
+
);
|
|
198
|
+
if (inlineTypes.length === 0) {
|
|
199
|
+
return type;
|
|
200
|
+
}
|
|
201
|
+
const newMembers = inlineTypes.map((g) => g.typeName);
|
|
202
|
+
return {
|
|
203
|
+
...type,
|
|
204
|
+
unionMembers: [
|
|
205
|
+
...(type.unionMembers ?? []),
|
|
206
|
+
...newMembers,
|
|
207
|
+
].sort(),
|
|
208
|
+
};
|
|
209
|
+
}),
|
|
210
|
+
diagnostics: updatedTypesResult.diagnostics,
|
|
211
|
+
}
|
|
212
|
+
: updatedTypesResult;
|
|
213
|
+
|
|
214
|
+
const allAutoGeneratedTypes = [
|
|
215
|
+
...autoTypeResult.autoGeneratedTypes,
|
|
216
|
+
...typenameResolveTypesResult.generatedObjectTypes,
|
|
217
|
+
];
|
|
218
|
+
|
|
219
|
+
const integratedResult = integrate(
|
|
220
|
+
updatedTypesForIntegration,
|
|
221
|
+
autoTypeResult.updatedResolversResult,
|
|
222
|
+
customScalarNames,
|
|
223
|
+
customScalars,
|
|
224
|
+
directiveDefinitions,
|
|
225
|
+
allAutoGeneratedTypes,
|
|
226
|
+
typenameResolveTypesResult.autoResolveTypes,
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
let documentNode = buildDocumentNode(
|
|
230
|
+
integratedResult,
|
|
231
|
+
sourceRoot !== null ? { sourceRoot } : undefined,
|
|
232
|
+
);
|
|
233
|
+
let prunedTypes: ReadonlyArray<string> | null = null;
|
|
234
|
+
|
|
235
|
+
if (enablePruning) {
|
|
236
|
+
const pruneResult = pruneDocumentNode({
|
|
237
|
+
documentNode,
|
|
238
|
+
customScalarNames,
|
|
239
|
+
});
|
|
240
|
+
documentNode = pruneResult.documentNode;
|
|
241
|
+
prunedTypes = pruneResult.removedTypes;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const typeDefsCode = emitTypeDefsCode(
|
|
245
|
+
integratedResult,
|
|
246
|
+
sourceRoot !== null ? { sourceRoot } : undefined,
|
|
247
|
+
);
|
|
248
|
+
const sdlContent = emitSdlContent(documentNode);
|
|
249
|
+
|
|
250
|
+
const resolverInfo = collectResolverInfo(integratedResult);
|
|
251
|
+
const resolversCode = emitResolversCode({
|
|
252
|
+
resolverInfo,
|
|
253
|
+
outputDir,
|
|
254
|
+
customScalars: customScalars ?? [],
|
|
255
|
+
numericEnums: integratedResult.numericEnums,
|
|
256
|
+
stringEnumMappings: integratedResult.stringEnumMappings,
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
typeDefsCode,
|
|
261
|
+
sdlContent,
|
|
262
|
+
resolversCode,
|
|
263
|
+
diagnostics: integratedResult.diagnostics,
|
|
264
|
+
hasErrors: integratedResult.hasErrors,
|
|
265
|
+
prunedTypes,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export {
|
|
2
|
+
type GenerateSchemaInput,
|
|
3
|
+
type GenerateSchemaResult,
|
|
4
|
+
generateSchema,
|
|
5
|
+
} from "./generate-schema.js";
|
|
6
|
+
export type {
|
|
7
|
+
BaseField,
|
|
8
|
+
BaseType,
|
|
9
|
+
CustomScalarInfo,
|
|
10
|
+
ExtensionField,
|
|
11
|
+
IntegratedResult,
|
|
12
|
+
TypeExtension,
|
|
13
|
+
} from "./integrator/result-integrator.js";
|
|
14
|
+
export type {
|
|
15
|
+
AbstractTypeResolverInfo,
|
|
16
|
+
FieldResolver,
|
|
17
|
+
ResolverInfo,
|
|
18
|
+
TypeResolvers,
|
|
19
|
+
} from "./resolver-collector/resolver-collector.js";
|