@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,564 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directive definition extractor.
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to extract directive definitions from
|
|
5
|
+
* TypeScript type aliases that use the Directive<Name, Args, Location> type.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import ts from "typescript";
|
|
9
|
+
import type { GraphQLFieldType } from "../type-extractor/types/graphql.js";
|
|
10
|
+
import { METADATA_PROPERTIES } from "./constants.js";
|
|
11
|
+
import { getActualMetadataType } from "./metadata-detector.js";
|
|
12
|
+
import {
|
|
13
|
+
getNonNullableTypes,
|
|
14
|
+
isNullableUnion,
|
|
15
|
+
isNullOrUndefined,
|
|
16
|
+
} from "./typescript-utils.js";
|
|
17
|
+
|
|
18
|
+
const DIRECTIVE_NAME_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_NAME;
|
|
19
|
+
const DIRECTIVE_ARGS_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_ARGS;
|
|
20
|
+
const DIRECTIVE_LOCATION_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_LOCATION;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Represents a directive location.
|
|
24
|
+
*/
|
|
25
|
+
export type DirectiveLocation =
|
|
26
|
+
| "SCHEMA"
|
|
27
|
+
| "SCALAR"
|
|
28
|
+
| "OBJECT"
|
|
29
|
+
| "FIELD_DEFINITION"
|
|
30
|
+
| "ARGUMENT_DEFINITION"
|
|
31
|
+
| "INTERFACE"
|
|
32
|
+
| "UNION"
|
|
33
|
+
| "ENUM"
|
|
34
|
+
| "ENUM_VALUE"
|
|
35
|
+
| "INPUT_OBJECT"
|
|
36
|
+
| "INPUT_FIELD_DEFINITION";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Represents a directive argument definition.
|
|
40
|
+
*/
|
|
41
|
+
export interface DirectiveArgumentDefinition {
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly type: GraphQLFieldType;
|
|
44
|
+
readonly description: string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Represents a directive definition extracted from a type alias.
|
|
49
|
+
*/
|
|
50
|
+
export interface DirectiveDefinitionInfo {
|
|
51
|
+
readonly name: string;
|
|
52
|
+
readonly typeAliasName: string;
|
|
53
|
+
readonly args: ReadonlyArray<DirectiveArgumentDefinition>;
|
|
54
|
+
readonly locations: ReadonlyArray<DirectiveLocation>;
|
|
55
|
+
readonly sourceFile: string;
|
|
56
|
+
readonly line: number;
|
|
57
|
+
readonly description: string | null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Error codes for directive definition extraction.
|
|
62
|
+
*/
|
|
63
|
+
export type DirectiveDefinitionErrorCode =
|
|
64
|
+
| "UNRESOLVABLE_ARG_TYPE"
|
|
65
|
+
| "INVALID_LOCATION";
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Error information for directive definition extraction.
|
|
69
|
+
*/
|
|
70
|
+
export interface DirectiveDefinitionError {
|
|
71
|
+
readonly code: DirectiveDefinitionErrorCode;
|
|
72
|
+
readonly message: string;
|
|
73
|
+
readonly sourceFile: string;
|
|
74
|
+
readonly line: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Result of directive definition extraction.
|
|
79
|
+
*/
|
|
80
|
+
export interface DirectiveDefinitionExtractionResult {
|
|
81
|
+
readonly definitions: ReadonlyArray<DirectiveDefinitionInfo>;
|
|
82
|
+
readonly errors: ReadonlyArray<DirectiveDefinitionError>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Checks if a type is a Directive type (has $directiveName, $directiveArgs, $directiveLocation properties).
|
|
87
|
+
*/
|
|
88
|
+
function isDirectiveType(type: ts.Type): boolean {
|
|
89
|
+
const nameProp = type.getProperty(DIRECTIVE_NAME_PROPERTY);
|
|
90
|
+
const argsProp = type.getProperty(DIRECTIVE_ARGS_PROPERTY);
|
|
91
|
+
|
|
92
|
+
return nameProp !== undefined && argsProp !== undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Extracts the directive name from a Directive type.
|
|
97
|
+
*/
|
|
98
|
+
function extractDirectiveName(
|
|
99
|
+
type: ts.Type,
|
|
100
|
+
checker: ts.TypeChecker,
|
|
101
|
+
): string | null {
|
|
102
|
+
const nameProp = type.getProperty(DIRECTIVE_NAME_PROPERTY);
|
|
103
|
+
if (!nameProp) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const rawNameType = checker.getTypeOfSymbol(nameProp);
|
|
108
|
+
const nameType = getActualMetadataType(rawNameType);
|
|
109
|
+
if (!nameType || !nameType.isStringLiteral()) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return nameType.value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Extracts directive locations from a Directive type.
|
|
118
|
+
*/
|
|
119
|
+
function extractDirectiveLocations(
|
|
120
|
+
type: ts.Type,
|
|
121
|
+
checker: ts.TypeChecker,
|
|
122
|
+
): DirectiveLocation[] {
|
|
123
|
+
const locationProp = type.getProperty(DIRECTIVE_LOCATION_PROPERTY);
|
|
124
|
+
if (!locationProp) {
|
|
125
|
+
return ["FIELD_DEFINITION"];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const rawLocationType = checker.getTypeOfSymbol(locationProp);
|
|
129
|
+
const locations: DirectiveLocation[] = [];
|
|
130
|
+
|
|
131
|
+
// Handle tuple types like ["FIELD_DEFINITION", "OBJECT"]
|
|
132
|
+
if (checker.isTupleType(rawLocationType)) {
|
|
133
|
+
const typeArgs = checker.getTypeArguments(
|
|
134
|
+
rawLocationType as ts.TypeReference,
|
|
135
|
+
);
|
|
136
|
+
for (const arg of typeArgs) {
|
|
137
|
+
if (arg.flags & ts.TypeFlags.Undefined) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (arg.isStringLiteral()) {
|
|
141
|
+
const value = arg.value as DirectiveLocation;
|
|
142
|
+
if (isValidLocation(value)) {
|
|
143
|
+
locations.push(value);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (locations.length > 0) {
|
|
148
|
+
return locations;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Handle array types
|
|
153
|
+
if (checker.isArrayType(rawLocationType)) {
|
|
154
|
+
const typeArgs = checker.getTypeArguments(
|
|
155
|
+
rawLocationType as ts.TypeReference,
|
|
156
|
+
);
|
|
157
|
+
if (typeArgs.length > 0 && typeArgs[0]) {
|
|
158
|
+
const elemType = typeArgs[0];
|
|
159
|
+
if (elemType.isUnion()) {
|
|
160
|
+
for (const member of elemType.types) {
|
|
161
|
+
if (member.flags & ts.TypeFlags.Undefined) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (member.isStringLiteral()) {
|
|
165
|
+
const value = member.value as DirectiveLocation;
|
|
166
|
+
if (isValidLocation(value)) {
|
|
167
|
+
locations.push(value);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (locations.length > 0) {
|
|
172
|
+
return locations;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Handle union types like "OBJECT" | "FIELD_DEFINITION" | undefined
|
|
179
|
+
if (rawLocationType.isUnion()) {
|
|
180
|
+
for (const member of rawLocationType.types) {
|
|
181
|
+
if (member.flags & ts.TypeFlags.Undefined) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (member.isStringLiteral()) {
|
|
185
|
+
const value = member.value as DirectiveLocation;
|
|
186
|
+
if (isValidLocation(value)) {
|
|
187
|
+
locations.push(value);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
} else if (rawLocationType.isStringLiteral()) {
|
|
192
|
+
const value = rawLocationType.value as DirectiveLocation;
|
|
193
|
+
if (isValidLocation(value)) {
|
|
194
|
+
locations.push(value);
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
// Try to unwrap optional type (T | undefined where T is a single type)
|
|
198
|
+
const locationType = getActualMetadataType(rawLocationType);
|
|
199
|
+
if (locationType?.isStringLiteral()) {
|
|
200
|
+
const value = locationType.value as DirectiveLocation;
|
|
201
|
+
if (isValidLocation(value)) {
|
|
202
|
+
locations.push(value);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return locations.length > 0 ? locations : ["FIELD_DEFINITION"];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const VALID_LOCATIONS = new Set<string>([
|
|
211
|
+
"SCHEMA",
|
|
212
|
+
"SCALAR",
|
|
213
|
+
"OBJECT",
|
|
214
|
+
"FIELD_DEFINITION",
|
|
215
|
+
"ARGUMENT_DEFINITION",
|
|
216
|
+
"INTERFACE",
|
|
217
|
+
"UNION",
|
|
218
|
+
"ENUM",
|
|
219
|
+
"ENUM_VALUE",
|
|
220
|
+
"INPUT_OBJECT",
|
|
221
|
+
"INPUT_FIELD_DEFINITION",
|
|
222
|
+
]);
|
|
223
|
+
|
|
224
|
+
function isValidLocation(value: string): value is DirectiveLocation {
|
|
225
|
+
return VALID_LOCATIONS.has(value);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Converts a TypeScript type to a GraphQL field type.
|
|
230
|
+
*/
|
|
231
|
+
function convertToGraphQLType(
|
|
232
|
+
type: ts.Type,
|
|
233
|
+
checker: ts.TypeChecker,
|
|
234
|
+
): GraphQLFieldType | null {
|
|
235
|
+
// Handle type parameters by getting their constraint
|
|
236
|
+
if (type.flags & ts.TypeFlags.TypeParameter) {
|
|
237
|
+
const constraint = checker.getBaseConstraintOfType(type);
|
|
238
|
+
if (constraint) {
|
|
239
|
+
return convertToGraphQLType(constraint, checker);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Check for type alias (e.g., Role = "USER" | "ADMIN")
|
|
244
|
+
if (type.aliasSymbol) {
|
|
245
|
+
const aliasName = type.aliasSymbol.getName();
|
|
246
|
+
if (aliasName && aliasName !== "__type") {
|
|
247
|
+
return {
|
|
248
|
+
typeName: aliasName,
|
|
249
|
+
nullable: false,
|
|
250
|
+
list: false,
|
|
251
|
+
listItemNullable: null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (
|
|
257
|
+
type.flags & ts.TypeFlags.String ||
|
|
258
|
+
type.flags & ts.TypeFlags.StringLiteral
|
|
259
|
+
) {
|
|
260
|
+
return {
|
|
261
|
+
typeName: "String",
|
|
262
|
+
nullable: false,
|
|
263
|
+
list: false,
|
|
264
|
+
listItemNullable: null,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (
|
|
269
|
+
type.flags & ts.TypeFlags.Number ||
|
|
270
|
+
type.flags & ts.TypeFlags.NumberLiteral
|
|
271
|
+
) {
|
|
272
|
+
return {
|
|
273
|
+
typeName: "Float",
|
|
274
|
+
nullable: false,
|
|
275
|
+
list: false,
|
|
276
|
+
listItemNullable: null,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (
|
|
281
|
+
type.flags & ts.TypeFlags.Boolean ||
|
|
282
|
+
type.flags & ts.TypeFlags.BooleanLiteral
|
|
283
|
+
) {
|
|
284
|
+
return {
|
|
285
|
+
typeName: "Boolean",
|
|
286
|
+
nullable: false,
|
|
287
|
+
list: false,
|
|
288
|
+
listItemNullable: null,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (type.isUnion()) {
|
|
293
|
+
const nonNullTypes = getNonNullableTypes(type);
|
|
294
|
+
const nullable = isNullableUnion(type);
|
|
295
|
+
|
|
296
|
+
if (nonNullTypes.length === 1 && nonNullTypes[0]) {
|
|
297
|
+
const innerType = convertToGraphQLType(nonNullTypes[0], checker);
|
|
298
|
+
if (innerType) {
|
|
299
|
+
return { ...innerType, nullable };
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (
|
|
304
|
+
nonNullTypes.length > 0 &&
|
|
305
|
+
nonNullTypes.every((t) => t.isStringLiteral())
|
|
306
|
+
) {
|
|
307
|
+
return {
|
|
308
|
+
typeName: "String",
|
|
309
|
+
nullable,
|
|
310
|
+
list: false,
|
|
311
|
+
listItemNullable: null,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (checker.isArrayType(type) || checker.isTupleType(type)) {
|
|
317
|
+
const typeArgs = checker.getTypeArguments(type as ts.TypeReference);
|
|
318
|
+
if (typeArgs.length > 0 && typeArgs[0]) {
|
|
319
|
+
let elementType = typeArgs[0];
|
|
320
|
+
|
|
321
|
+
if (checker.isTupleType(type) && typeArgs.length > 1) {
|
|
322
|
+
const nonNullTypes = typeArgs.filter((t) => !isNullOrUndefined(t));
|
|
323
|
+
if (nonNullTypes.length > 0 && nonNullTypes[0]) {
|
|
324
|
+
elementType = nonNullTypes[0];
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Check if element type is a type alias (e.g., Role = "USER" | "ADMIN")
|
|
329
|
+
if (elementType.aliasSymbol) {
|
|
330
|
+
const aliasName = elementType.aliasSymbol.getName();
|
|
331
|
+
if (aliasName && aliasName !== "__type") {
|
|
332
|
+
return {
|
|
333
|
+
typeName: aliasName,
|
|
334
|
+
nullable: false,
|
|
335
|
+
list: true,
|
|
336
|
+
listItemNullable: false,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (elementType.isUnion()) {
|
|
342
|
+
const nonNullMembers = getNonNullableTypes(elementType);
|
|
343
|
+
if (
|
|
344
|
+
nonNullMembers.length > 0 &&
|
|
345
|
+
nonNullMembers.every((t) => t.isStringLiteral())
|
|
346
|
+
) {
|
|
347
|
+
return {
|
|
348
|
+
typeName: "String",
|
|
349
|
+
nullable: false,
|
|
350
|
+
list: true,
|
|
351
|
+
listItemNullable: false,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const hasNull = isNullableUnion(elementType);
|
|
356
|
+
|
|
357
|
+
if (nonNullMembers.length === 1 && nonNullMembers[0]) {
|
|
358
|
+
const innerType = convertToGraphQLType(nonNullMembers[0], checker);
|
|
359
|
+
if (innerType && !innerType.list) {
|
|
360
|
+
return {
|
|
361
|
+
typeName: innerType.typeName,
|
|
362
|
+
nullable: false,
|
|
363
|
+
list: true,
|
|
364
|
+
listItemNullable: hasNull,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const innerType = convertToGraphQLType(elementType, checker);
|
|
371
|
+
if (innerType && !innerType.list) {
|
|
372
|
+
return {
|
|
373
|
+
typeName: innerType.typeName,
|
|
374
|
+
nullable: false,
|
|
375
|
+
list: true,
|
|
376
|
+
listItemNullable: innerType.nullable,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
typeName: "String",
|
|
383
|
+
nullable: false,
|
|
384
|
+
list: true,
|
|
385
|
+
listItemNullable: false,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (type.symbol) {
|
|
390
|
+
const symbolName = type.symbol.getName();
|
|
391
|
+
if (symbolName !== "__type" && symbolName !== "") {
|
|
392
|
+
return {
|
|
393
|
+
typeName: symbolName,
|
|
394
|
+
nullable: false,
|
|
395
|
+
list: false,
|
|
396
|
+
listItemNullable: null,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* Extracts directive argument definitions from a Directive type.
|
|
406
|
+
*/
|
|
407
|
+
function extractDirectiveArgs(
|
|
408
|
+
type: ts.Type,
|
|
409
|
+
checker: ts.TypeChecker,
|
|
410
|
+
sourceFile: string,
|
|
411
|
+
line: number,
|
|
412
|
+
): {
|
|
413
|
+
args: DirectiveArgumentDefinition[];
|
|
414
|
+
errors: DirectiveDefinitionError[];
|
|
415
|
+
} {
|
|
416
|
+
const argsProp = type.getProperty(DIRECTIVE_ARGS_PROPERTY);
|
|
417
|
+
if (!argsProp) {
|
|
418
|
+
return { args: [], errors: [] };
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
const rawArgsType = checker.getTypeOfSymbol(argsProp);
|
|
422
|
+
let argsType = getActualMetadataType(rawArgsType);
|
|
423
|
+
if (!argsType) {
|
|
424
|
+
return { args: [], errors: [] };
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// If argsType is a type parameter, get its constraint
|
|
428
|
+
if (argsType.flags & ts.TypeFlags.TypeParameter) {
|
|
429
|
+
const constraint = checker.getBaseConstraintOfType(argsType);
|
|
430
|
+
if (constraint) {
|
|
431
|
+
argsType = constraint;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
const args: DirectiveArgumentDefinition[] = [];
|
|
436
|
+
const errors: DirectiveDefinitionError[] = [];
|
|
437
|
+
|
|
438
|
+
const properties = argsType.getProperties();
|
|
439
|
+
for (const prop of properties) {
|
|
440
|
+
const propName = prop.getName();
|
|
441
|
+
const propType = checker.getTypeOfSymbol(prop);
|
|
442
|
+
|
|
443
|
+
const graphqlType = convertToGraphQLType(propType, checker);
|
|
444
|
+
if (graphqlType) {
|
|
445
|
+
args.push({
|
|
446
|
+
name: propName,
|
|
447
|
+
type: graphqlType,
|
|
448
|
+
description: null,
|
|
449
|
+
});
|
|
450
|
+
} else {
|
|
451
|
+
errors.push({
|
|
452
|
+
code: "UNRESOLVABLE_ARG_TYPE",
|
|
453
|
+
message: `Cannot resolve argument type for '${propName}'`,
|
|
454
|
+
sourceFile,
|
|
455
|
+
line,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
return { args, errors };
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Extracts directive definitions from a TypeScript program.
|
|
465
|
+
*
|
|
466
|
+
* This function analyzes exported type aliases to find those that use
|
|
467
|
+
* the Directive<Name, Args, Location> type and extracts directive definitions.
|
|
468
|
+
*
|
|
469
|
+
* @param program - The TypeScript program
|
|
470
|
+
* @param sourceFiles - The source files to analyze
|
|
471
|
+
* @returns Extraction result with definitions and errors
|
|
472
|
+
*/
|
|
473
|
+
export function extractDirectiveDefinitions(
|
|
474
|
+
program: ts.Program,
|
|
475
|
+
sourceFiles: ReadonlyArray<string>,
|
|
476
|
+
): DirectiveDefinitionExtractionResult {
|
|
477
|
+
const checker = program.getTypeChecker();
|
|
478
|
+
const definitions: DirectiveDefinitionInfo[] = [];
|
|
479
|
+
const errors: DirectiveDefinitionError[] = [];
|
|
480
|
+
|
|
481
|
+
for (const filePath of sourceFiles) {
|
|
482
|
+
const sourceFile = program.getSourceFile(filePath);
|
|
483
|
+
if (!sourceFile) {
|
|
484
|
+
continue;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
488
|
+
if (!ts.isTypeAliasDeclaration(node)) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const modifiers = ts.getCombinedModifierFlags(node);
|
|
493
|
+
const isExported = (modifiers & ts.ModifierFlags.Export) !== 0;
|
|
494
|
+
if (!isExported) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const symbol = checker.getSymbolAtLocation(node.name);
|
|
499
|
+
if (!symbol) {
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const type = checker.getDeclaredTypeOfSymbol(symbol);
|
|
504
|
+
if (!isDirectiveType(type)) {
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const directiveName = extractDirectiveName(type, checker);
|
|
509
|
+
if (!directiveName) {
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
const typeAliasName = node.name.getText(sourceFile);
|
|
514
|
+
|
|
515
|
+
const { line } = sourceFile.getLineAndCharacterOfPosition(
|
|
516
|
+
node.getStart(sourceFile),
|
|
517
|
+
);
|
|
518
|
+
|
|
519
|
+
const locations = extractDirectiveLocations(type, checker);
|
|
520
|
+
const argsResult = extractDirectiveArgs(
|
|
521
|
+
type,
|
|
522
|
+
checker,
|
|
523
|
+
filePath,
|
|
524
|
+
line + 1,
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
const description = extractDescription(node, checker);
|
|
528
|
+
|
|
529
|
+
definitions.push({
|
|
530
|
+
name: directiveName,
|
|
531
|
+
typeAliasName,
|
|
532
|
+
args: argsResult.args,
|
|
533
|
+
locations,
|
|
534
|
+
sourceFile: filePath,
|
|
535
|
+
line: line + 1,
|
|
536
|
+
description,
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
errors.push(...argsResult.errors);
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
return { definitions, errors };
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Extracts description from TSDoc comments.
|
|
548
|
+
*/
|
|
549
|
+
function extractDescription(
|
|
550
|
+
node: ts.TypeAliasDeclaration,
|
|
551
|
+
checker: ts.TypeChecker,
|
|
552
|
+
): string | null {
|
|
553
|
+
const symbol = checker.getSymbolAtLocation(node.name);
|
|
554
|
+
if (!symbol) {
|
|
555
|
+
return null;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
const documentation = symbol.getDocumentationComment(checker);
|
|
559
|
+
if (documentation.length === 0) {
|
|
560
|
+
return null;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
return documentation.map((d) => d.text).join("\n");
|
|
564
|
+
}
|