@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,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directive metadata detector.
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to detect directive metadata embedded
|
|
5
|
+
* in TypeScript intersection types using the $gqlkitFieldMeta or $gqlkitTypeMeta properties.
|
|
6
|
+
*/
|
|
7
|
+
import ts from "typescript";
|
|
8
|
+
import { METADATA_PROPERTIES, RUNTIME_TYPE_NAMES } from "./constants.js";
|
|
9
|
+
import { getActualMetadataType } from "./metadata-detector.js";
|
|
10
|
+
const FIELD_META_PROPERTY = METADATA_PROPERTIES.FIELD_META;
|
|
11
|
+
const TYPE_META_PROPERTY = METADATA_PROPERTIES.TYPE_META;
|
|
12
|
+
const DIRECTIVE_NAME_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_NAME;
|
|
13
|
+
const DIRECTIVE_ARGS_PROPERTY = METADATA_PROPERTIES.DIRECTIVE_ARGS;
|
|
14
|
+
const ORIGINAL_TYPE_PROPERTY = METADATA_PROPERTIES.ORIGINAL_TYPE;
|
|
15
|
+
/**
|
|
16
|
+
* Gets the metadata property from a type, checking both field and type meta properties.
|
|
17
|
+
*/
|
|
18
|
+
function getMetaProperty(type) {
|
|
19
|
+
return (type.getProperty(FIELD_META_PROPERTY) ??
|
|
20
|
+
type.getProperty(TYPE_META_PROPERTY));
|
|
21
|
+
}
|
|
22
|
+
function createEmptyResult() {
|
|
23
|
+
return {
|
|
24
|
+
directives: [],
|
|
25
|
+
errors: [],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolves a directive argument value from a TypeScript type.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveArgumentValue(type, checker) {
|
|
32
|
+
if (type.flags & ts.TypeFlags.Null) {
|
|
33
|
+
return { kind: "null", value: null };
|
|
34
|
+
}
|
|
35
|
+
if (type.isStringLiteral()) {
|
|
36
|
+
// Check enum pattern: starts with uppercase and contains only uppercase letters, digits, and underscores
|
|
37
|
+
if (/^[A-Z][A-Z0-9_]*$/.test(type.value)) {
|
|
38
|
+
return { kind: "enum", value: type.value };
|
|
39
|
+
}
|
|
40
|
+
return { kind: "string", value: type.value };
|
|
41
|
+
}
|
|
42
|
+
if (type.isNumberLiteral()) {
|
|
43
|
+
return { kind: "number", value: type.value };
|
|
44
|
+
}
|
|
45
|
+
if (type.flags & ts.TypeFlags.BooleanLiteral) {
|
|
46
|
+
const intrinsicName = type
|
|
47
|
+
.intrinsicName;
|
|
48
|
+
if (intrinsicName === "true") {
|
|
49
|
+
return { kind: "boolean", value: true };
|
|
50
|
+
}
|
|
51
|
+
if (intrinsicName === "false") {
|
|
52
|
+
return { kind: "boolean", value: false };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (checker.isTupleType(type)) {
|
|
56
|
+
const typeArgs = checker.getTypeArguments(type);
|
|
57
|
+
const values = [];
|
|
58
|
+
for (const arg of typeArgs) {
|
|
59
|
+
const resolved = resolveArgumentValue(arg, checker);
|
|
60
|
+
if (resolved) {
|
|
61
|
+
values.push(resolved);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { kind: "list", values };
|
|
65
|
+
}
|
|
66
|
+
if (checker.isArrayType(type)) {
|
|
67
|
+
const typeArgs = checker.getTypeArguments(type);
|
|
68
|
+
if (typeArgs.length > 0 && typeArgs[0]) {
|
|
69
|
+
const elemType = typeArgs[0];
|
|
70
|
+
if (elemType.isUnion()) {
|
|
71
|
+
const values = [];
|
|
72
|
+
for (const member of elemType.types) {
|
|
73
|
+
const resolved = resolveArgumentValue(member, checker);
|
|
74
|
+
if (resolved) {
|
|
75
|
+
values.push(resolved);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { kind: "list", values };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const properties = type.getProperties();
|
|
83
|
+
if (properties.length > 0) {
|
|
84
|
+
const isMetadataProperty = properties.some((p) => p.getName().startsWith(" $") ||
|
|
85
|
+
p.getName() === DIRECTIVE_NAME_PROPERTY ||
|
|
86
|
+
p.getName() === DIRECTIVE_ARGS_PROPERTY);
|
|
87
|
+
if (!isMetadataProperty) {
|
|
88
|
+
const fields = [];
|
|
89
|
+
for (const prop of properties) {
|
|
90
|
+
const propType = checker.getTypeOfSymbol(prop);
|
|
91
|
+
const resolved = resolveArgumentValue(propType, checker);
|
|
92
|
+
if (resolved) {
|
|
93
|
+
fields.push({ name: prop.getName(), value: resolved });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (fields.length > 0) {
|
|
97
|
+
return { kind: "object", fields };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const symbol = type.getSymbol();
|
|
102
|
+
if (symbol) {
|
|
103
|
+
const name = symbol.getName();
|
|
104
|
+
if (name !== "__type" &&
|
|
105
|
+
name !== "Array" &&
|
|
106
|
+
!name.includes("<") &&
|
|
107
|
+
/^[A-Z][A-Z0-9_]*$/.test(name)) {
|
|
108
|
+
return { kind: "enum", value: name };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Extracts directive arguments from a type.
|
|
115
|
+
*/
|
|
116
|
+
function extractDirectiveArgs(argsType, checker, directiveName) {
|
|
117
|
+
const args = [];
|
|
118
|
+
const errors = [];
|
|
119
|
+
const properties = argsType.getProperties();
|
|
120
|
+
for (const prop of properties) {
|
|
121
|
+
const propName = prop.getName();
|
|
122
|
+
const propType = checker.getTypeOfSymbol(prop);
|
|
123
|
+
const resolved = resolveArgumentValue(propType, checker);
|
|
124
|
+
if (resolved) {
|
|
125
|
+
args.push({ name: propName, value: resolved });
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
errors.push({
|
|
129
|
+
code: "UNRESOLVABLE_ARGUMENT",
|
|
130
|
+
message: `Cannot resolve argument '${propName}' for directive '@${directiveName}'`,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return { args, errors };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Extracts a single directive from a type.
|
|
138
|
+
*/
|
|
139
|
+
function extractDirectiveFromType(type, checker) {
|
|
140
|
+
const nameProp = type.getProperty(DIRECTIVE_NAME_PROPERTY);
|
|
141
|
+
if (!nameProp) {
|
|
142
|
+
return { directive: null, errors: [] };
|
|
143
|
+
}
|
|
144
|
+
const rawNameType = checker.getTypeOfSymbol(nameProp);
|
|
145
|
+
const nameType = getActualMetadataType(rawNameType);
|
|
146
|
+
if (!nameType || !nameType.isStringLiteral()) {
|
|
147
|
+
return { directive: null, errors: [] };
|
|
148
|
+
}
|
|
149
|
+
const directiveName = nameType.value;
|
|
150
|
+
if (directiveName === "") {
|
|
151
|
+
return {
|
|
152
|
+
directive: null,
|
|
153
|
+
errors: [
|
|
154
|
+
{
|
|
155
|
+
code: "EMPTY_DIRECTIVE_NAME",
|
|
156
|
+
message: "Directive name cannot be empty",
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const argsProp = type.getProperty(DIRECTIVE_ARGS_PROPERTY);
|
|
162
|
+
let args = [];
|
|
163
|
+
let argErrors = [];
|
|
164
|
+
if (argsProp) {
|
|
165
|
+
const rawArgsType = checker.getTypeOfSymbol(argsProp);
|
|
166
|
+
const argsType = getActualMetadataType(rawArgsType);
|
|
167
|
+
if (argsType) {
|
|
168
|
+
const argsResult = extractDirectiveArgs(argsType, checker, directiveName);
|
|
169
|
+
args = argsResult.args;
|
|
170
|
+
argErrors = argsResult.errors;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
directive: { name: directiveName, args },
|
|
175
|
+
errors: argErrors,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Detects directive metadata from a TypeScript type.
|
|
180
|
+
*
|
|
181
|
+
* This function analyzes TypeScript types to detect directive metadata:
|
|
182
|
+
* - Intersection types with " $gqlkitFieldMeta" or " $gqlkitTypeMeta" property indicate directives
|
|
183
|
+
* - Each directive has a name and optional arguments
|
|
184
|
+
* - Arguments are resolved from TypeScript literal types
|
|
185
|
+
*
|
|
186
|
+
* @param type - The TypeScript type to analyze
|
|
187
|
+
* @param checker - The TypeScript type checker
|
|
188
|
+
* @returns Detection result with directives and any errors
|
|
189
|
+
*/
|
|
190
|
+
export function detectDirectiveMetadata(type, checker) {
|
|
191
|
+
const metaProp = getMetaProperty(type);
|
|
192
|
+
if (!metaProp) {
|
|
193
|
+
if (type.isIntersection()) {
|
|
194
|
+
for (const member of type.types) {
|
|
195
|
+
const memberProp = getMetaProperty(member);
|
|
196
|
+
if (memberProp) {
|
|
197
|
+
return detectDirectiveMetadataFromProperty(memberProp, checker);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Handle union types: (T & Directive) | null
|
|
202
|
+
if (type.isUnion()) {
|
|
203
|
+
for (const member of type.types) {
|
|
204
|
+
// Skip null/undefined members
|
|
205
|
+
if (member.flags & ts.TypeFlags.Null ||
|
|
206
|
+
member.flags & ts.TypeFlags.Undefined) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
const result = detectDirectiveMetadata(member, checker);
|
|
210
|
+
if (result.directives.length > 0) {
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return createEmptyResult();
|
|
216
|
+
}
|
|
217
|
+
return detectDirectiveMetadataFromProperty(metaProp, checker);
|
|
218
|
+
}
|
|
219
|
+
function detectDirectiveMetadataFromProperty(directivesProp, checker) {
|
|
220
|
+
const rawDirectivesType = checker.getTypeOfSymbol(directivesProp);
|
|
221
|
+
const directivesType = getActualMetadataType(rawDirectivesType);
|
|
222
|
+
if (!directivesType) {
|
|
223
|
+
return createEmptyResult();
|
|
224
|
+
}
|
|
225
|
+
// New structure: { directives: Ds }
|
|
226
|
+
// Check if the type has a "directives" property
|
|
227
|
+
const directivesArrayProp = directivesType.getProperty("directives");
|
|
228
|
+
if (directivesArrayProp) {
|
|
229
|
+
const rawDirectivesArrayType = checker.getTypeOfSymbol(directivesArrayProp);
|
|
230
|
+
const directivesArrayType = getActualMetadataType(rawDirectivesArrayType);
|
|
231
|
+
if (directivesArrayType) {
|
|
232
|
+
return extractDirectivesFromType(directivesArrayType, checker);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Fallback: Old structure - direct array/tuple form (for backward compatibility)
|
|
236
|
+
return extractDirectivesFromType(directivesType, checker);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Extracts directives from a tuple or array type.
|
|
240
|
+
* Use this to extract directives from a type like [AuthDirective, CacheDirective].
|
|
241
|
+
*/
|
|
242
|
+
export function extractDirectivesFromType(directivesType, checker) {
|
|
243
|
+
const directives = [];
|
|
244
|
+
const errors = [];
|
|
245
|
+
if (checker.isTupleType(directivesType)) {
|
|
246
|
+
const typeArgs = checker.getTypeArguments(directivesType);
|
|
247
|
+
for (const arg of typeArgs) {
|
|
248
|
+
const result = extractDirectiveFromType(arg, checker);
|
|
249
|
+
if (result.directive) {
|
|
250
|
+
directives.push(result.directive);
|
|
251
|
+
}
|
|
252
|
+
errors.push(...result.errors);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (checker.isArrayType(directivesType)) {
|
|
256
|
+
const typeArgs = checker.getTypeArguments(directivesType);
|
|
257
|
+
if (typeArgs.length > 0 && typeArgs[0]) {
|
|
258
|
+
const elemType = typeArgs[0];
|
|
259
|
+
if (elemType.isUnion()) {
|
|
260
|
+
for (const member of elemType.types) {
|
|
261
|
+
const result = extractDirectiveFromType(member, checker);
|
|
262
|
+
if (result.directive) {
|
|
263
|
+
directives.push(result.directive);
|
|
264
|
+
}
|
|
265
|
+
errors.push(...result.errors);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const result = extractDirectiveFromType(elemType, checker);
|
|
270
|
+
if (result.directive) {
|
|
271
|
+
directives.push(result.directive);
|
|
272
|
+
}
|
|
273
|
+
errors.push(...result.errors);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
const result = extractDirectiveFromType(directivesType, checker);
|
|
279
|
+
if (result.directive) {
|
|
280
|
+
directives.push(result.directive);
|
|
281
|
+
}
|
|
282
|
+
errors.push(...result.errors);
|
|
283
|
+
}
|
|
284
|
+
return { directives, errors };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Checks if a type is wrapped with GqlField or GqlObject.
|
|
288
|
+
*/
|
|
289
|
+
export function hasDirectiveMetadata(type) {
|
|
290
|
+
const metaProp = getMetaProperty(type);
|
|
291
|
+
if (metaProp) {
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
// Also check for the original type property (GqlField marker)
|
|
295
|
+
const originalTypeProp = type.getProperty(ORIGINAL_TYPE_PROPERTY);
|
|
296
|
+
if (originalTypeProp) {
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
if (type.isIntersection()) {
|
|
300
|
+
for (const member of type.types) {
|
|
301
|
+
const prop = getMetaProperty(member);
|
|
302
|
+
if (prop) {
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
// Also check for original type property in intersection members
|
|
306
|
+
const origProp = member.getProperty(ORIGINAL_TYPE_PROPERTY);
|
|
307
|
+
if (origProp) {
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Handle union types: (T & Meta) | null is normalized by TypeScript
|
|
313
|
+
// to (T & Meta) | null, so we need to check each member recursively
|
|
314
|
+
if (type.isUnion()) {
|
|
315
|
+
for (const member of type.types) {
|
|
316
|
+
if (hasDirectiveMetadata(member)) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Check for GqlField/GqlObject type alias by examining the alias symbol
|
|
322
|
+
if (type.aliasSymbol) {
|
|
323
|
+
const aliasName = type.aliasSymbol.getName();
|
|
324
|
+
if (aliasName === RUNTIME_TYPE_NAMES.GQL_FIELD ||
|
|
325
|
+
aliasName === RUNTIME_TYPE_NAMES.GQL_OBJECT) {
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Unwraps a GqlField or GqlObject type and returns the base type.
|
|
333
|
+
* For GqlField<T, Meta> which is T & { " $gqlkitFieldMeta"?: ...; " $gqlkitOriginalType"?: T },
|
|
334
|
+
* this extracts and returns T from the $gqlkitOriginalType property.
|
|
335
|
+
*
|
|
336
|
+
* The $gqlkitOriginalType property preserves nullability information that would otherwise
|
|
337
|
+
* be lost due to TypeScript's union type normalization.
|
|
338
|
+
*
|
|
339
|
+
* If the type is not wrapped with GqlField or GqlObject, returns the original type.
|
|
340
|
+
*/
|
|
341
|
+
export function unwrapDirectiveType(type, checker) {
|
|
342
|
+
// 1. Check aliasTypeArguments first (most reliable)
|
|
343
|
+
// Get T directly from GqlField<T, Meta> or GqlObject<T, Meta>
|
|
344
|
+
// This works when the type alias hasn't been expanded by TypeScript
|
|
345
|
+
if (type.aliasTypeArguments && type.aliasTypeArguments.length > 0) {
|
|
346
|
+
const aliasSymbolName = type.aliasSymbol?.getName() ?? "";
|
|
347
|
+
if (aliasSymbolName === RUNTIME_TYPE_NAMES.GQL_FIELD ||
|
|
348
|
+
aliasSymbolName === RUNTIME_TYPE_NAMES.GQL_OBJECT) {
|
|
349
|
+
return type.aliasTypeArguments[0];
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// 2. Check intersection members' aliasTypeArguments
|
|
353
|
+
// When TypeScript expands the type alias to an intersection,
|
|
354
|
+
// one of the intersection members might still have aliasTypeArguments
|
|
355
|
+
if (type.isIntersection()) {
|
|
356
|
+
for (const member of type.types) {
|
|
357
|
+
if (member.aliasTypeArguments && member.aliasTypeArguments.length > 0) {
|
|
358
|
+
const memberAliasSymbolName = member.aliasSymbol?.getName() ?? "";
|
|
359
|
+
if (memberAliasSymbolName === RUNTIME_TYPE_NAMES.GQL_FIELD ||
|
|
360
|
+
memberAliasSymbolName === RUNTIME_TYPE_NAMES.GQL_OBJECT) {
|
|
361
|
+
return member.aliasTypeArguments[0];
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// 3. Fall back to $gqlkitOriginalType property
|
|
367
|
+
// This property preserves the original type information including array types.
|
|
368
|
+
// The type's symbol name may be __type (internal TypeScript symbol), but that's
|
|
369
|
+
// handled by the caller using checker.typeToString() for correct type name resolution.
|
|
370
|
+
const originalTypeProp = type.getProperty(ORIGINAL_TYPE_PROPERTY);
|
|
371
|
+
if (originalTypeProp) {
|
|
372
|
+
const rawOriginalType = checker.getTypeOfSymbol(originalTypeProp);
|
|
373
|
+
const originalType = getActualMetadataType(rawOriginalType);
|
|
374
|
+
if (originalType) {
|
|
375
|
+
return originalType;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Check intersection members for $gqlkitOriginalType
|
|
379
|
+
if (type.isIntersection()) {
|
|
380
|
+
for (const member of type.types) {
|
|
381
|
+
const originalProp = member.getProperty(ORIGINAL_TYPE_PROPERTY);
|
|
382
|
+
if (originalProp) {
|
|
383
|
+
const rawOriginalType = checker.getTypeOfSymbol(originalProp);
|
|
384
|
+
const originalType = getActualMetadataType(rawOriginalType);
|
|
385
|
+
if (originalType) {
|
|
386
|
+
return originalType;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Fallback: filter out metadata members
|
|
391
|
+
const nonDirectiveMembers = [];
|
|
392
|
+
for (const member of type.types) {
|
|
393
|
+
const metaProp = getMetaProperty(member);
|
|
394
|
+
const originalTypeProp = member.getProperty(ORIGINAL_TYPE_PROPERTY);
|
|
395
|
+
if (!metaProp && !originalTypeProp) {
|
|
396
|
+
nonDirectiveMembers.push(member);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (nonDirectiveMembers.length === 1 && nonDirectiveMembers[0]) {
|
|
400
|
+
return nonDirectiveMembers[0];
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Handle union types: (T & Meta) | null
|
|
404
|
+
// We extract the base type from the non-null member and return it.
|
|
405
|
+
// Nullability is handled separately in the type-extractor.
|
|
406
|
+
if (type.isUnion()) {
|
|
407
|
+
for (const member of type.types) {
|
|
408
|
+
// Skip null/undefined members
|
|
409
|
+
if (member.flags & ts.TypeFlags.Null ||
|
|
410
|
+
member.flags & ts.TypeFlags.Undefined) {
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
// Recursively unwrap if this member has metadata
|
|
414
|
+
const unwrapped = unwrapDirectiveType(member, checker);
|
|
415
|
+
if (unwrapped !== member) {
|
|
416
|
+
return unwrapped;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return type;
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=directive-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directive-detector.js","sourceRoot":"","sources":["../../src/shared/directive-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,UAAU,CAAC;AAC3D,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,SAAS,CAAC;AACzD,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,cAAc,CAAC;AACnE,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,cAAc,CAAC;AACnE,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,aAAa,CAAC;AAEjE;;GAEG;AACH,SAAS,eAAe,CAAC,IAAa;IACpC,OAAO,CACL,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CACrC,CAAC;AACJ,CAAC;AA2DD,SAAS,iBAAiB;IACxB,OAAO;QACL,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAa,EACb,OAAuB;IAEvB,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3B,yGAAyG;QACzG,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAI,IAA8C;aAClE,aAAa,CAAC;QACjB,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAwB,CAAC,CAAC;QACpE,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAwB,CAAC,CAAC;QACpE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACvB,MAAM,MAAM,GAA6B,EAAE,CAAC;gBAC5C,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACvD,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAC5B,CAAC,CAAC,OAAO,EAAE,KAAK,uBAAuB;YACvC,CAAC,CAAC,OAAO,EAAE,KAAK,uBAAuB,CAC1C,CAAC;QAEF,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,MAAM,GAAwB,EAAE,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC/C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACzD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,IACE,IAAI,KAAK,QAAQ;YACjB,IAAI,KAAK,OAAO;YAChB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAC9B,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAOD;;GAEG;AACH,SAAS,oBAAoB,CAC3B,QAAiB,EACjB,OAAuB,EACvB,aAAqB;IAErB,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,4BAA4B,QAAQ,qBAAqB,aAAa,GAAG;aACnF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,IAAa,EACb,OAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC;QAC7C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;IAErC,IAAI,aAAa,KAAK,EAAE,EAAE,CAAC;QACzB,OAAO;YACL,SAAS,EAAE,IAAI;YACf,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,gCAAgC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAC3D,IAAI,IAAI,GAAwB,EAAE,CAAC;IACnC,IAAI,SAAS,GAA8B,EAAE,CAAC;IAE9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YAC1E,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;YACvB,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;QACxC,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAa,EACb,OAAuB;IAEvB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,mCAAmC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;QACD,6CAA6C;QAC7C,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChC,8BAA8B;gBAC9B,IACE,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI;oBAChC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EACrC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACxD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,mCAAmC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,mCAAmC,CAC1C,cAAyB,EACzB,OAAuB;IAEvB,MAAM,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;IAEhE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,oCAAoC;IACpC,gDAAgD;IAChD,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACrE,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;QAC5E,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;QAC1E,IAAI,mBAAmB,EAAE,CAAC;YACxB,OAAO,yBAAyB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,OAAO,yBAAyB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,cAAuB,EACvB,OAAuB;IAEvB,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,IAAI,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CACvC,cAAkC,CACnC,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CACvC,cAAkC,CACnC,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACvB,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACpC,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACzD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACrB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACpC,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACpC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,wBAAwB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8DAA8D;IAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAClE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;YACD,gEAAgE;YAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;YAC5D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,oEAAoE;IACpE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC7C,IACE,SAAS,KAAK,kBAAkB,CAAC,SAAS;YAC1C,SAAS,KAAK,kBAAkB,CAAC,UAAU,EAC3C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAa,EACb,OAAuB;IAEvB,oDAAoD;IACpD,iEAAiE;IACjE,uEAAuE;IACvE,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1D,IACE,eAAe,KAAK,kBAAkB,CAAC,SAAS;YAChD,eAAe,KAAK,kBAAkB,CAAC,UAAU,EACjD,CAAC;YACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,gEAAgE;IAChE,yEAAyE;IACzE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtE,MAAM,qBAAqB,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAClE,IACE,qBAAqB,KAAK,kBAAkB,CAAC,SAAS;oBACtD,qBAAqB,KAAK,kBAAkB,CAAC,UAAU,EACvD,CAAC;oBACD,OAAO,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAE,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,+EAA+E;IAC/E,gFAAgF;IAChF,uFAAuF;IACvF,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAClE,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;YAChE,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC9D,MAAM,YAAY,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;gBAC5D,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,YAAY,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,MAAM,mBAAmB,GAAc,EAAE,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACnC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,mEAAmE;IACnE,2DAA2D;IAC3D,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,8BAA8B;YAC9B,IACE,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI;gBAChC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EACrC,CAAC;gBACD,SAAS;YACX,CAAC;YACD,iDAAiD;YACjD,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACzB,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Diagnostic } from "../type-extractor/types/index.js";
|
|
2
|
+
export interface ScanResult {
|
|
3
|
+
readonly files: ReadonlyArray<string>;
|
|
4
|
+
readonly errors: ReadonlyArray<Diagnostic>;
|
|
5
|
+
}
|
|
6
|
+
export interface ScanOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Glob patterns to exclude files.
|
|
9
|
+
* Patterns are matched against file paths relative to the scan directory.
|
|
10
|
+
*/
|
|
11
|
+
readonly excludeGlobs?: ReadonlyArray<string>;
|
|
12
|
+
/**
|
|
13
|
+
* File paths to exclude (for generated files).
|
|
14
|
+
* Each path is individually excluded from scanning.
|
|
15
|
+
*/
|
|
16
|
+
readonly excludePaths?: ReadonlyArray<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Simple suffix patterns to exclude (existing behavior).
|
|
19
|
+
* @deprecated Use excludeGlobs instead
|
|
20
|
+
*/
|
|
21
|
+
readonly excludePatterns?: ReadonlyArray<string>;
|
|
22
|
+
}
|
|
23
|
+
export declare function isTypeScriptSourceFile(fileName: string): boolean;
|
|
24
|
+
export declare function scanDirectory(directory: string, options?: ScanOptions): Promise<ScanResult>;
|
|
25
|
+
//# sourceMappingURL=file-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/shared/file-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAE9C;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAE9C;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAClD;AAKD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKhE;AA6ED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAgDrB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join, matchesGlob, relative, resolve } from "node:path";
|
|
3
|
+
const TS_SOURCE_EXTENSIONS = [".ts", ".cts", ".mts"];
|
|
4
|
+
const TS_DEFINITION_SUFFIXES = [".d.ts", ".d.cts", ".d.mts"];
|
|
5
|
+
export function isTypeScriptSourceFile(fileName) {
|
|
6
|
+
if (TS_DEFINITION_SUFFIXES.some((suffix) => fileName.endsWith(suffix))) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return TS_SOURCE_EXTENSIONS.some((ext) => fileName.endsWith(ext));
|
|
10
|
+
}
|
|
11
|
+
function matchesSuffixPattern(fileName, pattern) {
|
|
12
|
+
return fileName.endsWith(pattern);
|
|
13
|
+
}
|
|
14
|
+
function shouldExcludeBySuffix(fileName, excludePatterns) {
|
|
15
|
+
return excludePatterns.some((pattern) => matchesSuffixPattern(fileName, pattern));
|
|
16
|
+
}
|
|
17
|
+
function shouldExcludeByGlobs(filePath, rootDir, excludeGlobs) {
|
|
18
|
+
if (excludeGlobs.length === 0) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const relativePath = relative(rootDir, filePath);
|
|
22
|
+
return excludeGlobs.some((pattern) => matchesGlob(relativePath, pattern));
|
|
23
|
+
}
|
|
24
|
+
function shouldExcludeByPaths(filePath, excludePaths) {
|
|
25
|
+
return excludePaths.some((excludePath) => filePath === excludePath);
|
|
26
|
+
}
|
|
27
|
+
async function collectFiles(directory, files, context) {
|
|
28
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
const fullPath = join(directory, entry.name);
|
|
31
|
+
if (entry.isDirectory()) {
|
|
32
|
+
if (entry.name === "node_modules") {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
await collectFiles(fullPath, files, context);
|
|
36
|
+
}
|
|
37
|
+
else if (entry.isFile()) {
|
|
38
|
+
if (!isTypeScriptSourceFile(entry.name)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (shouldExcludeBySuffix(entry.name, context.excludePatterns)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (shouldExcludeByGlobs(fullPath, context.rootDir, context.excludeGlobs)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (shouldExcludeByPaths(fullPath, context.excludePaths)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
files.push(fullPath);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function scanDirectory(directory, options = {}) {
|
|
55
|
+
const absolutePath = resolve(directory);
|
|
56
|
+
try {
|
|
57
|
+
const stats = await stat(absolutePath);
|
|
58
|
+
if (!stats.isDirectory()) {
|
|
59
|
+
return {
|
|
60
|
+
files: [],
|
|
61
|
+
errors: [
|
|
62
|
+
{
|
|
63
|
+
code: "DIRECTORY_NOT_FOUND",
|
|
64
|
+
message: `Path is not a directory: ${absolutePath}`,
|
|
65
|
+
severity: "error",
|
|
66
|
+
location: null,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return {
|
|
74
|
+
files: [],
|
|
75
|
+
errors: [
|
|
76
|
+
{
|
|
77
|
+
code: "DIRECTORY_NOT_FOUND",
|
|
78
|
+
message: `Directory not found: ${absolutePath}`,
|
|
79
|
+
severity: "error",
|
|
80
|
+
location: null,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const context = {
|
|
86
|
+
rootDir: absolutePath,
|
|
87
|
+
excludePatterns: options.excludePatterns ?? [],
|
|
88
|
+
excludeGlobs: options.excludeGlobs ?? [],
|
|
89
|
+
excludePaths: options.excludePaths ?? [],
|
|
90
|
+
};
|
|
91
|
+
const files = [];
|
|
92
|
+
await collectFiles(absolutePath, files, context);
|
|
93
|
+
files.sort();
|
|
94
|
+
return {
|
|
95
|
+
files,
|
|
96
|
+
errors: [],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=file-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/shared/file-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.test.d.ts","sourceRoot":"","sources":["../../src/shared/file-scanner.test.ts"],"names":[],"mappings":""}
|