@sun-asterisk/sungen 1.0.23 ā 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -74
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +5 -3
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -35
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +5 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/dist/generators/test-generator/code-generator.d.ts +0 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +0 -47
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +33 -8
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +4 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +17 -5
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +1 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +36 -34
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +4 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/types.d.ts +7 -24
- package/dist/generators/test-generator/types.d.ts.map +1 -1
- package/dist/generators/test-generator/types.js +2 -101
- package/dist/generators/test-generator/types.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +8 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +343 -32
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -32
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +55 -216
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +3 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/commands/add.ts +5 -3
- package/src/cli/commands/generate.ts +90 -38
- package/src/cli/index.ts +5 -16
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/label-value-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/src/generators/test-generator/code-generator.ts +0 -59
- package/src/generators/test-generator/patterns/assertion-patterns.ts +39 -8
- package/src/generators/test-generator/patterns/index.ts +12 -3
- package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
- package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
- package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
- package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
- package/src/generators/test-generator/step-mapper.ts +39 -34
- package/src/generators/test-generator/template-engine.ts +3 -1
- package/src/generators/test-generator/types.ts +7 -112
- package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
- package/src/orchestrator/project-initializer.ts +345 -32
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/utils/selector-types.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts +0 -3
- package/dist/cli/commands/cache-clear.d.ts.map +0 -1
- package/dist/cli/commands/cache-clear.js +0 -24
- package/dist/cli/commands/cache-clear.js.map +0 -1
- package/dist/cli/commands/full.d.ts +0 -3
- package/dist/cli/commands/full.d.ts.map +0 -1
- package/dist/cli/commands/full.js +0 -37
- package/dist/cli/commands/full.js.map +0 -1
- package/dist/cli/commands/live-scan.d.ts +0 -3
- package/dist/cli/commands/live-scan.d.ts.map +0 -1
- package/dist/cli/commands/live-scan.js +0 -78
- package/dist/cli/commands/live-scan.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -3
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -93
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -3
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -43
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -6
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -101
- package/dist/cli/utils.js.map +0 -1
- package/dist/config/config-loader.d.ts +0 -51
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-loader.js +0 -216
- package/dist/config/config-loader.js.map +0 -1
- package/dist/config/config-schema.d.ts +0 -121
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/config/config-schema.js +0 -7
- package/dist/config/config-schema.js.map +0 -1
- package/dist/core/live-scanner/config-reader.d.ts +0 -10
- package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/config-reader.js +0 -87
- package/dist/core/live-scanner/config-reader.js.map +0 -1
- package/dist/core/live-scanner/element-finder.d.ts +0 -20
- package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
- package/dist/core/live-scanner/element-finder.js +0 -486
- package/dist/core/live-scanner/element-finder.js.map +0 -1
- package/dist/core/live-scanner/index.d.ts +0 -8
- package/dist/core/live-scanner/index.d.ts.map +0 -1
- package/dist/core/live-scanner/index.js +0 -33
- package/dist/core/live-scanner/index.js.map +0 -1
- package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
- package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-reader.js +0 -60
- package/dist/core/live-scanner/matrix-reader.js.map +0 -1
- package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
- package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-writer.js +0 -103
- package/dist/core/live-scanner/matrix-writer.js.map +0 -1
- package/dist/core/live-scanner/role-fallback.d.ts +0 -15
- package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
- package/dist/core/live-scanner/role-fallback.js +0 -45
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -13
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -243
- package/dist/core/live-scanner/scanner.js.map +0 -1
- package/dist/core/live-scanner/step-replayer.d.ts +0 -26
- package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
- package/dist/core/live-scanner/step-replayer.js +0 -286
- package/dist/core/live-scanner/step-replayer.js.map +0 -1
- package/dist/core/live-scanner/types.d.ts +0 -52
- package/dist/core/live-scanner/types.d.ts.map +0 -1
- package/dist/core/live-scanner/types.js +0 -14
- package/dist/core/live-scanner/types.js.map +0 -1
- package/dist/core/selector-base/annotation-handler.d.ts +0 -45
- package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
- package/dist/core/selector-base/annotation-handler.js +0 -102
- package/dist/core/selector-base/annotation-handler.js.map +0 -1
- package/dist/core/selector-base/base-generator.d.ts +0 -49
- package/dist/core/selector-base/base-generator.d.ts.map +0 -1
- package/dist/core/selector-base/base-generator.js +0 -214
- package/dist/core/selector-base/base-generator.js.map +0 -1
- package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
- package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
- package/dist/core/selector-base/gherkin-parser.js +0 -42
- package/dist/core/selector-base/gherkin-parser.js.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.js +0 -477
- package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
- package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
- package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/react-scanner.js +0 -163
- package/dist/core/ui-scanner/react-scanner.js.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.js +0 -33
- package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.js +0 -511
- package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
- package/dist/core/validator/data-validator.d.ts +0 -38
- package/dist/core/validator/data-validator.d.ts.map +0 -1
- package/dist/core/validator/data-validator.js +0 -212
- package/dist/core/validator/data-validator.js.map +0 -1
- package/dist/core/validator/feature-validator.d.ts +0 -27
- package/dist/core/validator/feature-validator.d.ts.map +0 -1
- package/dist/core/validator/feature-validator.js +0 -182
- package/dist/core/validator/feature-validator.js.map +0 -1
- package/dist/core/validator/index.d.ts +0 -46
- package/dist/core/validator/index.d.ts.map +0 -1
- package/dist/core/validator/index.js +0 -17
- package/dist/core/validator/index.js.map +0 -1
- package/dist/core/validator/screen-validator.d.ts +0 -35
- package/dist/core/validator/screen-validator.d.ts.map +0 -1
- package/dist/core/validator/screen-validator.js +0 -195
- package/dist/core/validator/screen-validator.js.map +0 -1
- package/dist/core/validator/selector-validator.d.ts +0 -36
- package/dist/core/validator/selector-validator.d.ts.map +0 -1
- package/dist/core/validator/selector-validator.js +0 -210
- package/dist/core/validator/selector-validator.js.map +0 -1
- package/dist/external/ai-provider.d.ts +0 -60
- package/dist/external/ai-provider.d.ts.map +0 -1
- package/dist/external/ai-provider.js +0 -30
- package/dist/external/ai-provider.js.map +0 -1
- package/dist/external/anthropic-provider.d.ts +0 -29
- package/dist/external/anthropic-provider.d.ts.map +0 -1
- package/dist/external/anthropic-provider.js +0 -85
- package/dist/external/anthropic-provider.js.map +0 -1
- package/dist/generators/cache/cache-manager.d.ts +0 -66
- package/dist/generators/cache/cache-manager.d.ts.map +0 -1
- package/dist/generators/cache/cache-manager.js +0 -286
- package/dist/generators/cache/cache-manager.js.map +0 -1
- package/dist/generators/dsl-writer/index.d.ts +0 -33
- package/dist/generators/dsl-writer/index.d.ts.map +0 -1
- package/dist/generators/dsl-writer/index.js +0 -226
- package/dist/generators/dsl-writer/index.js.map +0 -1
- package/dist/generators/scaffold-generator/index.d.ts +0 -162
- package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
- package/dist/generators/scaffold-generator/index.js +0 -868
- package/dist/generators/scaffold-generator/index.js.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.js +0 -457
- package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/index.d.ts +0 -8
- package/dist/generators/selector-mapper/index.d.ts.map +0 -1
- package/dist/generators/selector-mapper/index.js +0 -12
- package/dist/generators/selector-mapper/index.js.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.js +0 -204
- package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.js +0 -82
- package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
- package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.js +0 -797
- package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
- package/dist/orchestrator/cache-manager.d.ts +0 -15
- package/dist/orchestrator/cache-manager.d.ts.map +0 -1
- package/dist/orchestrator/cache-manager.js +0 -62
- package/dist/orchestrator/cache-manager.js.map +0 -1
- package/dist/orchestrator/pipeline.d.ts +0 -56
- package/dist/orchestrator/pipeline.d.ts.map +0 -1
- package/dist/orchestrator/pipeline.js +0 -298
- package/dist/orchestrator/pipeline.js.map +0 -1
- package/dist/orchestrator/reporter.d.ts +0 -15
- package/dist/orchestrator/reporter.d.ts.map +0 -1
- package/dist/orchestrator/reporter.js +0 -30
- package/dist/orchestrator/reporter.js.map +0 -1
- package/src/cli/commands/cache-clear.ts +0 -22
- package/src/cli/commands/full.ts +0 -35
- package/src/cli/commands/live-scan.ts +0 -82
- package/src/cli/commands/map.ts +0 -97
- package/src/cli/commands/validate.ts +0 -43
- package/src/cli/utils.ts +0 -106
- package/src/config/ai-providers.yaml +0 -56
- package/src/config/config-loader.ts +0 -248
- package/src/config/config-schema.ts +0 -148
- package/src/config/default.config.yaml +0 -107
- package/src/config/framework.config.yaml +0 -52
- package/src/config/routes.yaml +0 -31
- package/src/core/live-scanner/config-reader.ts +0 -57
- package/src/core/live-scanner/element-finder.ts +0 -541
- package/src/core/live-scanner/index.ts +0 -7
- package/src/core/live-scanner/matrix-reader.ts +0 -65
- package/src/core/live-scanner/matrix-writer.ts +0 -77
- package/src/core/live-scanner/role-fallback.ts +0 -43
- package/src/core/live-scanner/scanner.ts +0 -254
- package/src/core/live-scanner/step-replayer.ts +0 -306
- package/src/core/live-scanner/types.ts +0 -58
- package/src/core/selector-base/annotation-handler.ts +0 -127
- package/src/core/selector-base/base-generator.ts +0 -234
- package/src/core/selector-base/gherkin-parser.ts +0 -57
- package/src/core/selector-mapper/priority-mapper.ts +0 -607
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
- package/src/core/ui-scanner/react-scanner.ts +0 -156
- package/src/core/ui-scanner/scanner-interface.ts +0 -133
- package/src/core/ui-scanner/strict-scanner.ts +0 -629
- package/src/core/validator/data-validator.ts +0 -202
- package/src/core/validator/feature-validator.ts +0 -176
- package/src/core/validator/index.ts +0 -57
- package/src/core/validator/screen-validator.ts +0 -209
- package/src/core/validator/selector-validator.ts +0 -209
- package/src/external/ai-provider.ts +0 -90
- package/src/external/anthropic-provider.ts +0 -114
- package/src/generators/README.md +0 -410
- package/src/generators/cache/cache-manager.ts +0 -322
- package/src/generators/dsl-writer/index.ts +0 -253
- package/src/generators/scaffold-generator/index.ts +0 -1019
- package/src/generators/selector-mapper/ai-mapper.ts +0 -528
- package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
- package/src/generators/selector-mapper/index.ts +0 -10
- package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
- package/src/generators/test-generator/ai-step-mapper.ts +0 -224
- package/src/generators/test-generator/auth-setup-generator.ts +0 -59
- package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
- package/src/generators/ui-model-builder/react-scanner.ts +0 -959
- package/src/orchestrator/cache-manager.ts +0 -32
- package/src/orchestrator/pipeline.ts +0 -354
- package/src/orchestrator/reporter.ts +0 -36
|
@@ -49,112 +49,105 @@ class ScreenManager {
|
|
|
49
49
|
* Add a new screen definition
|
|
50
50
|
*/
|
|
51
51
|
async addScreen(options) {
|
|
52
|
-
console.log(`š± Adding screen: ${options.name}...\n`);
|
|
53
52
|
// Validate screen name
|
|
54
53
|
this.validateScreenName(options.name);
|
|
55
54
|
// Normalize screen name for directory
|
|
56
55
|
const screenName = this.normalizeScreenName(options.name);
|
|
57
56
|
const screenDir = path.join(this.screensDir, screenName);
|
|
58
|
-
// Derive filename
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
// Derive filename: --feature flag creates "<screen>-<feature>" name
|
|
58
|
+
let filename;
|
|
59
|
+
if (options.feature) {
|
|
60
|
+
filename = `${screenName}-${this.normalizeScreenName(options.feature)}`;
|
|
61
|
+
}
|
|
62
|
+
else if (options.path) {
|
|
63
|
+
filename = this.extractFilenameFromPath(options.path);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
filename = screenName;
|
|
67
|
+
}
|
|
62
68
|
// Create directory structure
|
|
63
69
|
const featuresDir = path.join(screenDir, 'features');
|
|
64
70
|
const selectorsDir = path.join(screenDir, 'selectors');
|
|
65
71
|
const testDataDir = path.join(screenDir, 'test-data');
|
|
66
72
|
// File paths
|
|
67
73
|
const featurePath = path.join(featuresDir, `${filename}.feature`);
|
|
68
|
-
const
|
|
69
|
-
const
|
|
74
|
+
const selectorPath = path.join(selectorsDir, `${filename}.yaml`);
|
|
75
|
+
const testDataPath = path.join(testDataDir, `${filename}.yaml`);
|
|
70
76
|
// Smart behavior: Create dirs only if first file
|
|
71
77
|
const isFirstFile = !fs.existsSync(screenDir);
|
|
72
78
|
if (isFirstFile) {
|
|
73
|
-
console.log(
|
|
74
|
-
// Create directories
|
|
79
|
+
console.log(`Creating screen: ${options.name}\n`);
|
|
75
80
|
try {
|
|
76
81
|
if (!fs.existsSync(this.screensDir)) {
|
|
77
82
|
fs.mkdirSync(this.screensDir, { recursive: true });
|
|
78
|
-
console.log(`ā Created directory: qa/screens/\n`);
|
|
79
83
|
}
|
|
80
84
|
fs.mkdirSync(featuresDir, { recursive: true });
|
|
81
85
|
fs.mkdirSync(selectorsDir, { recursive: true });
|
|
82
86
|
fs.mkdirSync(testDataDir, { recursive: true });
|
|
83
87
|
}
|
|
84
88
|
catch (error) {
|
|
85
|
-
console.error(
|
|
86
|
-
console.error(`
|
|
87
|
-
console.error(' Check file permissions and try again.\n');
|
|
89
|
+
console.error(`Error: Failed to create directories`);
|
|
90
|
+
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
88
91
|
process.exit(1);
|
|
89
92
|
}
|
|
90
93
|
}
|
|
91
94
|
else {
|
|
92
|
-
console.log(
|
|
95
|
+
console.log(`Adding feature to screen: ${options.name}\n`);
|
|
93
96
|
}
|
|
94
97
|
// Check file existence to prevent overwrite
|
|
95
98
|
if (fs.existsSync(featurePath)) {
|
|
96
|
-
console.error(
|
|
97
|
-
console.error(`
|
|
98
|
-
console.error(`
|
|
99
|
+
console.error(`Error: Feature file "${filename}.feature" already exists`);
|
|
100
|
+
console.error(` Path: ${featurePath}`);
|
|
101
|
+
console.error(` Use a different --path or --feature value.`);
|
|
99
102
|
process.exit(1);
|
|
100
103
|
}
|
|
101
104
|
// Generate and write feature file
|
|
102
105
|
const featureContent = this.generateFeatureTemplate(options, filename);
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
106
|
+
fs.writeFileSync(featurePath, featureContent, 'utf-8');
|
|
107
|
+
// Generate empty selector YAML (with page entry)
|
|
108
|
+
if (!fs.existsSync(selectorPath)) {
|
|
109
|
+
const pagePath = options.path || `/${screenName}`;
|
|
110
|
+
fs.writeFileSync(selectorPath, [
|
|
111
|
+
`# ${options.name} Screen Selectors`,
|
|
112
|
+
`# Fill via AI or manually`,
|
|
113
|
+
``,
|
|
114
|
+
`${screenName}:`,
|
|
115
|
+
` type: 'page'`,
|
|
116
|
+
` value: '${pagePath}'`,
|
|
117
|
+
` nth: 0`,
|
|
118
|
+
``,
|
|
119
|
+
].join('\n'), 'utf-8');
|
|
115
120
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
fs.writeFileSync(testDataOverridePath, testDataOverrideContent, 'utf-8');
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
console.error(`ā Error: Failed to create test data override file at ${testDataOverridePath}`);
|
|
128
|
-
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
129
|
-
process.exit(1);
|
|
130
|
-
}
|
|
131
|
-
// Display success message
|
|
132
|
-
if (isFirstFile) {
|
|
133
|
-
console.log(`ā Created screen: ${options.name} at ${screenDir}`);
|
|
121
|
+
// Generate empty test-data YAML
|
|
122
|
+
if (!fs.existsSync(testDataPath)) {
|
|
123
|
+
fs.writeFileSync(testDataPath, [
|
|
124
|
+
`# ${options.name} Screen Test Data`,
|
|
125
|
+
`# Fill via AI or manually`,
|
|
126
|
+
`# Reference in features using {{variable}} syntax`,
|
|
127
|
+
``,
|
|
128
|
+
].join('\n'), 'utf-8');
|
|
134
129
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
|
|
130
|
+
// Display success
|
|
131
|
+
console.log(`Created files:`);
|
|
132
|
+
console.log(` ${path.relative(this.cwd, featurePath)}`);
|
|
133
|
+
console.log(` ${path.relative(this.cwd, selectorPath)}`);
|
|
134
|
+
console.log(` ${path.relative(this.cwd, testDataPath)}\n`);
|
|
135
|
+
console.log('Next steps:');
|
|
136
|
+
console.log(` 1. Use AI (Copilot/Claude) to generate Gherkin + selectors from the live page`);
|
|
137
|
+
console.log(` 2. Fill in test-data values`);
|
|
138
|
+
console.log(` 3. Compile: sungen generate --screen ${screenName}`);
|
|
139
|
+
console.log(` 4. Run: npx playwright test\n`);
|
|
139
140
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Validate screen name
|
|
142
|
-
*/
|
|
143
141
|
validateScreenName(name) {
|
|
144
142
|
if (!name || name.trim().length === 0) {
|
|
145
|
-
console.error('
|
|
143
|
+
console.error('Error: Screen name cannot be empty');
|
|
146
144
|
process.exit(1);
|
|
147
145
|
}
|
|
148
|
-
// Check if name contains at least one alphanumeric character
|
|
149
146
|
if (!/[a-zA-Z0-9]/.test(name)) {
|
|
150
|
-
console.error('
|
|
151
|
-
console.error(' Valid examples: login, user-profile, Dashboard');
|
|
147
|
+
console.error('Error: Screen name must contain at least one alphanumeric character');
|
|
152
148
|
process.exit(1);
|
|
153
149
|
}
|
|
154
150
|
}
|
|
155
|
-
/**
|
|
156
|
-
* Normalize screen name to kebab-case for filename
|
|
157
|
-
*/
|
|
158
151
|
normalizeScreenName(name) {
|
|
159
152
|
return name
|
|
160
153
|
.toLowerCase()
|
|
@@ -162,21 +155,12 @@ class ScreenManager {
|
|
|
162
155
|
.replace(/^-+|-+$/g, '')
|
|
163
156
|
.replace(/-+/g, '-');
|
|
164
157
|
}
|
|
165
|
-
/**
|
|
166
|
-
* Extract filename from path value
|
|
167
|
-
*/
|
|
168
158
|
extractFilenameFromPath(pathString) {
|
|
169
|
-
// Remove leading and trailing slashes
|
|
170
159
|
const cleanPath = pathString.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
171
|
-
// Split by '/' and take last segment
|
|
172
160
|
const segments = cleanPath.split('/');
|
|
173
161
|
const lastSegment = segments[segments.length - 1];
|
|
174
|
-
// Normalize to kebab-case
|
|
175
162
|
return this.normalizeScreenName(lastSegment);
|
|
176
163
|
}
|
|
177
|
-
/**
|
|
178
|
-
* Generate feature file template
|
|
179
|
-
*/
|
|
180
164
|
generateFeatureTemplate(options, filename) {
|
|
181
165
|
const screenName = this.normalizeScreenName(options.name);
|
|
182
166
|
const featurePath = options.path || `/${screenName}`;
|
|
@@ -190,156 +174,11 @@ class ScreenManager {
|
|
|
190
174
|
|
|
191
175
|
@high
|
|
192
176
|
Scenario: Sample scenario for ${options.name}
|
|
193
|
-
Given User is on [${
|
|
177
|
+
Given User is on [${screenName}] page
|
|
194
178
|
When User click [element] button
|
|
195
179
|
Then User see [result] text with {{success}}
|
|
196
180
|
`;
|
|
197
181
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Generate selector YAML template
|
|
200
|
-
*/
|
|
201
|
-
generateSelectorTemplate(options, filename) {
|
|
202
|
-
const timestamp = new Date().toISOString().split('T')[0];
|
|
203
|
-
const screenPath = options.path || '';
|
|
204
|
-
return `# ${options.name} Screen Selectors
|
|
205
|
-
# Created: ${timestamp}
|
|
206
|
-
${screenPath ? `# Path: ${screenPath}` : '# Path: (not specified - update as needed)'}
|
|
207
|
-
|
|
208
|
-
# Example element - replace with actual elements or use 'sungen map'
|
|
209
|
-
#
|
|
210
|
-
# Element structure:
|
|
211
|
-
# key: element-identifier
|
|
212
|
-
# locator: "" # Playwright locator
|
|
213
|
-
# type: text|role|placeholder|testid|xpath
|
|
214
|
-
# value: "text content" # Element value/text/label
|
|
215
|
-
# name: "Display Name" # Optional: readable name
|
|
216
|
-
# nth: 0 # Optional: element index if multiple matches
|
|
217
|
-
|
|
218
|
-
# element:
|
|
219
|
-
# locator: ""
|
|
220
|
-
# type: role
|
|
221
|
-
# value: "button"
|
|
222
|
-
# name: "element"
|
|
223
|
-
# nth: 0
|
|
224
|
-
|
|
225
|
-
# Next steps:
|
|
226
|
-
# 1. Edit the feature file: qa/screens/${filename}/features/${filename}.feature
|
|
227
|
-
# 2. Run: sungen map --screen ${filename}
|
|
228
|
-
# This will populate selectors from your feature file
|
|
229
|
-
#
|
|
230
|
-
# Documentation: https://github.com/sun-asterisk/sungen
|
|
231
|
-
`;
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Generate test data YAML template
|
|
235
|
-
*/
|
|
236
|
-
generateTestDataTemplate(options) {
|
|
237
|
-
const timestamp = new Date().toISOString().split('T')[0];
|
|
238
|
-
return `# ${options.name} Screen Test Data
|
|
239
|
-
# Created: ${timestamp}
|
|
240
|
-
|
|
241
|
-
# Define test data variables here
|
|
242
|
-
# Example:
|
|
243
|
-
# success: "Operation completed successfully"
|
|
244
|
-
# username: "testuser@example.com"
|
|
245
|
-
# password: "SecurePassword123"
|
|
246
|
-
|
|
247
|
-
# Next steps:
|
|
248
|
-
# 1. Add test data variables referenced in your feature scenarios
|
|
249
|
-
# 2. Use {{variable}} syntax in your feature files to reference these values
|
|
250
|
-
`;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Generate selector override YAML template (empty with guidelines)
|
|
254
|
-
*/
|
|
255
|
-
generateSelectorOverrideTemplate(filename) {
|
|
256
|
-
return `# ${filename}.override.yaml - User Override File
|
|
257
|
-
# This file will NEVER be modified by 'sungen map' command
|
|
258
|
-
# Use this to override auto-generated selectors or add custom ones
|
|
259
|
-
#
|
|
260
|
-
# Format:
|
|
261
|
-
# element.key:
|
|
262
|
-
# locator: "css-locator-here" # Optional: custom CSS locator
|
|
263
|
-
# type: role|testid|placeholder|label|text
|
|
264
|
-
# value: "value-for-type"
|
|
265
|
-
# name: "Display Name" # Optional
|
|
266
|
-
# nth: 0 # Optional: element index
|
|
267
|
-
#
|
|
268
|
-
# Examples:
|
|
269
|
-
# email.field:
|
|
270
|
-
# type: testid
|
|
271
|
-
# value: "login-email"
|
|
272
|
-
#
|
|
273
|
-
# submit.button:
|
|
274
|
-
# type: role
|
|
275
|
-
# value: "button"
|
|
276
|
-
# name: "Sign In"
|
|
277
|
-
#
|
|
278
|
-
# custom.element:
|
|
279
|
-
# locator: "#my-custom-id"
|
|
280
|
-
# type: placeholder
|
|
281
|
-
# value: "Enter text"
|
|
282
|
-
#
|
|
283
|
-
# Leave empty if no overrides needed
|
|
284
|
-
# Base selectors will be auto-generated by: sungen map --screen ${filename}
|
|
285
|
-
`;
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Generate test-data override YAML template (empty with guidelines)
|
|
289
|
-
*/
|
|
290
|
-
generateTestDataOverrideTemplate(filename) {
|
|
291
|
-
return `# ${filename}.override.yaml - User Override File
|
|
292
|
-
# This file will NEVER be modified by 'sungen map' command
|
|
293
|
-
# Use this to override auto-generated test data or add custom data
|
|
294
|
-
#
|
|
295
|
-
# Format:
|
|
296
|
-
# variable_name: "value"
|
|
297
|
-
#
|
|
298
|
-
# nested:
|
|
299
|
-
# variable: "value"
|
|
300
|
-
#
|
|
301
|
-
# array_example:
|
|
302
|
-
# - "item1"
|
|
303
|
-
# - "item2"
|
|
304
|
-
#
|
|
305
|
-
# Examples:
|
|
306
|
-
# # Simple string override
|
|
307
|
-
# valid_email: "custom@example.com"
|
|
308
|
-
#
|
|
309
|
-
# # Nested object override
|
|
310
|
-
# api:
|
|
311
|
-
# url: "https://staging.example.com"
|
|
312
|
-
# timeout: 5000
|
|
313
|
-
#
|
|
314
|
-
# # Array override
|
|
315
|
-
# test_users:
|
|
316
|
-
# - "user1@example.com"
|
|
317
|
-
# - "user2@example.com"
|
|
318
|
-
#
|
|
319
|
-
# Leave empty if no overrides needed
|
|
320
|
-
# Base test data will be auto-generated by: sungen map --screen ${filename}
|
|
321
|
-
`;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Display success message with next steps
|
|
325
|
-
*/
|
|
326
|
-
displaySuccess(name, filename, screenDir) {
|
|
327
|
-
console.log('ā
Screen definition created successfully!\n');
|
|
328
|
-
console.log(`Screen: ${name}`);
|
|
329
|
-
console.log(`Path: ${screenDir}\n`);
|
|
330
|
-
console.log('Created files:');
|
|
331
|
-
console.log(` š ${path.join(screenDir, 'features', `${filename}.feature`)}`);
|
|
332
|
-
console.log(` š ${path.join(screenDir, 'selectors', `${filename}.override.yaml`)} (user-editable)`);
|
|
333
|
-
console.log(` š ${path.join(screenDir, 'test-data', `${filename}.override.yaml`)} (user-editable)\n`);
|
|
334
|
-
console.log('š Note: Override files will NEVER be modified by automation');
|
|
335
|
-
console.log(' Edit these files to customize selectors and test data\n');
|
|
336
|
-
console.log('Next steps:');
|
|
337
|
-
console.log(` 1. Edit the Gherkin feature file to define test scenarios`);
|
|
338
|
-
console.log(` 2. Run: sungen map --screen ${name}`);
|
|
339
|
-
console.log(` This will generate BASE selector and test-data files`);
|
|
340
|
-
console.log(` (Override files remain untouched)\n`);
|
|
341
|
-
console.log('Documentation: https://github.com/sun-asterisk/sungen');
|
|
342
|
-
}
|
|
343
182
|
}
|
|
344
183
|
exports.ScreenManager = ScreenManager;
|
|
345
184
|
//# sourceMappingURL=screen-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-manager.js","sourceRoot":"","sources":["../../src/orchestrator/screen-manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;
|
|
1
|
+
{"version":3,"file":"screen-manager.js","sourceRoot":"","sources":["../../src/orchestrator/screen-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Valid selector types used across scaffold generator, selector resolver, and validator.
|
|
3
3
|
* Single source of truth ā import this instead of hardcoding.
|
|
4
4
|
*/
|
|
5
|
-
export declare const VALID_SELECTOR_TYPES: readonly ["placeholder", "role", "testid", "label", "text", "page", "column", "locator", "id"];
|
|
5
|
+
export declare const VALID_SELECTOR_TYPES: readonly ["placeholder", "role", "testid", "label", "text", "page", "column", "locator", "id", "upload", "frame", "table"];
|
|
6
6
|
export type SelectorType = (typeof VALID_SELECTOR_TYPES)[number];
|
|
7
7
|
//# sourceMappingURL=selector-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector-types.d.ts","sourceRoot":"","sources":["../../src/utils/selector-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"selector-types.d.ts","sourceRoot":"","sources":["../../src/utils/selector-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,4HAavB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector-types.js","sourceRoot":"","sources":["../../src/utils/selector-types.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,oBAAoB,GAAG;IAClC,aAAa;IACb,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,IAAI;
|
|
1
|
+
{"version":3,"file":"selector-types.js","sourceRoot":"","sources":["../../src/utils/selector-types.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,oBAAoB,GAAG;IAClC,aAAa;IACb,MAAM;IACN,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,OAAO;CACC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sun-asterisk/sungen",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Deterministic E2E Test Compiler - Gherkin + Selectors ā Playwright tests",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
package/src/cli/commands/add.ts
CHANGED
|
@@ -3,9 +3,10 @@ import { Command } from 'commander';
|
|
|
3
3
|
export function registerAddCommand(program: Command): void {
|
|
4
4
|
program
|
|
5
5
|
.command('add')
|
|
6
|
-
.description('Add screen definition with scaffolded files')
|
|
6
|
+
.description('Add screen or feature definition with scaffolded files')
|
|
7
7
|
.requiredOption('--screen <name>', 'Screen name')
|
|
8
|
-
.option('-p, --path <path>', 'Screen route path')
|
|
8
|
+
.option('-p, --path <path>', 'Screen route path (e.g. /awards)')
|
|
9
|
+
.option('-f, --feature <name>', 'Add additional feature file to existing screen')
|
|
9
10
|
.option('-d, --description <text>', 'Screen description')
|
|
10
11
|
.action(async (options) => {
|
|
11
12
|
try {
|
|
@@ -15,10 +16,11 @@ export function registerAddCommand(program: Command): void {
|
|
|
15
16
|
await manager.addScreen({
|
|
16
17
|
name: options.screen,
|
|
17
18
|
path: options.path,
|
|
19
|
+
feature: options.feature,
|
|
18
20
|
description: options.description,
|
|
19
21
|
});
|
|
20
22
|
} catch (error) {
|
|
21
|
-
console.error('
|
|
23
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
22
24
|
process.exit(1);
|
|
23
25
|
}
|
|
24
26
|
});
|
|
@@ -1,54 +1,106 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import { CodeGenerator } from '../../generators/test-generator/code-generator';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Find .feature files recursively in a directory
|
|
8
|
+
*/
|
|
9
|
+
function findFeatureFiles(dir: string): string[] {
|
|
10
|
+
const files: string[] = [];
|
|
11
|
+
if (!fs.existsSync(dir)) return files;
|
|
12
|
+
|
|
13
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
const fullPath = path.join(dir, entry.name);
|
|
16
|
+
if (entry.isDirectory()) {
|
|
17
|
+
files.push(...findFeatureFiles(fullPath));
|
|
18
|
+
} else if (entry.isFile() && entry.name.endsWith('.feature')) {
|
|
19
|
+
files.push(fullPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return files;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Find feature files for a specific screen
|
|
27
|
+
*/
|
|
28
|
+
function findFeatureFilesForScreen(screenName: string): string[] {
|
|
29
|
+
const screenFeaturesDir = path.join(process.cwd(), 'qa', 'screens', screenName, 'features');
|
|
30
|
+
return findFeatureFiles(screenFeaturesDir);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Find all feature files across all screens
|
|
35
|
+
*/
|
|
36
|
+
function findAllFeatureFiles(): string[] {
|
|
37
|
+
const allFiles: string[] = [];
|
|
38
|
+
const screensDir = path.join(process.cwd(), 'qa', 'screens');
|
|
39
|
+
|
|
40
|
+
if (fs.existsSync(screensDir)) {
|
|
41
|
+
const screenDirs = fs.readdirSync(screensDir, { withFileTypes: true })
|
|
42
|
+
.filter(entry => entry.isDirectory())
|
|
43
|
+
.map(entry => entry.name);
|
|
44
|
+
|
|
45
|
+
for (const screenName of screenDirs) {
|
|
46
|
+
const screenFeaturesDir = path.join(screensDir, screenName, 'features');
|
|
47
|
+
allFiles.push(...findFeatureFiles(screenFeaturesDir));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return allFiles;
|
|
52
|
+
}
|
|
6
53
|
|
|
7
54
|
export function registerGenerateCommand(program: Command): void {
|
|
8
55
|
program
|
|
9
56
|
.command('generate')
|
|
10
|
-
.description('Generate Playwright test code from features')
|
|
11
|
-
.option('--
|
|
12
|
-
.option('--
|
|
13
|
-
.option('
|
|
14
|
-
.option('-f, --force', 'Force regeneration, bypass cache')
|
|
15
|
-
.option('--skip-validation', 'Skip validation before generation')
|
|
57
|
+
.description('Generate Playwright test code from Gherkin features')
|
|
58
|
+
.option('-s, --screen <name>', 'Generate tests for a specific screen')
|
|
59
|
+
.option('--all', 'Generate tests for all screens')
|
|
60
|
+
.option('--framework <name>', 'Test framework (default: playwright)', 'playwright')
|
|
16
61
|
.action(async (options) => {
|
|
17
62
|
try {
|
|
18
|
-
|
|
19
|
-
if (!options.skipValidation) {
|
|
20
|
-
const { ScreenValidator } = require('../../core/validator');
|
|
21
|
-
const validator = new ScreenValidator();
|
|
22
|
-
|
|
23
|
-
let validationResult: ValidationResult;
|
|
24
|
-
if (options.screen) {
|
|
25
|
-
console.log(`š Validating screen: ${options.screen}...\n`);
|
|
26
|
-
validationResult = validator.validateScreen(options.screen);
|
|
27
|
-
} else {
|
|
28
|
-
console.log('š Validating all screens...\n');
|
|
29
|
-
validationResult = validator.validateAll();
|
|
30
|
-
}
|
|
63
|
+
const screenName = options.screen;
|
|
31
64
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
65
|
+
// Find feature files
|
|
66
|
+
let featureFiles: string[];
|
|
67
|
+
if (screenName) {
|
|
68
|
+
featureFiles = findFeatureFilesForScreen(screenName);
|
|
69
|
+
if (featureFiles.length === 0) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`No feature files found for screen: ${screenName}\n` +
|
|
72
|
+
`Looked in: qa/screens/${screenName}/features/`
|
|
73
|
+
);
|
|
37
74
|
}
|
|
38
|
-
|
|
39
|
-
|
|
75
|
+
console.log(`\nGenerating tests: ${screenName}\n`);
|
|
76
|
+
} else {
|
|
77
|
+
featureFiles = findAllFeatureFiles();
|
|
78
|
+
if (featureFiles.length === 0) {
|
|
79
|
+
throw new Error('No feature files found in qa/screens/');
|
|
80
|
+
}
|
|
81
|
+
console.log(`\nGenerating tests for all screens\n`);
|
|
40
82
|
}
|
|
41
83
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
84
|
+
// Output directory
|
|
85
|
+
const outputDir = path.join(process.cwd(), 'specs', 'generated');
|
|
86
|
+
|
|
87
|
+
// Create generator and compile
|
|
88
|
+
const generator = new CodeGenerator({
|
|
89
|
+
framework: options.framework || 'playwright',
|
|
90
|
+
screenName,
|
|
91
|
+
verbose: program.opts().verbose,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
const results = await generator.generateAllTests(
|
|
95
|
+
path.join(process.cwd(), 'qa', 'screens'),
|
|
96
|
+
outputDir,
|
|
97
|
+
featureFiles
|
|
98
|
+
);
|
|
48
99
|
|
|
49
|
-
|
|
100
|
+
console.log(`\n${results.length} test file(s) generated.`);
|
|
101
|
+
console.log(`Next step: npx playwright test --ui\n`);
|
|
50
102
|
} catch (error) {
|
|
51
|
-
console.error('
|
|
103
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
52
104
|
process.exit(1);
|
|
53
105
|
}
|
|
54
106
|
});
|
package/src/cli/index.ts
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Sungen CLI
|
|
4
|
-
*
|
|
3
|
+
* Sungen CLI v2 - Deterministic E2E Test Compiler
|
|
4
|
+
* Compiles Gherkin features + selector YAML + test data ā Playwright tests
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { Command } from 'commander';
|
|
8
8
|
import { registerInitCommand } from './commands/init';
|
|
9
9
|
import { registerAddCommand } from './commands/add';
|
|
10
|
-
import { registerLiveScanCommand } from './commands/live-scan';
|
|
11
|
-
import { registerMapCommand } from './commands/map';
|
|
12
10
|
import { registerGenerateCommand } from './commands/generate';
|
|
13
|
-
import { registerFullCommand } from './commands/full';
|
|
14
|
-
import { registerValidateCommand } from './commands/validate';
|
|
15
|
-
import { registerCacheClearCommand } from './commands/cache-clear';
|
|
16
11
|
import { registerMakeauthCommand } from './commands/makeauth';
|
|
17
12
|
|
|
18
13
|
async function main() {
|
|
@@ -20,23 +15,17 @@ async function main() {
|
|
|
20
15
|
|
|
21
16
|
program
|
|
22
17
|
.name('sungen')
|
|
23
|
-
.description('
|
|
24
|
-
.version('
|
|
18
|
+
.description('Deterministic E2E Test Compiler ā Gherkin + Selectors ā Playwright')
|
|
19
|
+
.version('2.0.0');
|
|
25
20
|
|
|
26
21
|
// Global options
|
|
27
22
|
program
|
|
28
|
-
.option('-c, --config <path>', 'Path to custom config file')
|
|
29
23
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
30
24
|
|
|
31
|
-
// Register
|
|
25
|
+
// Register commands (5 only)
|
|
32
26
|
registerInitCommand(program);
|
|
33
27
|
registerAddCommand(program);
|
|
34
|
-
registerLiveScanCommand(program);
|
|
35
|
-
registerMapCommand(program);
|
|
36
28
|
registerGenerateCommand(program);
|
|
37
|
-
registerFullCommand(program);
|
|
38
|
-
registerValidateCommand(program);
|
|
39
|
-
registerCacheClearCommand(program);
|
|
40
29
|
registerMakeauthCommand(program);
|
|
41
30
|
|
|
42
31
|
await program.parseAsync(process.argv);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const frame = page.frameLocator('{{value}}');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// Back to main page context
|