@gqlkit-ts/cli 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-type-generator/auto-type-generator.d.ts +26 -4
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -1
- package/dist/auto-type-generator/auto-type-generator.js +846 -152
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -1
- package/dist/auto-type-generator/index.d.ts +9 -2
- package/dist/auto-type-generator/index.d.ts.map +1 -1
- package/dist/auto-type-generator/index.js +3 -0
- package/dist/auto-type-generator/index.js.map +1 -1
- package/dist/auto-type-generator/inline-enum-collector.d.ts +39 -0
- package/dist/auto-type-generator/inline-enum-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-enum-collector.js +193 -0
- package/dist/auto-type-generator/inline-enum-collector.js.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts +20 -0
- package/dist/auto-type-generator/inline-object-traverser.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-object-traverser.js +22 -0
- package/dist/auto-type-generator/inline-object-traverser.js.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-collector.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-collector.js +216 -0
- package/dist/auto-type-generator/inline-union-collector.js.map +1 -0
- package/dist/auto-type-generator/inline-union-types.d.ts +29 -0
- package/dist/auto-type-generator/inline-union-types.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-types.js +2 -0
- package/dist/auto-type-generator/inline-union-types.js.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts +76 -0
- package/dist/auto-type-generator/inline-union-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/inline-union-validator.js +329 -0
- package/dist/auto-type-generator/inline-union-validator.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +22 -1
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -1
- package/dist/auto-type-generator/naming-convention.js +24 -0
- package/dist/auto-type-generator/naming-convention.js.map +1 -1
- package/dist/auto-type-generator/resolve-type-generator.d.ts +20 -0
- package/dist/auto-type-generator/resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolve-type-generator.js +2 -0
- package/dist/auto-type-generator/resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts +13 -0
- package/dist/auto-type-generator/resolver-field-iterator.d.ts.map +1 -0
- package/dist/auto-type-generator/resolver-field-iterator.js +22 -0
- package/dist/auto-type-generator/resolver-field-iterator.js.map +1 -0
- package/dist/auto-type-generator/typename-extractor.d.ts +26 -0
- package/dist/auto-type-generator/typename-extractor.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-extractor.js +142 -0
- package/dist/auto-type-generator/typename-extractor.js.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts +35 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js +177 -0
- package/dist/auto-type-generator/typename-resolve-type-generator.js.map +1 -0
- package/dist/auto-type-generator/typename-types.d.ts +43 -0
- package/dist/auto-type-generator/typename-types.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-types.js +37 -0
- package/dist/auto-type-generator/typename-types.js.map +1 -0
- package/dist/auto-type-generator/typename-validator.d.ts +37 -0
- package/dist/auto-type-generator/typename-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/typename-validator.js +206 -0
- package/dist/auto-type-generator/typename-validator.js.map +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/docs.d.ts +51 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +154 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/gen-orchestrator/orchestrator.js +119 -14
- package/dist/gen-orchestrator/orchestrator.js.map +1 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts +28 -1
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +16 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -1
- package/dist/resolver-extractor/extractor/define-api-extractor.js +86 -309
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -1
- package/dist/resolver-extractor/index.d.ts +0 -1
- package/dist/resolver-extractor/index.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -1
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +9 -5
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.d.ts +10 -2
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -1
- package/dist/schema-generator/emitter/code-emitter.js +39 -4
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -1
- package/dist/schema-generator/generate-schema.d.ts +1 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -1
- package/dist/schema-generator/generate-schema.js +90 -4
- package/dist/schema-generator/generate-schema.js.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.d.ts +34 -2
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -1
- package/dist/schema-generator/integrator/result-integrator.js +96 -1
- package/dist/schema-generator/integrator/result-integrator.js.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +2 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -1
- package/dist/schema-generator/resolver-collector/resolver-collector.js +22 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -1
- package/dist/shared/constants.d.ts +0 -16
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +0 -19
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/directive-detector.d.ts.map +1 -1
- package/dist/shared/directive-detector.js +8 -15
- package/dist/shared/directive-detector.js.map +1 -1
- package/dist/shared/enum-prefix-detector.d.ts +63 -0
- package/dist/shared/enum-prefix-detector.d.ts.map +1 -0
- package/dist/shared/enum-prefix-detector.js +80 -0
- package/dist/shared/enum-prefix-detector.js.map +1 -0
- package/dist/shared/file-scanner.d.ts.map +1 -1
- package/dist/shared/file-scanner.js +5 -3
- package/dist/shared/file-scanner.js.map +1 -1
- package/dist/shared/ignore-fields-detector.d.ts +26 -0
- package/dist/shared/ignore-fields-detector.d.ts.map +1 -0
- package/dist/shared/ignore-fields-detector.js +83 -0
- package/dist/shared/ignore-fields-detector.js.map +1 -0
- package/dist/shared/ignore-fields-validator.d.ts +29 -0
- package/dist/shared/ignore-fields-validator.d.ts.map +1 -0
- package/dist/shared/ignore-fields-validator.js +43 -0
- package/dist/shared/ignore-fields-validator.js.map +1 -0
- package/dist/shared/index.d.ts +3 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -3
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/interface-detector.d.ts +3 -2
- package/dist/shared/interface-detector.d.ts.map +1 -1
- package/dist/shared/interface-detector.js +54 -11
- package/dist/shared/interface-detector.js.map +1 -1
- package/dist/shared/path-utils.d.ts +2 -0
- package/dist/shared/path-utils.d.ts.map +1 -0
- package/dist/shared/path-utils.js +4 -0
- package/dist/shared/path-utils.js.map +1 -0
- package/dist/shared/source-location.d.ts +5 -0
- package/dist/shared/source-location.d.ts.map +1 -1
- package/dist/shared/source-location.js +7 -0
- package/dist/shared/source-location.js.map +1 -1
- package/dist/shared/type-converter.d.ts.map +1 -1
- package/dist/shared/type-converter.js +11 -0
- package/dist/shared/type-converter.js.map +1 -1
- package/dist/shared/typescript-utils.d.ts +34 -7
- package/dist/shared/typescript-utils.d.ts.map +1 -1
- package/dist/shared/typescript-utils.js +72 -24
- package/dist/shared/typescript-utils.js.map +1 -1
- package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -1
- package/dist/type-extractor/collector/scalar-collector.js +4 -14
- package/dist/type-extractor/collector/scalar-collector.js.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -1
- package/dist/type-extractor/converter/graphql-converter.js +57 -4
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -1
- package/dist/type-extractor/extractor/field-type-resolver.d.ts +28 -0
- package/dist/type-extractor/extractor/field-type-resolver.d.ts.map +1 -0
- package/dist/type-extractor/extractor/field-type-resolver.js +433 -0
- package/dist/type-extractor/extractor/field-type-resolver.js.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts +12 -3
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -1
- package/dist/type-extractor/extractor/type-extractor.js +260 -229
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -1
- package/dist/type-extractor/extractor/type-name-collector.d.ts +24 -0
- package/dist/type-extractor/extractor/type-name-collector.d.ts.map +1 -0
- package/dist/type-extractor/extractor/type-name-collector.js +102 -0
- package/dist/type-extractor/extractor/type-name-collector.js.map +1 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts +89 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.d.ts.map +1 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.js +158 -0
- package/dist/type-extractor/mapper/scalar-base-type-mapper.js.map +1 -0
- package/dist/type-extractor/types/diagnostics.d.ts +1 -1
- package/dist/type-extractor/types/diagnostics.d.ts.map +1 -1
- package/dist/type-extractor/types/graphql.d.ts +2 -0
- package/dist/type-extractor/types/graphql.d.ts.map +1 -1
- package/dist/type-extractor/types/index.d.ts +2 -1
- package/dist/type-extractor/types/index.d.ts.map +1 -1
- package/dist/type-extractor/types/index.js +1 -1
- package/dist/type-extractor/types/index.js.map +1 -1
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts +47 -0
- package/dist/type-extractor/types/ts-type-reference-factory.d.ts.map +1 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js +75 -0
- package/dist/type-extractor/types/ts-type-reference-factory.js.map +1 -0
- package/dist/type-extractor/types/typescript.d.ts +25 -1
- package/dist/type-extractor/types/typescript.d.ts.map +1 -1
- package/dist/type-extractor/validator/type-validator.js +1 -1
- package/dist/type-extractor/validator/type-validator.js.map +1 -1
- package/docs/coding-agents.md +64 -0
- package/docs/configuration.md +6 -20
- package/docs/getting-started.md +15 -12
- package/docs/index.md +36 -21
- package/docs/integration/apollo.md +8 -40
- package/docs/integration/drizzle.md +187 -0
- package/docs/integration/prisma.md +196 -0
- package/docs/integration/yoga.md +8 -40
- package/docs/schema/abstract-resolvers.md +117 -0
- package/docs/schema/directives.md +5 -0
- package/docs/schema/documentation.md +5 -0
- package/docs/schema/enums.md +307 -0
- package/docs/schema/fields.md +66 -0
- package/docs/schema/index.md +21 -0
- package/docs/schema/inputs.md +117 -15
- package/docs/schema/interfaces.md +31 -1
- package/docs/schema/objects.md +42 -0
- package/docs/schema/queries-mutations.md +138 -22
- package/docs/schema/scalars.md +5 -0
- package/docs/schema/unions.md +208 -1
- package/docs/what-is-gqlkit.md +13 -8
- package/package.json +14 -5
- package/src/auto-type-generator/auto-type-generator.ts +1670 -0
- package/src/auto-type-generator/index.ts +63 -0
- package/src/auto-type-generator/inline-enum-collector.ts +338 -0
- package/src/auto-type-generator/inline-object-traverser.ts +49 -0
- package/src/auto-type-generator/inline-union-collector.ts +402 -0
- package/src/auto-type-generator/inline-union-types.ts +33 -0
- package/src/auto-type-generator/inline-union-validator.ts +482 -0
- package/src/auto-type-generator/name-collision-validator.ts +119 -0
- package/src/auto-type-generator/naming-convention.ts +163 -0
- package/src/auto-type-generator/resolve-type-generator.ts +21 -0
- package/src/auto-type-generator/resolver-field-iterator.ts +39 -0
- package/src/auto-type-generator/typename-extractor.ts +230 -0
- package/src/auto-type-generator/typename-resolve-type-generator.ts +281 -0
- package/src/auto-type-generator/typename-types.ts +66 -0
- package/src/auto-type-generator/typename-validator.ts +326 -0
- package/src/cli.ts +13 -0
- package/src/commands/docs.ts +211 -0
- package/src/commands/gen.ts +141 -0
- package/src/commands/main.ts +5 -0
- package/src/config/define-config.ts +28 -0
- package/src/config/index.ts +7 -0
- package/src/config/types.ts +144 -0
- package/src/config-loader/index.ts +14 -0
- package/src/config-loader/loader.ts +143 -0
- package/src/config-loader/validator.ts +672 -0
- package/src/gen-orchestrator/hook-executor/hook-executor.ts +117 -0
- package/src/gen-orchestrator/orchestrator.ts +798 -0
- package/src/gen-orchestrator/reporter/diagnostic-reporter.ts +44 -0
- package/src/gen-orchestrator/reporter/progress-reporter.ts +61 -0
- package/src/gen-orchestrator/writer/file-writer.ts +38 -0
- package/src/index.ts +2 -0
- package/src/resolver-extractor/extract-resolvers.ts +82 -0
- package/src/resolver-extractor/extractor/define-api-extractor.ts +740 -0
- package/src/resolver-extractor/index.ts +13 -0
- package/src/resolver-extractor/validator/abstract-resolver-validator.ts +259 -0
- package/src/schema-generator/builder/ast-builder.ts +706 -0
- package/src/schema-generator/emitter/code-emitter.ts +385 -0
- package/src/schema-generator/emitter/sdl-emitter.ts +13 -0
- package/src/schema-generator/generate-schema.ts +267 -0
- package/src/schema-generator/index.ts +19 -0
- package/src/schema-generator/integrator/result-integrator.ts +759 -0
- package/src/schema-generator/pruner/schema-pruner.ts +112 -0
- package/src/schema-generator/resolver-collector/resolver-collector.ts +157 -0
- package/src/shared/constants.ts +122 -0
- package/src/shared/default-value-detector.ts +172 -0
- package/src/shared/diagnostics.ts +35 -0
- package/src/shared/directive-definition-extractor.ts +564 -0
- package/src/shared/directive-detector.ts +556 -0
- package/src/shared/enum-prefix-detector.ts +99 -0
- package/src/shared/file-scanner.ts +170 -0
- package/src/shared/ignore-fields-detector.ts +109 -0
- package/src/shared/ignore-fields-validator.ts +66 -0
- package/src/shared/index.ts +34 -0
- package/src/shared/inline-object-extractor.ts +102 -0
- package/src/shared/inline-object-utils.ts +23 -0
- package/src/shared/interface-detector.ts +176 -0
- package/src/shared/interface-validator.ts +211 -0
- package/src/shared/metadata-detector.ts +443 -0
- package/src/shared/path-utils.ts +3 -0
- package/src/shared/program-factory.ts +51 -0
- package/src/shared/source-location.ts +38 -0
- package/src/shared/tsconfig-loader.ts +126 -0
- package/src/shared/tsdoc-parser.ts +155 -0
- package/src/shared/type-converter.ts +99 -0
- package/src/shared/typescript-utils.ts +246 -0
- package/src/type-extractor/collector/result-collector.ts +57 -0
- package/src/type-extractor/collector/scalar-collector.ts +254 -0
- package/src/type-extractor/converter/field-eligibility.ts +112 -0
- package/src/type-extractor/converter/graphql-converter.ts +483 -0
- package/src/type-extractor/extract-types.ts +1 -0
- package/src/type-extractor/extractor/field-type-resolver.ts +614 -0
- package/src/type-extractor/extractor/type-extractor.ts +1644 -0
- package/src/type-extractor/extractor/type-name-collector.ts +130 -0
- package/src/type-extractor/index.ts +20 -0
- package/src/type-extractor/mapper/scalar-base-type-mapper.ts +265 -0
- package/src/type-extractor/types/diagnostics.ts +109 -0
- package/src/type-extractor/types/graphql.ts +55 -0
- package/src/type-extractor/types/index.ts +37 -0
- package/src/type-extractor/types/ts-type-reference-factory.ts +150 -0
- package/src/type-extractor/types/typescript.ts +137 -0
- package/src/type-extractor/validator/type-validator.ts +77 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts +0 -2
- package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +0 -1
- package/dist/auto-type-generator/auto-type-generator.test.js +0 -613
- package/dist/auto-type-generator/auto-type-generator.test.js.map +0 -1
- package/dist/auto-type-generator/name-collision-validator.test.d.ts +0 -2
- package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +0 -1
- package/dist/auto-type-generator/name-collision-validator.test.js +0 -358
- package/dist/auto-type-generator/name-collision-validator.test.js.map +0 -1
- package/dist/auto-type-generator/naming-convention.test.d.ts +0 -2
- package/dist/auto-type-generator/naming-convention.test.d.ts.map +0 -1
- package/dist/auto-type-generator/naming-convention.test.js +0 -132
- package/dist/auto-type-generator/naming-convention.test.js.map +0 -1
- package/dist/commands/gen.test.d.ts +0 -2
- package/dist/commands/gen.test.d.ts.map +0 -1
- package/dist/commands/gen.test.js +0 -226
- package/dist/commands/gen.test.js.map +0 -1
- package/dist/config-loader/loader.test.d.ts +0 -2
- package/dist/config-loader/loader.test.d.ts.map +0 -1
- package/dist/config-loader/loader.test.js +0 -123
- package/dist/config-loader/loader.test.js.map +0 -1
- package/dist/config-loader/validator.test.d.ts +0 -2
- package/dist/config-loader/validator.test.d.ts.map +0 -1
- package/dist/config-loader/validator.test.js +0 -846
- package/dist/config-loader/validator.test.js.map +0 -1
- package/dist/gen-orchestrator/golden.test.d.ts +0 -2
- package/dist/gen-orchestrator/golden.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/golden.test.js +0 -102
- package/dist/gen-orchestrator/golden.test.js.map +0 -1
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +0 -2
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +0 -167
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +0 -1
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +0 -2
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +0 -1
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js +0 -74
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.d.ts +0 -61
- package/dist/resolver-extractor/validator/only-validator.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.js +0 -76
- package/dist/resolver-extractor/validator/only-validator.js.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.test.d.ts +0 -8
- package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +0 -1
- package/dist/resolver-extractor/validator/only-validator.test.js +0 -352
- package/dist/resolver-extractor/validator/only-validator.test.js.map +0 -1
- package/dist/schema-generator/builder/ast-builder.test.d.ts +0 -2
- package/dist/schema-generator/builder/ast-builder.test.d.ts.map +0 -1
- package/dist/schema-generator/builder/ast-builder.test.js +0 -469
- package/dist/schema-generator/builder/ast-builder.test.js.map +0 -1
- package/dist/shared/file-scanner.test.d.ts +0 -2
- package/dist/shared/file-scanner.test.d.ts.map +0 -1
- package/dist/shared/file-scanner.test.js +0 -138
- package/dist/shared/file-scanner.test.js.map +0 -1
- package/dist/shared/interface-validator.test.d.ts +0 -2
- package/dist/shared/interface-validator.test.d.ts.map +0 -1
- package/dist/shared/interface-validator.test.js +0 -145
- package/dist/shared/interface-validator.test.js.map +0 -1
- package/dist/type-extractor/types/typescript.test.d.ts +0 -2
- package/dist/type-extractor/types/typescript.test.d.ts.map +0 -1
- package/dist/type-extractor/types/typescript.test.js +0 -287
- package/dist/type-extractor/types/typescript.test.js.map +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { pruneSchema } from "@graphql-tools/utils";
|
|
2
|
+
import {
|
|
3
|
+
buildASTSchema,
|
|
4
|
+
type DocumentNode,
|
|
5
|
+
type GraphQLSchema,
|
|
6
|
+
Kind,
|
|
7
|
+
parse,
|
|
8
|
+
print,
|
|
9
|
+
printSchema,
|
|
10
|
+
} from "graphql";
|
|
11
|
+
|
|
12
|
+
export interface PruneDocumentNodeInput {
|
|
13
|
+
readonly documentNode: DocumentNode;
|
|
14
|
+
readonly customScalarNames: ReadonlyArray<string> | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface PruneDocumentNodeResult {
|
|
18
|
+
readonly documentNode: DocumentNode;
|
|
19
|
+
readonly removedTypes: ReadonlyArray<string>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function getTypeNamesFromDocument(documentNode: DocumentNode): Set<string> {
|
|
23
|
+
const typeNames = new Set<string>();
|
|
24
|
+
|
|
25
|
+
for (const definition of documentNode.definitions) {
|
|
26
|
+
if (
|
|
27
|
+
definition.kind === Kind.OBJECT_TYPE_DEFINITION ||
|
|
28
|
+
definition.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ||
|
|
29
|
+
definition.kind === Kind.ENUM_TYPE_DEFINITION ||
|
|
30
|
+
definition.kind === Kind.UNION_TYPE_DEFINITION ||
|
|
31
|
+
definition.kind === Kind.SCALAR_TYPE_DEFINITION ||
|
|
32
|
+
definition.kind === Kind.INTERFACE_TYPE_DEFINITION
|
|
33
|
+
) {
|
|
34
|
+
typeNames.add(definition.name.value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return typeNames;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getTypeNamesFromSchema(schema: GraphQLSchema): Set<string> {
|
|
42
|
+
const typeNames = new Set<string>();
|
|
43
|
+
const typeMap = schema.getTypeMap();
|
|
44
|
+
|
|
45
|
+
for (const typeName of Object.keys(typeMap)) {
|
|
46
|
+
if (!typeName.startsWith("__")) {
|
|
47
|
+
typeNames.add(typeName);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return typeNames;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function extractCustomScalarDefinitions(
|
|
55
|
+
documentNode: DocumentNode,
|
|
56
|
+
customScalarNames: ReadonlyArray<string>,
|
|
57
|
+
): DocumentNode["definitions"] {
|
|
58
|
+
const customScalarSet = new Set(customScalarNames);
|
|
59
|
+
return documentNode.definitions.filter(
|
|
60
|
+
(def) =>
|
|
61
|
+
def.kind === Kind.SCALAR_TYPE_DEFINITION &&
|
|
62
|
+
customScalarSet.has(def.name.value),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Remove unused types from DocumentNode.
|
|
68
|
+
* Types not referenced from Query, Mutation, or Subscription are removed.
|
|
69
|
+
* Custom scalars are preserved and excluded from pruning.
|
|
70
|
+
*/
|
|
71
|
+
export function pruneDocumentNode(
|
|
72
|
+
input: PruneDocumentNodeInput,
|
|
73
|
+
): PruneDocumentNodeResult {
|
|
74
|
+
const { documentNode } = input;
|
|
75
|
+
const customScalarNames = input.customScalarNames ?? [];
|
|
76
|
+
|
|
77
|
+
const originalTypeNames = getTypeNamesFromDocument(documentNode);
|
|
78
|
+
const customScalarSet = new Set(customScalarNames);
|
|
79
|
+
|
|
80
|
+
const customScalarDefinitions = extractCustomScalarDefinitions(
|
|
81
|
+
documentNode,
|
|
82
|
+
customScalarNames,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const sdl = print(documentNode);
|
|
86
|
+
const schema = buildASTSchema(parse(sdl));
|
|
87
|
+
|
|
88
|
+
const prunedSchema = pruneSchema(schema, {
|
|
89
|
+
skipPruning: (type) => customScalarSet.has(type.name),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const prunedSdl = printSchema(prunedSchema);
|
|
93
|
+
const prunedDocument = parse(prunedSdl);
|
|
94
|
+
const prunedTypeNames = getTypeNamesFromSchema(prunedSchema);
|
|
95
|
+
|
|
96
|
+
const finalDocument: DocumentNode = {
|
|
97
|
+
kind: Kind.DOCUMENT,
|
|
98
|
+
definitions: [...customScalarDefinitions, ...prunedDocument.definitions],
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const removedTypes: string[] = [];
|
|
102
|
+
for (const typeName of originalTypeNames) {
|
|
103
|
+
if (!prunedTypeNames.has(typeName) && !customScalarSet.has(typeName)) {
|
|
104
|
+
removedTypes.push(typeName);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
documentNode: finalDocument,
|
|
110
|
+
removedTypes: removedTypes.sort(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { AutoGeneratedResolveType } from "../../auto-type-generator/resolve-type-generator.js";
|
|
2
|
+
import type { AbstractResolverInfo } from "../../resolver-extractor/extractor/define-api-extractor.js";
|
|
3
|
+
import type {
|
|
4
|
+
ExtensionField,
|
|
5
|
+
IntegratedResult,
|
|
6
|
+
TypeExtension,
|
|
7
|
+
} from "../integrator/result-integrator.js";
|
|
8
|
+
|
|
9
|
+
export interface FieldResolver {
|
|
10
|
+
readonly fieldName: string;
|
|
11
|
+
readonly sourceFile: string;
|
|
12
|
+
readonly resolverValueName: string;
|
|
13
|
+
readonly isDirectExport: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface TypeResolvers {
|
|
17
|
+
readonly typeName: string;
|
|
18
|
+
readonly fields: ReadonlyArray<FieldResolver>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface AbstractTypeResolverInfo {
|
|
22
|
+
readonly typeName: string;
|
|
23
|
+
readonly resolverKey: "__resolveType" | "__isTypeOf";
|
|
24
|
+
readonly sourceFile: string;
|
|
25
|
+
readonly exportName: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ResolverInfo {
|
|
29
|
+
readonly types: ReadonlyArray<TypeResolvers>;
|
|
30
|
+
readonly sourceFiles: ReadonlyArray<string>;
|
|
31
|
+
readonly abstractTypeResolvers: ReadonlyArray<AbstractTypeResolverInfo>;
|
|
32
|
+
readonly autoGeneratedResolveTypes: ReadonlyArray<AutoGeneratedResolveType>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function getResolverValueName(typeName: string): string {
|
|
36
|
+
return `${typeName.charAt(0).toLowerCase()}${typeName.slice(1)}Resolver`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function collectFieldResolver(
|
|
40
|
+
field: ExtensionField,
|
|
41
|
+
fallbackResolverValueName: string,
|
|
42
|
+
): FieldResolver {
|
|
43
|
+
const isDirectExport = field.resolverExportName !== null;
|
|
44
|
+
const resolverValueName = isDirectExport
|
|
45
|
+
? field.resolverExportName!
|
|
46
|
+
: fallbackResolverValueName;
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
fieldName: field.name,
|
|
50
|
+
sourceFile: field.resolverSourceFile,
|
|
51
|
+
resolverValueName,
|
|
52
|
+
isDirectExport,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function collectFieldResolvers(ext: TypeExtension): FieldResolver[] {
|
|
57
|
+
const fallbackResolverValueName = getResolverValueName(ext.targetTypeName);
|
|
58
|
+
|
|
59
|
+
return ext.fields.map((field) =>
|
|
60
|
+
collectFieldResolver(field, fallbackResolverValueName),
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function convertToAbstractTypeResolverInfo(
|
|
65
|
+
resolver: AbstractResolverInfo,
|
|
66
|
+
): AbstractTypeResolverInfo {
|
|
67
|
+
return {
|
|
68
|
+
typeName: resolver.targetTypeName,
|
|
69
|
+
resolverKey:
|
|
70
|
+
resolver.kind === "resolveType" ? "__resolveType" : "__isTypeOf",
|
|
71
|
+
sourceFile: resolver.sourceFile,
|
|
72
|
+
exportName: resolver.exportName,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function collectAbstractTypeResolvers(
|
|
77
|
+
abstractResolvers: ReadonlyArray<AbstractResolverInfo>,
|
|
78
|
+
): AbstractTypeResolverInfo[] {
|
|
79
|
+
return abstractResolvers
|
|
80
|
+
.map(convertToAbstractTypeResolverInfo)
|
|
81
|
+
.sort((a, b) => a.typeName.localeCompare(b.typeName));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function collectResolverInfo(
|
|
85
|
+
integratedResult: IntegratedResult,
|
|
86
|
+
): ResolverInfo {
|
|
87
|
+
const typeMap = new Map<string, FieldResolver[]>();
|
|
88
|
+
const sourceFilesSet = new Set<string>();
|
|
89
|
+
|
|
90
|
+
for (const ext of integratedResult.typeExtensions) {
|
|
91
|
+
const fieldResolvers = collectFieldResolvers(ext);
|
|
92
|
+
|
|
93
|
+
for (const resolver of fieldResolvers) {
|
|
94
|
+
sourceFilesSet.add(resolver.sourceFile);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const existing = typeMap.get(ext.targetTypeName) ?? [];
|
|
98
|
+
typeMap.set(ext.targetTypeName, [...existing, ...fieldResolvers]);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const abstractTypeResolvers = collectAbstractTypeResolvers(
|
|
102
|
+
integratedResult.abstractTypeResolvers,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
for (const resolver of abstractTypeResolvers) {
|
|
106
|
+
sourceFilesSet.add(resolver.sourceFile);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const manualResolveTypeNames = new Set<string>(
|
|
110
|
+
abstractTypeResolvers
|
|
111
|
+
.filter((r) => r.resolverKey === "__resolveType")
|
|
112
|
+
.map((r) => r.typeName),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const inlineUnionResolveTypes: AutoGeneratedResolveType[] =
|
|
116
|
+
integratedResult.autoGeneratedUnions
|
|
117
|
+
.filter(
|
|
118
|
+
(u) => u.hasAutoResolveType && !manualResolveTypeNames.has(u.name),
|
|
119
|
+
)
|
|
120
|
+
.map((u) => ({
|
|
121
|
+
unionTypeName: u.name,
|
|
122
|
+
fieldPattern: u.fieldPattern,
|
|
123
|
+
}));
|
|
124
|
+
|
|
125
|
+
const typenameResolveTypes: AutoGeneratedResolveType[] =
|
|
126
|
+
integratedResult.typenameAutoResolveTypes
|
|
127
|
+
.filter((t) => !manualResolveTypeNames.has(t.abstractTypeName))
|
|
128
|
+
.map((t) => ({
|
|
129
|
+
unionTypeName: t.abstractTypeName,
|
|
130
|
+
fieldPattern: {
|
|
131
|
+
usedFieldNames: t.resolveTypePattern.usedFieldNames,
|
|
132
|
+
},
|
|
133
|
+
}));
|
|
134
|
+
|
|
135
|
+
const autoGeneratedResolveTypes = [
|
|
136
|
+
...inlineUnionResolveTypes,
|
|
137
|
+
...typenameResolveTypes,
|
|
138
|
+
].sort((a, b) => a.unionTypeName.localeCompare(b.unionTypeName));
|
|
139
|
+
|
|
140
|
+
const types: TypeResolvers[] = [...typeMap.entries()]
|
|
141
|
+
.map(([typeName, fields]) => ({
|
|
142
|
+
typeName,
|
|
143
|
+
fields: [...fields].sort((a, b) =>
|
|
144
|
+
a.fieldName.localeCompare(b.fieldName),
|
|
145
|
+
),
|
|
146
|
+
}))
|
|
147
|
+
.sort((a, b) => a.typeName.localeCompare(b.typeName));
|
|
148
|
+
|
|
149
|
+
const sourceFiles = [...sourceFilesSet].sort((a, b) => a.localeCompare(b));
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
types,
|
|
153
|
+
sourceFiles,
|
|
154
|
+
abstractTypeResolvers,
|
|
155
|
+
autoGeneratedResolveTypes,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript internal symbol names.
|
|
3
|
+
*
|
|
4
|
+
* These are internal names used by the TypeScript compiler to represent
|
|
5
|
+
* certain types. They should be treated as implementation details and
|
|
6
|
+
* filtered out when converting TypeScript types to GraphQL types.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Anonymous object type symbol name.
|
|
11
|
+
*
|
|
12
|
+
* When TypeScript encounters an anonymous object type (e.g., `{ name: string }`
|
|
13
|
+
* without a type alias), it uses `__type` as the internal symbol name.
|
|
14
|
+
*
|
|
15
|
+
* This commonly occurs when:
|
|
16
|
+
* 1. A type is defined inline without a name
|
|
17
|
+
* 2. A type reference is resolved through complex type operations
|
|
18
|
+
* (e.g., extracting from optional properties, intersection types)
|
|
19
|
+
* 3. The original type name is lost during TypeScript's internal type resolution
|
|
20
|
+
*
|
|
21
|
+
* In the context of GqlField<T, Meta>, when we extract T from the
|
|
22
|
+
* `$gqlkitOriginalType` property, TypeScript may return the type with
|
|
23
|
+
* `__type` as its symbol name instead of the original type name (e.g., "NestedConfig").
|
|
24
|
+
* This happens because:
|
|
25
|
+
* - The property is optional (`T | undefined`)
|
|
26
|
+
* - TypeScript's type resolution doesn't always preserve the original type alias
|
|
27
|
+
*
|
|
28
|
+
* When we encounter `__type`, we should fall back to using `checker.typeToString()`
|
|
29
|
+
* which preserves the human-readable type name.
|
|
30
|
+
*/
|
|
31
|
+
const TS_ANONYMOUS_TYPE_SYMBOL = "__type";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Array type symbol name.
|
|
35
|
+
*
|
|
36
|
+
* TypeScript uses `Array` as the symbol name for array types.
|
|
37
|
+
* This should be handled separately using `checker.isArrayType()` rather than
|
|
38
|
+
* treating it as a named type reference.
|
|
39
|
+
*/
|
|
40
|
+
const TS_ARRAY_TYPE_SYMBOL = "Array";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Checks if a symbol name represents a TypeScript internal/anonymous type
|
|
44
|
+
* that should not be used directly as a GraphQL type name.
|
|
45
|
+
*
|
|
46
|
+
* @param symbolName - The symbol name from `type.symbol.getName()`
|
|
47
|
+
* @returns true if the symbol name is internal and should be filtered out
|
|
48
|
+
*/
|
|
49
|
+
export function isInternalTypeSymbol(symbolName: string): boolean {
|
|
50
|
+
return (
|
|
51
|
+
symbolName === TS_ANONYMOUS_TYPE_SYMBOL ||
|
|
52
|
+
symbolName === TS_ARRAY_TYPE_SYMBOL
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ============================================================
|
|
57
|
+
// gqlkit Metadata Property Names
|
|
58
|
+
// ============================================================
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Property names used internally by gqlkit types for metadata.
|
|
62
|
+
* These start with " $" (space + dollar sign) to avoid conflicts.
|
|
63
|
+
*/
|
|
64
|
+
export const METADATA_PROPERTIES = {
|
|
65
|
+
/** Field metadata (GqlField) */
|
|
66
|
+
FIELD_META: " $gqlkitFieldMeta",
|
|
67
|
+
/** Type metadata (GqlObject) */
|
|
68
|
+
TYPE_META: " $gqlkitTypeMeta",
|
|
69
|
+
/** Directive name */
|
|
70
|
+
DIRECTIVE_NAME: " $directiveName",
|
|
71
|
+
/** Directive arguments */
|
|
72
|
+
DIRECTIVE_ARGS: " $directiveArgs",
|
|
73
|
+
/** Directive location */
|
|
74
|
+
DIRECTIVE_LOCATION: " $directiveLocation",
|
|
75
|
+
/** Original unwrapped type */
|
|
76
|
+
ORIGINAL_TYPE: " $gqlkitOriginalType",
|
|
77
|
+
/** Scalar metadata */
|
|
78
|
+
SCALAR: " $gqlkitScalar",
|
|
79
|
+
/** Resolver metadata */
|
|
80
|
+
RESOLVER: " $gqlkitResolver",
|
|
81
|
+
/** Abstract resolver metadata (resolveType, isTypeOf) */
|
|
82
|
+
ABSTRACT_RESOLVER: " $gqlkitAbstractResolver",
|
|
83
|
+
/** Interface metadata */
|
|
84
|
+
INTERFACE_META: " $gqlkitInterfaceMeta",
|
|
85
|
+
} as const;
|
|
86
|
+
|
|
87
|
+
// ============================================================
|
|
88
|
+
// GraphQL Built-in Types
|
|
89
|
+
// ============================================================
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* GraphQL built-in scalar type names.
|
|
93
|
+
*/
|
|
94
|
+
export const BUILT_IN_SCALARS = new Set([
|
|
95
|
+
"ID",
|
|
96
|
+
"Int",
|
|
97
|
+
"Float",
|
|
98
|
+
"String",
|
|
99
|
+
"Boolean",
|
|
100
|
+
] as const);
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Checks if a type name is a GraphQL built-in scalar.
|
|
104
|
+
*/
|
|
105
|
+
export function isBuiltInScalar(typeName: string): boolean {
|
|
106
|
+
return BUILT_IN_SCALARS.has(
|
|
107
|
+
typeName as typeof BUILT_IN_SCALARS extends Set<infer T> ? T : never,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ============================================================
|
|
112
|
+
// TypeScript to GraphQL Type Mapping
|
|
113
|
+
// ============================================================
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Maps TypeScript primitive type names to GraphQL scalar names.
|
|
117
|
+
*/
|
|
118
|
+
export const PRIMITIVE_TYPE_MAP: Record<string, string> = {
|
|
119
|
+
string: "String",
|
|
120
|
+
number: "Float",
|
|
121
|
+
boolean: "Boolean",
|
|
122
|
+
} as const;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default value metadata detector.
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to detect default value metadata embedded
|
|
5
|
+
* in TypeScript intersection types using the $gqlkitFieldMeta property.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import ts from "typescript";
|
|
9
|
+
import { METADATA_PROPERTIES } from "./constants.js";
|
|
10
|
+
import type { DirectiveArgumentValue } from "./directive-detector.js";
|
|
11
|
+
import { resolveArgumentValue } from "./directive-detector.js";
|
|
12
|
+
import { getActualMetadataType } from "./metadata-detector.js";
|
|
13
|
+
|
|
14
|
+
const FIELD_META_PROPERTY = METADATA_PROPERTIES.FIELD_META;
|
|
15
|
+
const DEFAULT_VALUE_PROPERTY = "defaultValue";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Error codes for default value detection.
|
|
19
|
+
*/
|
|
20
|
+
export type DefaultValueDetectionErrorCode = "UNRESOLVABLE_DEFAULT_VALUE";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Error information for default value detection.
|
|
24
|
+
*/
|
|
25
|
+
export interface DefaultValueDetectionError {
|
|
26
|
+
readonly code: DefaultValueDetectionErrorCode;
|
|
27
|
+
readonly message: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Result of default value detection.
|
|
32
|
+
*/
|
|
33
|
+
export interface DefaultValueDetectionResult {
|
|
34
|
+
readonly defaultValue: DirectiveArgumentValue | null;
|
|
35
|
+
readonly errors: ReadonlyArray<DefaultValueDetectionError>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function createEmptyResult(): DefaultValueDetectionResult {
|
|
39
|
+
return {
|
|
40
|
+
defaultValue: null,
|
|
41
|
+
errors: [],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Gets the field meta property from a type, checking various type structures.
|
|
47
|
+
*/
|
|
48
|
+
function getFieldMetaProperty(type: ts.Type): ts.Symbol | undefined {
|
|
49
|
+
const prop = type.getProperty(FIELD_META_PROPERTY);
|
|
50
|
+
if (prop) {
|
|
51
|
+
return prop;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (type.isIntersection()) {
|
|
55
|
+
for (const member of type.types) {
|
|
56
|
+
const memberProp = member.getProperty(FIELD_META_PROPERTY);
|
|
57
|
+
if (memberProp) {
|
|
58
|
+
return memberProp;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (type.isUnion()) {
|
|
64
|
+
for (const member of type.types) {
|
|
65
|
+
if (
|
|
66
|
+
member.flags & ts.TypeFlags.Null ||
|
|
67
|
+
member.flags & ts.TypeFlags.Undefined
|
|
68
|
+
) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const result = getFieldMetaProperty(member);
|
|
72
|
+
if (result) {
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Detects default value metadata from a TypeScript type.
|
|
83
|
+
*
|
|
84
|
+
* This function analyzes TypeScript types to detect default value metadata:
|
|
85
|
+
* - Intersection types with " $gqlkitFieldMeta" property containing "defaultValue"
|
|
86
|
+
* - Literal types are resolved to their values
|
|
87
|
+
* - Non-literal types result in an error
|
|
88
|
+
*
|
|
89
|
+
* @param type - The TypeScript type to analyze
|
|
90
|
+
* @param checker - The TypeScript type checker
|
|
91
|
+
* @returns Detection result with default value and any errors
|
|
92
|
+
*/
|
|
93
|
+
export function detectDefaultValueMetadata(
|
|
94
|
+
type: ts.Type,
|
|
95
|
+
checker: ts.TypeChecker,
|
|
96
|
+
): DefaultValueDetectionResult {
|
|
97
|
+
const metaProp = getFieldMetaProperty(type);
|
|
98
|
+
if (!metaProp) {
|
|
99
|
+
return createEmptyResult();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const rawMetaType = checker.getTypeOfSymbol(metaProp);
|
|
103
|
+
const metaType = getActualMetadataType(rawMetaType);
|
|
104
|
+
if (!metaType) {
|
|
105
|
+
return createEmptyResult();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const defaultValueProp = metaType.getProperty(DEFAULT_VALUE_PROPERTY);
|
|
109
|
+
if (!defaultValueProp) {
|
|
110
|
+
return createEmptyResult();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const rawDefaultValueType = checker.getTypeOfSymbol(defaultValueProp);
|
|
114
|
+
const typeString = checker.typeToString(rawDefaultValueType);
|
|
115
|
+
|
|
116
|
+
// If defaultValue is undefined (not specified in Meta), return empty result
|
|
117
|
+
// Check raw type first before unwrapping
|
|
118
|
+
if (rawDefaultValueType.flags & ts.TypeFlags.Undefined) {
|
|
119
|
+
return createEmptyResult();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Check if the type is a union that only contains undefined
|
|
123
|
+
// This handles cases where Meta["defaultValue"] resolves to undefined
|
|
124
|
+
if (rawDefaultValueType.isUnion()) {
|
|
125
|
+
const nonUndefinedTypes = rawDefaultValueType.types.filter(
|
|
126
|
+
(t) => !(t.flags & ts.TypeFlags.Undefined),
|
|
127
|
+
);
|
|
128
|
+
if (nonUndefinedTypes.length === 0) {
|
|
129
|
+
return createEmptyResult();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// If the type string is "undefined", skip (handles edge cases)
|
|
134
|
+
if (typeString === "undefined") {
|
|
135
|
+
return createEmptyResult();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// If the type is unknown, it means Meta["defaultValue"] was not explicitly specified
|
|
139
|
+
// and TypeScript inferred it from the constraint (defaultValue?: unknown)
|
|
140
|
+
if (rawDefaultValueType.flags & ts.TypeFlags.Unknown) {
|
|
141
|
+
return createEmptyResult();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const defaultValueType = getActualMetadataType(rawDefaultValueType);
|
|
145
|
+
if (!defaultValueType) {
|
|
146
|
+
return createEmptyResult();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Also check the unwrapped type for undefined
|
|
150
|
+
if (defaultValueType.flags & ts.TypeFlags.Undefined) {
|
|
151
|
+
return createEmptyResult();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const resolved = resolveArgumentValue(defaultValueType, checker);
|
|
155
|
+
if (resolved) {
|
|
156
|
+
return {
|
|
157
|
+
defaultValue: resolved,
|
|
158
|
+
errors: [],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
defaultValue: null,
|
|
164
|
+
errors: [
|
|
165
|
+
{
|
|
166
|
+
code: "UNRESOLVABLE_DEFAULT_VALUE",
|
|
167
|
+
message:
|
|
168
|
+
"Default value must be a literal type (string, number, boolean, null, array, object, or enum)",
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Diagnostic, Diagnostics } from "../type-extractor/types/index.js";
|
|
2
|
+
|
|
3
|
+
function getDiagnosticKey(d: Diagnostic): string {
|
|
4
|
+
const locationKey = d.location
|
|
5
|
+
? `${d.location.file}:${d.location.line}:${d.location.column}`
|
|
6
|
+
: "";
|
|
7
|
+
return `${d.code}:${d.message}:${d.severity}:${locationKey}`;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function deduplicateDiagnostics(
|
|
11
|
+
diagnostics: ReadonlyArray<Diagnostic>,
|
|
12
|
+
): Diagnostic[] {
|
|
13
|
+
const seen = new Set<string>();
|
|
14
|
+
const result: Diagnostic[] = [];
|
|
15
|
+
|
|
16
|
+
for (const d of diagnostics) {
|
|
17
|
+
const key = getDiagnosticKey(d);
|
|
18
|
+
if (!seen.has(key)) {
|
|
19
|
+
seen.add(key);
|
|
20
|
+
result.push(d);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function collectDiagnostics(
|
|
28
|
+
allDiagnostics: ReadonlyArray<Diagnostic>,
|
|
29
|
+
): Diagnostics {
|
|
30
|
+
const uniqueDiagnostics = deduplicateDiagnostics(allDiagnostics);
|
|
31
|
+
const errors = uniqueDiagnostics.filter((d) => d.severity === "error");
|
|
32
|
+
const warnings = uniqueDiagnostics.filter((d) => d.severity === "warning");
|
|
33
|
+
|
|
34
|
+
return { errors, warnings };
|
|
35
|
+
}
|