@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
|
@@ -3,31 +3,17 @@ import ts from "typescript";
|
|
|
3
3
|
import { isInternalTypeSymbol } from "../../shared/constants.js";
|
|
4
4
|
import { detectDefaultValueMetadata } from "../../shared/default-value-detector.js";
|
|
5
5
|
import { detectDirectiveMetadata, hasDirectiveMetadata, unwrapDirectiveType, } from "../../shared/directive-detector.js";
|
|
6
|
+
import { detectIgnoreFieldsMetadata } from "../../shared/ignore-fields-detector.js";
|
|
7
|
+
import { validateIgnoreFields } from "../../shared/ignore-fields-validator.js";
|
|
6
8
|
import { extractInlineObjectProperties as extractInlineObjectPropertiesShared } from "../../shared/inline-object-extractor.js";
|
|
7
9
|
import { isInlineObjectType } from "../../shared/inline-object-utils.js";
|
|
8
10
|
import { extractImplementsFromDefineInterface, extractImplementsFromGqlTypeDef, isDefineInterfaceTypeAlias, } from "../../shared/interface-detector.js";
|
|
9
11
|
import { detectScalarMetadata } from "../../shared/metadata-detector.js";
|
|
10
12
|
import { getSourceLocationFromNode, } from "../../shared/source-location.js";
|
|
11
13
|
import { extractTsDocFromSymbol, extractTsDocInfo, } from "../../shared/tsdoc-parser.js";
|
|
12
|
-
import { extractPropertySymbols, getNonNullableTypes, hasUndefinedInType, isAnonymousObjectType, isExported, isNullableUnion, isNullOrUndefined, shouldTreatIntersectionAsInline, } from "../../shared/typescript-utils.js";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* Returns null if types are empty, don't have a common parent enum, or belong to different enums.
|
|
16
|
-
*/
|
|
17
|
-
function findEnumParentSymbol(types) {
|
|
18
|
-
if (types.length === 0)
|
|
19
|
-
return null;
|
|
20
|
-
const firstSymbol = types[0].symbol;
|
|
21
|
-
const parentSymbol = firstSymbol?.parent;
|
|
22
|
-
if (!parentSymbol || !(parentSymbol.flags & ts.SymbolFlags.Enum)) {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
const allBelongToSameEnum = types.every((t) => {
|
|
26
|
-
const sym = t.symbol;
|
|
27
|
-
return sym?.parent === parentSymbol;
|
|
28
|
-
});
|
|
29
|
-
return allBelongToSameEnum ? parentSymbol : null;
|
|
30
|
-
}
|
|
14
|
+
import { extractPropertySymbols, filterNonNullTypeNodes, findEnumParentSymbol, findNonNullTypeNode, getNonNullableTypes, getTypeNameFromNode, hasUndefinedInType, isAnonymousObjectType, isBooleanUnion, isExported, isNullableUnion, isNullOrUndefined, shouldTreatIntersectionAsInline, } from "../../shared/typescript-utils.js";
|
|
15
|
+
import { createArrayType, createInlineObjectType, createLiteralType, createPrimitiveType, createReferenceType, createScalarType, createUnionType, } from "../types/index.js";
|
|
16
|
+
import { resolveFieldType } from "./field-type-resolver.js";
|
|
31
17
|
function isDefaultExport(node, sourceFile) {
|
|
32
18
|
let hasDefaultExport = false;
|
|
33
19
|
const nodeName = node.name?.getText(sourceFile);
|
|
@@ -42,50 +28,36 @@ function isDefaultExport(node, sourceFile) {
|
|
|
42
28
|
});
|
|
43
29
|
return hasDefaultExport;
|
|
44
30
|
}
|
|
45
|
-
function isBooleanUnion(type) {
|
|
46
|
-
if (!type.isUnion())
|
|
47
|
-
return false;
|
|
48
|
-
const nonNullTypes = getNonNullableTypes(type);
|
|
49
|
-
return (nonNullTypes.length === 2 &&
|
|
50
|
-
nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral));
|
|
51
|
-
}
|
|
52
31
|
/**
|
|
53
32
|
* Attempts to extract a type as an inline object, with cycle detection.
|
|
54
33
|
* Returns a reference type if a cycle is detected, otherwise returns an inline object.
|
|
55
34
|
*/
|
|
56
|
-
function tryExtractAsInlineObject(type,
|
|
35
|
+
function tryExtractAsInlineObject(type, ctx) {
|
|
36
|
+
const { checker, visitedTypes } = ctx;
|
|
57
37
|
if (visitedTypes.has(type)) {
|
|
58
38
|
const typeName = type.symbol?.getName() ?? "Object";
|
|
59
39
|
return {
|
|
60
|
-
tsType: {
|
|
61
|
-
kind: "reference",
|
|
40
|
+
tsType: createReferenceType({
|
|
62
41
|
name: typeName === "__type" ? "Object" : typeName,
|
|
63
|
-
elementType: null,
|
|
64
|
-
members: null,
|
|
65
42
|
nullable: false,
|
|
66
|
-
|
|
67
|
-
inlineObjectProperties: null,
|
|
68
|
-
},
|
|
43
|
+
}),
|
|
69
44
|
};
|
|
70
45
|
}
|
|
71
46
|
visitedTypes.add(type);
|
|
72
|
-
const inlineProperties = extractInlineObjectPropertiesShared(type, checker, (t
|
|
47
|
+
const inlineProperties = extractInlineObjectPropertiesShared(type, checker, (t) => convertTsTypeToReference(t, ctx).tsType);
|
|
73
48
|
return {
|
|
74
|
-
tsType: {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
nullable: false,
|
|
80
|
-
scalarInfo: null,
|
|
81
|
-
inlineObjectProperties: inlineProperties,
|
|
82
|
-
},
|
|
49
|
+
tsType: createInlineObjectType({
|
|
50
|
+
properties: inlineProperties,
|
|
51
|
+
description: null,
|
|
52
|
+
deprecated: null,
|
|
53
|
+
}),
|
|
83
54
|
};
|
|
84
55
|
}
|
|
85
56
|
function findGlobalTypeMapping(typeName, globalTypeMappings) {
|
|
86
57
|
return globalTypeMappings.find((m) => m.typeName === typeName);
|
|
87
58
|
}
|
|
88
|
-
function convertTsTypeToReference(type,
|
|
59
|
+
function convertTsTypeToReference(type, ctx, typeNode) {
|
|
60
|
+
const { checker, globalTypeMappings, knownTypeNames } = ctx;
|
|
89
61
|
const metadataResult = detectScalarMetadata(type, checker);
|
|
90
62
|
// Skip scalar detection if it's an array of scalars (e.g., Int[])
|
|
91
63
|
// Array types should be handled by the array handling logic below
|
|
@@ -93,12 +65,8 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
93
65
|
!metadataResult.isPrimitive &&
|
|
94
66
|
!metadataResult.isList) {
|
|
95
67
|
return {
|
|
96
|
-
tsType: {
|
|
97
|
-
kind: "scalar",
|
|
68
|
+
tsType: createScalarType({
|
|
98
69
|
name: metadataResult.scalarName,
|
|
99
|
-
elementType: null,
|
|
100
|
-
members: null,
|
|
101
|
-
nullable: metadataResult.nullable,
|
|
102
70
|
scalarInfo: {
|
|
103
71
|
scalarName: metadataResult.scalarName,
|
|
104
72
|
typeName: metadataResult.scalarName,
|
|
@@ -106,22 +74,14 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
106
74
|
isCustom: true,
|
|
107
75
|
only: metadataResult.only,
|
|
108
76
|
},
|
|
109
|
-
|
|
110
|
-
},
|
|
77
|
+
nullable: metadataResult.nullable,
|
|
78
|
+
}),
|
|
111
79
|
};
|
|
112
80
|
}
|
|
113
81
|
if (isBooleanUnion(type)) {
|
|
114
82
|
const nullable = isNullableUnion(type);
|
|
115
83
|
return {
|
|
116
|
-
tsType: {
|
|
117
|
-
kind: "primitive",
|
|
118
|
-
name: "boolean",
|
|
119
|
-
elementType: null,
|
|
120
|
-
members: null,
|
|
121
|
-
nullable,
|
|
122
|
-
scalarInfo: null,
|
|
123
|
-
inlineObjectProperties: null,
|
|
124
|
-
},
|
|
84
|
+
tsType: createPrimitiveType({ name: "boolean", nullable }),
|
|
125
85
|
};
|
|
126
86
|
}
|
|
127
87
|
if (type.isUnion()) {
|
|
@@ -131,15 +91,7 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
131
91
|
if (aliasSymbol) {
|
|
132
92
|
const name = aliasSymbol.getName();
|
|
133
93
|
return {
|
|
134
|
-
tsType: {
|
|
135
|
-
kind: "reference",
|
|
136
|
-
name,
|
|
137
|
-
elementType: null,
|
|
138
|
-
members: null,
|
|
139
|
-
nullable,
|
|
140
|
-
scalarInfo: null,
|
|
141
|
-
inlineObjectProperties: null,
|
|
142
|
-
},
|
|
94
|
+
tsType: createReferenceType({ name, nullable }),
|
|
143
95
|
};
|
|
144
96
|
}
|
|
145
97
|
const nonNullTypes = getNonNullableTypes(type);
|
|
@@ -147,129 +99,72 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
147
99
|
const enumParentSymbol = findEnumParentSymbol(nonNullTypes);
|
|
148
100
|
if (enumParentSymbol) {
|
|
149
101
|
return {
|
|
150
|
-
tsType: {
|
|
151
|
-
kind: "reference",
|
|
102
|
+
tsType: createReferenceType({
|
|
152
103
|
name: enumParentSymbol.getName(),
|
|
153
|
-
elementType: null,
|
|
154
|
-
members: null,
|
|
155
104
|
nullable,
|
|
156
|
-
|
|
157
|
-
inlineObjectProperties: null,
|
|
158
|
-
},
|
|
105
|
+
}),
|
|
159
106
|
};
|
|
160
107
|
}
|
|
161
108
|
if (nonNullTypes.length === 1) {
|
|
162
|
-
|
|
109
|
+
// For nullable types like User | null, extract the non-null type node
|
|
110
|
+
const nonNullTypeNode = typeNode && ts.isUnionTypeNode(typeNode)
|
|
111
|
+
? findNonNullTypeNode(typeNode)
|
|
112
|
+
: undefined;
|
|
113
|
+
const innerResult = convertTsTypeToReference(nonNullTypes[0], ctx, nonNullTypeNode);
|
|
163
114
|
return {
|
|
164
115
|
tsType: { ...innerResult.tsType, nullable },
|
|
165
116
|
};
|
|
166
117
|
}
|
|
167
|
-
const memberResults = nonNullTypes.map((t) => convertTsTypeToReference(t,
|
|
118
|
+
const memberResults = nonNullTypes.map((t) => convertTsTypeToReference(t, ctx));
|
|
168
119
|
return {
|
|
169
|
-
tsType: {
|
|
170
|
-
kind: "union",
|
|
171
|
-
name: null,
|
|
172
|
-
elementType: null,
|
|
120
|
+
tsType: createUnionType({
|
|
173
121
|
members: memberResults.map((r) => r.tsType),
|
|
174
122
|
nullable,
|
|
175
|
-
|
|
176
|
-
inlineObjectProperties: null,
|
|
177
|
-
},
|
|
123
|
+
}),
|
|
178
124
|
};
|
|
179
125
|
}
|
|
180
126
|
if (checker.isArrayType(type)) {
|
|
181
127
|
const typeArgs = type.typeArguments;
|
|
182
128
|
const elementType = typeArgs?.[0];
|
|
129
|
+
// Extract element type node from array type node (e.g., User[] -> User)
|
|
130
|
+
let elementTypeNode;
|
|
131
|
+
if (typeNode && ts.isArrayTypeNode(typeNode)) {
|
|
132
|
+
elementTypeNode = typeNode.elementType;
|
|
133
|
+
}
|
|
183
134
|
const elementResult = elementType
|
|
184
|
-
? convertTsTypeToReference(elementType,
|
|
135
|
+
? convertTsTypeToReference(elementType, ctx, elementTypeNode)
|
|
185
136
|
: {
|
|
186
|
-
tsType: {
|
|
187
|
-
kind: "primitive",
|
|
188
|
-
name: "unknown",
|
|
189
|
-
elementType: null,
|
|
190
|
-
members: null,
|
|
191
|
-
nullable: false,
|
|
192
|
-
scalarInfo: null,
|
|
193
|
-
inlineObjectProperties: null,
|
|
194
|
-
},
|
|
137
|
+
tsType: createPrimitiveType({ name: "unknown", nullable: false }),
|
|
195
138
|
};
|
|
196
139
|
return {
|
|
197
|
-
tsType:
|
|
198
|
-
kind: "array",
|
|
199
|
-
name: null,
|
|
200
|
-
elementType: elementResult.tsType,
|
|
201
|
-
members: null,
|
|
202
|
-
nullable: false,
|
|
203
|
-
scalarInfo: null,
|
|
204
|
-
inlineObjectProperties: null,
|
|
205
|
-
},
|
|
140
|
+
tsType: createArrayType(elementResult.tsType),
|
|
206
141
|
};
|
|
207
142
|
}
|
|
208
143
|
const typeString = checker.typeToString(type);
|
|
209
144
|
if (type.flags & ts.TypeFlags.String) {
|
|
210
145
|
return {
|
|
211
|
-
tsType: {
|
|
212
|
-
kind: "primitive",
|
|
213
|
-
name: "string",
|
|
214
|
-
elementType: null,
|
|
215
|
-
members: null,
|
|
216
|
-
nullable: false,
|
|
217
|
-
scalarInfo: null,
|
|
218
|
-
inlineObjectProperties: null,
|
|
219
|
-
},
|
|
146
|
+
tsType: createPrimitiveType({ name: "string", nullable: false }),
|
|
220
147
|
};
|
|
221
148
|
}
|
|
222
149
|
if (type.flags & ts.TypeFlags.Number) {
|
|
223
150
|
return {
|
|
224
|
-
tsType: {
|
|
225
|
-
kind: "primitive",
|
|
226
|
-
name: "number",
|
|
227
|
-
elementType: null,
|
|
228
|
-
members: null,
|
|
229
|
-
nullable: false,
|
|
230
|
-
scalarInfo: null,
|
|
231
|
-
inlineObjectProperties: null,
|
|
232
|
-
},
|
|
151
|
+
tsType: createPrimitiveType({ name: "number", nullable: false }),
|
|
233
152
|
};
|
|
234
153
|
}
|
|
235
154
|
if (type.flags & ts.TypeFlags.Boolean ||
|
|
236
155
|
type.flags & ts.TypeFlags.BooleanLiteral) {
|
|
237
156
|
return {
|
|
238
|
-
tsType: {
|
|
239
|
-
kind: "primitive",
|
|
240
|
-
name: "boolean",
|
|
241
|
-
elementType: null,
|
|
242
|
-
members: null,
|
|
243
|
-
nullable: false,
|
|
244
|
-
scalarInfo: null,
|
|
245
|
-
inlineObjectProperties: null,
|
|
246
|
-
},
|
|
157
|
+
tsType: createPrimitiveType({ name: "boolean", nullable: false }),
|
|
247
158
|
};
|
|
248
159
|
}
|
|
249
160
|
if (type.flags & ts.TypeFlags.StringLiteral) {
|
|
250
161
|
return {
|
|
251
|
-
tsType:
|
|
252
|
-
kind: "literal",
|
|
253
|
-
name: typeString.replace(/"/g, ""),
|
|
254
|
-
elementType: null,
|
|
255
|
-
members: null,
|
|
256
|
-
nullable: false,
|
|
257
|
-
scalarInfo: null,
|
|
258
|
-
inlineObjectProperties: null,
|
|
259
|
-
},
|
|
162
|
+
tsType: createLiteralType(typeString.replace(/"/g, "")),
|
|
260
163
|
};
|
|
261
164
|
}
|
|
262
165
|
if (type.flags & ts.TypeFlags.NumberLiteral) {
|
|
263
166
|
return {
|
|
264
|
-
tsType:
|
|
265
|
-
kind: "literal",
|
|
266
|
-
name: typeString,
|
|
267
|
-
elementType: null,
|
|
268
|
-
members: null,
|
|
269
|
-
nullable: false,
|
|
270
|
-
scalarInfo: null,
|
|
271
|
-
inlineObjectProperties: null,
|
|
272
|
-
},
|
|
167
|
+
tsType: createLiteralType(typeString),
|
|
273
168
|
};
|
|
274
169
|
}
|
|
275
170
|
// Handle intersection types that should be treated as inline objects
|
|
@@ -281,31 +176,43 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
281
176
|
if (type.aliasSymbol) {
|
|
282
177
|
const aliasName = type.aliasSymbol.getName();
|
|
283
178
|
return {
|
|
284
|
-
tsType: {
|
|
285
|
-
kind: "reference",
|
|
286
|
-
name: aliasName,
|
|
287
|
-
elementType: null,
|
|
288
|
-
members: null,
|
|
289
|
-
nullable: false,
|
|
290
|
-
scalarInfo: null,
|
|
291
|
-
inlineObjectProperties: null,
|
|
292
|
-
},
|
|
179
|
+
tsType: createReferenceType({ name: aliasName, nullable: false }),
|
|
293
180
|
};
|
|
294
181
|
}
|
|
295
182
|
const shouldTreatAsInline = shouldTreatIntersectionAsInline(type);
|
|
296
183
|
if (shouldTreatAsInline) {
|
|
297
|
-
return tryExtractAsInlineObject(type,
|
|
184
|
+
return tryExtractAsInlineObject(type, ctx);
|
|
298
185
|
}
|
|
299
186
|
}
|
|
300
187
|
if (isInlineObjectType(type)) {
|
|
301
|
-
|
|
188
|
+
// Check if typeNode references a known type (schema-defined type)
|
|
189
|
+
if (typeNode && ts.isTypeReferenceNode(typeNode)) {
|
|
190
|
+
const typeName = getTypeNameFromNode(typeNode);
|
|
191
|
+
if (typeName && knownTypeNames.has(typeName)) {
|
|
192
|
+
return {
|
|
193
|
+
tsType: createReferenceType({ name: typeName, nullable: false }),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return tryExtractAsInlineObject(type, ctx);
|
|
302
198
|
}
|
|
303
199
|
// Check for utility types (Omit, Pick, Partial, Required, etc.)
|
|
304
200
|
// These create mapped types that should be treated as inline objects
|
|
305
201
|
if (type.flags & ts.TypeFlags.Object) {
|
|
306
202
|
const objectType = type;
|
|
307
203
|
if (objectType.objectFlags & ts.ObjectFlags.Mapped) {
|
|
308
|
-
|
|
204
|
+
// Check if typeNode references a known type (schema-defined type).
|
|
205
|
+
// This handles Simplify<T> = { [K in keyof T]: T[K] } & {} pattern.
|
|
206
|
+
if (typeNode && ts.isTypeReferenceNode(typeNode)) {
|
|
207
|
+
const typeName = getTypeNameFromNode(typeNode);
|
|
208
|
+
// Only use typeNode name if it's in knownTypeNames (schema-defined type)
|
|
209
|
+
if (typeName && knownTypeNames.has(typeName)) {
|
|
210
|
+
return {
|
|
211
|
+
tsType: createReferenceType({ name: typeName, nullable: false }),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return tryExtractAsInlineObject(type, ctx);
|
|
309
216
|
}
|
|
310
217
|
}
|
|
311
218
|
if (type.symbol) {
|
|
@@ -315,12 +222,8 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
315
222
|
const globalMapping = findGlobalTypeMapping(symbolName, globalTypeMappings);
|
|
316
223
|
if (globalMapping) {
|
|
317
224
|
return {
|
|
318
|
-
tsType: {
|
|
319
|
-
kind: "scalar",
|
|
225
|
+
tsType: createScalarType({
|
|
320
226
|
name: globalMapping.scalarName,
|
|
321
|
-
elementType: null,
|
|
322
|
-
members: null,
|
|
323
|
-
nullable: false,
|
|
324
227
|
scalarInfo: {
|
|
325
228
|
scalarName: globalMapping.scalarName,
|
|
326
229
|
typeName: globalMapping.typeName,
|
|
@@ -328,36 +231,32 @@ function convertTsTypeToReference(type, checker, globalTypeMappings = [], visite
|
|
|
328
231
|
isCustom: true,
|
|
329
232
|
only: globalMapping.only,
|
|
330
233
|
},
|
|
331
|
-
|
|
332
|
-
},
|
|
234
|
+
nullable: false,
|
|
235
|
+
}),
|
|
333
236
|
};
|
|
334
237
|
}
|
|
335
238
|
return {
|
|
336
|
-
tsType: {
|
|
337
|
-
kind: "reference",
|
|
338
|
-
name: symbolName,
|
|
339
|
-
elementType: null,
|
|
340
|
-
members: null,
|
|
341
|
-
nullable: false,
|
|
342
|
-
scalarInfo: null,
|
|
343
|
-
inlineObjectProperties: null,
|
|
344
|
-
},
|
|
239
|
+
tsType: createReferenceType({ name: symbolName, nullable: false }),
|
|
345
240
|
};
|
|
346
241
|
}
|
|
347
242
|
}
|
|
348
243
|
return {
|
|
349
|
-
tsType: {
|
|
350
|
-
kind: "reference",
|
|
351
|
-
name: typeString,
|
|
352
|
-
elementType: null,
|
|
353
|
-
members: null,
|
|
354
|
-
nullable: false,
|
|
355
|
-
scalarInfo: null,
|
|
356
|
-
inlineObjectProperties: null,
|
|
357
|
-
},
|
|
244
|
+
tsType: createReferenceType({ name: typeString, nullable: false }),
|
|
358
245
|
};
|
|
359
246
|
}
|
|
360
|
-
function
|
|
247
|
+
function collectAllFieldNames(type, checker) {
|
|
248
|
+
const properties = extractPropertySymbols(type, checker);
|
|
249
|
+
const fieldNames = new Set();
|
|
250
|
+
for (const prop of properties) {
|
|
251
|
+
const propName = prop.getName();
|
|
252
|
+
if (!propName.startsWith(" $")) {
|
|
253
|
+
fieldNames.add(propName);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return fieldNames;
|
|
257
|
+
}
|
|
258
|
+
function extractFieldsFromType(params) {
|
|
259
|
+
const { type, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, sourceFiles, scalarMappingTable, scalarMappingContext, ignoreFields, } = params;
|
|
361
260
|
const fields = [];
|
|
362
261
|
const diagnostics = [];
|
|
363
262
|
const properties = extractPropertySymbols(type, checker);
|
|
@@ -366,6 +265,9 @@ function extractFieldsFromType(type, checker, globalTypeMappings = []) {
|
|
|
366
265
|
if (propName.startsWith(" $")) {
|
|
367
266
|
continue;
|
|
368
267
|
}
|
|
268
|
+
if (ignoreFields?.has(propName)) {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
369
271
|
const propType = checker.getTypeOfSymbol(prop);
|
|
370
272
|
const declarations = prop.getDeclarations();
|
|
371
273
|
const declaration = declarations?.[0];
|
|
@@ -408,11 +310,27 @@ function extractFieldsFromType(type, checker, globalTypeMappings = []) {
|
|
|
408
310
|
directiveNullable = true;
|
|
409
311
|
}
|
|
410
312
|
}
|
|
411
|
-
|
|
313
|
+
// Get typeNode from property declaration to preserve type alias names
|
|
314
|
+
let propTypeNode;
|
|
315
|
+
if (declaration &&
|
|
316
|
+
(ts.isPropertySignature(declaration) ||
|
|
317
|
+
ts.isPropertyDeclaration(declaration))) {
|
|
318
|
+
propTypeNode = declaration.type;
|
|
319
|
+
}
|
|
320
|
+
const resolvedType = resolveFieldType(actualPropType, propTypeNode, {
|
|
321
|
+
checker,
|
|
322
|
+
knownTypeNames,
|
|
323
|
+
knownTypeSymbols,
|
|
324
|
+
underlyingSymbolToTypeName,
|
|
325
|
+
globalTypeMappings,
|
|
326
|
+
sourceFiles,
|
|
327
|
+
scalarMappingTable,
|
|
328
|
+
scalarMappingContext,
|
|
329
|
+
});
|
|
412
330
|
// Preserve nullability from original WithDirectives type
|
|
413
|
-
const tsType = directiveNullable && !
|
|
414
|
-
? { ...
|
|
415
|
-
:
|
|
331
|
+
const tsType = directiveNullable && !resolvedType.nullable
|
|
332
|
+
? { ...resolvedType, nullable: true }
|
|
333
|
+
: resolvedType;
|
|
416
334
|
fields.push({
|
|
417
335
|
name: propName,
|
|
418
336
|
tsType,
|
|
@@ -567,12 +485,12 @@ function extractStringLiteralUnionMembers(type, checker) {
|
|
|
567
485
|
}
|
|
568
486
|
return members;
|
|
569
487
|
}
|
|
570
|
-
function determineTypeKind(node, type,
|
|
488
|
+
function determineTypeKind(node, type, checker) {
|
|
571
489
|
if (ts.isInterfaceDeclaration(node)) {
|
|
572
490
|
return "interface";
|
|
573
491
|
}
|
|
574
492
|
if (ts.isTypeAliasDeclaration(node)) {
|
|
575
|
-
if (isDefineInterfaceTypeAlias(node,
|
|
493
|
+
if (isDefineInterfaceTypeAlias(node, checker)) {
|
|
576
494
|
return "graphqlInterface";
|
|
577
495
|
}
|
|
578
496
|
const unionKind = determineTypeKindFromUnion(type);
|
|
@@ -633,7 +551,7 @@ function createGenericTypeDiagnostic(declaration, exportedName, location) {
|
|
|
633
551
|
return null;
|
|
634
552
|
}
|
|
635
553
|
function processReexportedSymbol(params) {
|
|
636
|
-
const { exportedName, resolvedSymbol, type, location, filePath, checker, globalTypeMappings, scannedSourceFiles, } = params;
|
|
554
|
+
const { exportedName, resolvedSymbol, type, location, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFiles, scalarMappingTable, scalarMappingContext, } = params;
|
|
637
555
|
const diagnostics = [];
|
|
638
556
|
const scalarMetadataResult = detectScalarMetadata(type, checker);
|
|
639
557
|
if (scalarMetadataResult.scalarName && !scalarMetadataResult.isPrimitive) {
|
|
@@ -710,10 +628,38 @@ function processReexportedSymbol(params) {
|
|
|
710
628
|
skip: false,
|
|
711
629
|
};
|
|
712
630
|
}
|
|
713
|
-
|
|
631
|
+
// Get typeNode for union member extraction from declaration
|
|
632
|
+
const reexportDeclarations = resolvedSymbol.getDeclarations();
|
|
633
|
+
const reexportDeclaration = reexportDeclarations?.[0];
|
|
634
|
+
const reexportTypeNode = reexportDeclaration && ts.isTypeAliasDeclaration(reexportDeclaration)
|
|
635
|
+
? reexportDeclaration.type
|
|
636
|
+
: undefined;
|
|
637
|
+
const unionMembers = extractUnionMembers(type, reexportTypeNode);
|
|
638
|
+
const ignoreFields = detectIgnoreFieldsMetadata({ type, checker });
|
|
639
|
+
if (ignoreFields !== null && kind !== "union") {
|
|
640
|
+
const allFieldNames = collectAllFieldNames(type, checker);
|
|
641
|
+
const validationDiagnostics = validateIgnoreFields({
|
|
642
|
+
typeName: exportedName,
|
|
643
|
+
ignoreFields,
|
|
644
|
+
allFieldNames,
|
|
645
|
+
sourceLocation: location,
|
|
646
|
+
});
|
|
647
|
+
diagnostics.push(...validationDiagnostics);
|
|
648
|
+
}
|
|
714
649
|
const fieldResult = kind === "union"
|
|
715
650
|
? { fields: [], diagnostics: [] }
|
|
716
|
-
: extractFieldsFromType(
|
|
651
|
+
: extractFieldsFromType({
|
|
652
|
+
type,
|
|
653
|
+
checker,
|
|
654
|
+
globalTypeMappings,
|
|
655
|
+
knownTypeNames,
|
|
656
|
+
knownTypeSymbols,
|
|
657
|
+
underlyingSymbolToTypeName,
|
|
658
|
+
sourceFiles: scannedSourceFiles,
|
|
659
|
+
scalarMappingTable,
|
|
660
|
+
scalarMappingContext,
|
|
661
|
+
ignoreFields,
|
|
662
|
+
});
|
|
717
663
|
diagnostics.push(...fieldResult.diagnostics);
|
|
718
664
|
return {
|
|
719
665
|
typeInfo: {
|
|
@@ -730,7 +676,7 @@ function processReexportedSymbol(params) {
|
|
|
730
676
|
skip: false,
|
|
731
677
|
};
|
|
732
678
|
}
|
|
733
|
-
function processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, scannedSourceFiles) {
|
|
679
|
+
function processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFiles, scalarMappingTable) {
|
|
734
680
|
const types = [];
|
|
735
681
|
const diagnostics = [];
|
|
736
682
|
const detectedScalarNames = [];
|
|
@@ -802,7 +748,12 @@ function processExportDeclaration(node, sourceFile, filePath, checker, globalTyp
|
|
|
802
748
|
filePath,
|
|
803
749
|
checker,
|
|
804
750
|
globalTypeMappings,
|
|
751
|
+
knownTypeNames,
|
|
752
|
+
knownTypeSymbols,
|
|
753
|
+
underlyingSymbolToTypeName,
|
|
805
754
|
scannedSourceFiles,
|
|
755
|
+
scalarMappingTable,
|
|
756
|
+
scalarMappingContext: exportedName.endsWith("Input") ? "input" : "output",
|
|
806
757
|
});
|
|
807
758
|
if (result.skip)
|
|
808
759
|
continue;
|
|
@@ -826,11 +777,15 @@ function getNamedTypeName(memberType) {
|
|
|
826
777
|
// For regular types, use symbol
|
|
827
778
|
return memberType.symbol?.getName() ?? "";
|
|
828
779
|
}
|
|
829
|
-
function extractInlineObjectMembers(
|
|
780
|
+
function extractInlineObjectMembers(params) {
|
|
781
|
+
const { type, checker, globalTypeMappings, knownTypeNames, typeNode } = params;
|
|
830
782
|
if (!type.isUnion()) {
|
|
831
783
|
return null;
|
|
832
784
|
}
|
|
833
785
|
const nonNullTypes = getNonNullableTypes(type);
|
|
786
|
+
const memberTypeNodes = typeNode && ts.isUnionTypeNode(typeNode)
|
|
787
|
+
? filterNonNullTypeNodes(typeNode)
|
|
788
|
+
: [];
|
|
834
789
|
const allObjectTypes = nonNullTypes.every((t) => (t.flags & ts.TypeFlags.Object) !== 0 ||
|
|
835
790
|
(t.flags & ts.TypeFlags.Intersection) !== 0);
|
|
836
791
|
if (nonNullTypes.length < 2 || !allObjectTypes) {
|
|
@@ -839,31 +794,55 @@ function extractInlineObjectMembers(type, checker, globalTypeMappings = []) {
|
|
|
839
794
|
let hasInlineObjects = false;
|
|
840
795
|
let hasNamedTypes = false;
|
|
841
796
|
const members = [];
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
deprecated: tsdocInfo.deprecated ?? null,
|
|
856
|
-
});
|
|
797
|
+
const ctx = {
|
|
798
|
+
checker,
|
|
799
|
+
globalTypeMappings,
|
|
800
|
+
knownTypeNames,
|
|
801
|
+
visitedTypes: new WeakSet(),
|
|
802
|
+
};
|
|
803
|
+
if (memberTypeNodes.length > 0) {
|
|
804
|
+
for (const memberNode of memberTypeNodes) {
|
|
805
|
+
if (ts.isTypeReferenceNode(memberNode)) {
|
|
806
|
+
hasNamedTypes = true;
|
|
807
|
+
}
|
|
808
|
+
else {
|
|
809
|
+
hasInlineObjects = true;
|
|
857
810
|
}
|
|
858
|
-
members.push({ properties: memberProperties });
|
|
859
811
|
}
|
|
860
|
-
|
|
861
|
-
|
|
812
|
+
}
|
|
813
|
+
else {
|
|
814
|
+
for (const memberType of nonNullTypes) {
|
|
815
|
+
if (isAnonymousObjectType(memberType)) {
|
|
816
|
+
hasInlineObjects = true;
|
|
817
|
+
}
|
|
818
|
+
else {
|
|
819
|
+
hasNamedTypes = true;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
if (hasInlineObjects) {
|
|
824
|
+
for (const memberType of nonNullTypes) {
|
|
825
|
+
if (isAnonymousObjectType(memberType)) {
|
|
826
|
+
const properties = memberType.getProperties();
|
|
827
|
+
const memberProperties = [];
|
|
828
|
+
for (const prop of properties) {
|
|
829
|
+
const propType = checker.getTypeOfSymbol(prop);
|
|
830
|
+
const tsdocInfo = extractTsDocFromSymbol(prop, checker);
|
|
831
|
+
const typeResult = convertTsTypeToReference(propType, ctx);
|
|
832
|
+
memberProperties.push({
|
|
833
|
+
propertyName: prop.getName(),
|
|
834
|
+
propertyType: typeResult.tsType,
|
|
835
|
+
description: tsdocInfo.description ?? null,
|
|
836
|
+
deprecated: tsdocInfo.deprecated ?? null,
|
|
837
|
+
});
|
|
838
|
+
}
|
|
839
|
+
members.push({ properties: memberProperties });
|
|
840
|
+
}
|
|
862
841
|
}
|
|
863
842
|
}
|
|
864
843
|
return { members, hasInlineObjects, hasNamedTypes };
|
|
865
844
|
}
|
|
866
|
-
function extractUnionMembers(type) {
|
|
845
|
+
function extractUnionMembers(type, typeNode) {
|
|
867
846
|
if (!type.isUnion()) {
|
|
868
847
|
return undefined;
|
|
869
848
|
}
|
|
@@ -872,9 +851,28 @@ function extractUnionMembers(type) {
|
|
|
872
851
|
(t.flags & ts.TypeFlags.Intersection) !== 0 ||
|
|
873
852
|
t.symbol !== undefined);
|
|
874
853
|
if (nonNullTypes.length > 1 && allObjectTypes) {
|
|
854
|
+
// Extract member type nodes from union type node if available
|
|
855
|
+
const memberTypeNodes = typeNode && ts.isUnionTypeNode(typeNode)
|
|
856
|
+
? filterNonNullTypeNodes(typeNode)
|
|
857
|
+
: [];
|
|
875
858
|
const namedMembers = nonNullTypes
|
|
876
|
-
.
|
|
877
|
-
|
|
859
|
+
.map((t, index) => {
|
|
860
|
+
// First try to get name from type
|
|
861
|
+
if (!isAnonymousObjectType(t)) {
|
|
862
|
+
const name = getNamedTypeName(t);
|
|
863
|
+
if (name !== "" && name !== "__type") {
|
|
864
|
+
return name;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
// Fallback to typeNode name for Simplify<T> pattern
|
|
868
|
+
if (memberTypeNodes[index]) {
|
|
869
|
+
const memberNode = memberTypeNodes[index];
|
|
870
|
+
if (ts.isTypeReferenceNode(memberNode)) {
|
|
871
|
+
return getTypeNameFromNode(memberNode) ?? "";
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
return "";
|
|
875
|
+
})
|
|
878
876
|
.filter((name) => name !== "" && name !== "__type");
|
|
879
877
|
if (namedMembers.length > 0) {
|
|
880
878
|
return namedMembers.sort();
|
|
@@ -882,13 +880,13 @@ function extractUnionMembers(type) {
|
|
|
882
880
|
}
|
|
883
881
|
return undefined;
|
|
884
882
|
}
|
|
885
|
-
export function extractTypesFromProgram(program, sourceFiles, options
|
|
883
|
+
export function extractTypesFromProgram(program, sourceFiles, options) {
|
|
886
884
|
const checker = program.getTypeChecker();
|
|
887
885
|
const types = [];
|
|
888
886
|
const diagnostics = [];
|
|
889
887
|
const detectedScalarNames = new Set();
|
|
890
888
|
const detectedScalars = [];
|
|
891
|
-
const globalTypeMappings = options
|
|
889
|
+
const { globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scalarMappingTable, } = options;
|
|
892
890
|
const scannedSourceFilesSet = new Set(sourceFiles);
|
|
893
891
|
for (const filePath of sourceFiles) {
|
|
894
892
|
const sourceFile = program.getSourceFile(filePath);
|
|
@@ -1009,9 +1007,19 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
|
|
|
1009
1007
|
}
|
|
1010
1008
|
actualType = type;
|
|
1011
1009
|
}
|
|
1012
|
-
const kind = determineTypeKind(node, actualType,
|
|
1013
|
-
|
|
1014
|
-
const
|
|
1010
|
+
const kind = determineTypeKind(node, actualType, checker);
|
|
1011
|
+
// Get typeNode for union member extraction (only for type aliases)
|
|
1012
|
+
const typeAliasTypeNode = ts.isTypeAliasDeclaration(node)
|
|
1013
|
+
? node.type
|
|
1014
|
+
: undefined;
|
|
1015
|
+
const unionMembers = extractUnionMembers(actualType, typeAliasTypeNode);
|
|
1016
|
+
const inlineObjectResult = extractInlineObjectMembers({
|
|
1017
|
+
type: actualType,
|
|
1018
|
+
checker,
|
|
1019
|
+
globalTypeMappings,
|
|
1020
|
+
knownTypeNames,
|
|
1021
|
+
typeNode: typeAliasTypeNode,
|
|
1022
|
+
});
|
|
1015
1023
|
const tsdocInfo = extractTsDocInfo(node, checker);
|
|
1016
1024
|
let implementedInterfaces = null;
|
|
1017
1025
|
if (ts.isTypeAliasDeclaration(node)) {
|
|
@@ -1050,9 +1058,33 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
|
|
|
1050
1058
|
});
|
|
1051
1059
|
return;
|
|
1052
1060
|
}
|
|
1061
|
+
const ignoreFields = detectIgnoreFieldsMetadata({ type, checker });
|
|
1062
|
+
if (ignoreFields !== null && kind !== "union") {
|
|
1063
|
+
const allFieldNames = collectAllFieldNames(type, checker);
|
|
1064
|
+
const validationDiagnostics = validateIgnoreFields({
|
|
1065
|
+
typeName: name,
|
|
1066
|
+
ignoreFields,
|
|
1067
|
+
allFieldNames,
|
|
1068
|
+
sourceLocation: typeSourceLocation,
|
|
1069
|
+
});
|
|
1070
|
+
diagnostics.push(...validationDiagnostics);
|
|
1071
|
+
}
|
|
1053
1072
|
const fieldResult = kind === "union"
|
|
1054
1073
|
? { fields: [], diagnostics: [] }
|
|
1055
|
-
: extractFieldsFromType(
|
|
1074
|
+
: extractFieldsFromType({
|
|
1075
|
+
type: actualType,
|
|
1076
|
+
checker,
|
|
1077
|
+
globalTypeMappings,
|
|
1078
|
+
knownTypeNames,
|
|
1079
|
+
knownTypeSymbols,
|
|
1080
|
+
underlyingSymbolToTypeName,
|
|
1081
|
+
sourceFiles: scannedSourceFilesSet,
|
|
1082
|
+
scalarMappingTable,
|
|
1083
|
+
scalarMappingContext: name.endsWith("Input")
|
|
1084
|
+
? "input"
|
|
1085
|
+
: "output",
|
|
1086
|
+
ignoreFields,
|
|
1087
|
+
});
|
|
1056
1088
|
const fields = fieldResult.fields;
|
|
1057
1089
|
diagnostics.push(...fieldResult.diagnostics);
|
|
1058
1090
|
if (name.endsWith("Input") && kind === "union") {
|
|
@@ -1081,8 +1113,7 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
|
|
|
1081
1113
|
});
|
|
1082
1114
|
}
|
|
1083
1115
|
}
|
|
1084
|
-
const inlineObjectMembers = inlineObjectResult?.hasInlineObjects
|
|
1085
|
-
!inlineObjectResult.hasNamedTypes
|
|
1116
|
+
const inlineObjectMembers = inlineObjectResult?.hasInlineObjects
|
|
1086
1117
|
? inlineObjectResult.members
|
|
1087
1118
|
: null;
|
|
1088
1119
|
const typeInfo = {
|
|
@@ -1096,7 +1127,7 @@ export function extractTypesFromProgram(program, sourceFiles, options = {}) {
|
|
|
1096
1127
|
types.push(typeInfo);
|
|
1097
1128
|
}
|
|
1098
1129
|
if (ts.isExportDeclaration(node)) {
|
|
1099
|
-
const result = processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, scannedSourceFilesSet);
|
|
1130
|
+
const result = processExportDeclaration(node, sourceFile, filePath, checker, globalTypeMappings, knownTypeNames, knownTypeSymbols, underlyingSymbolToTypeName, scannedSourceFilesSet, scalarMappingTable);
|
|
1100
1131
|
types.push(...result.types);
|
|
1101
1132
|
diagnostics.push(...result.diagnostics);
|
|
1102
1133
|
for (const scalarName of result.detectedScalarNames) {
|