@gqlkit-ts/cli 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts +46 -0
- package/dist/auto-type-generator/auto-type-generator.d.ts.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.js +353 -0
- package/dist/auto-type-generator/auto-type-generator.js.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts +2 -0
- package/dist/auto-type-generator/auto-type-generator.test.d.ts.map +1 -0
- package/dist/auto-type-generator/auto-type-generator.test.js +613 -0
- package/dist/auto-type-generator/auto-type-generator.test.js.map +1 -0
- package/dist/auto-type-generator/index.d.ts +4 -0
- package/dist/auto-type-generator/index.d.ts.map +1 -0
- package/dist/auto-type-generator/index.js +3 -0
- package/dist/auto-type-generator/index.js.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.d.ts +17 -0
- package/dist/auto-type-generator/name-collision-validator.d.ts.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.js +68 -0
- package/dist/auto-type-generator/name-collision-validator.js.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.test.d.ts +2 -0
- package/dist/auto-type-generator/name-collision-validator.test.d.ts.map +1 -0
- package/dist/auto-type-generator/name-collision-validator.test.js +358 -0
- package/dist/auto-type-generator/name-collision-validator.test.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.d.ts +40 -0
- package/dist/auto-type-generator/naming-convention.d.ts.map +1 -0
- package/dist/auto-type-generator/naming-convention.js +59 -0
- package/dist/auto-type-generator/naming-convention.js.map +1 -0
- package/dist/auto-type-generator/naming-convention.test.d.ts +2 -0
- package/dist/auto-type-generator/naming-convention.test.d.ts.map +1 -0
- package/dist/auto-type-generator/naming-convention.test.js +132 -0
- package/dist/auto-type-generator/naming-convention.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/gen.d.ts +32 -0
- package/dist/commands/gen.d.ts.map +1 -0
- package/dist/commands/gen.js +101 -0
- package/dist/commands/gen.js.map +1 -0
- package/dist/commands/gen.test.d.ts +2 -0
- package/dist/commands/gen.test.d.ts.map +1 -0
- package/dist/commands/gen.test.js +226 -0
- package/dist/commands/gen.test.js.map +1 -0
- package/dist/commands/main.d.ts +12 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +5 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/config/define-config.d.ts +26 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +27 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +131 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config-loader/index.d.ts +3 -0
- package/dist/config-loader/index.d.ts.map +1 -0
- package/dist/config-loader/index.js +2 -0
- package/dist/config-loader/index.js.map +1 -0
- package/dist/config-loader/loader.d.ts +50 -0
- package/dist/config-loader/loader.d.ts.map +1 -0
- package/dist/config-loader/loader.js +78 -0
- package/dist/config-loader/loader.js.map +1 -0
- package/dist/config-loader/loader.test.d.ts +2 -0
- package/dist/config-loader/loader.test.d.ts.map +1 -0
- package/dist/config-loader/loader.test.js +123 -0
- package/dist/config-loader/loader.test.js.map +1 -0
- package/dist/config-loader/validator.d.ts +13 -0
- package/dist/config-loader/validator.d.ts.map +1 -0
- package/dist/config-loader/validator.js +497 -0
- package/dist/config-loader/validator.js.map +1 -0
- package/dist/config-loader/validator.test.d.ts +2 -0
- package/dist/config-loader/validator.test.d.ts.map +1 -0
- package/dist/config-loader/validator.test.js +846 -0
- package/dist/config-loader/validator.test.js.map +1 -0
- package/dist/gen-orchestrator/golden.test.d.ts +2 -0
- package/dist/gen-orchestrator/golden.test.d.ts.map +1 -0
- package/dist/gen-orchestrator/golden.test.js +102 -0
- package/dist/gen-orchestrator/golden.test.js.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.d.ts +25 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.d.ts.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.js +68 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.js.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts +2 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.d.ts.map +1 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js +167 -0
- package/dist/gen-orchestrator/hook-executor/hook-executor.test.js.map +1 -0
- package/dist/gen-orchestrator/orchestrator.d.ts +30 -0
- package/dist/gen-orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/gen-orchestrator/orchestrator.js +407 -0
- package/dist/gen-orchestrator/orchestrator.js.map +1 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.d.ts +9 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.d.ts.map +1 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.js +32 -0
- package/dist/gen-orchestrator/reporter/diagnostic-reporter.js.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.d.ts +19 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.d.ts.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.js +38 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.js.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts +2 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.d.ts.map +1 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js +74 -0
- package/dist/gen-orchestrator/reporter/progress-reporter.test.js.map +1 -0
- package/dist/gen-orchestrator/writer/file-writer.d.ts +13 -0
- package/dist/gen-orchestrator/writer/file-writer.d.ts.map +1 -0
- package/dist/gen-orchestrator/writer/file-writer.js +22 -0
- package/dist/gen-orchestrator/writer/file-writer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver-extractor/extract-resolvers.d.ts +40 -0
- package/dist/resolver-extractor/extract-resolvers.d.ts.map +1 -0
- package/dist/resolver-extractor/extract-resolvers.js +2 -0
- package/dist/resolver-extractor/extract-resolvers.js.map +1 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts +50 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.d.ts.map +1 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.js +685 -0
- package/dist/resolver-extractor/extractor/define-api-extractor.js.map +1 -0
- package/dist/resolver-extractor/index.d.ts +5 -0
- package/dist/resolver-extractor/index.d.ts.map +1 -0
- package/dist/resolver-extractor/index.js +2 -0
- package/dist/resolver-extractor/index.js.map +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts +25 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.d.ts.map +1 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js +172 -0
- package/dist/resolver-extractor/validator/abstract-resolver-validator.js.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.d.ts +61 -0
- package/dist/resolver-extractor/validator/only-validator.d.ts.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.js +76 -0
- package/dist/resolver-extractor/validator/only-validator.js.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.test.d.ts +8 -0
- package/dist/resolver-extractor/validator/only-validator.test.d.ts.map +1 -0
- package/dist/resolver-extractor/validator/only-validator.test.js +352 -0
- package/dist/resolver-extractor/validator/only-validator.test.js.map +1 -0
- package/dist/schema-generator/builder/ast-builder.d.ts +7 -0
- package/dist/schema-generator/builder/ast-builder.d.ts.map +1 -0
- package/dist/schema-generator/builder/ast-builder.js +417 -0
- package/dist/schema-generator/builder/ast-builder.js.map +1 -0
- package/dist/schema-generator/builder/ast-builder.test.d.ts +2 -0
- package/dist/schema-generator/builder/ast-builder.test.d.ts.map +1 -0
- package/dist/schema-generator/builder/ast-builder.test.js +469 -0
- package/dist/schema-generator/builder/ast-builder.test.js.map +1 -0
- package/dist/schema-generator/emitter/code-emitter.d.ts +7 -0
- package/dist/schema-generator/emitter/code-emitter.d.ts.map +1 -0
- package/dist/schema-generator/emitter/code-emitter.js +201 -0
- package/dist/schema-generator/emitter/code-emitter.js.map +1 -0
- package/dist/schema-generator/emitter/sdl-emitter.d.ts +7 -0
- package/dist/schema-generator/emitter/sdl-emitter.d.ts.map +1 -0
- package/dist/schema-generator/emitter/sdl-emitter.js +11 -0
- package/dist/schema-generator/emitter/sdl-emitter.js.map +1 -0
- package/dist/schema-generator/generate-schema.d.ts +26 -0
- package/dist/schema-generator/generate-schema.d.ts.map +1 -0
- package/dist/schema-generator/generate-schema.js +76 -0
- package/dist/schema-generator/generate-schema.js.map +1 -0
- package/dist/schema-generator/index.d.ts +4 -0
- package/dist/schema-generator/index.d.ts.map +1 -0
- package/dist/schema-generator/index.js +2 -0
- package/dist/schema-generator/index.js.map +1 -0
- package/dist/schema-generator/integrator/result-integrator.d.ts +93 -0
- package/dist/schema-generator/integrator/result-integrator.d.ts.map +1 -0
- package/dist/schema-generator/integrator/result-integrator.js +396 -0
- package/dist/schema-generator/integrator/result-integrator.js.map +1 -0
- package/dist/schema-generator/pruner/schema-pruner.d.ts +16 -0
- package/dist/schema-generator/pruner/schema-pruner.d.ts.map +1 -0
- package/dist/schema-generator/pruner/schema-pruner.js +66 -0
- package/dist/schema-generator/pruner/schema-pruner.js.map +1 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts +24 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.d.ts.map +1 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js +61 -0
- package/dist/schema-generator/resolver-collector/resolver-collector.js.map +1 -0
- package/dist/shared/constants.d.ts +70 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +128 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/default-value-detector.d.ts +40 -0
- package/dist/shared/default-value-detector.d.ts.map +1 -0
- package/dist/shared/default-value-detector.js +124 -0
- package/dist/shared/default-value-detector.js.map +1 -0
- package/dist/shared/diagnostics.d.ts +4 -0
- package/dist/shared/diagnostics.d.ts.map +1 -0
- package/dist/shared/diagnostics.js +25 -0
- package/dist/shared/diagnostics.js.map +1 -0
- package/dist/shared/directive-definition-extractor.d.ts +64 -0
- package/dist/shared/directive-definition-extractor.d.ts.map +1 -0
- package/dist/shared/directive-definition-extractor.js +399 -0
- package/dist/shared/directive-definition-extractor.js.map +1 -0
- package/dist/shared/directive-detector.d.ts +102 -0
- package/dist/shared/directive-detector.d.ts.map +1 -0
- package/dist/shared/directive-detector.js +422 -0
- package/dist/shared/directive-detector.js.map +1 -0
- package/dist/shared/file-scanner.d.ts +25 -0
- package/dist/shared/file-scanner.d.ts.map +1 -0
- package/dist/shared/file-scanner.js +99 -0
- package/dist/shared/file-scanner.js.map +1 -0
- package/dist/shared/file-scanner.test.d.ts +2 -0
- package/dist/shared/file-scanner.test.d.ts.map +1 -0
- package/dist/shared/file-scanner.test.js +138 -0
- package/dist/shared/file-scanner.test.js.map +1 -0
- package/dist/shared/index.d.ts +10 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +8 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/inline-object-extractor.d.ts +13 -0
- package/dist/shared/inline-object-extractor.d.ts.map +1 -0
- package/dist/shared/inline-object-extractor.js +65 -0
- package/dist/shared/inline-object-extractor.js.map +1 -0
- package/dist/shared/inline-object-utils.d.ts +7 -0
- package/dist/shared/inline-object-utils.d.ts.map +1 -0
- package/dist/shared/inline-object-utils.js +23 -0
- package/dist/shared/inline-object-utils.js.map +1 -0
- package/dist/shared/interface-detector.d.ts +22 -0
- package/dist/shared/interface-detector.d.ts.map +1 -0
- package/dist/shared/interface-detector.js +90 -0
- package/dist/shared/interface-detector.js.map +1 -0
- package/dist/shared/interface-validator.d.ts +9 -0
- package/dist/shared/interface-validator.d.ts.map +1 -0
- package/dist/shared/interface-validator.js +152 -0
- package/dist/shared/interface-validator.js.map +1 -0
- package/dist/shared/interface-validator.test.d.ts +2 -0
- package/dist/shared/interface-validator.test.d.ts.map +1 -0
- package/dist/shared/interface-validator.test.js +145 -0
- package/dist/shared/interface-validator.test.js.map +1 -0
- package/dist/shared/metadata-detector.d.ts +65 -0
- package/dist/shared/metadata-detector.d.ts.map +1 -0
- package/dist/shared/metadata-detector.js +333 -0
- package/dist/shared/metadata-detector.js.map +1 -0
- package/dist/shared/program-factory.d.ts +14 -0
- package/dist/shared/program-factory.d.ts.map +1 -0
- package/dist/shared/program-factory.js +29 -0
- package/dist/shared/program-factory.js.map +1 -0
- package/dist/shared/source-location.d.ts +11 -0
- package/dist/shared/source-location.d.ts.map +1 -0
- package/dist/shared/source-location.js +15 -0
- package/dist/shared/source-location.js.map +1 -0
- package/dist/shared/tsconfig-loader.d.ts +13 -0
- package/dist/shared/tsconfig-loader.d.ts.map +1 -0
- package/dist/shared/tsconfig-loader.js +90 -0
- package/dist/shared/tsconfig-loader.js.map +1 -0
- package/dist/shared/tsdoc-parser.d.ts +12 -0
- package/dist/shared/tsdoc-parser.d.ts.map +1 -0
- package/dist/shared/tsdoc-parser.js +101 -0
- package/dist/shared/tsdoc-parser.js.map +1 -0
- package/dist/shared/type-converter.d.ts +3 -0
- package/dist/shared/type-converter.d.ts.map +1 -0
- package/dist/shared/type-converter.js +72 -0
- package/dist/shared/type-converter.js.map +1 -0
- package/dist/shared/typescript-utils.d.ts +55 -0
- package/dist/shared/typescript-utils.d.ts.map +1 -0
- package/dist/shared/typescript-utils.js +149 -0
- package/dist/shared/typescript-utils.js.map +1 -0
- package/dist/type-extractor/collector/result-collector.d.ts +7 -0
- package/dist/type-extractor/collector/result-collector.d.ts.map +1 -0
- package/dist/type-extractor/collector/result-collector.js +35 -0
- package/dist/type-extractor/collector/result-collector.js.map +1 -0
- package/dist/type-extractor/collector/scalar-collector.d.ts +108 -0
- package/dist/type-extractor/collector/scalar-collector.d.ts.map +1 -0
- package/dist/type-extractor/collector/scalar-collector.js +133 -0
- package/dist/type-extractor/collector/scalar-collector.js.map +1 -0
- package/dist/type-extractor/converter/field-eligibility.d.ts +34 -0
- package/dist/type-extractor/converter/field-eligibility.d.ts.map +1 -0
- package/dist/type-extractor/converter/field-eligibility.js +89 -0
- package/dist/type-extractor/converter/field-eligibility.js.map +1 -0
- package/dist/type-extractor/converter/graphql-converter.d.ts +7 -0
- package/dist/type-extractor/converter/graphql-converter.d.ts.map +1 -0
- package/dist/type-extractor/converter/graphql-converter.js +299 -0
- package/dist/type-extractor/converter/graphql-converter.js.map +1 -0
- package/dist/type-extractor/extract-types.d.ts +2 -0
- package/dist/type-extractor/extract-types.d.ts.map +1 -0
- package/dist/type-extractor/extract-types.js +2 -0
- package/dist/type-extractor/extract-types.js.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts +27 -0
- package/dist/type-extractor/extractor/type-extractor.d.ts.map +1 -0
- package/dist/type-extractor/extractor/type-extractor.js +1116 -0
- package/dist/type-extractor/extractor/type-extractor.js.map +1 -0
- package/dist/type-extractor/index.d.ts +4 -0
- package/dist/type-extractor/index.d.ts.map +1 -0
- package/dist/type-extractor/index.js +2 -0
- package/dist/type-extractor/index.js.map +1 -0
- package/dist/type-extractor/types/diagnostics.d.ts +17 -0
- package/dist/type-extractor/types/diagnostics.d.ts.map +1 -0
- package/dist/type-extractor/types/diagnostics.js +2 -0
- package/dist/type-extractor/types/diagnostics.js.map +1 -0
- package/dist/type-extractor/types/graphql.d.ts +40 -0
- package/dist/type-extractor/types/graphql.d.ts.map +1 -0
- package/dist/type-extractor/types/graphql.js +2 -0
- package/dist/type-extractor/types/graphql.js.map +1 -0
- package/dist/type-extractor/types/index.d.ts +5 -0
- package/dist/type-extractor/types/index.d.ts.map +1 -0
- package/dist/type-extractor/types/index.js +2 -0
- package/dist/type-extractor/types/index.js.map +1 -0
- package/dist/type-extractor/types/typescript.d.ts +86 -0
- package/dist/type-extractor/types/typescript.d.ts.map +1 -0
- package/dist/type-extractor/types/typescript.js +2 -0
- package/dist/type-extractor/types/typescript.js.map +1 -0
- package/dist/type-extractor/types/typescript.test.d.ts +2 -0
- package/dist/type-extractor/types/typescript.test.d.ts.map +1 -0
- package/dist/type-extractor/types/typescript.test.js +287 -0
- package/dist/type-extractor/types/typescript.test.js.map +1 -0
- package/dist/type-extractor/validator/type-validator.d.ts +11 -0
- package/dist/type-extractor/validator/type-validator.d.ts.map +1 -0
- package/dist/type-extractor/validator/type-validator.js +53 -0
- package/dist/type-extractor/validator/type-validator.js.map +1 -0
- package/docs/configuration.md +163 -0
- package/docs/getting-started.md +117 -0
- package/docs/index.md +32 -0
- package/docs/integration/apollo.md +109 -0
- package/docs/integration/yoga.md +108 -0
- package/docs/schema/abstract-resolvers.md +146 -0
- package/docs/schema/directives.md +196 -0
- package/docs/schema/documentation.md +176 -0
- package/docs/schema/enums.md +162 -0
- package/docs/schema/fields.md +184 -0
- package/docs/schema/index.md +38 -0
- package/docs/schema/inputs.md +277 -0
- package/docs/schema/interfaces.md +178 -0
- package/docs/schema/objects.md +186 -0
- package/docs/schema/queries-mutations.md +205 -0
- package/docs/schema/scalars.md +194 -0
- package/docs/schema/unions.md +90 -0
- package/docs/what-is-gqlkit.md +22 -0
- package/package.json +59 -7
- package/README.md +0 -45
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { validateInterfaceImplementations } from "./interface-validator.js";
|
|
3
|
+
describe("validateInterfaceImplementations", () => {
|
|
4
|
+
it("should detect missing interface field", () => {
|
|
5
|
+
const types = [
|
|
6
|
+
{
|
|
7
|
+
name: "Node",
|
|
8
|
+
kind: "Interface",
|
|
9
|
+
fields: [
|
|
10
|
+
{
|
|
11
|
+
name: "id",
|
|
12
|
+
type: {
|
|
13
|
+
typeName: "ID",
|
|
14
|
+
nullable: false,
|
|
15
|
+
list: false,
|
|
16
|
+
listItemNullable: null,
|
|
17
|
+
},
|
|
18
|
+
description: null,
|
|
19
|
+
deprecated: null,
|
|
20
|
+
directives: null,
|
|
21
|
+
defaultValue: null,
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
unionMembers: null,
|
|
25
|
+
enumValues: null,
|
|
26
|
+
isNumericEnum: false,
|
|
27
|
+
implementedInterfaces: null,
|
|
28
|
+
sourceFile: "src/node.ts",
|
|
29
|
+
description: null,
|
|
30
|
+
deprecated: null,
|
|
31
|
+
directives: null,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "User",
|
|
35
|
+
kind: "Object",
|
|
36
|
+
fields: [
|
|
37
|
+
{
|
|
38
|
+
name: "name",
|
|
39
|
+
type: {
|
|
40
|
+
typeName: "String",
|
|
41
|
+
nullable: false,
|
|
42
|
+
list: false,
|
|
43
|
+
listItemNullable: null,
|
|
44
|
+
},
|
|
45
|
+
description: null,
|
|
46
|
+
deprecated: null,
|
|
47
|
+
directives: null,
|
|
48
|
+
defaultValue: null,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
unionMembers: null,
|
|
52
|
+
enumValues: null,
|
|
53
|
+
isNumericEnum: false,
|
|
54
|
+
implementedInterfaces: ["Node"],
|
|
55
|
+
sourceFile: "src/user.ts",
|
|
56
|
+
description: null,
|
|
57
|
+
deprecated: null,
|
|
58
|
+
directives: null,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
const result = validateInterfaceImplementations(types);
|
|
62
|
+
expect(result.isValid).toBe(false);
|
|
63
|
+
expect(result.diagnostics).toHaveLength(1);
|
|
64
|
+
expect(result.diagnostics[0]).toMatchObject({
|
|
65
|
+
code: "INTERFACE_MISSING_FIELD",
|
|
66
|
+
message: "Type 'User' implements interface 'Node' but is missing field 'id'",
|
|
67
|
+
severity: "error",
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
it("should pass when all interface fields are implemented", () => {
|
|
71
|
+
const types = [
|
|
72
|
+
{
|
|
73
|
+
name: "Node",
|
|
74
|
+
kind: "Interface",
|
|
75
|
+
fields: [
|
|
76
|
+
{
|
|
77
|
+
name: "id",
|
|
78
|
+
type: {
|
|
79
|
+
typeName: "ID",
|
|
80
|
+
nullable: false,
|
|
81
|
+
list: false,
|
|
82
|
+
listItemNullable: null,
|
|
83
|
+
},
|
|
84
|
+
description: null,
|
|
85
|
+
deprecated: null,
|
|
86
|
+
directives: null,
|
|
87
|
+
defaultValue: null,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
unionMembers: null,
|
|
91
|
+
enumValues: null,
|
|
92
|
+
isNumericEnum: false,
|
|
93
|
+
implementedInterfaces: null,
|
|
94
|
+
sourceFile: "src/node.ts",
|
|
95
|
+
description: null,
|
|
96
|
+
deprecated: null,
|
|
97
|
+
directives: null,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "User",
|
|
101
|
+
kind: "Object",
|
|
102
|
+
fields: [
|
|
103
|
+
{
|
|
104
|
+
name: "id",
|
|
105
|
+
type: {
|
|
106
|
+
typeName: "ID",
|
|
107
|
+
nullable: false,
|
|
108
|
+
list: false,
|
|
109
|
+
listItemNullable: null,
|
|
110
|
+
},
|
|
111
|
+
description: null,
|
|
112
|
+
deprecated: null,
|
|
113
|
+
directives: null,
|
|
114
|
+
defaultValue: null,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: "name",
|
|
118
|
+
type: {
|
|
119
|
+
typeName: "String",
|
|
120
|
+
nullable: false,
|
|
121
|
+
list: false,
|
|
122
|
+
listItemNullable: null,
|
|
123
|
+
},
|
|
124
|
+
description: null,
|
|
125
|
+
deprecated: null,
|
|
126
|
+
directives: null,
|
|
127
|
+
defaultValue: null,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
unionMembers: null,
|
|
131
|
+
enumValues: null,
|
|
132
|
+
isNumericEnum: false,
|
|
133
|
+
implementedInterfaces: ["Node"],
|
|
134
|
+
sourceFile: "src/user.ts",
|
|
135
|
+
description: null,
|
|
136
|
+
deprecated: null,
|
|
137
|
+
directives: null,
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
const result = validateInterfaceImplementations(types);
|
|
141
|
+
expect(result.isValid).toBe(true);
|
|
142
|
+
expect(result.diagnostics).toHaveLength(0);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=interface-validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface-validator.test.js","sourceRoot":"","sources":["../../src/shared/interface-validator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scalar metadata detector.
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to detect scalar metadata embedded
|
|
5
|
+
* in TypeScript intersection types using the $gqlkitScalar property.
|
|
6
|
+
*/
|
|
7
|
+
import ts from "typescript";
|
|
8
|
+
/**
|
|
9
|
+
* Error information for mixed scalar union detection.
|
|
10
|
+
*/
|
|
11
|
+
export interface ScalarMetadataError {
|
|
12
|
+
readonly code: "MIXED_SCALAR_UNION";
|
|
13
|
+
readonly message: string;
|
|
14
|
+
readonly scalarNames: ReadonlyArray<string>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Result of scalar metadata detection.
|
|
18
|
+
*/
|
|
19
|
+
export interface ScalarMetadataResult {
|
|
20
|
+
/** The GraphQL scalar name if detected, null otherwise */
|
|
21
|
+
readonly scalarName: string | null;
|
|
22
|
+
/** Usage constraint: "input", "output", or null for both */
|
|
23
|
+
readonly only: "input" | "output" | null;
|
|
24
|
+
/** Whether the type is nullable (union with null) */
|
|
25
|
+
readonly nullable: boolean;
|
|
26
|
+
/** Whether the type is a list (array type) */
|
|
27
|
+
readonly isList: boolean;
|
|
28
|
+
/** Whether list items are nullable (for list types) */
|
|
29
|
+
readonly listItemNullable: boolean;
|
|
30
|
+
/** Whether this is a TypeScript primitive type */
|
|
31
|
+
readonly isPrimitive: boolean;
|
|
32
|
+
/** Whether this is an object type (not a scalar) */
|
|
33
|
+
readonly isObjectType: boolean;
|
|
34
|
+
/** Error if mixed scalar union is detected */
|
|
35
|
+
readonly error: ScalarMetadataError | undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extracts the actual type from an optional property type (T | undefined).
|
|
39
|
+
* Used by both scalar and resolver metadata detection.
|
|
40
|
+
*
|
|
41
|
+
* For simple cases like `T | undefined`, returns T.
|
|
42
|
+
* For union cases like `T | null | undefined`, returns the original union type
|
|
43
|
+
* so the caller can analyze it (e.g., check for null members).
|
|
44
|
+
* For boolean types (true | false | undefined), reconstructs the boolean type.
|
|
45
|
+
*
|
|
46
|
+
* @param metadataType - The type of the metadata property (may be union with undefined)
|
|
47
|
+
* @returns The actual type excluding undefined, or null if extraction fails
|
|
48
|
+
*/
|
|
49
|
+
export declare function getActualMetadataType(metadataType: ts.Type): ts.Type | null;
|
|
50
|
+
/**
|
|
51
|
+
* Detects scalar metadata from a TypeScript type.
|
|
52
|
+
*
|
|
53
|
+
* This function analyzes TypeScript types to detect scalar metadata:
|
|
54
|
+
* - TypeScript primitives (string, boolean, number) map to GraphQL scalars
|
|
55
|
+
* - Intersection types with " $gqlkitScalar" property indicate custom scalars
|
|
56
|
+
* - Type aliases are followed to find the underlying scalar metadata
|
|
57
|
+
* - Unions with null indicate nullable types
|
|
58
|
+
* - Array types indicate list types
|
|
59
|
+
*
|
|
60
|
+
* @param type - The TypeScript type to analyze
|
|
61
|
+
* @param checker - The TypeScript type checker
|
|
62
|
+
* @returns Detection result with scalar information
|
|
63
|
+
*/
|
|
64
|
+
export declare function detectScalarMetadata(type: ts.Type, checker: ts.TypeChecker): ScalarMetadataResult;
|
|
65
|
+
//# sourceMappingURL=metadata-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-detector.d.ts","sourceRoot":"","sources":["../../src/shared/metadata-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAM5B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;IACzC,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,kDAAkD;IAClD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,CAAC;CACjD;AAsBD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,CA6B3E;AA8LD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,oBAAoB,CAkItB"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scalar metadata detector.
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to detect scalar metadata embedded
|
|
5
|
+
* in TypeScript intersection types using the $gqlkitScalar property.
|
|
6
|
+
*/
|
|
7
|
+
import ts from "typescript";
|
|
8
|
+
import { METADATA_PROPERTIES } from "./constants.js";
|
|
9
|
+
import { isNullOrUndefined } from "./typescript-utils.js";
|
|
10
|
+
const SCALAR_METADATA_PROPERTY = METADATA_PROPERTIES.SCALAR;
|
|
11
|
+
function createDefaultResult() {
|
|
12
|
+
return {
|
|
13
|
+
scalarName: null,
|
|
14
|
+
only: null,
|
|
15
|
+
nullable: false,
|
|
16
|
+
isList: false,
|
|
17
|
+
listItemNullable: false,
|
|
18
|
+
isPrimitive: false,
|
|
19
|
+
isObjectType: false,
|
|
20
|
+
error: undefined,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extracts the actual type from an optional property type (T | undefined).
|
|
25
|
+
* Used by both scalar and resolver metadata detection.
|
|
26
|
+
*
|
|
27
|
+
* For simple cases like `T | undefined`, returns T.
|
|
28
|
+
* For union cases like `T | null | undefined`, returns the original union type
|
|
29
|
+
* so the caller can analyze it (e.g., check for null members).
|
|
30
|
+
* For boolean types (true | false | undefined), reconstructs the boolean type.
|
|
31
|
+
*
|
|
32
|
+
* @param metadataType - The type of the metadata property (may be union with undefined)
|
|
33
|
+
* @returns The actual type excluding undefined, or null if extraction fails
|
|
34
|
+
*/
|
|
35
|
+
export function getActualMetadataType(metadataType) {
|
|
36
|
+
if (metadataType.isUnion()) {
|
|
37
|
+
const nonUndefinedTypes = metadataType.types.filter((t) => !(t.flags & ts.TypeFlags.Undefined));
|
|
38
|
+
if (nonUndefinedTypes.length === 1) {
|
|
39
|
+
return nonUndefinedTypes[0];
|
|
40
|
+
}
|
|
41
|
+
// Special case: boolean (true | false) optionally with undefined
|
|
42
|
+
// TypeScript represents boolean | undefined as true | false | undefined
|
|
43
|
+
if (nonUndefinedTypes.length === 2 &&
|
|
44
|
+
nonUndefinedTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral)) {
|
|
45
|
+
// This is effectively "boolean" - return the first member to preserve
|
|
46
|
+
// the boolean literal nature, or we could return the union
|
|
47
|
+
return metadataType;
|
|
48
|
+
}
|
|
49
|
+
// If there are multiple non-undefined types (e.g., string | null),
|
|
50
|
+
// return the original metadataType. The caller should analyze this
|
|
51
|
+
// union type and handle null members appropriately.
|
|
52
|
+
if (nonUndefinedTypes.length > 1) {
|
|
53
|
+
// Return the original type - caller will need to filter out undefined
|
|
54
|
+
// when checking for nullability
|
|
55
|
+
return metadataType;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return metadataType;
|
|
60
|
+
}
|
|
61
|
+
function extractMetadataFromType(type, checker) {
|
|
62
|
+
const metadataProp = type.getProperty(SCALAR_METADATA_PROPERTY);
|
|
63
|
+
if (!metadataProp) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const rawMetadataType = checker.getTypeOfSymbol(metadataProp);
|
|
67
|
+
const metadataType = getActualMetadataType(rawMetadataType);
|
|
68
|
+
if (!metadataType) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const nameProp = metadataType.getProperty("name");
|
|
72
|
+
if (!nameProp) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const nameType = checker.getTypeOfSymbol(nameProp);
|
|
76
|
+
if (!(nameType.flags & ts.TypeFlags.StringLiteral)) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const scalarName = nameType.value;
|
|
80
|
+
const onlyProp = metadataType.getProperty("only");
|
|
81
|
+
let only = null;
|
|
82
|
+
if (onlyProp) {
|
|
83
|
+
const onlyType = checker.getTypeOfSymbol(onlyProp);
|
|
84
|
+
if (onlyType.flags & ts.TypeFlags.StringLiteral) {
|
|
85
|
+
const onlyValue = onlyType.value;
|
|
86
|
+
if (onlyValue === "input" || onlyValue === "output") {
|
|
87
|
+
only = onlyValue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
scalarName,
|
|
93
|
+
only,
|
|
94
|
+
isPrimitive: false,
|
|
95
|
+
isObjectType: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function detectScalarMetadataFromIntersection(type, checker) {
|
|
99
|
+
if (!type.isIntersection()) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
for (const member of type.types) {
|
|
103
|
+
const metadata = extractMetadataFromType(member, checker);
|
|
104
|
+
if (metadata) {
|
|
105
|
+
return metadata;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
function detectPrimitiveScalar(type) {
|
|
111
|
+
if (type.flags & ts.TypeFlags.String) {
|
|
112
|
+
return {
|
|
113
|
+
scalarName: "String",
|
|
114
|
+
only: null,
|
|
115
|
+
isPrimitive: true,
|
|
116
|
+
isObjectType: false,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (type.flags & ts.TypeFlags.Number) {
|
|
120
|
+
return {
|
|
121
|
+
scalarName: "Float",
|
|
122
|
+
only: null,
|
|
123
|
+
isPrimitive: true,
|
|
124
|
+
isObjectType: false,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (type.flags & ts.TypeFlags.Boolean ||
|
|
128
|
+
type.flags & ts.TypeFlags.BooleanLiteral) {
|
|
129
|
+
return {
|
|
130
|
+
scalarName: "Boolean",
|
|
131
|
+
only: null,
|
|
132
|
+
isPrimitive: true,
|
|
133
|
+
isObjectType: false,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
function isBooleanLiteralUnion(types) {
|
|
139
|
+
const nonNullTypes = types.filter((t) => !isNullOrUndefined(t));
|
|
140
|
+
return (nonNullTypes.length === 2 &&
|
|
141
|
+
nonNullTypes.every((t) => t.flags & ts.TypeFlags.BooleanLiteral));
|
|
142
|
+
}
|
|
143
|
+
function detectScalarMetadataCore(type, checker) {
|
|
144
|
+
const primitiveResult = detectPrimitiveScalar(type);
|
|
145
|
+
if (primitiveResult) {
|
|
146
|
+
return primitiveResult;
|
|
147
|
+
}
|
|
148
|
+
const intersectionResult = detectScalarMetadataFromIntersection(type, checker);
|
|
149
|
+
if (intersectionResult) {
|
|
150
|
+
return intersectionResult;
|
|
151
|
+
}
|
|
152
|
+
const directMetadata = extractMetadataFromType(type, checker);
|
|
153
|
+
if (directMetadata) {
|
|
154
|
+
return directMetadata;
|
|
155
|
+
}
|
|
156
|
+
if (type.aliasSymbol) {
|
|
157
|
+
const aliasedType = checker.getDeclaredTypeOfSymbol(type.aliasSymbol);
|
|
158
|
+
if (aliasedType !== type) {
|
|
159
|
+
const aliasResult = detectScalarMetadataCore(aliasedType, checker);
|
|
160
|
+
if (aliasResult) {
|
|
161
|
+
return aliasResult;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const symbol = type.getSymbol();
|
|
166
|
+
if (symbol) {
|
|
167
|
+
const declarations = symbol.getDeclarations();
|
|
168
|
+
if (declarations && declarations.length > 0) {
|
|
169
|
+
for (const decl of declarations) {
|
|
170
|
+
if (ts.isTypeAliasDeclaration(decl)) {
|
|
171
|
+
const declSymbol = checker.getSymbolAtLocation(decl.name);
|
|
172
|
+
if (declSymbol) {
|
|
173
|
+
const declType = checker.getDeclaredTypeOfSymbol(declSymbol);
|
|
174
|
+
if (declType !== type && declType.isIntersection()) {
|
|
175
|
+
const result = detectScalarMetadataFromIntersection(declType, checker);
|
|
176
|
+
if (result) {
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
function isObjectLikeType(type) {
|
|
188
|
+
if (type.flags & ts.TypeFlags.Object) {
|
|
189
|
+
const objectType = type;
|
|
190
|
+
if (objectType.objectFlags & ts.ObjectFlags.Anonymous ||
|
|
191
|
+
objectType.objectFlags & ts.ObjectFlags.Interface ||
|
|
192
|
+
objectType.objectFlags & ts.ObjectFlags.Reference) {
|
|
193
|
+
const properties = type.getProperties();
|
|
194
|
+
const hasOnlyMetadataProperty = properties.length === 1 &&
|
|
195
|
+
properties[0]?.getName() === SCALAR_METADATA_PROPERTY;
|
|
196
|
+
if (!hasOnlyMetadataProperty && properties.length > 0) {
|
|
197
|
+
const metadataProp = type.getProperty(SCALAR_METADATA_PROPERTY);
|
|
198
|
+
if (!metadataProp) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Detects scalar metadata from a TypeScript type.
|
|
208
|
+
*
|
|
209
|
+
* This function analyzes TypeScript types to detect scalar metadata:
|
|
210
|
+
* - TypeScript primitives (string, boolean, number) map to GraphQL scalars
|
|
211
|
+
* - Intersection types with " $gqlkitScalar" property indicate custom scalars
|
|
212
|
+
* - Type aliases are followed to find the underlying scalar metadata
|
|
213
|
+
* - Unions with null indicate nullable types
|
|
214
|
+
* - Array types indicate list types
|
|
215
|
+
*
|
|
216
|
+
* @param type - The TypeScript type to analyze
|
|
217
|
+
* @param checker - The TypeScript type checker
|
|
218
|
+
* @returns Detection result with scalar information
|
|
219
|
+
*/
|
|
220
|
+
export function detectScalarMetadata(type, checker) {
|
|
221
|
+
const result = createDefaultResult();
|
|
222
|
+
if (checker.isArrayType(type)) {
|
|
223
|
+
const typeRef = type;
|
|
224
|
+
const elementType = typeRef.typeArguments?.[0];
|
|
225
|
+
if (!elementType) {
|
|
226
|
+
return {
|
|
227
|
+
...result,
|
|
228
|
+
isList: true,
|
|
229
|
+
scalarName: "String",
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const elementResult = detectScalarMetadata(elementType, checker);
|
|
233
|
+
return {
|
|
234
|
+
...result,
|
|
235
|
+
scalarName: elementResult.scalarName,
|
|
236
|
+
only: elementResult.only,
|
|
237
|
+
isList: true,
|
|
238
|
+
listItemNullable: elementResult.nullable,
|
|
239
|
+
isPrimitive: elementResult.isPrimitive,
|
|
240
|
+
error: elementResult.error,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
if (type.isUnion()) {
|
|
244
|
+
const nonNullTypes = type.types.filter((t) => !isNullOrUndefined(t));
|
|
245
|
+
const hasNull = type.types.some((t) => isNullOrUndefined(t));
|
|
246
|
+
if (isBooleanLiteralUnion(type.types)) {
|
|
247
|
+
return {
|
|
248
|
+
...result,
|
|
249
|
+
scalarName: "Boolean",
|
|
250
|
+
isPrimitive: true,
|
|
251
|
+
nullable: hasNull,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
if (nonNullTypes.length === 0) {
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
if (nonNullTypes.length === 1) {
|
|
258
|
+
const innerType = nonNullTypes[0];
|
|
259
|
+
if (checker.isArrayType(innerType)) {
|
|
260
|
+
const innerResult = detectScalarMetadata(innerType, checker);
|
|
261
|
+
return {
|
|
262
|
+
...innerResult,
|
|
263
|
+
nullable: hasNull,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const innerResult = detectScalarMetadata(innerType, checker);
|
|
267
|
+
return {
|
|
268
|
+
...innerResult,
|
|
269
|
+
nullable: hasNull || innerResult.nullable,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
const scalarNames = new Set();
|
|
273
|
+
const detectedResults = [];
|
|
274
|
+
for (const unionMember of nonNullTypes) {
|
|
275
|
+
const memberResult = detectScalarMetadataCore(unionMember, checker);
|
|
276
|
+
if (memberResult?.scalarName) {
|
|
277
|
+
scalarNames.add(memberResult.scalarName);
|
|
278
|
+
detectedResults.push(memberResult);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (scalarNames.size > 1) {
|
|
282
|
+
const scalarNameArray = Array.from(scalarNames).sort();
|
|
283
|
+
return {
|
|
284
|
+
...result,
|
|
285
|
+
nullable: hasNull,
|
|
286
|
+
error: {
|
|
287
|
+
code: "MIXED_SCALAR_UNION",
|
|
288
|
+
message: `Cannot use union of different scalar types: ${scalarNameArray.join(", ")}`,
|
|
289
|
+
scalarNames: scalarNameArray,
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
if (scalarNames.size === 1 && detectedResults.length > 0) {
|
|
294
|
+
const firstResult = detectedResults[0];
|
|
295
|
+
return {
|
|
296
|
+
...result,
|
|
297
|
+
scalarName: firstResult.scalarName,
|
|
298
|
+
only: firstResult.only,
|
|
299
|
+
nullable: hasNull,
|
|
300
|
+
isPrimitive: firstResult.isPrimitive,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
if (nonNullTypes.every((t) => isObjectLikeType(t))) {
|
|
304
|
+
return {
|
|
305
|
+
...result,
|
|
306
|
+
isObjectType: true,
|
|
307
|
+
nullable: hasNull,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
...result,
|
|
312
|
+
nullable: hasNull,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
const coreResult = detectScalarMetadataCore(type, checker);
|
|
316
|
+
if (coreResult) {
|
|
317
|
+
return {
|
|
318
|
+
...result,
|
|
319
|
+
scalarName: coreResult.scalarName,
|
|
320
|
+
only: coreResult.only,
|
|
321
|
+
isPrimitive: coreResult.isPrimitive,
|
|
322
|
+
isObjectType: coreResult.isObjectType,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
if (isObjectLikeType(type)) {
|
|
326
|
+
return {
|
|
327
|
+
...result,
|
|
328
|
+
isObjectType: true,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=metadata-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-detector.js","sourceRoot":"","sources":["../../src/shared/metadata-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { Diagnostic } from "../type-extractor/types/index.js";
|
|
3
|
+
export interface CreateSharedProgramOptions {
|
|
4
|
+
readonly cwd: string;
|
|
5
|
+
readonly tsconfigPath: string | null;
|
|
6
|
+
readonly typeFiles: ReadonlyArray<string>;
|
|
7
|
+
readonly resolverFiles: ReadonlyArray<string>;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateSharedProgramResult {
|
|
10
|
+
readonly program: ts.Program | null;
|
|
11
|
+
readonly diagnostics: ReadonlyArray<Diagnostic>;
|
|
12
|
+
}
|
|
13
|
+
export declare function createSharedProgram(options: CreateSharedProgramOptions): CreateSharedProgramResult;
|
|
14
|
+
//# sourceMappingURL=program-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-factory.d.ts","sourceRoot":"","sources":["../../src/shared/program-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAanE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACjD;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,GAClC,yBAAyB,CAsB3B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { loadTsconfig } from "./tsconfig-loader.js";
|
|
3
|
+
const DEFAULT_COMPILER_OPTIONS = {
|
|
4
|
+
target: ts.ScriptTarget.ES2022,
|
|
5
|
+
module: ts.ModuleKind.NodeNext,
|
|
6
|
+
moduleResolution: ts.ModuleResolutionKind.Node16,
|
|
7
|
+
strict: true,
|
|
8
|
+
esModuleInterop: true,
|
|
9
|
+
skipLibCheck: true,
|
|
10
|
+
noEmit: true,
|
|
11
|
+
};
|
|
12
|
+
export function createSharedProgram(options) {
|
|
13
|
+
const { cwd, tsconfigPath, typeFiles, resolverFiles } = options;
|
|
14
|
+
const tsconfigResult = loadTsconfig({ cwd, tsconfigPath });
|
|
15
|
+
if (tsconfigResult.diagnostics.length > 0) {
|
|
16
|
+
return {
|
|
17
|
+
program: null,
|
|
18
|
+
diagnostics: tsconfigResult.diagnostics,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const compilerOptions = tsconfigResult.compilerOptions ?? DEFAULT_COMPILER_OPTIONS;
|
|
22
|
+
const allFiles = [...typeFiles, ...resolverFiles];
|
|
23
|
+
const program = ts.createProgram(allFiles, compilerOptions);
|
|
24
|
+
return {
|
|
25
|
+
program,
|
|
26
|
+
diagnostics: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=program-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-factory.js","sourceRoot":"","sources":["../../src/shared/program-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,wBAAwB,GAAuB;IACnD,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;IAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ;IAC9B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM;IAChD,MAAM,EAAE,IAAI;IACZ,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,IAAI;CACb,CAAC;AAcF,MAAM,UAAU,mBAAmB,CACjC,OAAmC;IAEnC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAEhE,MAAM,cAAc,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;IAE3D,IAAI,cAAc,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,cAAc,CAAC,WAAW;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GACnB,cAAc,CAAC,eAAe,IAAI,wBAAwB,CAAC;IAE7D,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,aAAa,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAE5D,OAAO;QACL,OAAO;QACP,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type ts from "typescript";
|
|
2
|
+
export interface SourceLocation {
|
|
3
|
+
readonly file: string;
|
|
4
|
+
readonly line: number;
|
|
5
|
+
readonly column: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Extracts source location from a TypeScript AST node.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getSourceLocationFromNode(node: ts.Node | undefined): SourceLocation | null;
|
|
11
|
+
//# sourceMappingURL=source-location.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-location.d.ts","sourceRoot":"","sources":["../../src/shared/source-location.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,GACxB,cAAc,GAAG,IAAI,CAavB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts source location from a TypeScript AST node.
|
|
3
|
+
*/
|
|
4
|
+
export function getSourceLocationFromNode(node) {
|
|
5
|
+
if (!node)
|
|
6
|
+
return null;
|
|
7
|
+
const sourceFile = node.getSourceFile();
|
|
8
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
|
|
9
|
+
return {
|
|
10
|
+
file: sourceFile.fileName,
|
|
11
|
+
line: line + 1,
|
|
12
|
+
column: character + 1,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=source-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-location.js","sourceRoot":"","sources":["../../src/shared/source-location.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAyB;IAEzB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACxC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAClE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC1B,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,QAAQ;QACzB,IAAI,EAAE,IAAI,GAAG,CAAC;QACd,MAAM,EAAE,SAAS,GAAG,CAAC;KACtB,CAAC;AACJ,CAAC"}
|