@sun-asterisk/sungen 1.0.24 → 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/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 +2 -0
- 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 +30 -27
- 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/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 +2 -0
- 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 +33 -27
- 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 -481
- 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 -46
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -22
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -303
- 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 -473
- 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 -877
- 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 -534
- 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 -44
- package/src/core/live-scanner/scanner.ts +0 -321
- package/src/core/live-scanner/step-replayer.ts +0 -503
- 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 -1029
- 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,5 +1,4 @@
|
|
|
1
1
|
import { ParsedStep } from '../gherkin-parser';
|
|
2
|
-
import { AIStepMapper } from './ai-step-mapper';
|
|
3
2
|
import { TemplateEngine } from './template-engine';
|
|
4
3
|
import { PatternRegistry, PatternContext } from './patterns';
|
|
5
4
|
import { SelectorResolver } from './utils/selector-resolver';
|
|
@@ -18,8 +17,6 @@ export interface MappedStep {
|
|
|
18
17
|
*/
|
|
19
18
|
export class StepMapper {
|
|
20
19
|
private stepCounter: number = 0;
|
|
21
|
-
private aiMapper: AIStepMapper | null = null;
|
|
22
|
-
private useAI: boolean = false;
|
|
23
20
|
private verbose: boolean = false;
|
|
24
21
|
private templateEngine: TemplateEngine;
|
|
25
22
|
private patternRegistry: PatternRegistry;
|
|
@@ -31,9 +28,9 @@ export class StepMapper {
|
|
|
31
28
|
private featurePath?: string;
|
|
32
29
|
private currentScenarioSteps?: ParsedStep[];
|
|
33
30
|
private inDialogScope: boolean = false;
|
|
31
|
+
private inFrameScope: boolean = false;
|
|
34
32
|
|
|
35
|
-
constructor(options: {
|
|
36
|
-
this.useAI = options.useAI ?? false;
|
|
33
|
+
constructor(options: { verbose?: boolean; baseURL?: string; featureName?: string; screenName?: string; featurePath?: string } = {}) {
|
|
37
34
|
this.verbose = options.verbose ?? false;
|
|
38
35
|
this.baseURL = options.baseURL || null; // null means path-only navigation
|
|
39
36
|
this.featureName = options.featureName;
|
|
@@ -46,18 +43,8 @@ export class StepMapper {
|
|
|
46
43
|
this.selectorResolver = new SelectorResolver(undefined, options.screenName);
|
|
47
44
|
this.dataResolver = new DataResolver(undefined, options.screenName);
|
|
48
45
|
|
|
49
|
-
if (this.
|
|
50
|
-
|
|
51
|
-
this.aiMapper = new AIStepMapper(this.verbose);
|
|
52
|
-
if (this.verbose) {
|
|
53
|
-
console.log(` [StepMapper] AI fallback enabled (${this.patternRegistry.getPatternCount()} patterns loaded)`);
|
|
54
|
-
}
|
|
55
|
-
} catch (error) {
|
|
56
|
-
console.warn('[StepMapper] AI mapper initialization failed:', error);
|
|
57
|
-
this.useAI = false;
|
|
58
|
-
}
|
|
59
|
-
} else if (this.verbose) {
|
|
60
|
-
console.log(` [StepMapper] Dictionary mode (${this.patternRegistry.getPatternCount()} patterns loaded)`);
|
|
46
|
+
if (this.verbose) {
|
|
47
|
+
console.log(` [StepMapper] ${this.patternRegistry.getPatternCount()} patterns loaded`);
|
|
61
48
|
}
|
|
62
49
|
}
|
|
63
50
|
|
|
@@ -75,8 +62,9 @@ export class StepMapper {
|
|
|
75
62
|
*/
|
|
76
63
|
setScenarioContext(steps: ParsedStep[]): void {
|
|
77
64
|
this.currentScenarioSteps = steps;
|
|
78
|
-
// Reset dialog scope at the start of each new scenario
|
|
65
|
+
// Reset dialog and frame scope at the start of each new scenario
|
|
79
66
|
this.inDialogScope = false;
|
|
67
|
+
this.inFrameScope = false;
|
|
80
68
|
this.templateEngine.resetBaseContext();
|
|
81
69
|
}
|
|
82
70
|
|
|
@@ -87,6 +75,32 @@ export class StepMapper {
|
|
|
87
75
|
mapStep(step: ParsedStep): MappedStep | Promise<MappedStep> {
|
|
88
76
|
this.stepCounter++;
|
|
89
77
|
|
|
78
|
+
// Frame scope directives — intercept before pattern matching
|
|
79
|
+
if (/\bswitch(?:es)?\s+to\b/i.test(step.text) &&
|
|
80
|
+
(step.elementType === 'frame' || step.elementType === 'iframe')) {
|
|
81
|
+
const selectorRef = step.selectorRef || '';
|
|
82
|
+
|
|
83
|
+
if (selectorRef.toLowerCase() === 'main') {
|
|
84
|
+
// Exit frame scope
|
|
85
|
+
this.inFrameScope = false;
|
|
86
|
+
this.templateEngine.setBaseContext({ inFrame: false });
|
|
87
|
+
return { code: '// Back to main page context', comment: 'Exit frame scope' };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Enter frame scope
|
|
91
|
+
this.inFrameScope = true;
|
|
92
|
+
let frameSelector = selectorRef;
|
|
93
|
+
try {
|
|
94
|
+
const resolved = this.selectorResolver.resolveSelector(selectorRef, this.featureName, 'frame', 0);
|
|
95
|
+
frameSelector = resolved.value || selectorRef;
|
|
96
|
+
} catch {
|
|
97
|
+
// Use selectorRef as-is
|
|
98
|
+
}
|
|
99
|
+
this.templateEngine.setBaseContext({ inFrame: true, frameSelector });
|
|
100
|
+
const code = `const frame = page.frameLocator('${frameSelector}');`;
|
|
101
|
+
return { code, comment: `Switch to ${selectorRef} frame` };
|
|
102
|
+
}
|
|
103
|
+
|
|
90
104
|
// Dialog scope directives — intercept before pattern matching
|
|
91
105
|
if (/\buse dialog\b/i.test(step.text)) {
|
|
92
106
|
this.inDialogScope = true;
|
|
@@ -142,15 +156,7 @@ export class StepMapper {
|
|
|
142
156
|
return mappedStep;
|
|
143
157
|
}
|
|
144
158
|
|
|
145
|
-
//
|
|
146
|
-
if (this.useAI && this.aiMapper) {
|
|
147
|
-
if (this.verbose) {
|
|
148
|
-
console.log(` → AI fallback for: ${step.text.substring(0, 50)}...`);
|
|
149
|
-
}
|
|
150
|
-
return this.aiMapper.mapStep(step);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// No pattern matched and no AI - return generic code with comment
|
|
159
|
+
// No pattern matched - return TODO comment
|
|
154
160
|
return {
|
|
155
161
|
code: `// TODO: Implement step: ${step.text}`,
|
|
156
162
|
comment: `Unrecognized step pattern: ${step.text}`,
|
|
@@ -112,8 +112,10 @@ export class TemplateEngine {
|
|
|
112
112
|
}
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
-
// Returns the Playwright root object — scoped to dialog
|
|
115
|
+
// Returns the Playwright root object — scoped to dialog or frame when active
|
|
116
116
|
Handlebars.registerHelper('pageRoot', function(this: any) {
|
|
117
|
+
// Frame scope takes precedence (frame > dialog > page)
|
|
118
|
+
if (this.inFrame) return 'frame';
|
|
117
119
|
if (!this.inDialog) return 'page';
|
|
118
120
|
const partial = Handlebars.partials['dialog-root'];
|
|
119
121
|
if (partial) {
|
|
@@ -1,38 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Test Generator
|
|
3
|
-
*
|
|
2
|
+
* Test Generator Types
|
|
3
|
+
* Core type definitions for the test generation compiler
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { RuntimeConfig } from '../../config/config-schema';
|
|
7
|
-
import { ParsedFeature } from '../../core/selector-base/gherkin-parser';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
|
|
10
6
|
/**
|
|
11
|
-
*
|
|
12
|
-
*/
|
|
13
|
-
export interface TestGenerator {
|
|
14
|
-
readonly framework: string;
|
|
15
|
-
|
|
16
|
-
generate(
|
|
17
|
-
feature: ParsedFeature,
|
|
18
|
-
selectors: Record<string, any>,
|
|
19
|
-
testData: Record<string, any>,
|
|
20
|
-
config: RuntimeConfig
|
|
21
|
-
): Promise<GeneratedTest>;
|
|
22
|
-
|
|
23
|
-
getFileExtension(): string;
|
|
24
|
-
|
|
25
|
-
validate(): boolean;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Generated Test Result (executor-level)
|
|
7
|
+
* Generated Test Result
|
|
30
8
|
*/
|
|
31
9
|
export interface GeneratedTest {
|
|
32
|
-
|
|
33
|
-
|
|
10
|
+
featureName: string;
|
|
11
|
+
filePath: string;
|
|
34
12
|
code: string;
|
|
35
|
-
|
|
13
|
+
sourceFile?: string;
|
|
14
|
+
stepCount?: number;
|
|
36
15
|
}
|
|
37
16
|
|
|
38
17
|
/**
|
|
@@ -42,90 +21,6 @@ export interface GenerationStats {
|
|
|
42
21
|
totalScenarios: number;
|
|
43
22
|
totalSteps: number;
|
|
44
23
|
dictionaryMatched: number;
|
|
45
|
-
aiGenerated: number;
|
|
46
24
|
todoCount: number;
|
|
47
25
|
generationTime: number;
|
|
48
26
|
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Test Generator Factory
|
|
52
|
-
*/
|
|
53
|
-
export class TestGeneratorFactory {
|
|
54
|
-
static create(framework: string, config: RuntimeConfig): TestGenerator {
|
|
55
|
-
switch (framework) {
|
|
56
|
-
case 'playwright': {
|
|
57
|
-
const { CodeGenerator } = require('./code-generator');
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
framework: 'playwright',
|
|
61
|
-
|
|
62
|
-
async generate(
|
|
63
|
-
feature: ParsedFeature,
|
|
64
|
-
selectors: Record<string, any>,
|
|
65
|
-
testData: Record<string, any>,
|
|
66
|
-
cfg: RuntimeConfig
|
|
67
|
-
): Promise<GeneratedTest> {
|
|
68
|
-
const startTime = Date.now();
|
|
69
|
-
|
|
70
|
-
let screenName: string | undefined;
|
|
71
|
-
if (feature.sourceFile) {
|
|
72
|
-
const sourceDir = path.dirname(feature.sourceFile);
|
|
73
|
-
const parts = sourceDir.split(path.sep);
|
|
74
|
-
const screensIndex = parts.indexOf('screens');
|
|
75
|
-
if (screensIndex >= 0 && screensIndex < parts.length - 2) {
|
|
76
|
-
screenName = parts[screensIndex + 1];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const generator = new CodeGenerator({
|
|
81
|
-
useAI: cfg.testGenerator.enableAIFallback,
|
|
82
|
-
verbose: cfg.verbose,
|
|
83
|
-
screenName,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const outputDir = cfg.paths.specsDir;
|
|
87
|
-
const result = await generator.generateTest(feature, outputDir);
|
|
88
|
-
generator.writeTest(result);
|
|
89
|
-
|
|
90
|
-
const countSteps = (f: ParsedFeature) =>
|
|
91
|
-
f.scenarios.reduce((sum: number, s: any) => sum + (s.steps ? s.steps.length : 0), 0);
|
|
92
|
-
const countTodos = (code: string) => (code.match(/\/\/ TODO/g) || []).length;
|
|
93
|
-
|
|
94
|
-
const stats: GenerationStats = {
|
|
95
|
-
totalScenarios: feature.scenarios.length,
|
|
96
|
-
totalSteps: countSteps(feature),
|
|
97
|
-
dictionaryMatched: 0,
|
|
98
|
-
aiGenerated: 0,
|
|
99
|
-
todoCount: countTodos(result.code),
|
|
100
|
-
generationTime: Date.now() - startTime,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
feature: feature.name,
|
|
105
|
-
outputPath: result.filePath,
|
|
106
|
-
code: result.code,
|
|
107
|
-
stats,
|
|
108
|
-
};
|
|
109
|
-
},
|
|
110
|
-
|
|
111
|
-
getFileExtension() {
|
|
112
|
-
return '.spec.ts';
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
validate() {
|
|
116
|
-
return true;
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
case 'appium':
|
|
122
|
-
throw new Error('Appium generator not yet implemented');
|
|
123
|
-
|
|
124
|
-
case 'integration':
|
|
125
|
-
throw new Error('Integration test generator not yet implemented');
|
|
126
|
-
|
|
127
|
-
default:
|
|
128
|
-
throw new Error(`Unsupported test framework: ${framework}`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
@@ -190,15 +190,33 @@ function convertJapaneseToRomaji(text: string): string {
|
|
|
190
190
|
|
|
191
191
|
import { SelectorType } from '../../../utils/selector-types';
|
|
192
192
|
|
|
193
|
-
//
|
|
193
|
+
// Structured selector format v2
|
|
194
194
|
interface SelectorEntry {
|
|
195
|
-
locator?: string;
|
|
196
|
-
type?: SelectorType;
|
|
197
|
-
value?: string;
|
|
198
|
-
name?: string;
|
|
199
|
-
nth?: number;
|
|
200
|
-
exact?: boolean;
|
|
201
|
-
inputMethod?: string;
|
|
195
|
+
locator?: string; // CSS locator (optional, empty string means use type/value)
|
|
196
|
+
type?: SelectorType; // Locator strategy
|
|
197
|
+
value?: string; // Natural language value for the locator (e.g., 'button', 'link' for role)
|
|
198
|
+
name?: string; // Accessible name for role-based selectors (e.g., 'Login', 'Submit')
|
|
199
|
+
nth?: number; // Element index (0 = no index, 1+ = append .nth())
|
|
200
|
+
exact?: boolean; // Whether to use exact matching (default: false)
|
|
201
|
+
inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
|
|
202
|
+
|
|
203
|
+
// === v2: Disambiguation ===
|
|
204
|
+
scope?: string; // Parent landmark aria-label to scope within (e.g., 'desktop navigation')
|
|
205
|
+
match?: 'exact' | 'partial'; // For getByText matching (default: partial)
|
|
206
|
+
|
|
207
|
+
// === v2: Complex Elements ===
|
|
208
|
+
variant?: 'native' | 'custom' | 'dragdrop'; // Dropdown/upload subtype
|
|
209
|
+
trigger?: string; // Visible button that triggers hidden file input
|
|
210
|
+
frame?: string; // iframe selector for cross-frame elements
|
|
211
|
+
contenteditable?: boolean; // Rich text editor (contenteditable div)
|
|
212
|
+
|
|
213
|
+
// === v2: Table ===
|
|
214
|
+
columns?: Record<string, { index: number; header: string; elements?: Record<string, SelectorEntry> }>;
|
|
215
|
+
pagination?: Record<string, string>;
|
|
216
|
+
|
|
217
|
+
// === v2: Assertion Helpers ===
|
|
218
|
+
attribute?: string; // Attribute to check (for "has" assertions)
|
|
219
|
+
pattern?: string; // Regex for attribute value
|
|
202
220
|
}
|
|
203
221
|
|
|
204
222
|
// New selector file structure: flat key-value pairs
|
|
@@ -220,12 +238,24 @@ interface LegacySelectorFile {
|
|
|
220
238
|
export interface ResolvedSelector {
|
|
221
239
|
strategy: 'testid' | 'id' | 'placeholder' | 'label' | 'text' | 'css' | 'role' | 'locator';
|
|
222
240
|
value: string;
|
|
223
|
-
role?: string;
|
|
224
|
-
name?: string;
|
|
225
|
-
locator?: string;
|
|
226
|
-
nth?: number;
|
|
227
|
-
exact?: boolean;
|
|
241
|
+
role?: string; // For role-based selectors (e.g., 'button', 'link')
|
|
242
|
+
name?: string; // For accessible name in role selectors
|
|
243
|
+
locator?: string; // CSS locator for fallback
|
|
244
|
+
nth?: number; // Index for .nth() if multiple matches exist
|
|
245
|
+
exact?: boolean; // Whether to use exact matching (default: false)
|
|
228
246
|
inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
|
|
247
|
+
|
|
248
|
+
// === v2 fields ===
|
|
249
|
+
scope?: string; // Parent landmark to scope within
|
|
250
|
+
match?: 'exact' | 'partial'; // For getByText exact matching
|
|
251
|
+
variant?: 'native' | 'custom' | 'dragdrop'; // Dropdown/upload type
|
|
252
|
+
trigger?: string; // Button that triggers hidden file input
|
|
253
|
+
frame?: string; // iframe selector
|
|
254
|
+
contenteditable?: boolean; // Rich text editor
|
|
255
|
+
columns?: Record<string, { index: number; header: string; elements?: Record<string, any> }>;
|
|
256
|
+
pagination?: Record<string, string>;
|
|
257
|
+
attribute?: string; // Attribute to check
|
|
258
|
+
pattern?: string; // Regex for attribute value
|
|
229
259
|
}
|
|
230
260
|
|
|
231
261
|
/**
|
|
@@ -520,17 +550,32 @@ export class SelectorResolver {
|
|
|
520
550
|
// Check if name exists in entry (even if empty string), use it; otherwise use originalLabel
|
|
521
551
|
const name = entry.name !== undefined && entry.name !== null ? entry.name : originalLabel;
|
|
522
552
|
const nth = entry.nth || 0;
|
|
523
|
-
const exact = entry.exact === true;
|
|
553
|
+
const exact = entry.exact === true || entry.match === 'exact';
|
|
524
554
|
const inputMethod = entry.inputMethod;
|
|
525
555
|
|
|
526
|
-
//
|
|
527
|
-
const
|
|
528
|
-
|
|
556
|
+
// v2 fields
|
|
557
|
+
const v2Fields: Partial<ResolvedSelector> = {};
|
|
558
|
+
if (entry.scope) v2Fields.scope = entry.scope;
|
|
559
|
+
if (entry.match) v2Fields.match = entry.match;
|
|
560
|
+
if (entry.variant) v2Fields.variant = entry.variant;
|
|
561
|
+
if (entry.trigger) v2Fields.trigger = entry.trigger;
|
|
562
|
+
if (entry.frame) v2Fields.frame = entry.frame;
|
|
563
|
+
if (entry.contenteditable) v2Fields.contenteditable = true;
|
|
564
|
+
if (entry.columns) v2Fields.columns = entry.columns;
|
|
565
|
+
if (entry.pagination) v2Fields.pagination = entry.pagination;
|
|
566
|
+
if (entry.attribute) v2Fields.attribute = entry.attribute;
|
|
567
|
+
if (entry.pattern) v2Fields.pattern = entry.pattern;
|
|
568
|
+
|
|
569
|
+
// Helper to attach v2 fields and inputMethod
|
|
570
|
+
const withExtras = (resolved: ResolvedSelector): ResolvedSelector => {
|
|
571
|
+
if (inputMethod) resolved.inputMethod = inputMethod;
|
|
572
|
+
return { ...resolved, ...v2Fields };
|
|
573
|
+
};
|
|
529
574
|
|
|
530
575
|
// If type is 'locator', use locator field (or value as fallback) as the CSS locator directly
|
|
531
576
|
if (type === 'locator') {
|
|
532
577
|
const locatorValue = locator && locator.trim() ? locator : value;
|
|
533
|
-
return
|
|
578
|
+
return withExtras({
|
|
534
579
|
strategy: 'locator',
|
|
535
580
|
value: locatorValue,
|
|
536
581
|
locator: locatorValue,
|
|
@@ -540,7 +585,7 @@ export class SelectorResolver {
|
|
|
540
585
|
|
|
541
586
|
// If custom locator is provided and type is not 'locator', use it as CSS selector
|
|
542
587
|
if (locator && locator.trim()) {
|
|
543
|
-
return
|
|
588
|
+
return withExtras({
|
|
544
589
|
strategy: 'css',
|
|
545
590
|
value: locator,
|
|
546
591
|
locator: locator,
|
|
@@ -551,7 +596,7 @@ export class SelectorResolver {
|
|
|
551
596
|
// Use type-based strategy
|
|
552
597
|
switch (type) {
|
|
553
598
|
case 'placeholder':
|
|
554
|
-
return
|
|
599
|
+
return withExtras({
|
|
555
600
|
strategy: 'placeholder',
|
|
556
601
|
value,
|
|
557
602
|
nth,
|
|
@@ -559,7 +604,7 @@ export class SelectorResolver {
|
|
|
559
604
|
});
|
|
560
605
|
|
|
561
606
|
case 'role':
|
|
562
|
-
return
|
|
607
|
+
return withExtras({
|
|
563
608
|
strategy: 'role',
|
|
564
609
|
role: value,
|
|
565
610
|
name: name, // Use the name field for accessible name
|
|
@@ -569,14 +614,14 @@ export class SelectorResolver {
|
|
|
569
614
|
});
|
|
570
615
|
|
|
571
616
|
case 'testid':
|
|
572
|
-
return
|
|
617
|
+
return withExtras({
|
|
573
618
|
strategy: 'testid',
|
|
574
619
|
value,
|
|
575
620
|
nth,
|
|
576
621
|
});
|
|
577
622
|
|
|
578
623
|
case 'label':
|
|
579
|
-
return
|
|
624
|
+
return withExtras({
|
|
580
625
|
strategy: 'label',
|
|
581
626
|
value,
|
|
582
627
|
nth,
|
|
@@ -584,7 +629,7 @@ export class SelectorResolver {
|
|
|
584
629
|
});
|
|
585
630
|
|
|
586
631
|
case 'text':
|
|
587
|
-
return
|
|
632
|
+
return withExtras({
|
|
588
633
|
strategy: 'text',
|
|
589
634
|
value,
|
|
590
635
|
nth,
|
|
@@ -593,7 +638,7 @@ export class SelectorResolver {
|
|
|
593
638
|
|
|
594
639
|
default:
|
|
595
640
|
// Fallback to placeholder
|
|
596
|
-
return
|
|
641
|
+
return withExtras({
|
|
597
642
|
strategy: 'placeholder',
|
|
598
643
|
value,
|
|
599
644
|
nth,
|