@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,21 @@
|
|
|
1
|
+
export {
|
|
2
|
+
type AutoGeneratedEnumValue,
|
|
3
|
+
type AutoGeneratedField,
|
|
4
|
+
type AutoGeneratedType,
|
|
5
|
+
type AutoTypeGeneratorInput,
|
|
6
|
+
type AutoTypeGeneratorResult,
|
|
7
|
+
type GeneratedFromInfo,
|
|
8
|
+
generateAutoTypes,
|
|
9
|
+
} from "./auto-type-generator.js";
|
|
10
|
+
export {
|
|
11
|
+
type NameCollisionValidatorInput,
|
|
12
|
+
type NameCollisionValidatorResult,
|
|
13
|
+
type UserDefinedTypeInfo,
|
|
14
|
+
validateNameCollisions,
|
|
15
|
+
} from "./name-collision-validator.js";
|
|
16
|
+
export type {
|
|
17
|
+
AutoTypeNameContext,
|
|
18
|
+
InputFieldContext,
|
|
19
|
+
ObjectFieldContext,
|
|
20
|
+
ResolverArgContext,
|
|
21
|
+
} from "./naming-convention.js";
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import type ts from "typescript";
|
|
2
|
+
import type {
|
|
3
|
+
ExtractResolversResult,
|
|
4
|
+
GraphQLFieldDefinition,
|
|
5
|
+
} from "../resolver-extractor/index.js";
|
|
6
|
+
import type { DeprecationInfo } from "../shared/tsdoc-parser.js";
|
|
7
|
+
import type {
|
|
8
|
+
ExtractedTypeInfo,
|
|
9
|
+
FieldDefinition,
|
|
10
|
+
InlineEnumMemberInfo,
|
|
11
|
+
InlineObjectPropertyDef,
|
|
12
|
+
SourceLocation,
|
|
13
|
+
} from "../type-extractor/types/index.js";
|
|
14
|
+
import {
|
|
15
|
+
type AutoTypeNameContext,
|
|
16
|
+
buildFieldContext,
|
|
17
|
+
} from "./naming-convention.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Inline enum with context information for naming and generation.
|
|
21
|
+
*/
|
|
22
|
+
export interface InlineEnumWithContext {
|
|
23
|
+
readonly members: ReadonlyArray<InlineEnumMemberInfo>;
|
|
24
|
+
readonly context: AutoTypeNameContext;
|
|
25
|
+
readonly sourceLocation: SourceLocation;
|
|
26
|
+
readonly nullable: boolean;
|
|
27
|
+
/** External TypeScript enum symbol for deduplication (null for string literal unions) */
|
|
28
|
+
readonly externalEnumSymbol: ts.Symbol | null;
|
|
29
|
+
/** TSDoc description from the external enum type itself (null for string literal unions) */
|
|
30
|
+
readonly externalEnumDescription: string | null;
|
|
31
|
+
/** @deprecated tag from the external enum type itself (null for string literal unions) */
|
|
32
|
+
readonly externalEnumDeprecated: DeprecationInfo | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isInputTypeName(name: string): boolean {
|
|
36
|
+
return name.endsWith("Input");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Collect inline enums from ExtractedTypeInfo.
|
|
41
|
+
* Task 4.1: Traverse type fields to find inline enums with context.
|
|
42
|
+
*/
|
|
43
|
+
export function collectInlineEnumsFromTypes(
|
|
44
|
+
extractedTypes: ReadonlyArray<ExtractedTypeInfo>,
|
|
45
|
+
): InlineEnumWithContext[] {
|
|
46
|
+
const results: InlineEnumWithContext[] = [];
|
|
47
|
+
|
|
48
|
+
for (const typeInfo of extractedTypes) {
|
|
49
|
+
const isInput = isInputTypeName(typeInfo.metadata.name);
|
|
50
|
+
|
|
51
|
+
for (const field of typeInfo.fields) {
|
|
52
|
+
collectInlineEnumsFromField(
|
|
53
|
+
field,
|
|
54
|
+
typeInfo.metadata.name,
|
|
55
|
+
[],
|
|
56
|
+
isInput,
|
|
57
|
+
typeInfo.metadata.sourceFile,
|
|
58
|
+
results,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function collectInlineEnumsFromField(
|
|
67
|
+
field: FieldDefinition,
|
|
68
|
+
parentTypeName: string,
|
|
69
|
+
parentPath: ReadonlyArray<string>,
|
|
70
|
+
isInput: boolean,
|
|
71
|
+
sourceFile: string,
|
|
72
|
+
results: InlineEnumWithContext[],
|
|
73
|
+
): void {
|
|
74
|
+
const tsType = field.tsType;
|
|
75
|
+
const fieldPath = [...parentPath, field.name];
|
|
76
|
+
|
|
77
|
+
if (tsType.kind === "inlineEnum" && tsType.inlineEnumMembers) {
|
|
78
|
+
results.push({
|
|
79
|
+
members: tsType.inlineEnumMembers,
|
|
80
|
+
context: buildFieldContext(parentTypeName, fieldPath, isInput),
|
|
81
|
+
sourceLocation: field.sourceLocation ?? {
|
|
82
|
+
file: sourceFile,
|
|
83
|
+
line: 1,
|
|
84
|
+
column: 1,
|
|
85
|
+
},
|
|
86
|
+
nullable: tsType.nullable,
|
|
87
|
+
externalEnumSymbol: tsType.externalEnumSymbol,
|
|
88
|
+
externalEnumDescription: tsType.externalEnumDescription,
|
|
89
|
+
externalEnumDeprecated: tsType.externalEnumDeprecated,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (
|
|
94
|
+
tsType.kind === "array" &&
|
|
95
|
+
tsType.elementType?.kind === "inlineEnum" &&
|
|
96
|
+
tsType.elementType.inlineEnumMembers
|
|
97
|
+
) {
|
|
98
|
+
results.push({
|
|
99
|
+
members: tsType.elementType.inlineEnumMembers,
|
|
100
|
+
context: buildFieldContext(parentTypeName, fieldPath, isInput),
|
|
101
|
+
sourceLocation: field.sourceLocation ?? {
|
|
102
|
+
file: sourceFile,
|
|
103
|
+
line: 1,
|
|
104
|
+
column: 1,
|
|
105
|
+
},
|
|
106
|
+
nullable: tsType.elementType.nullable,
|
|
107
|
+
externalEnumSymbol: tsType.elementType.externalEnumSymbol,
|
|
108
|
+
externalEnumDescription: tsType.elementType.externalEnumDescription,
|
|
109
|
+
externalEnumDeprecated: tsType.elementType.externalEnumDeprecated,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
|
|
114
|
+
collectInlineEnumsFromInlineObjectProperties(
|
|
115
|
+
tsType.inlineObjectProperties,
|
|
116
|
+
parentTypeName,
|
|
117
|
+
fieldPath,
|
|
118
|
+
isInput,
|
|
119
|
+
sourceFile,
|
|
120
|
+
results,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function collectInlineEnumsFromInlineObjectProperties(
|
|
126
|
+
properties: ReadonlyArray<InlineObjectPropertyDef>,
|
|
127
|
+
parentTypeName: string,
|
|
128
|
+
parentPath: ReadonlyArray<string>,
|
|
129
|
+
isInput: boolean,
|
|
130
|
+
sourceFile: string,
|
|
131
|
+
results: InlineEnumWithContext[],
|
|
132
|
+
): void {
|
|
133
|
+
for (const prop of properties) {
|
|
134
|
+
const propPath = [...parentPath, prop.name];
|
|
135
|
+
const tsType = prop.tsType;
|
|
136
|
+
|
|
137
|
+
if (tsType.kind === "inlineEnum" && tsType.inlineEnumMembers) {
|
|
138
|
+
results.push({
|
|
139
|
+
members: tsType.inlineEnumMembers,
|
|
140
|
+
context: buildFieldContext(parentTypeName, propPath, isInput),
|
|
141
|
+
sourceLocation: prop.sourceLocation ?? {
|
|
142
|
+
file: sourceFile,
|
|
143
|
+
line: 1,
|
|
144
|
+
column: 1,
|
|
145
|
+
},
|
|
146
|
+
nullable: tsType.nullable,
|
|
147
|
+
externalEnumSymbol: tsType.externalEnumSymbol,
|
|
148
|
+
externalEnumDescription: tsType.externalEnumDescription,
|
|
149
|
+
externalEnumDeprecated: tsType.externalEnumDeprecated,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
|
|
154
|
+
collectInlineEnumsFromInlineObjectProperties(
|
|
155
|
+
tsType.inlineObjectProperties,
|
|
156
|
+
parentTypeName,
|
|
157
|
+
propPath,
|
|
158
|
+
isInput,
|
|
159
|
+
sourceFile,
|
|
160
|
+
results,
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Collect inline enums from ExtractResolversResult.
|
|
168
|
+
* Task 4.2: Traverse resolver args to find inline enums with context.
|
|
169
|
+
*/
|
|
170
|
+
export function collectInlineEnumsFromResolvers(
|
|
171
|
+
resolversResult: ExtractResolversResult,
|
|
172
|
+
): InlineEnumWithContext[] {
|
|
173
|
+
const results: InlineEnumWithContext[] = [];
|
|
174
|
+
|
|
175
|
+
for (const field of resolversResult.queryFields.fields) {
|
|
176
|
+
collectInlineEnumsFromResolverArgs(field, "query", null, results);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
for (const field of resolversResult.mutationFields.fields) {
|
|
180
|
+
collectInlineEnumsFromResolverArgs(field, "mutation", null, results);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
for (const ext of resolversResult.typeExtensions) {
|
|
184
|
+
for (const field of ext.fields) {
|
|
185
|
+
collectInlineEnumsFromResolverArgs(
|
|
186
|
+
field,
|
|
187
|
+
"field",
|
|
188
|
+
ext.targetTypeName,
|
|
189
|
+
results,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return results;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function collectInlineEnumsFromResolverArgs(
|
|
198
|
+
field: GraphQLFieldDefinition,
|
|
199
|
+
resolverType: "query" | "mutation" | "field",
|
|
200
|
+
parentTypeName: string | null,
|
|
201
|
+
results: InlineEnumWithContext[],
|
|
202
|
+
): void {
|
|
203
|
+
if (!field.args) return;
|
|
204
|
+
|
|
205
|
+
for (const arg of field.args) {
|
|
206
|
+
if (arg.inlineEnumMembers) {
|
|
207
|
+
const context: AutoTypeNameContext = {
|
|
208
|
+
kind: "resolverArg",
|
|
209
|
+
resolverType,
|
|
210
|
+
fieldName: field.name,
|
|
211
|
+
argName: arg.name,
|
|
212
|
+
parentTypeName,
|
|
213
|
+
fieldPath: [],
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
results.push({
|
|
217
|
+
members: arg.inlineEnumMembers,
|
|
218
|
+
context,
|
|
219
|
+
sourceLocation: field.sourceLocation,
|
|
220
|
+
nullable: arg.type.nullable,
|
|
221
|
+
externalEnumSymbol: arg.externalEnumSymbol,
|
|
222
|
+
externalEnumDescription: arg.externalEnumDescription,
|
|
223
|
+
externalEnumDeprecated: arg.externalEnumDeprecated,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (arg.inlineObjectProperties) {
|
|
228
|
+
collectInlineEnumsFromInlineObjectArg(
|
|
229
|
+
arg.inlineObjectProperties,
|
|
230
|
+
resolverType,
|
|
231
|
+
field.name,
|
|
232
|
+
arg.name,
|
|
233
|
+
parentTypeName,
|
|
234
|
+
[],
|
|
235
|
+
field.sourceLocation,
|
|
236
|
+
results,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function collectInlineEnumsFromInlineObjectArg(
|
|
243
|
+
properties: ReadonlyArray<InlineObjectPropertyDef>,
|
|
244
|
+
resolverType: "query" | "mutation" | "field",
|
|
245
|
+
fieldName: string,
|
|
246
|
+
argName: string,
|
|
247
|
+
parentTypeName: string | null,
|
|
248
|
+
parentPath: ReadonlyArray<string>,
|
|
249
|
+
sourceLocation: SourceLocation,
|
|
250
|
+
results: InlineEnumWithContext[],
|
|
251
|
+
): void {
|
|
252
|
+
for (const prop of properties) {
|
|
253
|
+
const propPath = [...parentPath, prop.name];
|
|
254
|
+
const tsType = prop.tsType;
|
|
255
|
+
|
|
256
|
+
if (tsType.kind === "inlineEnum" && tsType.inlineEnumMembers) {
|
|
257
|
+
const context: AutoTypeNameContext = {
|
|
258
|
+
kind: "resolverArg",
|
|
259
|
+
resolverType,
|
|
260
|
+
fieldName,
|
|
261
|
+
argName,
|
|
262
|
+
parentTypeName,
|
|
263
|
+
fieldPath: propPath,
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
results.push({
|
|
267
|
+
members: tsType.inlineEnumMembers,
|
|
268
|
+
context,
|
|
269
|
+
sourceLocation: prop.sourceLocation ?? sourceLocation,
|
|
270
|
+
nullable: tsType.nullable,
|
|
271
|
+
externalEnumSymbol: tsType.externalEnumSymbol,
|
|
272
|
+
externalEnumDescription: tsType.externalEnumDescription,
|
|
273
|
+
externalEnumDeprecated: tsType.externalEnumDeprecated,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (tsType.kind === "inlineObject" && tsType.inlineObjectProperties) {
|
|
278
|
+
collectInlineEnumsFromInlineObjectArg(
|
|
279
|
+
tsType.inlineObjectProperties,
|
|
280
|
+
resolverType,
|
|
281
|
+
fieldName,
|
|
282
|
+
argName,
|
|
283
|
+
parentTypeName,
|
|
284
|
+
propPath,
|
|
285
|
+
sourceLocation,
|
|
286
|
+
results,
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { relative } from "node:path";
|
|
2
|
+
import type {
|
|
3
|
+
Diagnostic,
|
|
4
|
+
SourceLocation,
|
|
5
|
+
} from "../type-extractor/types/index.js";
|
|
6
|
+
import type { AutoGeneratedType } from "./auto-type-generator.js";
|
|
7
|
+
|
|
8
|
+
export interface UserDefinedTypeInfo {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly sourceLocation: SourceLocation;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface NameCollisionValidatorInput {
|
|
14
|
+
readonly userDefinedTypes: ReadonlyArray<UserDefinedTypeInfo>;
|
|
15
|
+
readonly autoGeneratedTypes: ReadonlyArray<AutoGeneratedType>;
|
|
16
|
+
readonly sourceRoot: string | null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface NameCollisionValidatorResult {
|
|
20
|
+
readonly hasCollisions: boolean;
|
|
21
|
+
readonly diagnostics: ReadonlyArray<Diagnostic>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function formatLocation(
|
|
25
|
+
loc: SourceLocation,
|
|
26
|
+
sourceRoot: string | null,
|
|
27
|
+
): string {
|
|
28
|
+
let filePath = loc.file;
|
|
29
|
+
if (sourceRoot !== null) {
|
|
30
|
+
filePath = relative(sourceRoot, filePath);
|
|
31
|
+
}
|
|
32
|
+
const normalizedPath = filePath.replaceAll("\\", "/");
|
|
33
|
+
return `${normalizedPath}:${loc.line}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function findUserDefinedCollisions(
|
|
37
|
+
userDefinedTypes: ReadonlyArray<UserDefinedTypeInfo>,
|
|
38
|
+
autoGeneratedTypes: ReadonlyArray<AutoGeneratedType>,
|
|
39
|
+
sourceRoot: string | null,
|
|
40
|
+
): Diagnostic[] {
|
|
41
|
+
const diagnostics: Diagnostic[] = [];
|
|
42
|
+
|
|
43
|
+
const userTypeMap = new Map<string, UserDefinedTypeInfo>();
|
|
44
|
+
for (const userType of userDefinedTypes) {
|
|
45
|
+
userTypeMap.set(userType.name, userType);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for (const autoType of autoGeneratedTypes) {
|
|
49
|
+
const userType = userTypeMap.get(autoType.name);
|
|
50
|
+
if (userType) {
|
|
51
|
+
diagnostics.push({
|
|
52
|
+
code: "AUTO_TYPE_NAME_COLLISION_USER",
|
|
53
|
+
message: `Auto-generated type '${autoType.name}' conflicts with user-defined type at ${formatLocation(userType.sourceLocation, sourceRoot)}. Consider renaming the field or using an explicit type definition.`,
|
|
54
|
+
severity: "error",
|
|
55
|
+
location: autoType.sourceLocation,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return diagnostics;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function findAutoGeneratedCollisions(
|
|
64
|
+
autoGeneratedTypes: ReadonlyArray<AutoGeneratedType>,
|
|
65
|
+
sourceRoot: string | null,
|
|
66
|
+
): Diagnostic[] {
|
|
67
|
+
const diagnostics: Diagnostic[] = [];
|
|
68
|
+
|
|
69
|
+
const typesByName = new Map<string, AutoGeneratedType[]>();
|
|
70
|
+
for (const autoType of autoGeneratedTypes) {
|
|
71
|
+
const existing = typesByName.get(autoType.name);
|
|
72
|
+
if (existing) {
|
|
73
|
+
existing.push(autoType);
|
|
74
|
+
} else {
|
|
75
|
+
typesByName.set(autoType.name, [autoType]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (const [name, types] of typesByName) {
|
|
80
|
+
if (types.length > 1) {
|
|
81
|
+
const locations = types
|
|
82
|
+
.map((t) => formatLocation(t.sourceLocation, sourceRoot))
|
|
83
|
+
.join(", ");
|
|
84
|
+
const firstType = types[0];
|
|
85
|
+
if (firstType) {
|
|
86
|
+
diagnostics.push({
|
|
87
|
+
code: "AUTO_TYPE_NAME_COLLISION_AUTO",
|
|
88
|
+
message: `Auto-generated type name '${name}' is generated from multiple sources: ${locations}. Use explicit type definitions to resolve the conflict.`,
|
|
89
|
+
severity: "error",
|
|
90
|
+
location: firstType.sourceLocation,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return diagnostics;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function validateNameCollisions(
|
|
100
|
+
input: NameCollisionValidatorInput,
|
|
101
|
+
): NameCollisionValidatorResult {
|
|
102
|
+
const userCollisions = findUserDefinedCollisions(
|
|
103
|
+
input.userDefinedTypes,
|
|
104
|
+
input.autoGeneratedTypes,
|
|
105
|
+
input.sourceRoot,
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const autoCollisions = findAutoGeneratedCollisions(
|
|
109
|
+
input.autoGeneratedTypes,
|
|
110
|
+
input.sourceRoot,
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
const diagnostics = [...userCollisions, ...autoCollisions];
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
hasCollisions: diagnostics.length > 0,
|
|
117
|
+
diagnostics,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context for generating auto type names based on different scenarios.
|
|
3
|
+
*/
|
|
4
|
+
export type AutoTypeNameContext =
|
|
5
|
+
| ObjectFieldContext
|
|
6
|
+
| InputFieldContext
|
|
7
|
+
| ResolverArgContext;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Context for Object type field inline objects.
|
|
11
|
+
* Generated name: {ParentTypeName}{PascalCaseFieldPath}
|
|
12
|
+
*/
|
|
13
|
+
export interface ObjectFieldContext {
|
|
14
|
+
readonly kind: "objectField";
|
|
15
|
+
readonly parentTypeName: string;
|
|
16
|
+
readonly fieldPath: ReadonlyArray<string>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Context for Input type field inline objects.
|
|
21
|
+
* Generated name: {ParentTypeNameWithoutInputSuffix}{PascalCaseFieldPath}Input
|
|
22
|
+
*/
|
|
23
|
+
export interface InputFieldContext {
|
|
24
|
+
readonly kind: "inputField";
|
|
25
|
+
readonly parentTypeName: string;
|
|
26
|
+
readonly fieldPath: ReadonlyArray<string>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Context for resolver argument inline objects.
|
|
31
|
+
* Query/Mutation: {PascalCaseFieldName}{PascalCaseArgName}{NestedPath}Input
|
|
32
|
+
* Field resolver: {ParentTypeName}{PascalCaseFieldName}{PascalCaseArgName}{NestedPath}Input
|
|
33
|
+
*/
|
|
34
|
+
export interface ResolverArgContext {
|
|
35
|
+
readonly kind: "resolverArg";
|
|
36
|
+
readonly resolverType: "query" | "mutation" | "field";
|
|
37
|
+
readonly fieldName: string;
|
|
38
|
+
readonly argName: string;
|
|
39
|
+
readonly parentTypeName: string | null;
|
|
40
|
+
readonly fieldPath: ReadonlyArray<string>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Convert a string to PascalCase.
|
|
45
|
+
* Handles camelCase, snake_case, and kebab-case inputs.
|
|
46
|
+
*/
|
|
47
|
+
function toPascalCase(str: string): string {
|
|
48
|
+
if (str.length === 0) return str;
|
|
49
|
+
|
|
50
|
+
return str
|
|
51
|
+
.split(/[-_\s]+/)
|
|
52
|
+
.map((part) =>
|
|
53
|
+
part
|
|
54
|
+
.split(/(?=[A-Z])/)
|
|
55
|
+
.map(
|
|
56
|
+
(segment) =>
|
|
57
|
+
segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase(),
|
|
58
|
+
)
|
|
59
|
+
.join(""),
|
|
60
|
+
)
|
|
61
|
+
.join("");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Remove Input suffix from type name if present.
|
|
66
|
+
*/
|
|
67
|
+
function removeInputSuffix(typeName: string): string {
|
|
68
|
+
if (typeName.endsWith("Input")) {
|
|
69
|
+
return typeName.slice(0, -5);
|
|
70
|
+
}
|
|
71
|
+
return typeName;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Build a field context (object or input) based on the parent type name.
|
|
76
|
+
*/
|
|
77
|
+
export function buildFieldContext(
|
|
78
|
+
parentTypeName: string,
|
|
79
|
+
fieldPath: ReadonlyArray<string>,
|
|
80
|
+
isInput: boolean,
|
|
81
|
+
): ObjectFieldContext | InputFieldContext {
|
|
82
|
+
return isInput
|
|
83
|
+
? { kind: "inputField", parentTypeName, fieldPath }
|
|
84
|
+
: { kind: "objectField", parentTypeName, fieldPath };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Generate auto type name based on context.
|
|
89
|
+
*/
|
|
90
|
+
export function generateAutoTypeName(context: AutoTypeNameContext): string {
|
|
91
|
+
switch (context.kind) {
|
|
92
|
+
case "objectField":
|
|
93
|
+
return generateObjectFieldTypeName(context);
|
|
94
|
+
case "inputField":
|
|
95
|
+
return generateInputFieldTypeName(context);
|
|
96
|
+
case "resolverArg":
|
|
97
|
+
return generateResolverArgTypeName(context);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function generateObjectFieldTypeName(context: ObjectFieldContext): string {
|
|
102
|
+
const pathParts = context.fieldPath.map(toPascalCase).join("");
|
|
103
|
+
return `${context.parentTypeName}${pathParts}`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function generateInputFieldTypeName(context: InputFieldContext): string {
|
|
107
|
+
const baseName = removeInputSuffix(context.parentTypeName);
|
|
108
|
+
const pathParts = context.fieldPath.map(toPascalCase).join("");
|
|
109
|
+
return `${baseName}${pathParts}Input`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function generateResolverArgTypeName(context: ResolverArgContext): string {
|
|
113
|
+
const fieldNamePascal = toPascalCase(context.fieldName);
|
|
114
|
+
// Avoid "InputInput" duplication when argName is "input"
|
|
115
|
+
const argNamePascal =
|
|
116
|
+
context.argName.toLowerCase() === "input"
|
|
117
|
+
? ""
|
|
118
|
+
: toPascalCase(context.argName);
|
|
119
|
+
const pathParts = context.fieldPath.map(toPascalCase).join("");
|
|
120
|
+
|
|
121
|
+
if (context.resolverType === "field" && context.parentTypeName) {
|
|
122
|
+
return `${context.parentTypeName}${fieldNamePascal}${argNamePascal}${pathParts}Input`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return `${fieldNamePascal}${argNamePascal}${pathParts}Input`;
|
|
126
|
+
}
|
package/src/cli.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { cli } from "gunshi";
|
|
2
|
+
import { genCommand } from "./commands/gen.js";
|
|
3
|
+
import { mainCommand } from "./commands/main.js";
|
|
4
|
+
|
|
5
|
+
await cli(process.argv.slice(2), mainCommand, {
|
|
6
|
+
name: "gqlkit",
|
|
7
|
+
version: "0.0.0",
|
|
8
|
+
subCommands: {
|
|
9
|
+
gen: genCommand,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { dirname } from "node:path";
|
|
2
|
+
import { define } from "gunshi";
|
|
3
|
+
import { loadConfig } from "../config-loader/index.js";
|
|
4
|
+
import { executeHooks } from "../gen-orchestrator/hook-executor/hook-executor.js";
|
|
5
|
+
import {
|
|
6
|
+
executeGeneration,
|
|
7
|
+
type GenerationConfig,
|
|
8
|
+
writeGeneratedFiles,
|
|
9
|
+
} from "../gen-orchestrator/orchestrator.js";
|
|
10
|
+
import { createDiagnosticReporter } from "../gen-orchestrator/reporter/diagnostic-reporter.js";
|
|
11
|
+
import { createProgressReporter } from "../gen-orchestrator/reporter/progress-reporter.js";
|
|
12
|
+
|
|
13
|
+
export interface RunGenCommandOptions {
|
|
14
|
+
readonly cwd: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface RunGenCommandResult {
|
|
18
|
+
readonly exitCode: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function runGenCommand(
|
|
22
|
+
options: RunGenCommandOptions,
|
|
23
|
+
): Promise<RunGenCommandResult> {
|
|
24
|
+
const writer = {
|
|
25
|
+
stdout: (msg: string) => console.log(msg),
|
|
26
|
+
stderr: (msg: string) => console.error(msg),
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const progressReporter = createProgressReporter(writer);
|
|
30
|
+
const diagnosticReporter = createDiagnosticReporter(writer);
|
|
31
|
+
|
|
32
|
+
const configResult = await loadConfig({ cwd: options.cwd });
|
|
33
|
+
|
|
34
|
+
if (configResult.diagnostics.length > 0) {
|
|
35
|
+
diagnosticReporter.reportDiagnostics(configResult.diagnostics);
|
|
36
|
+
diagnosticReporter.reportError("Config load failed");
|
|
37
|
+
return { exitCode: 1 };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const configDir = configResult.configPath
|
|
41
|
+
? dirname(configResult.configPath)
|
|
42
|
+
: options.cwd;
|
|
43
|
+
|
|
44
|
+
const { sourceDir, sourceIgnoreGlobs, output, scalars, tsconfigPath } =
|
|
45
|
+
configResult.config;
|
|
46
|
+
|
|
47
|
+
const config: GenerationConfig = {
|
|
48
|
+
cwd: options.cwd,
|
|
49
|
+
sourceDir,
|
|
50
|
+
sourceIgnoreGlobs,
|
|
51
|
+
output,
|
|
52
|
+
configDir,
|
|
53
|
+
customScalars: scalars,
|
|
54
|
+
tsconfigPath,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
progressReporter.startPhase("Extracting types");
|
|
58
|
+
progressReporter.startPhase("Extracting resolvers");
|
|
59
|
+
progressReporter.startPhase("Generating schema");
|
|
60
|
+
|
|
61
|
+
const result = await executeGeneration(config);
|
|
62
|
+
|
|
63
|
+
if (result.diagnostics.length > 0) {
|
|
64
|
+
diagnosticReporter.reportDiagnostics(result.diagnostics);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!result.success) {
|
|
68
|
+
diagnosticReporter.reportError("Generation failed");
|
|
69
|
+
return { exitCode: 1 };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const writeResult = await writeGeneratedFiles({
|
|
73
|
+
files: result.files,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (!writeResult.success) {
|
|
77
|
+
diagnosticReporter.reportError("Failed to write output files");
|
|
78
|
+
return { exitCode: 1 };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const filePath of writeResult.filesWritten) {
|
|
82
|
+
progressReporter.fileWritten(filePath);
|
|
83
|
+
}
|
|
84
|
+
progressReporter.complete();
|
|
85
|
+
|
|
86
|
+
const { hooks } = configResult.config;
|
|
87
|
+
let hookFailed = false;
|
|
88
|
+
|
|
89
|
+
if (
|
|
90
|
+
writeResult.filesWritten.length > 0 &&
|
|
91
|
+
hooks.afterAllFileWrite.length > 0
|
|
92
|
+
) {
|
|
93
|
+
progressReporter.startHookPhase();
|
|
94
|
+
|
|
95
|
+
const hookResult = await executeHooks({
|
|
96
|
+
commands: hooks.afterAllFileWrite,
|
|
97
|
+
filePaths: writeResult.filesWritten,
|
|
98
|
+
cwd: options.cwd,
|
|
99
|
+
onHookComplete: (result) => {
|
|
100
|
+
if (result.success) {
|
|
101
|
+
progressReporter.hookCompleted(result.command);
|
|
102
|
+
} else {
|
|
103
|
+
progressReporter.hookFailed(
|
|
104
|
+
result.command,
|
|
105
|
+
result.exitCode,
|
|
106
|
+
result.stderr,
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
hookFailed = !hookResult.success;
|
|
113
|
+
const failedCount = hookResult.results.filter((r) => !r.success).length;
|
|
114
|
+
progressReporter.hookPhaseSummary(hookResult.results.length, failedCount);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (hookFailed) {
|
|
118
|
+
diagnosticReporter.reportError("Hook execution failed");
|
|
119
|
+
return { exitCode: 1 };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
diagnosticReporter.reportSuccess("Generation complete!");
|
|
123
|
+
return { exitCode: 0 };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export const genCommand = define({
|
|
127
|
+
name: "gen",
|
|
128
|
+
args: {
|
|
129
|
+
cwd: {
|
|
130
|
+
type: "string",
|
|
131
|
+
description: "Working directory for code generation",
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
run: async (ctx) => {
|
|
135
|
+
const cwd = ctx.values.cwd ?? process.cwd();
|
|
136
|
+
const result = await runGenCommand({ cwd });
|
|
137
|
+
if (result.exitCode !== 0) {
|
|
138
|
+
process.exitCode = result.exitCode;
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
});
|