@sun-asterisk/sungen 1.0.24 ā 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -74
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +5 -3
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -35
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +5 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/dist/generators/test-generator/code-generator.d.ts +0 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +0 -47
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +2 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +4 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +17 -5
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +1 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +30 -27
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +4 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/types.d.ts +7 -24
- package/dist/generators/test-generator/types.d.ts.map +1 -1
- package/dist/generators/test-generator/types.js +2 -101
- package/dist/generators/test-generator/types.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +8 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +343 -32
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -32
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +55 -216
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +3 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/commands/add.ts +5 -3
- package/src/cli/commands/generate.ts +90 -38
- package/src/cli/index.ts +5 -16
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/src/generators/test-generator/code-generator.ts +0 -59
- package/src/generators/test-generator/patterns/assertion-patterns.ts +2 -0
- package/src/generators/test-generator/patterns/index.ts +12 -3
- package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
- package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
- package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
- package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
- package/src/generators/test-generator/step-mapper.ts +33 -27
- package/src/generators/test-generator/template-engine.ts +3 -1
- package/src/generators/test-generator/types.ts +7 -112
- package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
- package/src/orchestrator/project-initializer.ts +345 -32
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/utils/selector-types.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts +0 -3
- package/dist/cli/commands/cache-clear.d.ts.map +0 -1
- package/dist/cli/commands/cache-clear.js +0 -24
- package/dist/cli/commands/cache-clear.js.map +0 -1
- package/dist/cli/commands/full.d.ts +0 -3
- package/dist/cli/commands/full.d.ts.map +0 -1
- package/dist/cli/commands/full.js +0 -37
- package/dist/cli/commands/full.js.map +0 -1
- package/dist/cli/commands/live-scan.d.ts +0 -3
- package/dist/cli/commands/live-scan.d.ts.map +0 -1
- package/dist/cli/commands/live-scan.js +0 -78
- package/dist/cli/commands/live-scan.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -3
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -93
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -3
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -43
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -6
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -101
- package/dist/cli/utils.js.map +0 -1
- package/dist/config/config-loader.d.ts +0 -51
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-loader.js +0 -216
- package/dist/config/config-loader.js.map +0 -1
- package/dist/config/config-schema.d.ts +0 -121
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/config/config-schema.js +0 -7
- package/dist/config/config-schema.js.map +0 -1
- package/dist/core/live-scanner/config-reader.d.ts +0 -10
- package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/config-reader.js +0 -87
- package/dist/core/live-scanner/config-reader.js.map +0 -1
- package/dist/core/live-scanner/element-finder.d.ts +0 -20
- package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
- package/dist/core/live-scanner/element-finder.js +0 -481
- package/dist/core/live-scanner/element-finder.js.map +0 -1
- package/dist/core/live-scanner/index.d.ts +0 -8
- package/dist/core/live-scanner/index.d.ts.map +0 -1
- package/dist/core/live-scanner/index.js +0 -33
- package/dist/core/live-scanner/index.js.map +0 -1
- package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
- package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-reader.js +0 -60
- package/dist/core/live-scanner/matrix-reader.js.map +0 -1
- package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
- package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-writer.js +0 -103
- package/dist/core/live-scanner/matrix-writer.js.map +0 -1
- package/dist/core/live-scanner/role-fallback.d.ts +0 -15
- package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
- package/dist/core/live-scanner/role-fallback.js +0 -46
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -22
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -303
- package/dist/core/live-scanner/scanner.js.map +0 -1
- package/dist/core/live-scanner/step-replayer.d.ts +0 -26
- package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
- package/dist/core/live-scanner/step-replayer.js +0 -473
- package/dist/core/live-scanner/step-replayer.js.map +0 -1
- package/dist/core/live-scanner/types.d.ts +0 -52
- package/dist/core/live-scanner/types.d.ts.map +0 -1
- package/dist/core/live-scanner/types.js +0 -14
- package/dist/core/live-scanner/types.js.map +0 -1
- package/dist/core/selector-base/annotation-handler.d.ts +0 -45
- package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
- package/dist/core/selector-base/annotation-handler.js +0 -102
- package/dist/core/selector-base/annotation-handler.js.map +0 -1
- package/dist/core/selector-base/base-generator.d.ts +0 -49
- package/dist/core/selector-base/base-generator.d.ts.map +0 -1
- package/dist/core/selector-base/base-generator.js +0 -214
- package/dist/core/selector-base/base-generator.js.map +0 -1
- package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
- package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
- package/dist/core/selector-base/gherkin-parser.js +0 -42
- package/dist/core/selector-base/gherkin-parser.js.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.js +0 -477
- package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
- package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
- package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/react-scanner.js +0 -163
- package/dist/core/ui-scanner/react-scanner.js.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.js +0 -33
- package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.js +0 -511
- package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
- package/dist/core/validator/data-validator.d.ts +0 -38
- package/dist/core/validator/data-validator.d.ts.map +0 -1
- package/dist/core/validator/data-validator.js +0 -212
- package/dist/core/validator/data-validator.js.map +0 -1
- package/dist/core/validator/feature-validator.d.ts +0 -27
- package/dist/core/validator/feature-validator.d.ts.map +0 -1
- package/dist/core/validator/feature-validator.js +0 -182
- package/dist/core/validator/feature-validator.js.map +0 -1
- package/dist/core/validator/index.d.ts +0 -46
- package/dist/core/validator/index.d.ts.map +0 -1
- package/dist/core/validator/index.js +0 -17
- package/dist/core/validator/index.js.map +0 -1
- package/dist/core/validator/screen-validator.d.ts +0 -35
- package/dist/core/validator/screen-validator.d.ts.map +0 -1
- package/dist/core/validator/screen-validator.js +0 -195
- package/dist/core/validator/screen-validator.js.map +0 -1
- package/dist/core/validator/selector-validator.d.ts +0 -36
- package/dist/core/validator/selector-validator.d.ts.map +0 -1
- package/dist/core/validator/selector-validator.js +0 -210
- package/dist/core/validator/selector-validator.js.map +0 -1
- package/dist/external/ai-provider.d.ts +0 -60
- package/dist/external/ai-provider.d.ts.map +0 -1
- package/dist/external/ai-provider.js +0 -30
- package/dist/external/ai-provider.js.map +0 -1
- package/dist/external/anthropic-provider.d.ts +0 -29
- package/dist/external/anthropic-provider.d.ts.map +0 -1
- package/dist/external/anthropic-provider.js +0 -85
- package/dist/external/anthropic-provider.js.map +0 -1
- package/dist/generators/cache/cache-manager.d.ts +0 -66
- package/dist/generators/cache/cache-manager.d.ts.map +0 -1
- package/dist/generators/cache/cache-manager.js +0 -286
- package/dist/generators/cache/cache-manager.js.map +0 -1
- package/dist/generators/dsl-writer/index.d.ts +0 -33
- package/dist/generators/dsl-writer/index.d.ts.map +0 -1
- package/dist/generators/dsl-writer/index.js +0 -226
- package/dist/generators/dsl-writer/index.js.map +0 -1
- package/dist/generators/scaffold-generator/index.d.ts +0 -162
- package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
- package/dist/generators/scaffold-generator/index.js +0 -877
- package/dist/generators/scaffold-generator/index.js.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.js +0 -457
- package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/index.d.ts +0 -8
- package/dist/generators/selector-mapper/index.d.ts.map +0 -1
- package/dist/generators/selector-mapper/index.js +0 -12
- package/dist/generators/selector-mapper/index.js.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.js +0 -204
- package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.js +0 -82
- package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
- package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.js +0 -797
- package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
- package/dist/orchestrator/cache-manager.d.ts +0 -15
- package/dist/orchestrator/cache-manager.d.ts.map +0 -1
- package/dist/orchestrator/cache-manager.js +0 -62
- package/dist/orchestrator/cache-manager.js.map +0 -1
- package/dist/orchestrator/pipeline.d.ts +0 -56
- package/dist/orchestrator/pipeline.d.ts.map +0 -1
- package/dist/orchestrator/pipeline.js +0 -298
- package/dist/orchestrator/pipeline.js.map +0 -1
- package/dist/orchestrator/reporter.d.ts +0 -15
- package/dist/orchestrator/reporter.d.ts.map +0 -1
- package/dist/orchestrator/reporter.js +0 -30
- package/dist/orchestrator/reporter.js.map +0 -1
- package/src/cli/commands/cache-clear.ts +0 -22
- package/src/cli/commands/full.ts +0 -35
- package/src/cli/commands/live-scan.ts +0 -82
- package/src/cli/commands/map.ts +0 -97
- package/src/cli/commands/validate.ts +0 -43
- package/src/cli/utils.ts +0 -106
- package/src/config/ai-providers.yaml +0 -56
- package/src/config/config-loader.ts +0 -248
- package/src/config/config-schema.ts +0 -148
- package/src/config/default.config.yaml +0 -107
- package/src/config/framework.config.yaml +0 -52
- package/src/config/routes.yaml +0 -31
- package/src/core/live-scanner/config-reader.ts +0 -57
- package/src/core/live-scanner/element-finder.ts +0 -534
- package/src/core/live-scanner/index.ts +0 -7
- package/src/core/live-scanner/matrix-reader.ts +0 -65
- package/src/core/live-scanner/matrix-writer.ts +0 -77
- package/src/core/live-scanner/role-fallback.ts +0 -44
- package/src/core/live-scanner/scanner.ts +0 -321
- package/src/core/live-scanner/step-replayer.ts +0 -503
- package/src/core/live-scanner/types.ts +0 -58
- package/src/core/selector-base/annotation-handler.ts +0 -127
- package/src/core/selector-base/base-generator.ts +0 -234
- package/src/core/selector-base/gherkin-parser.ts +0 -57
- package/src/core/selector-mapper/priority-mapper.ts +0 -607
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
- package/src/core/ui-scanner/react-scanner.ts +0 -156
- package/src/core/ui-scanner/scanner-interface.ts +0 -133
- package/src/core/ui-scanner/strict-scanner.ts +0 -629
- package/src/core/validator/data-validator.ts +0 -202
- package/src/core/validator/feature-validator.ts +0 -176
- package/src/core/validator/index.ts +0 -57
- package/src/core/validator/screen-validator.ts +0 -209
- package/src/core/validator/selector-validator.ts +0 -209
- package/src/external/ai-provider.ts +0 -90
- package/src/external/anthropic-provider.ts +0 -114
- package/src/generators/README.md +0 -410
- package/src/generators/cache/cache-manager.ts +0 -322
- package/src/generators/dsl-writer/index.ts +0 -253
- package/src/generators/scaffold-generator/index.ts +0 -1029
- package/src/generators/selector-mapper/ai-mapper.ts +0 -528
- package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
- package/src/generators/selector-mapper/index.ts +0 -10
- package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
- package/src/generators/test-generator/ai-step-mapper.ts +0 -224
- package/src/generators/test-generator/auth-setup-generator.ts +0 -59
- package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
- package/src/generators/ui-model-builder/react-scanner.ts +0 -959
- package/src/orchestrator/cache-manager.ts +0 -32
- package/src/orchestrator/pipeline.ts +0 -354
- package/src/orchestrator/reporter.ts +0 -36
package/README.md
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
# Sungen
|
|
1
|
+
# Sungen v2 ā Deterministic E2E Test Compiler
|
|
2
2
|
|
|
3
|
-
**Version**:
|
|
4
|
-
**
|
|
3
|
+
**Version**: 2.0.0
|
|
4
|
+
**Gherkin + Selector YAML + Test Data ā Playwright .spec.ts**
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
## What is Sungen?
|
|
9
9
|
|
|
10
|
-
Sungen
|
|
10
|
+
Sungen is a deterministic compiler that converts Gherkin features into Playwright tests.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
2. **Accessibility** (`role` + `aria-label`) - semantic fallback
|
|
14
|
-
3. **AI Fallback** (Claude) - last resort only
|
|
12
|
+
**v2 architecture**: AI generates the input files (Gherkin + selectors), sungen compiles to tests. No AI inside sungen itself.
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
```
|
|
15
|
+
AI (Copilot/Claude + MCP Playwright) ā visits URL ā generates files
|
|
16
|
+
sungen generate ā compiles .feature + selectors.yaml + data.yaml ā .spec.ts
|
|
17
|
+
```
|
|
17
18
|
|
|
18
19
|
---
|
|
19
20
|
|
|
@@ -23,12 +24,16 @@ Goal: **90%+ Direct ID match** with minimal AI dependency.
|
|
|
23
24
|
# Install
|
|
24
25
|
npm install -g @sun-asterisk/sungen@latest
|
|
25
26
|
|
|
26
|
-
# Initialize project
|
|
27
|
+
# Initialize project (creates AI rules + directory structure)
|
|
27
28
|
sungen init
|
|
28
29
|
|
|
29
|
-
# Create a screen
|
|
30
|
+
# Create a screen
|
|
30
31
|
sungen add --screen login --path /auth/login
|
|
31
|
-
|
|
32
|
+
|
|
33
|
+
# Use AI to generate Gherkin + selectors from the live page
|
|
34
|
+
# (GitHub Copilot / Claude Code reads the AI rules and generates files)
|
|
35
|
+
|
|
36
|
+
# Compile to Playwright tests
|
|
32
37
|
sungen generate --screen login
|
|
33
38
|
|
|
34
39
|
# Run tests
|
|
@@ -37,11 +42,69 @@ npx playwright test
|
|
|
37
42
|
|
|
38
43
|
---
|
|
39
44
|
|
|
45
|
+
## CLI Commands
|
|
46
|
+
|
|
47
|
+
| Command | Description |
|
|
48
|
+
|---------|-------------|
|
|
49
|
+
| `sungen init` | Scaffold project + generate AI rules |
|
|
50
|
+
| `sungen add --screen <name> --path <path>` | Create screen with empty templates |
|
|
51
|
+
| `sungen add --screen <name> --feature <name>` | Add feature file to existing screen |
|
|
52
|
+
| `sungen generate --screen <name>` | Compile Gherkin ā Playwright .spec.ts |
|
|
53
|
+
| `sungen generate --all` | Compile all screens |
|
|
54
|
+
| `sungen makeauth <role>` | Capture browser auth state (SSO support) |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Workflow
|
|
59
|
+
|
|
60
|
+
### 1. Add a screen
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
sungen add --screen awards --path /awards
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Creates:
|
|
67
|
+
```
|
|
68
|
+
qa/screens/awards/
|
|
69
|
+
āāā features/awards.feature # Gherkin template
|
|
70
|
+
āāā selectors/awards.yaml # Selector YAML (page entry pre-filled)
|
|
71
|
+
āāā test-data/awards.yaml # Test data (empty)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2. AI generates Gherkin + selectors
|
|
75
|
+
|
|
76
|
+
Use your AI assistant (GitHub Copilot or Claude Code) with MCP Playwright to:
|
|
77
|
+
1. Navigate to the page URL
|
|
78
|
+
2. Take an accessibility snapshot
|
|
79
|
+
3. Generate `.feature` + `selectors.yaml` + `test-data.yaml`
|
|
80
|
+
|
|
81
|
+
The AI rules in `.github/copilot-instructions.md` and `CLAUDE.md` (created by `sungen init`) teach the AI the correct syntax.
|
|
82
|
+
|
|
83
|
+
### 3. Compile + run
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
sungen generate --screen awards
|
|
87
|
+
npx playwright test
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 4. Fix failures (AI verify loop)
|
|
91
|
+
|
|
92
|
+
When tests fail ā AI reads error ā fixes `selectors.yaml` ā recompile ā re-run.
|
|
93
|
+
|
|
94
|
+
| Error | Fix in selectors.yaml |
|
|
95
|
+
|---|---|
|
|
96
|
+
| strict mode: resolved to N elements | Add `exact: true` or `scope` or `nth` |
|
|
97
|
+
| element(s) not found | Fix `name`, `type`, or `value` |
|
|
98
|
+
| getByText matched too many | Add `match: 'exact'` or `nth` |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
40
102
|
## Gherkin Syntax
|
|
41
103
|
|
|
42
|
-
**Pattern**: `User
|
|
104
|
+
**Pattern**: `User <action> [<Target>] <type> with {{<Value>}}`
|
|
43
105
|
|
|
44
|
-
|
|
106
|
+
- `[Target]` ā selector reference ā lookup in `selectors/*.yaml`
|
|
107
|
+
- `{{Value}}` ā test data reference ā lookup in `test-data/*.yaml`
|
|
45
108
|
|
|
46
109
|
### Example
|
|
47
110
|
|
|
@@ -49,51 +112,106 @@ npx playwright test
|
|
|
49
112
|
Feature: Login Screen
|
|
50
113
|
Path: /auth/login
|
|
51
114
|
|
|
115
|
+
@auth:admin
|
|
52
116
|
Scenario: User logs in successfully
|
|
53
|
-
Given User is on [
|
|
117
|
+
Given User is on [login] page
|
|
54
118
|
When User fill [Email] field with {{valid_email}}
|
|
55
119
|
And User fill [Password] field with {{valid_password}}
|
|
56
120
|
And User click [Login] button
|
|
57
|
-
Then User see [Welcome]
|
|
121
|
+
Then User see [Welcome] heading with {{success_message}}
|
|
122
|
+
And User see [dashboard] page
|
|
58
123
|
```
|
|
59
124
|
|
|
60
|
-
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Pattern Shapes (17 categories)
|
|
61
128
|
|
|
62
|
-
|
|
63
|
-
|--------|---------|
|
|
64
|
-
| Navigate | `Given User is on [Login] page` |
|
|
65
|
-
| Open | `Given User open [Login] page` |
|
|
66
|
-
| Fill | `When User fill [Email] field with {{email}}` |
|
|
67
|
-
| Click | `When User click [Submit] button` |
|
|
68
|
-
| Select | `When User select [Country] dropdown with {{country}}` |
|
|
69
|
-
| See (visible) | `Then User see [Welcome] text` |
|
|
70
|
-
| See (with value) | `Then User see [Welcome] text with {{message}}` |
|
|
71
|
-
| See (hidden) | `Then User see [panel] dialog with {{title}} is hidden` |
|
|
72
|
-
| Wait for hidden | `And User wait for dialog with {{title}} is hidden` |
|
|
129
|
+
### Actions
|
|
73
130
|
|
|
74
|
-
|
|
131
|
+
| Pattern | Example |
|
|
132
|
+
|---|---|
|
|
133
|
+
| Simple click | `User click [Submit] button` |
|
|
134
|
+
| Click with data | `User click [Teammate] button with {{name}}` |
|
|
135
|
+
| Fill field | `User fill [Email] field with {{email}}` |
|
|
136
|
+
| Check/Uncheck | `User check [Remember me] checkbox` |
|
|
137
|
+
| Select dropdown | `User select [Country] dropdown with {{country}}` |
|
|
138
|
+
| Upload file | `User upload [Avatar] file with {{path}}` |
|
|
139
|
+
| Double click | `User double click [Cell] element` |
|
|
140
|
+
| Hover | `User hover [Info] icon` |
|
|
141
|
+
| Clear | `User clear [Search] field` |
|
|
142
|
+
| Toggle | `User toggle [Dark mode] switch` |
|
|
143
|
+
|
|
144
|
+
### Keyboard
|
|
145
|
+
|
|
146
|
+
| Pattern | Example |
|
|
147
|
+
|---|---|
|
|
148
|
+
| Global key | `User press Escape key` |
|
|
149
|
+
| Key on element | `User press Enter on [Search] field` |
|
|
150
|
+
|
|
151
|
+
### Navigation
|
|
152
|
+
|
|
153
|
+
| Pattern | Example |
|
|
154
|
+
|---|---|
|
|
155
|
+
| Open page | `User is on [login] page` |
|
|
156
|
+
| See page (URL) | `User see [dashboard] page` |
|
|
157
|
+
|
|
158
|
+
### Wait
|
|
159
|
+
|
|
160
|
+
| Pattern | Example |
|
|
161
|
+
|---|---|
|
|
162
|
+
| Wait timeout | `User wait for 3 seconds` |
|
|
163
|
+
| Wait element | `User wait for [Modal] dialog` |
|
|
164
|
+
| Wait hidden | `User wait for [Loading] spinner is hidden` |
|
|
165
|
+
| Wait with data | `User wait for [Dialog] dialog with {{title}}` |
|
|
166
|
+
|
|
167
|
+
### Assertions
|
|
168
|
+
|
|
169
|
+
| Pattern | Example |
|
|
170
|
+
|---|---|
|
|
171
|
+
| See element | `User see [Welcome] heading` |
|
|
172
|
+
| See with value | `User see [Title] heading with {{title}}` |
|
|
173
|
+
| State check | `User see [Submit] button is disabled` |
|
|
174
|
+
| State + data | `User see [Panel] dialog with {{title}} is hidden` |
|
|
175
|
+
| Text contains | `User see [Message] text contains {{partial}}` |
|
|
176
|
+
|
|
177
|
+
**States**: `hidden`, `visible`, `disabled`, `enabled`, `checked`, `unchecked`, `focused`, `empty`
|
|
178
|
+
|
|
179
|
+
### Table
|
|
180
|
+
|
|
181
|
+
| Pattern | Example |
|
|
182
|
+
|---|---|
|
|
183
|
+
| Row exists | `User see [Users] table has row with {{name}}` |
|
|
184
|
+
| No row | `User see [Users] table has no row with {{name}}` |
|
|
185
|
+
| Row count | `User see [Users] table has {{count}} rows` |
|
|
186
|
+
| Column exists | `User see [Users] table has [Email] column` |
|
|
187
|
+
| Cell by filter | `User see [Users] table row with {{name}} has [Status] with {{status}}` |
|
|
188
|
+
| Cell by index | `User see [Users] table row 1 [Name] cell with {{name}}` |
|
|
189
|
+
| Action in row | `User click [Edit] in [Users] table row with {{name}}` |
|
|
190
|
+
| Empty table | `User see [Users] table is empty` |
|
|
191
|
+
|
|
192
|
+
### Scope
|
|
193
|
+
|
|
194
|
+
| Pattern | Example |
|
|
195
|
+
|---|---|
|
|
196
|
+
| Scroll | `User scroll to [Footer] section` |
|
|
197
|
+
| Frame enter | `User switch to [Payment] frame` |
|
|
198
|
+
| Frame exit | `User switch to [main] frame` |
|
|
75
199
|
|
|
76
|
-
|
|
77
|
-
|--------|-------------|
|
|
78
|
-
| `[Element]` | Selector reference (mapped via selectors YAML) |
|
|
79
|
-
| `{{variable}}` | Test data reference (mapped via test-data YAML) |
|
|
80
|
-
| `Path: /route` | Page route in feature description |
|
|
200
|
+
---
|
|
81
201
|
|
|
82
|
-
|
|
202
|
+
## Tags
|
|
83
203
|
|
|
84
204
|
| Tag | Level | Description |
|
|
85
205
|
|-----|-------|-------------|
|
|
86
206
|
| `@auth:<role>` | Feature/Scenario | Use Playwright auth storage state |
|
|
87
|
-
| `@no-auth` |
|
|
207
|
+
| `@no-auth` | Scenario | Disable inherited auth |
|
|
88
208
|
| `@steps:<name>` | Scenario | Mark as reusable step block |
|
|
89
209
|
| `@extend:<name>` | Scenario | Prepend steps from a `@steps` block |
|
|
90
|
-
| `@
|
|
91
|
-
| `@ignore-testcase` | Step (comment) | Skip entire scenario |
|
|
210
|
+
| `@manual` | Scenario | Skip in generation |
|
|
92
211
|
|
|
93
212
|
**Auth precedence**: Scenario > Feature > None
|
|
94
|
-
**@extend precedence**: Extending scenario `@auth` > Base scenario `@auth` > Feature `@auth`
|
|
95
213
|
|
|
96
|
-
### Reusable Steps
|
|
214
|
+
### Reusable Steps
|
|
97
215
|
|
|
98
216
|
```gherkin
|
|
99
217
|
@auth:user @steps:open-dialog
|
|
@@ -107,14 +225,44 @@ Scenario: Open kudos dialog
|
|
|
107
225
|
Scenario: User sends a thank you message
|
|
108
226
|
Given User is on [panel] dialog with {{kudo_title}}
|
|
109
227
|
When User fill [Search] field with {{teammate_name}}
|
|
110
|
-
And User click [teammate] row with {{teammate_name}}
|
|
111
|
-
And User fill [Message] textarea with {{message}}
|
|
112
228
|
And User click [Send] button
|
|
113
|
-
|
|
114
|
-
Then User see [panel] modal with {{kudo_title}} is hidden
|
|
229
|
+
Then User see [panel] dialog with {{kudo_title}} is hidden
|
|
115
230
|
```
|
|
116
231
|
|
|
117
|
-
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Selector YAML Schema
|
|
235
|
+
|
|
236
|
+
```yaml
|
|
237
|
+
# Page navigation
|
|
238
|
+
login:
|
|
239
|
+
type: 'page'
|
|
240
|
+
value: '/auth/login'
|
|
241
|
+
|
|
242
|
+
# Role-based (preferred)
|
|
243
|
+
submit:
|
|
244
|
+
type: 'role'
|
|
245
|
+
value: 'button'
|
|
246
|
+
name: 'Submit'
|
|
247
|
+
exact: true # avoid substring collisions
|
|
248
|
+
scope: 'desktop navigation' # scope to parent landmark
|
|
249
|
+
|
|
250
|
+
# Text-based
|
|
251
|
+
price:
|
|
252
|
+
type: 'text'
|
|
253
|
+
value: '5.000.000 VNÄ'
|
|
254
|
+
match: 'exact' # exact text match
|
|
255
|
+
nth: 1 # second occurrence
|
|
256
|
+
|
|
257
|
+
# TestID (best)
|
|
258
|
+
login.form:
|
|
259
|
+
type: 'testid'
|
|
260
|
+
value: 'login-form'
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Locator priority**: `data-testid` > `role+name` > `label` > `text` > `CSS`
|
|
264
|
+
|
|
265
|
+
**Types**: `testid`, `role`, `text`, `label`, `placeholder`, `locator`, `page`, `upload`, `frame`
|
|
118
266
|
|
|
119
267
|
---
|
|
120
268
|
|
|
@@ -123,44 +271,20 @@ The `@extend:open-dialog` scenario automatically inherits all steps from `@steps
|
|
|
123
271
|
```
|
|
124
272
|
qa/screens/<name>/
|
|
125
273
|
āāā features/ # Gherkin .feature files
|
|
126
|
-
āāā selectors/ # Element
|
|
127
|
-
āāā test-data/ # Test
|
|
274
|
+
āāā selectors/ # Element selector YAML mappings
|
|
275
|
+
āāā test-data/ # Test data YAML values
|
|
128
276
|
|
|
129
277
|
specs/generated/<name>/
|
|
130
278
|
āāā <feature>.spec.ts # Generated Playwright tests
|
|
131
279
|
```
|
|
132
280
|
|
|
133
|
-
Override files (`.override.yaml`) are never overwritten by `sungen map` and take precedence at runtime.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## CLI Commands
|
|
138
|
-
|
|
139
|
-
| Command | Description |
|
|
140
|
-
|---------|-------------|
|
|
141
|
-
| `sungen init` | Initialize project structure |
|
|
142
|
-
| `sungen add --screen <name> [--path <path>]` | Create screen definition |
|
|
143
|
-
| `sungen live-scan --screen <name> [-f] [--headed]` | Scan live site to detect real Playwright selectors |
|
|
144
|
-
| `sungen map --screen <name> [--force] [--skip-live-scan]` | Generate selector/test-data YAML from Gherkin |
|
|
145
|
-
| `sungen generate --screen <name> [--force]` | Generate Playwright .spec.ts |
|
|
146
|
-
| `sungen full --screen <name>` | Run all: discover ā map ā generate |
|
|
147
|
-
| `sungen auto-tag --screen <name> [--dry-run]` | Inject `data-testid` into source code |
|
|
148
|
-
| `sungen makeauth <role>` | Save browser auth state (supports SSO) |
|
|
149
|
-
| `sungen validate --screen <name>` | Validate features and mappings |
|
|
150
|
-
| `sungen cache-clear` | Clear cached data |
|
|
151
|
-
|
|
152
|
-
Use `sungen <command> -h` for detailed options.
|
|
153
|
-
|
|
154
281
|
---
|
|
155
282
|
|
|
156
283
|
## Documentation
|
|
157
284
|
|
|
158
|
-
- **[Gherkin
|
|
159
|
-
- **[
|
|
160
|
-
- **[
|
|
161
|
-
- **[Auth Setup Guide](docs/makeauth.md)** - Configure authentication states
|
|
162
|
-
- **[Validation Guide](docs/validate.md)** - Validate Gherkin files
|
|
163
|
-
- **[Windows Setup Guide](WINDOWS-SETUP-GUIDE.md)** - Step-by-step for Windows users
|
|
285
|
+
- **[Gherkin Dictionary](docs/gherkin-dictionary.md)** ā Full grammar, all 17 patterns, compiler rules, formal BNF
|
|
286
|
+
- **[Gherkin Core Standard](docs/gherkin%20standards/gherkin-core-standard.md)** ā Syntax rules ([Tiįŗæng Viį»t](docs/gherkin%20standards/gherkin-core-standard.vi.md))
|
|
287
|
+
- **[Auth Setup Guide](docs/makeauth.md)** ā Configure authentication states
|
|
164
288
|
|
|
165
289
|
---
|
|
166
290
|
|
|
@@ -168,4 +292,4 @@ Use `sungen <command> -h` for detailed options.
|
|
|
168
292
|
|
|
169
293
|
MIT License - see LICENSE file for details.
|
|
170
294
|
|
|
171
|
-
**Made with ā¤ļø by
|
|
295
|
+
**Made with ā¤ļø by Sun Asterisk**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBzD"}
|
package/dist/cli/commands/add.js
CHANGED
|
@@ -4,9 +4,10 @@ exports.registerAddCommand = registerAddCommand;
|
|
|
4
4
|
function registerAddCommand(program) {
|
|
5
5
|
program
|
|
6
6
|
.command('add')
|
|
7
|
-
.description('Add screen definition with scaffolded files')
|
|
7
|
+
.description('Add screen or feature definition with scaffolded files')
|
|
8
8
|
.requiredOption('--screen <name>', 'Screen name')
|
|
9
|
-
.option('-p, --path <path>', 'Screen route path')
|
|
9
|
+
.option('-p, --path <path>', 'Screen route path (e.g. /awards)')
|
|
10
|
+
.option('-f, --feature <name>', 'Add additional feature file to existing screen')
|
|
10
11
|
.option('-d, --description <text>', 'Screen description')
|
|
11
12
|
.action(async (options) => {
|
|
12
13
|
try {
|
|
@@ -15,11 +16,12 @@ function registerAddCommand(program) {
|
|
|
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
|
}
|
|
21
23
|
catch (error) {
|
|
22
|
-
console.error('
|
|
24
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
23
25
|
process.exit(1);
|
|
24
26
|
}
|
|
25
27
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":";;AAEA,gDAwBC;AAxBD,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,wDAAwD,CAAC;SACrE,cAAc,CAAC,iBAAiB,EAAE,aAAa,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,gDAAgD,CAAC;SAChF,MAAM,CAAC,0BAA0B,EAAE,oBAAoB,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,mCAAmC,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;YAEpC,MAAM,OAAO,CAAC,SAAS,CAAC;gBACtB,IAAI,EAAE,OAAO,CAAC,MAAM;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqD9D"}
|
|
@@ -1,51 +1,126 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.registerGenerateCommand = registerGenerateCommand;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const code_generator_1 = require("../../generators/test-generator/code-generator");
|
|
40
|
+
/**
|
|
41
|
+
* Find .feature files recursively in a directory
|
|
42
|
+
*/
|
|
43
|
+
function findFeatureFiles(dir) {
|
|
44
|
+
const files = [];
|
|
45
|
+
if (!fs.existsSync(dir))
|
|
46
|
+
return files;
|
|
47
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
48
|
+
for (const entry of entries) {
|
|
49
|
+
const fullPath = path.join(dir, entry.name);
|
|
50
|
+
if (entry.isDirectory()) {
|
|
51
|
+
files.push(...findFeatureFiles(fullPath));
|
|
52
|
+
}
|
|
53
|
+
else if (entry.isFile() && entry.name.endsWith('.feature')) {
|
|
54
|
+
files.push(fullPath);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return files;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Find feature files for a specific screen
|
|
61
|
+
*/
|
|
62
|
+
function findFeatureFilesForScreen(screenName) {
|
|
63
|
+
const screenFeaturesDir = path.join(process.cwd(), 'qa', 'screens', screenName, 'features');
|
|
64
|
+
return findFeatureFiles(screenFeaturesDir);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Find all feature files across all screens
|
|
68
|
+
*/
|
|
69
|
+
function findAllFeatureFiles() {
|
|
70
|
+
const allFiles = [];
|
|
71
|
+
const screensDir = path.join(process.cwd(), 'qa', 'screens');
|
|
72
|
+
if (fs.existsSync(screensDir)) {
|
|
73
|
+
const screenDirs = fs.readdirSync(screensDir, { withFileTypes: true })
|
|
74
|
+
.filter(entry => entry.isDirectory())
|
|
75
|
+
.map(entry => entry.name);
|
|
76
|
+
for (const screenName of screenDirs) {
|
|
77
|
+
const screenFeaturesDir = path.join(screensDir, screenName, 'features');
|
|
78
|
+
allFiles.push(...findFeatureFiles(screenFeaturesDir));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return allFiles;
|
|
82
|
+
}
|
|
7
83
|
function registerGenerateCommand(program) {
|
|
8
84
|
program
|
|
9
85
|
.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')
|
|
86
|
+
.description('Generate Playwright test code from Gherkin features')
|
|
87
|
+
.option('-s, --screen <name>', 'Generate tests for a specific screen')
|
|
88
|
+
.option('--all', 'Generate tests for all screens')
|
|
89
|
+
.option('--framework <name>', 'Test framework (default: playwright)', 'playwright')
|
|
16
90
|
.action(async (options) => {
|
|
17
91
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
92
|
+
const screenName = options.screen;
|
|
93
|
+
// Find feature files
|
|
94
|
+
let featureFiles;
|
|
95
|
+
if (screenName) {
|
|
96
|
+
featureFiles = findFeatureFilesForScreen(screenName);
|
|
97
|
+
if (featureFiles.length === 0) {
|
|
98
|
+
throw new Error(`No feature files found for screen: ${screenName}\n` +
|
|
99
|
+
`Looked in: qa/screens/${screenName}/features/`);
|
|
26
100
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
console.error('\nā Validation failed. Fix errors before generating tests.');
|
|
34
|
-
console.error(' Tip: Use --skip-validation to bypass validation (not recommended)');
|
|
35
|
-
process.exit(1);
|
|
101
|
+
console.log(`\nGenerating tests: ${screenName}\n`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
featureFiles = findAllFeatureFiles();
|
|
105
|
+
if (featureFiles.length === 0) {
|
|
106
|
+
throw new Error('No feature files found in qa/screens/');
|
|
36
107
|
}
|
|
37
|
-
console.log(
|
|
108
|
+
console.log(`\nGenerating tests for all screens\n`);
|
|
38
109
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
110
|
+
// Output directory
|
|
111
|
+
const outputDir = path.join(process.cwd(), 'specs', 'generated');
|
|
112
|
+
// Create generator and compile
|
|
113
|
+
const generator = new code_generator_1.CodeGenerator({
|
|
114
|
+
framework: options.framework || 'playwright',
|
|
115
|
+
screenName,
|
|
116
|
+
verbose: program.opts().verbose,
|
|
117
|
+
});
|
|
118
|
+
const results = await generator.generateAllTests(path.join(process.cwd(), 'qa', 'screens'), outputDir, featureFiles);
|
|
119
|
+
console.log(`\n${results.length} test file(s) generated.`);
|
|
120
|
+
console.log(`Next step: npx playwright test --ui\n`);
|
|
46
121
|
}
|
|
47
122
|
catch (error) {
|
|
48
|
-
console.error('
|
|
123
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
49
124
|
process.exit(1);
|
|
50
125
|
}
|
|
51
126
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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
|
export {};
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cli/index.js
CHANGED
|
@@ -1,39 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
/**
|
|
4
|
-
* Sungen CLI
|
|
5
|
-
*
|
|
4
|
+
* Sungen CLI v2 - Deterministic E2E Test Compiler
|
|
5
|
+
* Compiles Gherkin features + selector YAML + test data ā Playwright tests
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
const commander_1 = require("commander");
|
|
9
9
|
const init_1 = require("./commands/init");
|
|
10
10
|
const add_1 = require("./commands/add");
|
|
11
|
-
const live_scan_1 = require("./commands/live-scan");
|
|
12
|
-
const map_1 = require("./commands/map");
|
|
13
11
|
const generate_1 = require("./commands/generate");
|
|
14
|
-
const full_1 = require("./commands/full");
|
|
15
|
-
const validate_1 = require("./commands/validate");
|
|
16
|
-
const cache_clear_1 = require("./commands/cache-clear");
|
|
17
12
|
const makeauth_1 = require("./commands/makeauth");
|
|
18
13
|
async function main() {
|
|
19
14
|
const program = new commander_1.Command();
|
|
20
15
|
program
|
|
21
16
|
.name('sungen')
|
|
22
|
-
.description('
|
|
23
|
-
.version('
|
|
17
|
+
.description('Deterministic E2E Test Compiler ā Gherkin + Selectors ā Playwright')
|
|
18
|
+
.version('2.0.0');
|
|
24
19
|
// Global options
|
|
25
20
|
program
|
|
26
|
-
.option('-c, --config <path>', 'Path to custom config file')
|
|
27
21
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
28
|
-
// Register
|
|
22
|
+
// Register commands (5 only)
|
|
29
23
|
(0, init_1.registerInitCommand)(program);
|
|
30
24
|
(0, add_1.registerAddCommand)(program);
|
|
31
|
-
(0, live_scan_1.registerLiveScanCommand)(program);
|
|
32
|
-
(0, map_1.registerMapCommand)(program);
|
|
33
25
|
(0, generate_1.registerGenerateCommand)(program);
|
|
34
|
-
(0, full_1.registerFullCommand)(program);
|
|
35
|
-
(0, validate_1.registerValidateCommand)(program);
|
|
36
|
-
(0, cache_clear_1.registerCacheClearCommand)(program);
|
|
37
26
|
(0, makeauth_1.registerMakeauthCommand)(program);
|
|
38
27
|
await program.parseAsync(process.argv);
|
|
39
28
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAE9D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,6BAA6B;IAC7B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const frame = page.frameLocator('{{value}}');
|