@sun-asterisk/sungen 1.0.24 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -74
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +5 -3
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -35
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +5 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/dist/generators/test-generator/code-generator.d.ts +0 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +10 -47
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +2 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +4 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +17 -5
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +5 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +38 -27
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +4 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/types.d.ts +7 -24
- package/dist/generators/test-generator/types.d.ts.map +1 -1
- package/dist/generators/test-generator/types.js +2 -101
- package/dist/generators/test-generator/types.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +12 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +72 -160
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -32
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +55 -216
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-rules.md +189 -0
- package/dist/orchestrator/templates/gitignore +16 -0
- package/dist/orchestrator/templates/playwright.config.d.ts +10 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -0
- package/dist/orchestrator/templates/playwright.config.js +77 -0
- package/dist/orchestrator/templates/playwright.config.js.map +1 -0
- package/dist/orchestrator/templates/playwright.config.ts +80 -0
- package/dist/orchestrator/templates/readme.md +197 -0
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +3 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/docs/gherkin standards/gherkin-core-standard.md +377 -0
- package/docs/gherkin standards/gherkin-core-standard.vi.md +303 -0
- package/docs/gherkin-dictionary.md +1071 -0
- package/docs/makeauth.md +225 -0
- package/package.json +4 -3
- package/src/cli/commands/add.ts +5 -3
- package/src/cli/commands/generate.ts +90 -38
- package/src/cli/index.ts +5 -16
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/src/generators/test-generator/code-generator.ts +11 -59
- package/src/generators/test-generator/patterns/assertion-patterns.ts +2 -0
- package/src/generators/test-generator/patterns/index.ts +12 -3
- package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
- package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
- package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
- package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
- package/src/generators/test-generator/step-mapper.ts +42 -27
- package/src/generators/test-generator/template-engine.ts +3 -1
- package/src/generators/test-generator/types.ts +7 -112
- package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
- package/src/orchestrator/project-initializer.ts +75 -160
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/orchestrator/templates/ai-rules.md +189 -0
- package/src/orchestrator/templates/gitignore +16 -0
- package/src/orchestrator/templates/playwright.config.ts +80 -0
- package/src/orchestrator/templates/readme.md +197 -0
- package/src/utils/selector-types.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts +0 -3
- package/dist/cli/commands/cache-clear.d.ts.map +0 -1
- package/dist/cli/commands/cache-clear.js +0 -24
- package/dist/cli/commands/cache-clear.js.map +0 -1
- package/dist/cli/commands/full.d.ts +0 -3
- package/dist/cli/commands/full.d.ts.map +0 -1
- package/dist/cli/commands/full.js +0 -37
- package/dist/cli/commands/full.js.map +0 -1
- package/dist/cli/commands/live-scan.d.ts +0 -3
- package/dist/cli/commands/live-scan.d.ts.map +0 -1
- package/dist/cli/commands/live-scan.js +0 -78
- package/dist/cli/commands/live-scan.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -3
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -93
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -3
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -43
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -6
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -101
- package/dist/cli/utils.js.map +0 -1
- package/dist/config/config-loader.d.ts +0 -51
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-loader.js +0 -216
- package/dist/config/config-loader.js.map +0 -1
- package/dist/config/config-schema.d.ts +0 -121
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/config/config-schema.js +0 -7
- package/dist/config/config-schema.js.map +0 -1
- package/dist/core/live-scanner/config-reader.d.ts +0 -10
- package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/config-reader.js +0 -87
- package/dist/core/live-scanner/config-reader.js.map +0 -1
- package/dist/core/live-scanner/element-finder.d.ts +0 -20
- package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
- package/dist/core/live-scanner/element-finder.js +0 -481
- package/dist/core/live-scanner/element-finder.js.map +0 -1
- package/dist/core/live-scanner/index.d.ts +0 -8
- package/dist/core/live-scanner/index.d.ts.map +0 -1
- package/dist/core/live-scanner/index.js +0 -33
- package/dist/core/live-scanner/index.js.map +0 -1
- package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
- package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-reader.js +0 -60
- package/dist/core/live-scanner/matrix-reader.js.map +0 -1
- package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
- package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-writer.js +0 -103
- package/dist/core/live-scanner/matrix-writer.js.map +0 -1
- package/dist/core/live-scanner/role-fallback.d.ts +0 -15
- package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
- package/dist/core/live-scanner/role-fallback.js +0 -46
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -22
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -303
- package/dist/core/live-scanner/scanner.js.map +0 -1
- package/dist/core/live-scanner/step-replayer.d.ts +0 -26
- package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
- package/dist/core/live-scanner/step-replayer.js +0 -473
- package/dist/core/live-scanner/step-replayer.js.map +0 -1
- package/dist/core/live-scanner/types.d.ts +0 -52
- package/dist/core/live-scanner/types.d.ts.map +0 -1
- package/dist/core/live-scanner/types.js +0 -14
- package/dist/core/live-scanner/types.js.map +0 -1
- package/dist/core/selector-base/annotation-handler.d.ts +0 -45
- package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
- package/dist/core/selector-base/annotation-handler.js +0 -102
- package/dist/core/selector-base/annotation-handler.js.map +0 -1
- package/dist/core/selector-base/base-generator.d.ts +0 -49
- package/dist/core/selector-base/base-generator.d.ts.map +0 -1
- package/dist/core/selector-base/base-generator.js +0 -214
- package/dist/core/selector-base/base-generator.js.map +0 -1
- package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
- package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
- package/dist/core/selector-base/gherkin-parser.js +0 -42
- package/dist/core/selector-base/gherkin-parser.js.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.js +0 -477
- package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
- package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
- package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/react-scanner.js +0 -163
- package/dist/core/ui-scanner/react-scanner.js.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.js +0 -33
- package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.js +0 -511
- package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
- package/dist/core/validator/data-validator.d.ts +0 -38
- package/dist/core/validator/data-validator.d.ts.map +0 -1
- package/dist/core/validator/data-validator.js +0 -212
- package/dist/core/validator/data-validator.js.map +0 -1
- package/dist/core/validator/feature-validator.d.ts +0 -27
- package/dist/core/validator/feature-validator.d.ts.map +0 -1
- package/dist/core/validator/feature-validator.js +0 -182
- package/dist/core/validator/feature-validator.js.map +0 -1
- package/dist/core/validator/index.d.ts +0 -46
- package/dist/core/validator/index.d.ts.map +0 -1
- package/dist/core/validator/index.js +0 -17
- package/dist/core/validator/index.js.map +0 -1
- package/dist/core/validator/screen-validator.d.ts +0 -35
- package/dist/core/validator/screen-validator.d.ts.map +0 -1
- package/dist/core/validator/screen-validator.js +0 -195
- package/dist/core/validator/screen-validator.js.map +0 -1
- package/dist/core/validator/selector-validator.d.ts +0 -36
- package/dist/core/validator/selector-validator.d.ts.map +0 -1
- package/dist/core/validator/selector-validator.js +0 -210
- package/dist/core/validator/selector-validator.js.map +0 -1
- package/dist/external/ai-provider.d.ts +0 -60
- package/dist/external/ai-provider.d.ts.map +0 -1
- package/dist/external/ai-provider.js +0 -30
- package/dist/external/ai-provider.js.map +0 -1
- package/dist/external/anthropic-provider.d.ts +0 -29
- package/dist/external/anthropic-provider.d.ts.map +0 -1
- package/dist/external/anthropic-provider.js +0 -85
- package/dist/external/anthropic-provider.js.map +0 -1
- package/dist/generators/cache/cache-manager.d.ts +0 -66
- package/dist/generators/cache/cache-manager.d.ts.map +0 -1
- package/dist/generators/cache/cache-manager.js +0 -286
- package/dist/generators/cache/cache-manager.js.map +0 -1
- package/dist/generators/dsl-writer/index.d.ts +0 -33
- package/dist/generators/dsl-writer/index.d.ts.map +0 -1
- package/dist/generators/dsl-writer/index.js +0 -226
- package/dist/generators/dsl-writer/index.js.map +0 -1
- package/dist/generators/scaffold-generator/index.d.ts +0 -162
- package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
- package/dist/generators/scaffold-generator/index.js +0 -877
- package/dist/generators/scaffold-generator/index.js.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.js +0 -457
- package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/index.d.ts +0 -8
- package/dist/generators/selector-mapper/index.d.ts.map +0 -1
- package/dist/generators/selector-mapper/index.js +0 -12
- package/dist/generators/selector-mapper/index.js.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.js +0 -204
- package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.js +0 -82
- package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
- package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.js +0 -797
- package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
- package/dist/orchestrator/cache-manager.d.ts +0 -15
- package/dist/orchestrator/cache-manager.d.ts.map +0 -1
- package/dist/orchestrator/cache-manager.js +0 -62
- package/dist/orchestrator/cache-manager.js.map +0 -1
- package/dist/orchestrator/pipeline.d.ts +0 -56
- package/dist/orchestrator/pipeline.d.ts.map +0 -1
- package/dist/orchestrator/pipeline.js +0 -298
- package/dist/orchestrator/pipeline.js.map +0 -1
- package/dist/orchestrator/reporter.d.ts +0 -15
- package/dist/orchestrator/reporter.d.ts.map +0 -1
- package/dist/orchestrator/reporter.js +0 -30
- package/dist/orchestrator/reporter.js.map +0 -1
- package/src/cli/commands/cache-clear.ts +0 -22
- package/src/cli/commands/full.ts +0 -35
- package/src/cli/commands/live-scan.ts +0 -82
- package/src/cli/commands/map.ts +0 -97
- package/src/cli/commands/validate.ts +0 -43
- package/src/cli/utils.ts +0 -106
- package/src/config/ai-providers.yaml +0 -56
- package/src/config/config-loader.ts +0 -248
- package/src/config/config-schema.ts +0 -148
- package/src/config/default.config.yaml +0 -107
- package/src/config/framework.config.yaml +0 -52
- package/src/config/routes.yaml +0 -31
- package/src/core/live-scanner/config-reader.ts +0 -57
- package/src/core/live-scanner/element-finder.ts +0 -534
- package/src/core/live-scanner/index.ts +0 -7
- package/src/core/live-scanner/matrix-reader.ts +0 -65
- package/src/core/live-scanner/matrix-writer.ts +0 -77
- package/src/core/live-scanner/role-fallback.ts +0 -44
- package/src/core/live-scanner/scanner.ts +0 -321
- package/src/core/live-scanner/step-replayer.ts +0 -503
- package/src/core/live-scanner/types.ts +0 -58
- package/src/core/selector-base/annotation-handler.ts +0 -127
- package/src/core/selector-base/base-generator.ts +0 -234
- package/src/core/selector-base/gherkin-parser.ts +0 -57
- package/src/core/selector-mapper/priority-mapper.ts +0 -607
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
- package/src/core/ui-scanner/react-scanner.ts +0 -156
- package/src/core/ui-scanner/scanner-interface.ts +0 -133
- package/src/core/ui-scanner/strict-scanner.ts +0 -629
- package/src/core/validator/data-validator.ts +0 -202
- package/src/core/validator/feature-validator.ts +0 -176
- package/src/core/validator/index.ts +0 -57
- package/src/core/validator/screen-validator.ts +0 -209
- package/src/core/validator/selector-validator.ts +0 -209
- package/src/external/ai-provider.ts +0 -90
- package/src/external/anthropic-provider.ts +0 -114
- package/src/generators/README.md +0 -410
- package/src/generators/cache/cache-manager.ts +0 -322
- package/src/generators/dsl-writer/index.ts +0 -253
- package/src/generators/scaffold-generator/index.ts +0 -1029
- package/src/generators/selector-mapper/ai-mapper.ts +0 -528
- package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
- package/src/generators/selector-mapper/index.ts +0 -10
- package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
- package/src/generators/test-generator/ai-step-mapper.ts +0 -224
- package/src/generators/test-generator/auth-setup-generator.ts +0 -59
- package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
- package/src/generators/ui-model-builder/react-scanner.ts +0 -959
- package/src/orchestrator/cache-manager.ts +0 -32
- package/src/orchestrator/pipeline.ts +0 -354
- package/src/orchestrator/reporter.ts +0 -36
package/docs/makeauth.md
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# sungen makeauth
|
|
2
|
+
|
|
3
|
+
Generate authentication state for E2E tests with SSO (Single Sign-On) support.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The `makeauth` command opens a browser window for manual login (including SSO providers like Google, Facebook, GitHub, etc.) and saves the authentication state to a JSON file. This storage state can then be used in Playwright tests to skip the login process.
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
sungen makeauth <name> [options]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### Arguments
|
|
16
|
+
|
|
17
|
+
| Argument | Description |
|
|
18
|
+
|----------|-------------|
|
|
19
|
+
| `name` | Name for the auth state (e.g., `admin`, `user`, `guest`) |
|
|
20
|
+
|
|
21
|
+
### Options
|
|
22
|
+
|
|
23
|
+
| Option | Description | Default |
|
|
24
|
+
|--------|-------------|---------|
|
|
25
|
+
| `-u, --url <url>` | Base URL of the application | Auto-detect from `playwright.config.ts` |
|
|
26
|
+
| `-p, --path <path>` | Login page path | `/login` |
|
|
27
|
+
| `-o, --output <dir>` | Output directory for auth files | `specs/.auth` |
|
|
28
|
+
| `-t, --timeout <ms>` | Overall timeout for login process | `180000` (3 minutes) |
|
|
29
|
+
| `--nav-timeout <ms>` | Navigation timeout (page load) | `180000` (3 minutes) |
|
|
30
|
+
| `--stability-wait <ms>` | URL stability wait before confirming login | `5000` (5 seconds) |
|
|
31
|
+
| `--headless` | Run browser in headless mode | `false` |
|
|
32
|
+
| `--verify` | Verify existing auth state is still valid | - |
|
|
33
|
+
| `--list` | List all existing auth states | - |
|
|
34
|
+
| `--export` | Export auth state as base64 (for CI) | - |
|
|
35
|
+
|
|
36
|
+
### Timeout Configuration
|
|
37
|
+
|
|
38
|
+
| Config | Default | Description |
|
|
39
|
+
|--------|---------|-------------|
|
|
40
|
+
| `timeout` | 180000 (3 min) | Overall timeout for the entire login process |
|
|
41
|
+
| `nav-timeout` | 180000 (3 min) | Timeout for page navigation (page.goto) |
|
|
42
|
+
| `stability-wait` | 5000 (5 sec) | Time URL must remain stable before confirming successful login |
|
|
43
|
+
|
|
44
|
+
## Examples
|
|
45
|
+
|
|
46
|
+
### Create auth state
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Basic usage - auto-detect URL from playwright.config.ts
|
|
50
|
+
sungen makeauth admin
|
|
51
|
+
|
|
52
|
+
# Specify URL explicitly
|
|
53
|
+
sungen makeauth admin --url https://myapp.com
|
|
54
|
+
|
|
55
|
+
# Custom login path
|
|
56
|
+
sungen makeauth admin --url https://myapp.com --path /auth/signin
|
|
57
|
+
|
|
58
|
+
# Longer timeout for slow SSO providers
|
|
59
|
+
sungen makeauth admin --timeout 300000
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Manage auth states
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# List all auth states
|
|
66
|
+
sungen makeauth admin --list
|
|
67
|
+
|
|
68
|
+
# Verify auth state is still valid
|
|
69
|
+
sungen makeauth admin --verify
|
|
70
|
+
|
|
71
|
+
# Export for CI (base64)
|
|
72
|
+
sungen makeauth admin --export
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## URL Detection Priority
|
|
76
|
+
|
|
77
|
+
The command automatically detects the base URL in this order:
|
|
78
|
+
|
|
79
|
+
1. `--url` flag (if provided)
|
|
80
|
+
2. `playwright.config.ts` - reads `baseURL` from the config
|
|
81
|
+
3. `APP_BASE_URL` environment variable
|
|
82
|
+
4. Default: `http://localhost:3000`
|
|
83
|
+
|
|
84
|
+
## Supported SSO Providers
|
|
85
|
+
|
|
86
|
+
The tool automatically detects and displays the SSO provider being used:
|
|
87
|
+
|
|
88
|
+
| Provider | Detection |
|
|
89
|
+
|----------|-----------|
|
|
90
|
+
| Google | accounts.google.com |
|
|
91
|
+
| Facebook | facebook.com |
|
|
92
|
+
| GitHub | github.com |
|
|
93
|
+
| Microsoft/Azure AD | login.microsoftonline.com |
|
|
94
|
+
| Apple | appleid.apple.com |
|
|
95
|
+
| X (Twitter) | twitter.com, x.com |
|
|
96
|
+
| LinkedIn | linkedin.com |
|
|
97
|
+
| Okta | *.okta.com |
|
|
98
|
+
| Auth0 | *.auth0.com |
|
|
99
|
+
| GitLab | gitlab.com |
|
|
100
|
+
| Atlassian | atlassian.com, bitbucket.org |
|
|
101
|
+
| Slack | slack.com |
|
|
102
|
+
| Discord | discord.com |
|
|
103
|
+
| Amazon Cognito | amazoncognito.com |
|
|
104
|
+
| Yahoo | yahoo.com |
|
|
105
|
+
|
|
106
|
+
Any other SSO provider will show the domain name.
|
|
107
|
+
|
|
108
|
+
## How It Works
|
|
109
|
+
|
|
110
|
+
1. **Open Browser**: Launches Chromium browser and navigates to login page
|
|
111
|
+
2. **Wait for SSO**: Detects when user clicks SSO button (redirect to external domain)
|
|
112
|
+
3. **Wait for Callback**: Monitors for redirect back to application
|
|
113
|
+
4. **Save State**: Stores cookies, localStorage, and sessionStorage to JSON file
|
|
114
|
+
5. **Auto-close**: Browser closes automatically after successful login
|
|
115
|
+
|
|
116
|
+
You can also press **ENTER** at any time to manually save the current state.
|
|
117
|
+
|
|
118
|
+
## Output
|
|
119
|
+
|
|
120
|
+
Auth states are saved to `specs/.auth/<name>.json`:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
specs/
|
|
124
|
+
.auth/
|
|
125
|
+
admin.json
|
|
126
|
+
user.json
|
|
127
|
+
guest.json
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Using in Playwright Tests
|
|
131
|
+
|
|
132
|
+
### Method 1: Global Setup (Recommended)
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// playwright.config.ts
|
|
136
|
+
import { defineConfig } from '@playwright/test';
|
|
137
|
+
|
|
138
|
+
export default defineConfig({
|
|
139
|
+
projects: [
|
|
140
|
+
{
|
|
141
|
+
name: 'authenticated',
|
|
142
|
+
use: {
|
|
143
|
+
storageState: 'specs/.auth/admin.json',
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Method 2: Per-test Setup
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
// my-test.spec.ts
|
|
154
|
+
import { test } from '@playwright/test';
|
|
155
|
+
|
|
156
|
+
test.use({ storageState: 'specs/.auth/admin.json' });
|
|
157
|
+
|
|
158
|
+
test('authenticated test', async ({ page }) => {
|
|
159
|
+
await page.goto('/dashboard');
|
|
160
|
+
// Already logged in!
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Method 3: Multiple Roles
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// playwright.config.ts
|
|
168
|
+
export default defineConfig({
|
|
169
|
+
projects: [
|
|
170
|
+
{
|
|
171
|
+
name: 'admin',
|
|
172
|
+
use: { storageState: 'specs/.auth/admin.json' },
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'user',
|
|
176
|
+
use: { storageState: 'specs/.auth/user.json' },
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
});
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## CI/CD Integration
|
|
183
|
+
|
|
184
|
+
### Option 1: Pre-generated Auth State
|
|
185
|
+
|
|
186
|
+
1. Generate auth state locally:
|
|
187
|
+
```bash
|
|
188
|
+
sungen makeauth admin
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
2. Export as base64:
|
|
192
|
+
```bash
|
|
193
|
+
sungen makeauth admin --export
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
3. Save to CI secret (e.g., `AUTH_STATE_ADMIN`)
|
|
197
|
+
|
|
198
|
+
4. In CI, decode and save:
|
|
199
|
+
```bash
|
|
200
|
+
echo "$AUTH_STATE_ADMIN" | base64 -d > specs/.auth/admin.json
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Option 2: Service Account
|
|
204
|
+
|
|
205
|
+
For automated CI without SSO:
|
|
206
|
+
1. Create a service account with username/password login
|
|
207
|
+
2. Use Playwright's built-in auth setup
|
|
208
|
+
|
|
209
|
+
## Troubleshooting
|
|
210
|
+
|
|
211
|
+
### Browser closes immediately
|
|
212
|
+
- Make sure to click the SSO button before the browser closes
|
|
213
|
+
- The tool waits for you to leave the base URL domain
|
|
214
|
+
|
|
215
|
+
### Auth state expired
|
|
216
|
+
- Run `sungen makeauth admin --verify` to check
|
|
217
|
+
- Regenerate with `sungen makeauth admin`
|
|
218
|
+
|
|
219
|
+
### Wrong URL detected
|
|
220
|
+
- Check your `playwright.config.ts` has correct `baseURL`
|
|
221
|
+
- Or specify explicitly: `--url https://your-app.com`
|
|
222
|
+
|
|
223
|
+
### Timeout error
|
|
224
|
+
- Increase timeout: `--timeout 300000` (5 minutes)
|
|
225
|
+
- Or press ENTER to save manually at any time
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sun-asterisk/sungen",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.1",
|
|
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": {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc && npm run copy-templates",
|
|
12
|
-
"copy-templates": "mkdir -p dist/generators/test-generator/adapters/playwright/templates/steps && mkdir -p dist/generators/test-generator/templates && cp -r src/generators/test-generator/adapters/playwright/templates/*.hbs dist/generators/test-generator/adapters/playwright/templates/ 2>/dev/null || true && cp -r src/generators/test-generator/adapters/playwright/templates/steps dist/generators/test-generator/adapters/playwright/templates/ && cp src/generators/test-generator/templates/*.hbs dist/generators/test-generator/templates/ 2>/dev/null || true",
|
|
12
|
+
"copy-templates": "mkdir -p dist/generators/test-generator/adapters/playwright/templates/steps && mkdir -p dist/generators/test-generator/templates && mkdir -p dist/orchestrator/templates && cp -r src/generators/test-generator/adapters/playwright/templates/*.hbs dist/generators/test-generator/adapters/playwright/templates/ 2>/dev/null || true && cp -r src/generators/test-generator/adapters/playwright/templates/steps dist/generators/test-generator/adapters/playwright/templates/ && cp src/generators/test-generator/templates/*.hbs dist/generators/test-generator/templates/ 2>/dev/null || true && cp -r src/orchestrator/templates/* dist/orchestrator/templates/",
|
|
13
13
|
"dev": "tsx src/cli/index.ts",
|
|
14
14
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
15
15
|
"prepublishOnly": "npm run build"
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
"dist",
|
|
68
68
|
"bin",
|
|
69
69
|
"src",
|
|
70
|
+
"docs",
|
|
70
71
|
"README.md",
|
|
71
72
|
"LICENSE"
|
|
72
73
|
]
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
await page.keyboard.press('{{key}}');
|
package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
await {{> locator}}.scrollIntoViewIfNeeded();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
await page.waitForLoadState('networkidle');
|
|
2
|
-
await expect(page.getByText('{{escapeQuotes value}}'
|
|
2
|
+
await expect(page.getByText('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{#if (gt nth 0)}}.nth({{subtract nth 1}}){{/if}}).toBeVisible();
|
package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
{{#switch strategy~}}
|
|
1
|
+
{{#if scope}}{{pageRoot}}.getByLabel('{{escapeQuotes scope}}').{{#switch strategy~}}
|
|
2
|
+
{{~#case 'testid'}}getByTestId('{{value}}'){{/case~}}
|
|
3
|
+
{{~#case 'role'}}{{#if name}}getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{else}}getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}){{/if}}{{/case~}}
|
|
4
|
+
{{~#case 'placeholder'}}getByPlaceholder('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
5
|
+
{{~#case 'label'}}getByLabel('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
6
|
+
{{~#case 'text'}}getByText('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
7
|
+
{{~#case 'locator'}}locator('{{value}}'){{/case~}}
|
|
8
|
+
{{~#case 'id'}}locator('{{value}}'){{/case~}}
|
|
9
|
+
{{~#default}}locator('{{value}}'){{/default~}}
|
|
10
|
+
{{~/switch}}{{else}}{{#switch strategy~}}
|
|
2
11
|
{{~#case 'testid'}}{{> locator-strategies/testid}}{{/case~}}
|
|
3
12
|
{{~#case 'role'}}{{> locator-strategies/role}}{{/case~}}
|
|
4
13
|
{{~#case 'placeholder'}}{{> locator-strategies/placeholder}}{{/case~}}
|
|
@@ -7,4 +16,4 @@
|
|
|
7
16
|
{{~#case 'locator'}}{{> locator-strategies/locator}}{{/case~}}
|
|
8
17
|
{{~#case 'id'}}{{> locator-strategies/id}}{{/case~}}
|
|
9
18
|
{{~#default}}{{> locator-strategies/default}}{{/default~}}
|
|
10
|
-
{{~/switch}}
|
|
19
|
+
{{~/switch}}{{/if}}
|
package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
{{#switch strategy~}}
|
|
1
|
+
{{#if scope}}{{pageRoot}}.getByLabel('{{escapeQuotes scope}}').{{#switch strategy~}}
|
|
2
|
+
{{~#case 'testid'}}getByTestId('{{value}}'){{/case~}}
|
|
3
|
+
{{~#case 'role'}}{{#if name}}getByRole('{{role}}', { name: '{{escapeQuotes name}}'{{#if exact}}, exact: true{{/if}} }){{else}}getByRole('{{role}}'{{#if exact}}, { exact: true }{{/if}}){{/if}}{{/case~}}
|
|
4
|
+
{{~#case 'placeholder'}}getByPlaceholder('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
5
|
+
{{~#case 'label'}}getByLabel('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
6
|
+
{{~#case 'text'}}getByText('{{escapeQuotes value}}'{{#if exact}}, { exact: true }{{/if}}){{/case~}}
|
|
7
|
+
{{~#case 'locator'}}locator('{{value}}'){{/case~}}
|
|
8
|
+
{{~#case 'id'}}locator('{{value}}'){{/case~}}
|
|
9
|
+
{{~#default}}locator('{{value}}'){{/default~}}
|
|
10
|
+
{{~/switch}}{{> locator-nth}}{{else}}{{#switch strategy~}}
|
|
2
11
|
{{~#case 'testid'}}{{> locator-strategies/testid}}{{/case~}}
|
|
3
12
|
{{~#case 'role'}}{{> locator-strategies/role}}{{/case~}}
|
|
4
13
|
{{~#case 'placeholder'}}{{> locator-strategies/placeholder}}{{/case~}}
|
|
@@ -7,4 +16,4 @@
|
|
|
7
16
|
{{~#case 'locator'}}{{> locator-strategies/locator}}{{/case~}}
|
|
8
17
|
{{~#case 'id'}}{{> locator-strategies/id}}{{/case~}}
|
|
9
18
|
{{~#default}}{{> locator-strategies/default}}{{/default~}}
|
|
10
|
-
{{~/switch}}{{> locator-nth}}
|
|
19
|
+
{{~/switch}}{{> locator-nth}}{{/if}}
|