@sun-asterisk/sungen 1.0.23 → 2.0.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/README.md +198 -74
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +5 -3
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -35
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +5 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/dist/generators/test-generator/code-generator.d.ts +0 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +0 -47
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +33 -8
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +4 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +17 -5
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +1 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +36 -34
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +4 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/types.d.ts +7 -24
- package/dist/generators/test-generator/types.d.ts.map +1 -1
- package/dist/generators/test-generator/types.js +2 -101
- package/dist/generators/test-generator/types.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +8 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +343 -32
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -32
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +55 -216
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +3 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/commands/add.ts +5 -3
- package/src/cli/commands/generate.ts +90 -38
- package/src/cli/index.ts +5 -16
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/src/generators/test-generator/code-generator.ts +0 -59
- package/src/generators/test-generator/patterns/assertion-patterns.ts +39 -8
- package/src/generators/test-generator/patterns/index.ts +12 -3
- package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
- package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
- package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
- package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
- package/src/generators/test-generator/step-mapper.ts +39 -34
- package/src/generators/test-generator/template-engine.ts +3 -1
- package/src/generators/test-generator/types.ts +7 -112
- package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
- package/src/orchestrator/project-initializer.ts +345 -32
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/utils/selector-types.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts +0 -3
- package/dist/cli/commands/cache-clear.d.ts.map +0 -1
- package/dist/cli/commands/cache-clear.js +0 -24
- package/dist/cli/commands/cache-clear.js.map +0 -1
- package/dist/cli/commands/full.d.ts +0 -3
- package/dist/cli/commands/full.d.ts.map +0 -1
- package/dist/cli/commands/full.js +0 -37
- package/dist/cli/commands/full.js.map +0 -1
- package/dist/cli/commands/live-scan.d.ts +0 -3
- package/dist/cli/commands/live-scan.d.ts.map +0 -1
- package/dist/cli/commands/live-scan.js +0 -78
- package/dist/cli/commands/live-scan.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -3
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -93
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -3
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -43
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -6
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -101
- package/dist/cli/utils.js.map +0 -1
- package/dist/config/config-loader.d.ts +0 -51
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-loader.js +0 -216
- package/dist/config/config-loader.js.map +0 -1
- package/dist/config/config-schema.d.ts +0 -121
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/config/config-schema.js +0 -7
- package/dist/config/config-schema.js.map +0 -1
- package/dist/core/live-scanner/config-reader.d.ts +0 -10
- package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/config-reader.js +0 -87
- package/dist/core/live-scanner/config-reader.js.map +0 -1
- package/dist/core/live-scanner/element-finder.d.ts +0 -20
- package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
- package/dist/core/live-scanner/element-finder.js +0 -486
- package/dist/core/live-scanner/element-finder.js.map +0 -1
- package/dist/core/live-scanner/index.d.ts +0 -8
- package/dist/core/live-scanner/index.d.ts.map +0 -1
- package/dist/core/live-scanner/index.js +0 -33
- package/dist/core/live-scanner/index.js.map +0 -1
- package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
- package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-reader.js +0 -60
- package/dist/core/live-scanner/matrix-reader.js.map +0 -1
- package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
- package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-writer.js +0 -103
- package/dist/core/live-scanner/matrix-writer.js.map +0 -1
- package/dist/core/live-scanner/role-fallback.d.ts +0 -15
- package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
- package/dist/core/live-scanner/role-fallback.js +0 -45
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -13
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -243
- package/dist/core/live-scanner/scanner.js.map +0 -1
- package/dist/core/live-scanner/step-replayer.d.ts +0 -26
- package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
- package/dist/core/live-scanner/step-replayer.js +0 -286
- package/dist/core/live-scanner/step-replayer.js.map +0 -1
- package/dist/core/live-scanner/types.d.ts +0 -52
- package/dist/core/live-scanner/types.d.ts.map +0 -1
- package/dist/core/live-scanner/types.js +0 -14
- package/dist/core/live-scanner/types.js.map +0 -1
- package/dist/core/selector-base/annotation-handler.d.ts +0 -45
- package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
- package/dist/core/selector-base/annotation-handler.js +0 -102
- package/dist/core/selector-base/annotation-handler.js.map +0 -1
- package/dist/core/selector-base/base-generator.d.ts +0 -49
- package/dist/core/selector-base/base-generator.d.ts.map +0 -1
- package/dist/core/selector-base/base-generator.js +0 -214
- package/dist/core/selector-base/base-generator.js.map +0 -1
- package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
- package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
- package/dist/core/selector-base/gherkin-parser.js +0 -42
- package/dist/core/selector-base/gherkin-parser.js.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.js +0 -477
- package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
- package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
- package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/react-scanner.js +0 -163
- package/dist/core/ui-scanner/react-scanner.js.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.js +0 -33
- package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.js +0 -511
- package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
- package/dist/core/validator/data-validator.d.ts +0 -38
- package/dist/core/validator/data-validator.d.ts.map +0 -1
- package/dist/core/validator/data-validator.js +0 -212
- package/dist/core/validator/data-validator.js.map +0 -1
- package/dist/core/validator/feature-validator.d.ts +0 -27
- package/dist/core/validator/feature-validator.d.ts.map +0 -1
- package/dist/core/validator/feature-validator.js +0 -182
- package/dist/core/validator/feature-validator.js.map +0 -1
- package/dist/core/validator/index.d.ts +0 -46
- package/dist/core/validator/index.d.ts.map +0 -1
- package/dist/core/validator/index.js +0 -17
- package/dist/core/validator/index.js.map +0 -1
- package/dist/core/validator/screen-validator.d.ts +0 -35
- package/dist/core/validator/screen-validator.d.ts.map +0 -1
- package/dist/core/validator/screen-validator.js +0 -195
- package/dist/core/validator/screen-validator.js.map +0 -1
- package/dist/core/validator/selector-validator.d.ts +0 -36
- package/dist/core/validator/selector-validator.d.ts.map +0 -1
- package/dist/core/validator/selector-validator.js +0 -210
- package/dist/core/validator/selector-validator.js.map +0 -1
- package/dist/external/ai-provider.d.ts +0 -60
- package/dist/external/ai-provider.d.ts.map +0 -1
- package/dist/external/ai-provider.js +0 -30
- package/dist/external/ai-provider.js.map +0 -1
- package/dist/external/anthropic-provider.d.ts +0 -29
- package/dist/external/anthropic-provider.d.ts.map +0 -1
- package/dist/external/anthropic-provider.js +0 -85
- package/dist/external/anthropic-provider.js.map +0 -1
- package/dist/generators/cache/cache-manager.d.ts +0 -66
- package/dist/generators/cache/cache-manager.d.ts.map +0 -1
- package/dist/generators/cache/cache-manager.js +0 -286
- package/dist/generators/cache/cache-manager.js.map +0 -1
- package/dist/generators/dsl-writer/index.d.ts +0 -33
- package/dist/generators/dsl-writer/index.d.ts.map +0 -1
- package/dist/generators/dsl-writer/index.js +0 -226
- package/dist/generators/dsl-writer/index.js.map +0 -1
- package/dist/generators/scaffold-generator/index.d.ts +0 -162
- package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
- package/dist/generators/scaffold-generator/index.js +0 -868
- package/dist/generators/scaffold-generator/index.js.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.js +0 -457
- package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/index.d.ts +0 -8
- package/dist/generators/selector-mapper/index.d.ts.map +0 -1
- package/dist/generators/selector-mapper/index.js +0 -12
- package/dist/generators/selector-mapper/index.js.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.js +0 -204
- package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.js +0 -82
- package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
- package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.js +0 -797
- package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
- package/dist/orchestrator/cache-manager.d.ts +0 -15
- package/dist/orchestrator/cache-manager.d.ts.map +0 -1
- package/dist/orchestrator/cache-manager.js +0 -62
- package/dist/orchestrator/cache-manager.js.map +0 -1
- package/dist/orchestrator/pipeline.d.ts +0 -56
- package/dist/orchestrator/pipeline.d.ts.map +0 -1
- package/dist/orchestrator/pipeline.js +0 -298
- package/dist/orchestrator/pipeline.js.map +0 -1
- package/dist/orchestrator/reporter.d.ts +0 -15
- package/dist/orchestrator/reporter.d.ts.map +0 -1
- package/dist/orchestrator/reporter.js +0 -30
- package/dist/orchestrator/reporter.js.map +0 -1
- package/src/cli/commands/cache-clear.ts +0 -22
- package/src/cli/commands/full.ts +0 -35
- package/src/cli/commands/live-scan.ts +0 -82
- package/src/cli/commands/map.ts +0 -97
- package/src/cli/commands/validate.ts +0 -43
- package/src/cli/utils.ts +0 -106
- package/src/config/ai-providers.yaml +0 -56
- package/src/config/config-loader.ts +0 -248
- package/src/config/config-schema.ts +0 -148
- package/src/config/default.config.yaml +0 -107
- package/src/config/framework.config.yaml +0 -52
- package/src/config/routes.yaml +0 -31
- package/src/core/live-scanner/config-reader.ts +0 -57
- package/src/core/live-scanner/element-finder.ts +0 -541
- package/src/core/live-scanner/index.ts +0 -7
- package/src/core/live-scanner/matrix-reader.ts +0 -65
- package/src/core/live-scanner/matrix-writer.ts +0 -77
- package/src/core/live-scanner/role-fallback.ts +0 -43
- package/src/core/live-scanner/scanner.ts +0 -254
- package/src/core/live-scanner/step-replayer.ts +0 -306
- package/src/core/live-scanner/types.ts +0 -58
- package/src/core/selector-base/annotation-handler.ts +0 -127
- package/src/core/selector-base/base-generator.ts +0 -234
- package/src/core/selector-base/gherkin-parser.ts +0 -57
- package/src/core/selector-mapper/priority-mapper.ts +0 -607
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
- package/src/core/ui-scanner/react-scanner.ts +0 -156
- package/src/core/ui-scanner/scanner-interface.ts +0 -133
- package/src/core/ui-scanner/strict-scanner.ts +0 -629
- package/src/core/validator/data-validator.ts +0 -202
- package/src/core/validator/feature-validator.ts +0 -176
- package/src/core/validator/index.ts +0 -57
- package/src/core/validator/screen-validator.ts +0 -209
- package/src/core/validator/selector-validator.ts +0 -209
- package/src/external/ai-provider.ts +0 -90
- package/src/external/anthropic-provider.ts +0 -114
- package/src/generators/README.md +0 -410
- package/src/generators/cache/cache-manager.ts +0 -322
- package/src/generators/dsl-writer/index.ts +0 -253
- package/src/generators/scaffold-generator/index.ts +0 -1019
- package/src/generators/selector-mapper/ai-mapper.ts +0 -528
- package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
- package/src/generators/selector-mapper/index.ts +0 -10
- package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
- package/src/generators/test-generator/ai-step-mapper.ts +0 -224
- package/src/generators/test-generator/auth-setup-generator.ts +0 -59
- package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
- package/src/generators/ui-model-builder/react-scanner.ts +0 -959
- package/src/orchestrator/cache-manager.ts +0 -32
- package/src/orchestrator/pipeline.ts +0 -354
- package/src/orchestrator/reporter.ts +0 -36
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Heuristic Interface
|
|
3
|
-
* All element detection heuristics implement this interface
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import * as t from '@babel/types';
|
|
7
|
-
import { UIElement } from '../scanner-interface';
|
|
8
|
-
|
|
9
|
-
export interface ElementHeuristic {
|
|
10
|
-
/**
|
|
11
|
-
* Heuristic name for debugging
|
|
12
|
-
*/
|
|
13
|
-
readonly name: string;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Detect if a JSX element matches this heuristic
|
|
17
|
-
*/
|
|
18
|
-
matches(node: t.JSXElement | t.JSXFragment, context: HeuristicContext): boolean;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Extract UI element information from matched node
|
|
22
|
-
*/
|
|
23
|
-
extract(node: t.JSXElement | t.JSXFragment, context: HeuristicContext): UIElement | null;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Context passed to heuristics for element detection
|
|
28
|
-
*/
|
|
29
|
-
export interface HeuristicContext {
|
|
30
|
-
/**
|
|
31
|
-
* Current component name
|
|
32
|
-
*/
|
|
33
|
-
componentName?: string;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Parent component name
|
|
37
|
-
*/
|
|
38
|
-
parentComponent?: string;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Current depth in component tree
|
|
42
|
-
*/
|
|
43
|
-
depth?: number;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Element counter for ID generation
|
|
47
|
-
*/
|
|
48
|
-
elementCounter: number;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Increment element counter
|
|
52
|
-
*/
|
|
53
|
-
incrementCounter(): void;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* File path being scanned
|
|
57
|
-
*/
|
|
58
|
-
filePath?: string;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Helper functions for heuristics
|
|
63
|
-
*/
|
|
64
|
-
export class HeuristicHelpers {
|
|
65
|
-
/**
|
|
66
|
-
* Get JSX element name (e.g., "input", "Button")
|
|
67
|
-
*/
|
|
68
|
-
static getElementName(node: t.JSXElement): string | null {
|
|
69
|
-
const openingElement = node.openingElement;
|
|
70
|
-
if (t.isJSXIdentifier(openingElement.name)) {
|
|
71
|
-
return openingElement.name.name;
|
|
72
|
-
}
|
|
73
|
-
if (t.isJSXMemberExpression(openingElement.name)) {
|
|
74
|
-
// Handle cases like <Form.Input>
|
|
75
|
-
return this.getMemberExpressionName(openingElement.name);
|
|
76
|
-
}
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Get member expression name (e.g., "Form.Input" -> "Input")
|
|
82
|
-
*/
|
|
83
|
-
private static getMemberExpressionName(expr: t.JSXMemberExpression): string {
|
|
84
|
-
if (t.isJSXIdentifier(expr.property)) {
|
|
85
|
-
return expr.property.name;
|
|
86
|
-
}
|
|
87
|
-
return '';
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Get attribute value from JSX element
|
|
92
|
-
*/
|
|
93
|
-
static getAttributeValue(node: t.JSXElement, attrName: string): string | null {
|
|
94
|
-
const attr = node.openingElement.attributes.find(
|
|
95
|
-
(a): a is t.JSXAttribute =>
|
|
96
|
-
t.isJSXAttribute(a) && t.isJSXIdentifier(a.name) && a.name.name === attrName
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
if (!attr) return null;
|
|
100
|
-
|
|
101
|
-
if (t.isStringLiteral(attr.value)) {
|
|
102
|
-
return attr.value.value;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (t.isJSXExpressionContainer(attr.value)) {
|
|
106
|
-
const expr = attr.value.expression;
|
|
107
|
-
if (t.isStringLiteral(expr)) {
|
|
108
|
-
return expr.value;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Check if element has attribute
|
|
117
|
-
*/
|
|
118
|
-
static hasAttribute(node: t.JSXElement, attrName: string): boolean {
|
|
119
|
-
return node.openingElement.attributes.some(
|
|
120
|
-
(a) => t.isJSXAttribute(a) && t.isJSXIdentifier(a.name) && a.name.name === attrName
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Get all attributes as key-value pairs
|
|
126
|
-
*/
|
|
127
|
-
static getAllAttributes(node: t.JSXElement): Record<string, string> {
|
|
128
|
-
const attrs: Record<string, string> = {};
|
|
129
|
-
|
|
130
|
-
for (const attr of node.openingElement.attributes) {
|
|
131
|
-
if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {
|
|
132
|
-
const value = this.getAttributeValue(node, attr.name.name);
|
|
133
|
-
if (value) {
|
|
134
|
-
attrs[attr.name.name] = value;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return attrs;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Generate element ID from attributes
|
|
144
|
-
*/
|
|
145
|
-
static generateElementId(node: t.JSXElement, counter: number): string {
|
|
146
|
-
// Priority: id > data-testid > name > placeholder > generated
|
|
147
|
-
const id = this.getAttributeValue(node, 'id');
|
|
148
|
-
if (id) return id;
|
|
149
|
-
|
|
150
|
-
const testId = this.getAttributeValue(node, 'data-testid');
|
|
151
|
-
if (testId) return testId;
|
|
152
|
-
|
|
153
|
-
const name = this.getAttributeValue(node, 'name');
|
|
154
|
-
if (name) return name;
|
|
155
|
-
|
|
156
|
-
const placeholder = this.getAttributeValue(node, 'placeholder');
|
|
157
|
-
if (placeholder) {
|
|
158
|
-
return placeholder.toLowerCase().replace(/\s+/g, '-');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
const elementName = this.getElementName(node);
|
|
162
|
-
return `${elementName || 'element'}-${counter}`;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Build CSS selector for element
|
|
167
|
-
*/
|
|
168
|
-
static buildSelector(node: t.JSXElement): string {
|
|
169
|
-
const elementName = this.getElementName(node);
|
|
170
|
-
if (!elementName) return '';
|
|
171
|
-
|
|
172
|
-
const selectors: string[] = [elementName.toLowerCase()];
|
|
173
|
-
|
|
174
|
-
// Add attribute selectors
|
|
175
|
-
const id = this.getAttributeValue(node, 'id');
|
|
176
|
-
if (id) {
|
|
177
|
-
selectors.push(`#${id}`);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const className = this.getAttributeValue(node, 'className');
|
|
181
|
-
if (className) {
|
|
182
|
-
const classes = className.split(/\s+/).filter(c => c && !c.includes('${'));
|
|
183
|
-
if (classes.length > 0) {
|
|
184
|
-
selectors.push(`.${classes.join('.')}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const testId = this.getAttributeValue(node, 'data-testid');
|
|
189
|
-
if (testId) {
|
|
190
|
-
selectors.push(`[data-testid="${testId}"]`);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const placeholder = this.getAttributeValue(node, 'placeholder');
|
|
194
|
-
if (placeholder && !placeholder.includes('${')) {
|
|
195
|
-
selectors.push(`[placeholder="${placeholder}"]`);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return selectors.join('');
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Check if element is a form control
|
|
203
|
-
*/
|
|
204
|
-
static isFormControl(elementName: string): boolean {
|
|
205
|
-
const formControls = ['input', 'textarea', 'select', 'button'];
|
|
206
|
-
return formControls.includes(elementName.toLowerCase());
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Check if element name suggests it's a custom component
|
|
211
|
-
*/
|
|
212
|
-
static isCustomComponent(elementName: string): boolean {
|
|
213
|
-
// Custom components start with uppercase
|
|
214
|
-
return /^[A-Z]/.test(elementName);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* React UI Scanner
|
|
3
|
-
* Refactored implementation that conforms to UIScanner interface
|
|
4
|
-
* Uses DeepScanner for high-quality element detection
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { UIScanner, UIModel, UIElement, ScanStats } from './scanner-interface';
|
|
8
|
-
import { RuntimeConfig } from '../../config/config-schema';
|
|
9
|
-
import { DeepScanner } from '../../generators/ui-model-builder/deep-scanner';
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
import * as fs from 'fs';
|
|
12
|
-
|
|
13
|
-
export class ReactScanner implements UIScanner {
|
|
14
|
-
readonly name = 'ReactScanner';
|
|
15
|
-
readonly framework = 'react' as const;
|
|
16
|
-
|
|
17
|
-
private config: RuntimeConfig;
|
|
18
|
-
private deepScanner: DeepScanner;
|
|
19
|
-
|
|
20
|
-
constructor(config: RuntimeConfig) {
|
|
21
|
-
this.config = config;
|
|
22
|
-
|
|
23
|
-
// Initialize DeepScanner with config
|
|
24
|
-
this.deepScanner = new DeepScanner({
|
|
25
|
-
sourceRoot: config.paths.sourceRoot,
|
|
26
|
-
projectRoot: process.cwd(),
|
|
27
|
-
maxDepth: config.scanner.maxDepth,
|
|
28
|
-
verbose: config.verbose
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Scan a screen and generate UI model
|
|
34
|
-
*/
|
|
35
|
-
async scan(screenName: string, config: RuntimeConfig): Promise<UIModel> {
|
|
36
|
-
const startTime = Date.now();
|
|
37
|
-
|
|
38
|
-
// Find screen files
|
|
39
|
-
const screenFiles = this.findScreenFiles(screenName);
|
|
40
|
-
|
|
41
|
-
if (config.verbose) {
|
|
42
|
-
console.log(` Scanning ${screenFiles.length} file(s) for screen: ${screenName}`);
|
|
43
|
-
screenFiles.forEach(f => console.log(` - ${path.relative(process.cwd(), f)}`));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// Use DeepScanner to scan files
|
|
47
|
-
// @ts-ignore - DeepScanner elements compatible but different type definition
|
|
48
|
-
const elements = await this.deepScanner.scanFiles(screenFiles);
|
|
49
|
-
|
|
50
|
-
if (config.verbose) {
|
|
51
|
-
console.log(` Found ${elements.length} elements`);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Build UI model
|
|
55
|
-
const uiModel: UIModel = {
|
|
56
|
-
screen: screenName,
|
|
57
|
-
timestamp: Date.now(),
|
|
58
|
-
framework: this.framework,
|
|
59
|
-
sourceFiles: screenFiles.map(f => path.relative(process.cwd(), f)),
|
|
60
|
-
elements: elements as any, // Type cast - DeepScanner elements are compatible
|
|
61
|
-
stats: {
|
|
62
|
-
totalComponents: 0, // DeepScanner doesn't track this
|
|
63
|
-
totalElements: elements.length,
|
|
64
|
-
maxDepth: config.scanner.maxDepth,
|
|
65
|
-
scanDuration: Date.now() - startTime,
|
|
66
|
-
filesScanned: screenFiles.length
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
return uiModel;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Validate scanner can run
|
|
75
|
-
*/
|
|
76
|
-
validate(): boolean {
|
|
77
|
-
return fs.existsSync(this.config.paths.sourceRoot);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Find all source files for a screen
|
|
82
|
-
* Looks for: app/{screen}/page.tsx, app/{screen}/page.jsx, etc.
|
|
83
|
-
*/
|
|
84
|
-
private findScreenFiles(screenName: string): string[] {
|
|
85
|
-
const files: string[] = [];
|
|
86
|
-
const sourceRoot = this.config.paths.sourceRoot;
|
|
87
|
-
|
|
88
|
-
// Convert screen name to possible paths
|
|
89
|
-
// auth-login -> auth/login
|
|
90
|
-
const screenPath = screenName.replace(/-/g, '/');
|
|
91
|
-
|
|
92
|
-
// Possible file patterns
|
|
93
|
-
const patterns = [
|
|
94
|
-
path.join(sourceRoot, screenPath, 'page.tsx'),
|
|
95
|
-
path.join(sourceRoot, screenPath, 'page.jsx'),
|
|
96
|
-
path.join(sourceRoot, screenPath, 'index.tsx'),
|
|
97
|
-
path.join(sourceRoot, screenPath, 'index.jsx'),
|
|
98
|
-
path.join(sourceRoot, `${screenName}.tsx`),
|
|
99
|
-
path.join(sourceRoot, `${screenName}.jsx`),
|
|
100
|
-
path.join(sourceRoot, 'page.tsx'), // Root page for "home"
|
|
101
|
-
path.join(sourceRoot, 'layout.tsx') // Always include layout
|
|
102
|
-
];
|
|
103
|
-
|
|
104
|
-
// Add files that exist
|
|
105
|
-
for (const pattern of patterns) {
|
|
106
|
-
if (fs.existsSync(pattern) && !files.includes(pattern)) {
|
|
107
|
-
files.push(pattern);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return files;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Discover all available screens
|
|
116
|
-
*/
|
|
117
|
-
async discoverScreens(): Promise<string[]> {
|
|
118
|
-
const screens: string[] = [];
|
|
119
|
-
const sourceRoot = this.config.paths.sourceRoot;
|
|
120
|
-
|
|
121
|
-
if (!fs.existsSync(sourceRoot)) {
|
|
122
|
-
return screens;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Scan sourceRoot for directories with page.tsx/jsx files
|
|
126
|
-
const scanDir = (dir: string, prefix = '') => {
|
|
127
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
128
|
-
|
|
129
|
-
for (const entry of entries) {
|
|
130
|
-
if (entry.isDirectory()) {
|
|
131
|
-
const fullPath = path.join(dir, entry.name);
|
|
132
|
-
const hasPageFile = fs.existsSync(path.join(fullPath, 'page.tsx')) ||
|
|
133
|
-
fs.existsSync(path.join(fullPath, 'page.jsx'));
|
|
134
|
-
|
|
135
|
-
if (hasPageFile) {
|
|
136
|
-
const screenName = prefix ? `${prefix}-${entry.name}` : entry.name;
|
|
137
|
-
screens.push(screenName);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Recursively scan subdirectories
|
|
141
|
-
scanDir(fullPath, prefix ? `${prefix}-${entry.name}` : entry.name);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
scanDir(sourceRoot);
|
|
147
|
-
|
|
148
|
-
// Add "home" if root page exists
|
|
149
|
-
if (fs.existsSync(path.join(sourceRoot, 'page.tsx')) ||
|
|
150
|
-
fs.existsSync(path.join(sourceRoot, 'page.jsx'))) {
|
|
151
|
-
screens.unshift('home');
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
return screens;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UI Scanner Interface
|
|
3
|
-
* Defines the contract for UI scanning implementations
|
|
4
|
-
* Supports multiple frameworks: React, Vue, Angular, etc.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { RuntimeConfig } from '../../config/config-schema';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Main Scanner Interface
|
|
11
|
-
*/
|
|
12
|
-
export interface UIScanner {
|
|
13
|
-
/**
|
|
14
|
-
* Scanner name/type
|
|
15
|
-
*/
|
|
16
|
-
readonly name: string;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Supported framework
|
|
20
|
-
*/
|
|
21
|
-
readonly framework: 'react' | 'vue' | 'angular';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Scan a screen and generate UI model
|
|
25
|
-
*
|
|
26
|
-
* @param screenName - Screen identifier (e.g., 'chat', 'login')
|
|
27
|
-
* @param config - Runtime configuration
|
|
28
|
-
* @returns UI Model
|
|
29
|
-
*/
|
|
30
|
-
scan(screenName: string, config: RuntimeConfig): Promise<UIModel>;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Validate scanner can run in current environment
|
|
34
|
-
*/
|
|
35
|
-
validate(): boolean;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* UI Model Structure
|
|
40
|
-
* Represents discovered UI elements for a screen
|
|
41
|
-
*/
|
|
42
|
-
export interface UIModel {
|
|
43
|
-
screen: string;
|
|
44
|
-
timestamp: number;
|
|
45
|
-
framework: string;
|
|
46
|
-
sourceFiles: string[];
|
|
47
|
-
elements: UIElement[];
|
|
48
|
-
stats: ScanStats;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* UI Element
|
|
53
|
-
* Represents a discovered UI element
|
|
54
|
-
*/
|
|
55
|
-
export interface UIElement {
|
|
56
|
-
id: string; // Suggested ID (e.g., 'message-input')
|
|
57
|
-
type: ElementType; // Element type (input, button, etc.)
|
|
58
|
-
selector: string; // CSS selector to locate element
|
|
59
|
-
label?: string; // Associated label text
|
|
60
|
-
placeholder?: string; // Placeholder text (for inputs)
|
|
61
|
-
role?: string; // ARIA role
|
|
62
|
-
required?: boolean; // Is required field
|
|
63
|
-
context?: ElementContext; // Additional context
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Element Types
|
|
68
|
-
*/
|
|
69
|
-
export type ElementType =
|
|
70
|
-
| 'input'
|
|
71
|
-
| 'textarea'
|
|
72
|
-
| 'select'
|
|
73
|
-
| 'button'
|
|
74
|
-
| 'link'
|
|
75
|
-
| 'checkbox'
|
|
76
|
-
| 'radio'
|
|
77
|
-
| 'container'
|
|
78
|
-
| 'heading'
|
|
79
|
-
| 'text'
|
|
80
|
-
| 'image'
|
|
81
|
-
| 'list'
|
|
82
|
-
| 'unknown';
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Element Context
|
|
86
|
-
* Additional contextual information about an element
|
|
87
|
-
*/
|
|
88
|
-
export interface ElementContext {
|
|
89
|
-
component?: string; // Component name where element was found
|
|
90
|
-
parentComponent?: string; // Parent component name
|
|
91
|
-
depth?: number; // Nesting depth from root
|
|
92
|
-
conditionalRendering?: boolean; // Is conditionally rendered
|
|
93
|
-
dynamicContent?: boolean; // Contains dynamic content
|
|
94
|
-
props?: Record<string, any>; // Component props (if available)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Scan Statistics
|
|
99
|
-
*/
|
|
100
|
-
export interface ScanStats {
|
|
101
|
-
totalComponents: number; // Total components scanned
|
|
102
|
-
totalElements: number; // Total elements found
|
|
103
|
-
maxDepth: number; // Maximum depth reached
|
|
104
|
-
scanDuration: number; // Scan duration in ms
|
|
105
|
-
filesScanned: number; // Number of files scanned
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Scanner Factory
|
|
110
|
-
* Creates appropriate scanner based on framework type
|
|
111
|
-
*/
|
|
112
|
-
export class ScannerFactory {
|
|
113
|
-
/**
|
|
114
|
-
* Create scanner instance for framework
|
|
115
|
-
*/
|
|
116
|
-
static create(framework: 'react' | 'vue' | 'angular', config: RuntimeConfig): UIScanner {
|
|
117
|
-
switch (framework) {
|
|
118
|
-
case 'react':
|
|
119
|
-
// Dynamic import to avoid loading all scanners
|
|
120
|
-
const ReactScanner = require('./react-scanner').ReactScanner;
|
|
121
|
-
return new ReactScanner(config);
|
|
122
|
-
|
|
123
|
-
case 'vue':
|
|
124
|
-
throw new Error('Vue scanner not yet implemented');
|
|
125
|
-
|
|
126
|
-
case 'angular':
|
|
127
|
-
throw new Error('Angular scanner not yet implemented');
|
|
128
|
-
|
|
129
|
-
default:
|
|
130
|
-
throw new Error(`Unsupported framework: ${framework}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|