@sun-asterisk/sungen 1.0.24 → 2.0.1
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 +10 -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 +5 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +38 -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 +12 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +72 -160
- 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/orchestrator/templates/ai-rules.md +189 -0
- package/dist/orchestrator/templates/gitignore +16 -0
- package/dist/orchestrator/templates/playwright.config.d.ts +10 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -0
- package/dist/orchestrator/templates/playwright.config.js +77 -0
- package/dist/orchestrator/templates/playwright.config.js.map +1 -0
- package/dist/orchestrator/templates/playwright.config.ts +80 -0
- package/dist/orchestrator/templates/readme.md +197 -0
- 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/docs/gherkin standards/gherkin-core-standard.md +377 -0
- package/docs/gherkin standards/gherkin-core-standard.vi.md +303 -0
- package/docs/gherkin-dictionary.md +1071 -0
- package/docs/makeauth.md +225 -0
- package/package.json +4 -3
- 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 +11 -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 +42 -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 +75 -160
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/orchestrator/templates/ai-rules.md +189 -0
- package/src/orchestrator/templates/gitignore +16 -0
- package/src/orchestrator/templates/playwright.config.ts +80 -0
- package/src/orchestrator/templates/readme.md +197 -0
- 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,391 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Intelligent Selector Mapper with Context-Aware Scoring
|
|
4
|
-
*
|
|
5
|
-
* Maps logical element names (from Gherkin) to actual UI elements using:
|
|
6
|
-
* 1. Semantic context understanding
|
|
7
|
-
* 2. Multi-criteria scoring algorithm
|
|
8
|
-
* 3. Ambiguity detection and resolution
|
|
9
|
-
* 4. Reasoning generation for transparency
|
|
10
|
-
*/
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.IntelligentSelectorMapper = void 0;
|
|
13
|
-
class IntelligentSelectorMapper {
|
|
14
|
-
/**
|
|
15
|
-
* Map a logical name to best matching element using context
|
|
16
|
-
*/
|
|
17
|
-
mapElement(logicalName, elements, gherkinContext) {
|
|
18
|
-
// 1. Find candidates
|
|
19
|
-
const candidates = this.findCandidates(logicalName, elements);
|
|
20
|
-
if (candidates.length === 0) {
|
|
21
|
-
console.warn(`⚠️ No candidates found for: ${logicalName}`);
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
// 2. Score each candidate
|
|
25
|
-
const scored = candidates.map(element => ({
|
|
26
|
-
element,
|
|
27
|
-
score: this.scoreElement(element, logicalName, gherkinContext),
|
|
28
|
-
reasoning: this.generateReasoning(element, logicalName, gherkinContext),
|
|
29
|
-
contextClues: this.extractContextClues(element, gherkinContext),
|
|
30
|
-
}));
|
|
31
|
-
// 3. Sort by score
|
|
32
|
-
scored.sort((a, b) => b.score - a.score);
|
|
33
|
-
// 4. Detect ambiguity
|
|
34
|
-
const best = scored[0];
|
|
35
|
-
const secondBest = scored[1];
|
|
36
|
-
const ambiguityWarning = this.detectAmbiguity(best, secondBest);
|
|
37
|
-
// 5. Build mapping
|
|
38
|
-
const primary = this.selectPrimaryStrategy(best.element);
|
|
39
|
-
const fallbacks = best.element.selectorStrategies
|
|
40
|
-
.filter(s => s !== primary)
|
|
41
|
-
.sort((a, b) => this.strategyPriority(b) - this.strategyPriority(a));
|
|
42
|
-
return {
|
|
43
|
-
logicalName,
|
|
44
|
-
element: best.element,
|
|
45
|
-
primary: {
|
|
46
|
-
type: primary.type,
|
|
47
|
-
selector: primary.selector,
|
|
48
|
-
playwright: primary.playwrightCode || primary.selector,
|
|
49
|
-
confidence: primary.confidence,
|
|
50
|
-
},
|
|
51
|
-
fallbacks: fallbacks.map(s => ({
|
|
52
|
-
type: s.type,
|
|
53
|
-
selector: s.selector,
|
|
54
|
-
playwright: s.playwrightCode || s.selector,
|
|
55
|
-
})),
|
|
56
|
-
score: best.score,
|
|
57
|
-
reasoning: best.reasoning,
|
|
58
|
-
contextClues: best.contextClues,
|
|
59
|
-
ambiguityWarning,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Find candidate elements that might match logical name
|
|
64
|
-
*/
|
|
65
|
-
findCandidates(logicalName, elements) {
|
|
66
|
-
const normalized = this.normalizeLogicalName(logicalName);
|
|
67
|
-
const keywords = normalized.split(/[-_\s]+/);
|
|
68
|
-
return elements.filter(element => {
|
|
69
|
-
// Match by text content
|
|
70
|
-
if (element.text && this.textMatches(element.text, keywords)) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
// Match by ARIA label
|
|
74
|
-
if (element.semanticContext.accessibility.ariaLabel) {
|
|
75
|
-
if (this.textMatches(element.semanticContext.accessibility.ariaLabel, keywords)) {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Match by form field name
|
|
80
|
-
if (element.semanticContext.formContext?.fieldName) {
|
|
81
|
-
if (this.textMatches(element.semanticContext.formContext.fieldName, keywords)) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Match by element name
|
|
86
|
-
if (element.name && this.textMatches(element.name, keywords)) {
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
// Match by placeholder
|
|
90
|
-
if (element.placeholder && this.textMatches(element.placeholder, keywords)) {
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
// Match by purpose + tag
|
|
94
|
-
const purposeMatch = keywords.some(k => element.semanticContext.purpose.toLowerCase().includes(k));
|
|
95
|
-
const tagMatch = keywords.some(k => element.tag.toLowerCase().includes(k));
|
|
96
|
-
if (purposeMatch || tagMatch) {
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
return false;
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Score an element based on how well it matches logical name
|
|
104
|
-
*/
|
|
105
|
-
scoreElement(element, logicalName, gherkinContext) {
|
|
106
|
-
let score = 0;
|
|
107
|
-
const normalized = this.normalizeLogicalName(logicalName);
|
|
108
|
-
const keywords = normalized.split(/[-_\s]+/);
|
|
109
|
-
// === TEXT CONTENT MATCHING (0-50 points) ===
|
|
110
|
-
if (element.text) {
|
|
111
|
-
const textNorm = element.text.toLowerCase();
|
|
112
|
-
if (textNorm === normalized) {
|
|
113
|
-
score += 50; // Exact match
|
|
114
|
-
}
|
|
115
|
-
else if (keywords.every(k => textNorm.includes(k))) {
|
|
116
|
-
score += 35; // Contains all keywords
|
|
117
|
-
}
|
|
118
|
-
else if (keywords.some(k => textNorm.includes(k))) {
|
|
119
|
-
score += 20; // Contains some keywords
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
// === ARIA LABEL MATCHING (0-45 points) ===
|
|
123
|
-
const ariaLabel = element.semanticContext.accessibility.ariaLabel;
|
|
124
|
-
if (ariaLabel) {
|
|
125
|
-
const ariaNorm = ariaLabel.toLowerCase();
|
|
126
|
-
if (ariaNorm === normalized) {
|
|
127
|
-
score += 45;
|
|
128
|
-
}
|
|
129
|
-
else if (keywords.every(k => ariaNorm.includes(k))) {
|
|
130
|
-
score += 30;
|
|
131
|
-
}
|
|
132
|
-
else if (keywords.some(k => ariaNorm.includes(k))) {
|
|
133
|
-
score += 15;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// === FORM FIELD NAME MATCHING (0-40 points) ===
|
|
137
|
-
if (element.semanticContext.formContext) {
|
|
138
|
-
const fieldName = element.semanticContext.formContext.fieldName.toLowerCase();
|
|
139
|
-
if (fieldName === normalized) {
|
|
140
|
-
score += 40;
|
|
141
|
-
}
|
|
142
|
-
else if (keywords.every(k => fieldName.includes(k))) {
|
|
143
|
-
score += 25;
|
|
144
|
-
}
|
|
145
|
-
else if (keywords.some(k => fieldName.includes(k))) {
|
|
146
|
-
score += 12;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
// === NAME ATTRIBUTE MATCHING (0-35 points) ===
|
|
150
|
-
if (element.name) {
|
|
151
|
-
const nameNorm = element.name.toLowerCase();
|
|
152
|
-
if (nameNorm === normalized) {
|
|
153
|
-
score += 35;
|
|
154
|
-
}
|
|
155
|
-
else if (keywords.every(k => nameNorm.includes(k))) {
|
|
156
|
-
score += 20;
|
|
157
|
-
}
|
|
158
|
-
else if (keywords.some(k => nameNorm.includes(k))) {
|
|
159
|
-
score += 10;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
// === PLACEHOLDER MATCHING (0-30 points) ===
|
|
163
|
-
if (element.placeholder) {
|
|
164
|
-
const placeholderNorm = element.placeholder.toLowerCase();
|
|
165
|
-
if (keywords.every(k => placeholderNorm.includes(k))) {
|
|
166
|
-
score += 30;
|
|
167
|
-
}
|
|
168
|
-
else if (keywords.some(k => placeholderNorm.includes(k))) {
|
|
169
|
-
score += 15;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// === PURPOSE MATCHING (0-20 points) ===
|
|
173
|
-
const purposeKeywords = {
|
|
174
|
-
button: 'action',
|
|
175
|
-
input: 'input',
|
|
176
|
-
link: 'navigation',
|
|
177
|
-
select: 'input',
|
|
178
|
-
checkbox: 'input',
|
|
179
|
-
};
|
|
180
|
-
keywords.forEach(keyword => {
|
|
181
|
-
if (purposeKeywords[keyword] === element.semanticContext.purpose) {
|
|
182
|
-
score += 20;
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
// === TAG MATCHING (0-15 points) ===
|
|
186
|
-
keywords.forEach(keyword => {
|
|
187
|
-
if (element.tag.toLowerCase() === keyword) {
|
|
188
|
-
score += 15;
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
// === GHERKIN CONTEXT MATCHING (0-25 points) ===
|
|
192
|
-
if (gherkinContext) {
|
|
193
|
-
const contextNorm = gherkinContext.toLowerCase();
|
|
194
|
-
// Preceding text mentioned
|
|
195
|
-
if (element.semanticContext.spatialContext.precedingText) {
|
|
196
|
-
const preceding = element.semanticContext.spatialContext.precedingText.toLowerCase();
|
|
197
|
-
if (contextNorm.includes(preceding)) {
|
|
198
|
-
score += 15;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
// Section mentioned
|
|
202
|
-
if (contextNorm.includes(element.semanticContext.section)) {
|
|
203
|
-
score += 10;
|
|
204
|
-
}
|
|
205
|
-
// Form context mentioned
|
|
206
|
-
if (element.semanticContext.formContext) {
|
|
207
|
-
const formPurpose = element.semanticContext.formContext.formPurpose;
|
|
208
|
-
if (contextNorm.includes(formPurpose)) {
|
|
209
|
-
score += 10;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// === SELECTOR QUALITY BONUS (0-20 points) ===
|
|
214
|
-
const hasHighConfARIA = element.selectorStrategies.some(s => s.type === 'aria' && s.confidence === 'high');
|
|
215
|
-
if (hasHighConfARIA) {
|
|
216
|
-
score += 20;
|
|
217
|
-
}
|
|
218
|
-
// === UNIQUENESS PENALTY (0 to -30 points) ===
|
|
219
|
-
// This would require passing all elements to check for duplicates
|
|
220
|
-
// For now, skip this in basic implementation
|
|
221
|
-
return Math.max(0, score);
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Generate human-readable reasoning for the mapping
|
|
225
|
-
*/
|
|
226
|
-
generateReasoning(element, logicalName, gherkinContext) {
|
|
227
|
-
const reasons = [];
|
|
228
|
-
// Text match
|
|
229
|
-
if (element.text) {
|
|
230
|
-
reasons.push(`Text: "${element.text}"`);
|
|
231
|
-
}
|
|
232
|
-
// ARIA label
|
|
233
|
-
if (element.semanticContext.accessibility.ariaLabel) {
|
|
234
|
-
reasons.push(`ARIA label: "${element.semanticContext.accessibility.ariaLabel}"`);
|
|
235
|
-
}
|
|
236
|
-
// Form context
|
|
237
|
-
if (element.semanticContext.formContext) {
|
|
238
|
-
reasons.push(`Form field: ${element.semanticContext.formContext.formName}/${element.semanticContext.formContext.fieldName}`);
|
|
239
|
-
}
|
|
240
|
-
// Element type
|
|
241
|
-
reasons.push(`Element: <${element.tag}>`);
|
|
242
|
-
// Purpose
|
|
243
|
-
reasons.push(`Purpose: ${element.semanticContext.purpose}`);
|
|
244
|
-
// Section
|
|
245
|
-
if (element.semanticContext.section !== 'main') {
|
|
246
|
-
reasons.push(`Section: ${element.semanticContext.section}`);
|
|
247
|
-
}
|
|
248
|
-
// Preceding text
|
|
249
|
-
if (element.semanticContext.spatialContext.precedingText) {
|
|
250
|
-
reasons.push(`After: "${element.semanticContext.spatialContext.precedingText}"`);
|
|
251
|
-
}
|
|
252
|
-
return reasons;
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Extract context clues that helped with matching
|
|
256
|
-
*/
|
|
257
|
-
extractContextClues(element, gherkinContext) {
|
|
258
|
-
const clues = [];
|
|
259
|
-
if (element.semanticContext.section !== 'main') {
|
|
260
|
-
clues.push(`section:${element.semanticContext.section}`);
|
|
261
|
-
}
|
|
262
|
-
if (element.semanticContext.formContext) {
|
|
263
|
-
clues.push(`form:${element.semanticContext.formContext.formName}`);
|
|
264
|
-
}
|
|
265
|
-
if (element.semanticContext.accessibility.ariaLabel) {
|
|
266
|
-
clues.push(`aria-label`);
|
|
267
|
-
}
|
|
268
|
-
if (element.semanticContext.spatialContext.precedingText) {
|
|
269
|
-
clues.push(`has-preceding-text`);
|
|
270
|
-
}
|
|
271
|
-
if (gherkinContext) {
|
|
272
|
-
clues.push(`gherkin-context-used`);
|
|
273
|
-
}
|
|
274
|
-
return clues;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Detect if there's ambiguity between top candidates
|
|
278
|
-
*/
|
|
279
|
-
detectAmbiguity(best, secondBest) {
|
|
280
|
-
if (!secondBest)
|
|
281
|
-
return undefined;
|
|
282
|
-
const scoreDiff = best.score - secondBest.score;
|
|
283
|
-
if (scoreDiff < 10) {
|
|
284
|
-
return `⚠️ Low confidence - score difference only ${scoreDiff} points. Consider adding more specific identifiers.`;
|
|
285
|
-
}
|
|
286
|
-
if (scoreDiff < 20) {
|
|
287
|
-
return `⚠️ Moderate confidence - multiple similar elements found.`;
|
|
288
|
-
}
|
|
289
|
-
return undefined;
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Select the best selector strategy for an element
|
|
293
|
-
*/
|
|
294
|
-
selectPrimaryStrategy(element) {
|
|
295
|
-
// Priority: high-conf ARIA > high-conf semantic > testid > medium-conf ARIA > CSS
|
|
296
|
-
const strategies = element.selectorStrategies;
|
|
297
|
-
// Try high-confidence ARIA first
|
|
298
|
-
const highAria = strategies.find(s => s.type === 'aria' && s.confidence === 'high');
|
|
299
|
-
if (highAria)
|
|
300
|
-
return highAria;
|
|
301
|
-
// Try high-confidence semantic
|
|
302
|
-
const highSemantic = strategies.find(s => s.type === 'semantic' && s.confidence === 'high');
|
|
303
|
-
if (highSemantic)
|
|
304
|
-
return highSemantic;
|
|
305
|
-
// Try testid
|
|
306
|
-
const testid = strategies.find(s => s.type === 'testid');
|
|
307
|
-
if (testid)
|
|
308
|
-
return testid;
|
|
309
|
-
// Try medium-confidence ARIA
|
|
310
|
-
const medAria = strategies.find(s => s.type === 'aria' && s.confidence === 'medium');
|
|
311
|
-
if (medAria)
|
|
312
|
-
return medAria;
|
|
313
|
-
// Try any semantic
|
|
314
|
-
const semantic = strategies.find(s => s.type === 'semantic');
|
|
315
|
-
if (semantic)
|
|
316
|
-
return semantic;
|
|
317
|
-
// Fallback to first available
|
|
318
|
-
return strategies[0];
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Get priority score for a strategy type
|
|
322
|
-
*/
|
|
323
|
-
strategyPriority(strategy) {
|
|
324
|
-
const priorities = {
|
|
325
|
-
aria: { high: 100, medium: 80, low: 60 },
|
|
326
|
-
semantic: { high: 90, medium: 70, low: 50 },
|
|
327
|
-
testid: { high: 85, medium: 85, low: 85 },
|
|
328
|
-
css: { high: 40, medium: 30, low: 20 },
|
|
329
|
-
};
|
|
330
|
-
const typePriority = priorities[strategy.type] || { high: 10, medium: 5, low: 1 };
|
|
331
|
-
return typePriority[strategy.confidence] || 1;
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Normalize logical name for comparison
|
|
335
|
-
*/
|
|
336
|
-
normalizeLogicalName(name) {
|
|
337
|
-
return name
|
|
338
|
-
.toLowerCase()
|
|
339
|
-
.replace(/[-_.]/g, ' ')
|
|
340
|
-
.replace(/\s+/g, ' ')
|
|
341
|
-
.trim();
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Check if text matches keywords
|
|
345
|
-
*/
|
|
346
|
-
textMatches(text, keywords) {
|
|
347
|
-
const textNorm = text.toLowerCase();
|
|
348
|
-
return keywords.some(keyword => textNorm.includes(keyword));
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Map multiple logical names at once
|
|
352
|
-
*/
|
|
353
|
-
mapElements(logicalNames, elements, gherkinContexts) {
|
|
354
|
-
const mappings = {};
|
|
355
|
-
logicalNames.forEach(name => {
|
|
356
|
-
const context = gherkinContexts?.[name];
|
|
357
|
-
mappings[name] = this.mapElement(name, elements, context);
|
|
358
|
-
});
|
|
359
|
-
return mappings;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Generate statistics about mappings
|
|
363
|
-
*/
|
|
364
|
-
generateStats(mappings) {
|
|
365
|
-
const total = Object.keys(mappings).length;
|
|
366
|
-
const successful = Object.values(mappings).filter(m => m !== null).length;
|
|
367
|
-
const failed = total - successful;
|
|
368
|
-
const selectorTypeBreakdown = {};
|
|
369
|
-
const confidenceBreakdown = {};
|
|
370
|
-
const ambiguityCount = Object.values(mappings).filter(m => m && m.ambiguityWarning).length;
|
|
371
|
-
Object.values(mappings).forEach(mapping => {
|
|
372
|
-
if (mapping) {
|
|
373
|
-
selectorTypeBreakdown[mapping.primary.type] =
|
|
374
|
-
(selectorTypeBreakdown[mapping.primary.type] || 0) + 1;
|
|
375
|
-
confidenceBreakdown[mapping.primary.confidence] =
|
|
376
|
-
(confidenceBreakdown[mapping.primary.confidence] || 0) + 1;
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
return {
|
|
380
|
-
total,
|
|
381
|
-
successful,
|
|
382
|
-
failed,
|
|
383
|
-
successRate: ((successful / total) * 100).toFixed(1) + '%',
|
|
384
|
-
selectorTypeBreakdown,
|
|
385
|
-
confidenceBreakdown,
|
|
386
|
-
ambiguityCount,
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
exports.IntelligentSelectorMapper = IntelligentSelectorMapper;
|
|
391
|
-
//# sourceMappingURL=intelligent-mapper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intelligent-mapper.js","sourceRoot":"","sources":["../../../src/generators/selector-mapper/intelligent-mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI-Based Step Mapper
|
|
3
|
-
* Fallback for dictionary when Gherkin patterns are ambiguous or unknown
|
|
4
|
-
*/
|
|
5
|
-
import { ParsedStep } from '../gherkin-parser';
|
|
6
|
-
import { MappedStep } from './step-mapper';
|
|
7
|
-
export declare class AIStepMapper {
|
|
8
|
-
private client;
|
|
9
|
-
private verbose;
|
|
10
|
-
constructor(verbose?: boolean);
|
|
11
|
-
/**
|
|
12
|
-
* Map a Gherkin step to Playwright code using AI
|
|
13
|
-
* Provides rich context to help AI understand the intent
|
|
14
|
-
*/
|
|
15
|
-
mapStep(step: ParsedStep): Promise<MappedStep>;
|
|
16
|
-
/**
|
|
17
|
-
* Build context-rich prompt for AI
|
|
18
|
-
* Includes examples, patterns, and clear instructions
|
|
19
|
-
*/
|
|
20
|
-
private buildPrompt;
|
|
21
|
-
/**
|
|
22
|
-
* Extract clean code from AI response
|
|
23
|
-
* Remove markdown code blocks, explanations, etc.
|
|
24
|
-
*/
|
|
25
|
-
private extractCode;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=ai-step-mapper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-step-mapper.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/ai-step-mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,OAAe;IAUpC;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA4CpD;;;OAGG;IACH,OAAO,CAAC,WAAW;IAoFnB;;;OAGG;IACH,OAAO,CAAC,WAAW;CA4DpB"}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* AI-Based Step Mapper
|
|
4
|
-
* Fallback for dictionary when Gherkin patterns are ambiguous or unknown
|
|
5
|
-
*/
|
|
6
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
-
};
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.AIStepMapper = void 0;
|
|
11
|
-
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
12
|
-
class AIStepMapper {
|
|
13
|
-
constructor(verbose = false) {
|
|
14
|
-
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
15
|
-
if (!apiKey) {
|
|
16
|
-
throw new Error('ANTHROPIC_API_KEY environment variable is required for AI step mapping');
|
|
17
|
-
}
|
|
18
|
-
this.client = new sdk_1.default({ apiKey });
|
|
19
|
-
this.verbose = verbose;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Map a Gherkin step to Playwright code using AI
|
|
23
|
-
* Provides rich context to help AI understand the intent
|
|
24
|
-
*/
|
|
25
|
-
async mapStep(step) {
|
|
26
|
-
if (this.verbose) {
|
|
27
|
-
console.log(` [AI] Mapping step: "${step.text}"`);
|
|
28
|
-
}
|
|
29
|
-
const prompt = this.buildPrompt(step);
|
|
30
|
-
try {
|
|
31
|
-
const message = await this.client.messages.create({
|
|
32
|
-
model: 'claude-3-5-haiku-20241022', // Fast & cheap for code generation
|
|
33
|
-
max_tokens: 500,
|
|
34
|
-
temperature: 0, // Deterministic for code generation
|
|
35
|
-
messages: [{
|
|
36
|
-
role: 'user',
|
|
37
|
-
content: prompt
|
|
38
|
-
}]
|
|
39
|
-
});
|
|
40
|
-
const content = message.content[0];
|
|
41
|
-
if (content.type !== 'text') {
|
|
42
|
-
throw new Error('Unexpected response type from AI');
|
|
43
|
-
}
|
|
44
|
-
const code = this.extractCode(content.text);
|
|
45
|
-
if (this.verbose) {
|
|
46
|
-
console.log(` [AI] Generated code (${code.split('\n').length} lines)`);
|
|
47
|
-
}
|
|
48
|
-
return {
|
|
49
|
-
code,
|
|
50
|
-
comment: `AI-generated from: ${step.text}`
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
console.error(`[AI] Failed to map step: ${error}`);
|
|
55
|
-
// Fallback to TODO comment
|
|
56
|
-
return {
|
|
57
|
-
code: `// TODO: AI mapping failed - implement manually: ${step.text}`,
|
|
58
|
-
comment: `AI mapping error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Build context-rich prompt for AI
|
|
64
|
-
* Includes examples, patterns, and clear instructions
|
|
65
|
-
*/
|
|
66
|
-
buildPrompt(step) {
|
|
67
|
-
const { keyword, text, selectorRef, dataRef, value } = step;
|
|
68
|
-
return `You are an expert Playwright test code generator.
|
|
69
|
-
|
|
70
|
-
**Task**: Convert this Gherkin step into Playwright TypeScript code.
|
|
71
|
-
|
|
72
|
-
**Gherkin Step**:
|
|
73
|
-
${keyword} ${text}
|
|
74
|
-
|
|
75
|
-
**Parsed Information**:
|
|
76
|
-
- Element ID: ${selectorRef || 'N/A'}
|
|
77
|
-
- Data Reference: ${dataRef || 'N/A'}
|
|
78
|
-
- Value: ${value || 'N/A'}
|
|
79
|
-
|
|
80
|
-
**Context**:
|
|
81
|
-
- We use a custom selector helper: \`pw.fill(elementId, value, screenId)\`
|
|
82
|
-
- Element IDs are in format: [screen.element-name]
|
|
83
|
-
- Screen ID is extracted from element ID (e.g., "chat" from "[chat.input]")
|
|
84
|
-
- For assertions, use: \`await pw.getElement(elementId, screenId)\` then \`expect(element)...\`
|
|
85
|
-
|
|
86
|
-
**Common Patterns & Examples**:
|
|
87
|
-
|
|
88
|
-
1. **Fill/Input Actions**:
|
|
89
|
-
- "user fills/inputs/enters [element] with value"
|
|
90
|
-
- "user types value in/into [element]"
|
|
91
|
-
→ \`await pw.fill('[element]', 'value', 'screen');\`
|
|
92
|
-
|
|
93
|
-
2. **Click Actions**:
|
|
94
|
-
- "user clicks/taps/presses [element]"
|
|
95
|
-
- "user clicks on [element]"
|
|
96
|
-
→ \`await pw.click('[element]', 'screen');\`
|
|
97
|
-
|
|
98
|
-
3. **Keyboard Actions**:
|
|
99
|
-
- "user presses Enter in [element]"
|
|
100
|
-
- "user hits Tab key in [element]"
|
|
101
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await el.press('Enter');\`
|
|
102
|
-
|
|
103
|
-
4. **Visibility Assertions**:
|
|
104
|
-
- "user should see [element]"
|
|
105
|
-
- "[element] is/should be visible"
|
|
106
|
-
- "[element] appears/shows"
|
|
107
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toBeVisible();\`
|
|
108
|
-
|
|
109
|
-
5. **State Assertions**:
|
|
110
|
-
- "[element] should be disabled/enabled"
|
|
111
|
-
- "[element] is checked/unchecked"
|
|
112
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toBeDisabled();\`
|
|
113
|
-
|
|
114
|
-
6. **Text Content Assertions**:
|
|
115
|
-
- "[element] should contain text \\"value\\""
|
|
116
|
-
- "[element] has/displays text \\"value\\""
|
|
117
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n await expect(el).toContainText('value');\`
|
|
118
|
-
|
|
119
|
-
7. **Collection State**:
|
|
120
|
-
- "[element] should be empty"
|
|
121
|
-
- "[element] has no items"
|
|
122
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n const items = await el.locator('> *').all();\n expect(items.length).toBe(0);\`
|
|
123
|
-
|
|
124
|
-
8. **Scroll State**:
|
|
125
|
-
- "[element] should be scrolled to bottom"
|
|
126
|
-
→ \`const el = await pw.getElement('[element]', 'screen');\n const scrollHeight = await el.evaluate(el => el.scrollHeight);\n const scrollTop = await el.evaluate(el => el.scrollTop);\n const clientHeight = await el.evaluate(el => el.clientHeight);\n expect(scrollTop + clientHeight).toBeGreaterThanOrEqual(scrollHeight - 10);\`
|
|
127
|
-
|
|
128
|
-
**Important Rules**:
|
|
129
|
-
1. Extract screen ID from element ID: "[chat.input]" → screen="chat"
|
|
130
|
-
2. Use proper TypeScript syntax with await
|
|
131
|
-
3. Use descriptive variable names (element, el, container, etc.)
|
|
132
|
-
4. Add helpful comments for complex assertions
|
|
133
|
-
5. NEVER use page.evaluate() unless absolutely necessary
|
|
134
|
-
6. NEVER generate partial or incomplete statements
|
|
135
|
-
7. Each step should generate COMPLETE, SELF-CONTAINED code
|
|
136
|
-
8. If you can't map the step, return a comment: // TODO: Implement step
|
|
137
|
-
|
|
138
|
-
**Output Format**:
|
|
139
|
-
Return ONLY complete Playwright TypeScript statements, no explanations, no markdown blocks.
|
|
140
|
-
Each statement must be syntactically complete and can be inserted directly into a test function.
|
|
141
|
-
|
|
142
|
-
**Example Output**:
|
|
143
|
-
const chat_input_123 = await pw.getElement('[chat.input]', 'chat');
|
|
144
|
-
await expect(chat_input_123).toBeVisible();
|
|
145
|
-
|
|
146
|
-
Now generate code for the given step.`;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Extract clean code from AI response
|
|
150
|
-
* Remove markdown code blocks, explanations, etc.
|
|
151
|
-
*/
|
|
152
|
-
extractCode(response) {
|
|
153
|
-
let code = response.trim();
|
|
154
|
-
// Remove markdown code blocks
|
|
155
|
-
code = code.replace(/```(?:typescript|ts|javascript|js)?\n?/g, '');
|
|
156
|
-
code = code.replace(/```\n?/g, '');
|
|
157
|
-
// Remove leading/trailing whitespace
|
|
158
|
-
code = code.trim();
|
|
159
|
-
// If response contains explanations, try to extract only code
|
|
160
|
-
const lines = code.split('\n');
|
|
161
|
-
const codeLines = lines.filter(line => {
|
|
162
|
-
const trimmed = line.trim();
|
|
163
|
-
// Skip lines that are clearly explanations (start with text, not code)
|
|
164
|
-
// But keep all valid TypeScript/JavaScript syntax
|
|
165
|
-
if (trimmed === '')
|
|
166
|
-
return true; // Keep empty lines
|
|
167
|
-
if (trimmed.startsWith('//'))
|
|
168
|
-
return true; // Keep comments
|
|
169
|
-
// Exclude lines that look like natural language explanations
|
|
170
|
-
// (start with capital letter and contain spaces, no semicolons/operators)
|
|
171
|
-
if (/^[A-Z][a-z]+ [\w\s]+$/.test(trimmed) && !trimmed.includes(';')) {
|
|
172
|
-
return false; // This looks like an explanation
|
|
173
|
-
}
|
|
174
|
-
// Keep lines that contain code-like patterns
|
|
175
|
-
const codePatterns = [
|
|
176
|
-
'await ', 'const ', 'let ', 'var ', 'return ', 'expect(', 'if ', 'else',
|
|
177
|
-
'for ', 'while ', 'function ', '=>', 'pw.', 'page.',
|
|
178
|
-
')', '}', '];', '});', '})', 'import ', 'export ',
|
|
179
|
-
'.', '(', '[', '=', '+', '-', '*', '/', '%', '&&', '||'
|
|
180
|
-
];
|
|
181
|
-
return codePatterns.some(pattern => trimmed.includes(pattern));
|
|
182
|
-
});
|
|
183
|
-
// If we filtered too much, return original
|
|
184
|
-
if (codeLines.length === 0) {
|
|
185
|
-
return code;
|
|
186
|
-
}
|
|
187
|
-
let finalCode = codeLines.join('\n');
|
|
188
|
-
// Safety check: Remove incomplete page.evaluate statements
|
|
189
|
-
// If we find "page.evaluate(" without proper closing, remove it
|
|
190
|
-
const evaluatePattern = /await\s+page\.evaluate\(\(\)\s*=>\s*\{\s*$/gm;
|
|
191
|
-
if (evaluatePattern.test(finalCode)) {
|
|
192
|
-
// Has unclosed page.evaluate at end - this is incomplete, return TODO
|
|
193
|
-
return '// TODO: Implement step (AI generated incomplete code)';
|
|
194
|
-
}
|
|
195
|
-
// Safety check: If code ends with an opening brace/paren, it's incomplete
|
|
196
|
-
const endsIncomplete = /[\({]\s*$/.test(finalCode);
|
|
197
|
-
if (endsIncomplete) {
|
|
198
|
-
return '// TODO: Implement step (AI generated incomplete code)';
|
|
199
|
-
}
|
|
200
|
-
return finalCode;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
exports.AIStepMapper = AIStepMapper;
|
|
204
|
-
//# sourceMappingURL=ai-step-mapper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-step-mapper.js","sourceRoot":"","sources":["../../../src/generators/test-generator/ai-step-mapper.ts"],"names":[],"mappings":"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"}
|