@sun-asterisk/sungen 1.0.24 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -74
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +5 -3
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +110 -35
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.js +5 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/dist/generators/test-generator/code-generator.d.ts +0 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +10 -47
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +2 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +4 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +17 -5
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +47 -0
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js +36 -0
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js +25 -0
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/table-patterns.js +192 -0
- package/dist/generators/test-generator/patterns/table-patterns.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +5 -3
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +38 -27
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +4 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/types.d.ts +7 -24
- package/dist/generators/test-generator/types.d.ts.map +1 -1
- package/dist/generators/test-generator/types.js +2 -101
- package/dist/generators/test-generator/types.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +14 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +37 -11
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +12 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +72 -160
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +1 -32
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +55 -216
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-rules.md +189 -0
- package/dist/orchestrator/templates/gitignore +16 -0
- package/dist/orchestrator/templates/playwright.config.d.ts +10 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -0
- package/dist/orchestrator/templates/playwright.config.js +77 -0
- package/dist/orchestrator/templates/playwright.config.js.map +1 -0
- package/dist/orchestrator/templates/playwright.config.ts +80 -0
- package/dist/orchestrator/templates/readme.md +197 -0
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +3 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/docs/gherkin standards/gherkin-core-standard.md +377 -0
- package/docs/gherkin standards/gherkin-core-standard.vi.md +303 -0
- package/docs/gherkin-dictionary.md +1071 -0
- package/docs/makeauth.md +225 -0
- package/package.json +4 -3
- package/src/cli/commands/add.ts +5 -3
- package/src/cli/commands/generate.ts +90 -38
- package/src/cli/index.ts +5 -16
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-enter-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/frame-exit-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/keyboard-global-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/scroll-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-filter.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-cell-by-index.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-column-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +11 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +11 -2
- package/src/generators/test-generator/code-generator.ts +11 -59
- package/src/generators/test-generator/patterns/assertion-patterns.ts +2 -0
- package/src/generators/test-generator/patterns/index.ts +12 -3
- package/src/generators/test-generator/patterns/interaction-patterns.ts +1 -1
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +51 -0
- package/src/generators/test-generator/patterns/scope-patterns.ts +40 -0
- package/src/generators/test-generator/patterns/scroll-patterns.ts +27 -0
- package/src/generators/test-generator/patterns/table-patterns.ts +232 -0
- package/src/generators/test-generator/step-mapper.ts +42 -27
- package/src/generators/test-generator/template-engine.ts +3 -1
- package/src/generators/test-generator/types.ts +7 -112
- package/src/generators/test-generator/utils/selector-resolver.ts +70 -25
- package/src/orchestrator/project-initializer.ts +75 -160
- package/src/orchestrator/screen-manager.ts +61 -233
- package/src/orchestrator/templates/ai-rules.md +189 -0
- package/src/orchestrator/templates/gitignore +16 -0
- package/src/orchestrator/templates/playwright.config.ts +80 -0
- package/src/orchestrator/templates/readme.md +197 -0
- package/src/utils/selector-types.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts +0 -3
- package/dist/cli/commands/cache-clear.d.ts.map +0 -1
- package/dist/cli/commands/cache-clear.js +0 -24
- package/dist/cli/commands/cache-clear.js.map +0 -1
- package/dist/cli/commands/full.d.ts +0 -3
- package/dist/cli/commands/full.d.ts.map +0 -1
- package/dist/cli/commands/full.js +0 -37
- package/dist/cli/commands/full.js.map +0 -1
- package/dist/cli/commands/live-scan.d.ts +0 -3
- package/dist/cli/commands/live-scan.d.ts.map +0 -1
- package/dist/cli/commands/live-scan.js +0 -78
- package/dist/cli/commands/live-scan.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -3
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -93
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -3
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -43
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -6
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -101
- package/dist/cli/utils.js.map +0 -1
- package/dist/config/config-loader.d.ts +0 -51
- package/dist/config/config-loader.d.ts.map +0 -1
- package/dist/config/config-loader.js +0 -216
- package/dist/config/config-loader.js.map +0 -1
- package/dist/config/config-schema.d.ts +0 -121
- package/dist/config/config-schema.d.ts.map +0 -1
- package/dist/config/config-schema.js +0 -7
- package/dist/config/config-schema.js.map +0 -1
- package/dist/core/live-scanner/config-reader.d.ts +0 -10
- package/dist/core/live-scanner/config-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/config-reader.js +0 -87
- package/dist/core/live-scanner/config-reader.js.map +0 -1
- package/dist/core/live-scanner/element-finder.d.ts +0 -20
- package/dist/core/live-scanner/element-finder.d.ts.map +0 -1
- package/dist/core/live-scanner/element-finder.js +0 -481
- package/dist/core/live-scanner/element-finder.js.map +0 -1
- package/dist/core/live-scanner/index.d.ts +0 -8
- package/dist/core/live-scanner/index.d.ts.map +0 -1
- package/dist/core/live-scanner/index.js +0 -33
- package/dist/core/live-scanner/index.js.map +0 -1
- package/dist/core/live-scanner/matrix-reader.d.ts +0 -17
- package/dist/core/live-scanner/matrix-reader.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-reader.js +0 -60
- package/dist/core/live-scanner/matrix-reader.js.map +0 -1
- package/dist/core/live-scanner/matrix-writer.d.ts +0 -7
- package/dist/core/live-scanner/matrix-writer.d.ts.map +0 -1
- package/dist/core/live-scanner/matrix-writer.js +0 -103
- package/dist/core/live-scanner/matrix-writer.js.map +0 -1
- package/dist/core/live-scanner/role-fallback.d.ts +0 -15
- package/dist/core/live-scanner/role-fallback.d.ts.map +0 -1
- package/dist/core/live-scanner/role-fallback.js +0 -46
- package/dist/core/live-scanner/role-fallback.js.map +0 -1
- package/dist/core/live-scanner/scanner.d.ts +0 -22
- package/dist/core/live-scanner/scanner.d.ts.map +0 -1
- package/dist/core/live-scanner/scanner.js +0 -303
- package/dist/core/live-scanner/scanner.js.map +0 -1
- package/dist/core/live-scanner/step-replayer.d.ts +0 -26
- package/dist/core/live-scanner/step-replayer.d.ts.map +0 -1
- package/dist/core/live-scanner/step-replayer.js +0 -473
- package/dist/core/live-scanner/step-replayer.js.map +0 -1
- package/dist/core/live-scanner/types.d.ts +0 -52
- package/dist/core/live-scanner/types.d.ts.map +0 -1
- package/dist/core/live-scanner/types.js +0 -14
- package/dist/core/live-scanner/types.js.map +0 -1
- package/dist/core/selector-base/annotation-handler.d.ts +0 -45
- package/dist/core/selector-base/annotation-handler.d.ts.map +0 -1
- package/dist/core/selector-base/annotation-handler.js +0 -102
- package/dist/core/selector-base/annotation-handler.js.map +0 -1
- package/dist/core/selector-base/base-generator.d.ts +0 -49
- package/dist/core/selector-base/base-generator.d.ts.map +0 -1
- package/dist/core/selector-base/base-generator.js +0 -214
- package/dist/core/selector-base/base-generator.js.map +0 -1
- package/dist/core/selector-base/gherkin-parser.d.ts +0 -24
- package/dist/core/selector-base/gherkin-parser.d.ts.map +0 -1
- package/dist/core/selector-base/gherkin-parser.js +0 -42
- package/dist/core/selector-base/gherkin-parser.js.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.d.ts +0 -74
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +0 -1
- package/dist/core/selector-mapper/priority-mapper.js +0 -477
- package/dist/core/selector-mapper/priority-mapper.js.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +0 -91
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +0 -1
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +0 -175
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +0 -1
- package/dist/core/ui-scanner/react-scanner.d.ts +0 -32
- package/dist/core/ui-scanner/react-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/react-scanner.js +0 -163
- package/dist/core/ui-scanner/react-scanner.js.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.d.ts +0 -94
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +0 -1
- package/dist/core/ui-scanner/scanner-interface.js +0 -33
- package/dist/core/ui-scanner/scanner-interface.js.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.d.ts +0 -81
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +0 -1
- package/dist/core/ui-scanner/strict-scanner.js +0 -511
- package/dist/core/ui-scanner/strict-scanner.js.map +0 -1
- package/dist/core/validator/data-validator.d.ts +0 -38
- package/dist/core/validator/data-validator.d.ts.map +0 -1
- package/dist/core/validator/data-validator.js +0 -212
- package/dist/core/validator/data-validator.js.map +0 -1
- package/dist/core/validator/feature-validator.d.ts +0 -27
- package/dist/core/validator/feature-validator.d.ts.map +0 -1
- package/dist/core/validator/feature-validator.js +0 -182
- package/dist/core/validator/feature-validator.js.map +0 -1
- package/dist/core/validator/index.d.ts +0 -46
- package/dist/core/validator/index.d.ts.map +0 -1
- package/dist/core/validator/index.js +0 -17
- package/dist/core/validator/index.js.map +0 -1
- package/dist/core/validator/screen-validator.d.ts +0 -35
- package/dist/core/validator/screen-validator.d.ts.map +0 -1
- package/dist/core/validator/screen-validator.js +0 -195
- package/dist/core/validator/screen-validator.js.map +0 -1
- package/dist/core/validator/selector-validator.d.ts +0 -36
- package/dist/core/validator/selector-validator.d.ts.map +0 -1
- package/dist/core/validator/selector-validator.js +0 -210
- package/dist/core/validator/selector-validator.js.map +0 -1
- package/dist/external/ai-provider.d.ts +0 -60
- package/dist/external/ai-provider.d.ts.map +0 -1
- package/dist/external/ai-provider.js +0 -30
- package/dist/external/ai-provider.js.map +0 -1
- package/dist/external/anthropic-provider.d.ts +0 -29
- package/dist/external/anthropic-provider.d.ts.map +0 -1
- package/dist/external/anthropic-provider.js +0 -85
- package/dist/external/anthropic-provider.js.map +0 -1
- package/dist/generators/cache/cache-manager.d.ts +0 -66
- package/dist/generators/cache/cache-manager.d.ts.map +0 -1
- package/dist/generators/cache/cache-manager.js +0 -286
- package/dist/generators/cache/cache-manager.js.map +0 -1
- package/dist/generators/dsl-writer/index.d.ts +0 -33
- package/dist/generators/dsl-writer/index.d.ts.map +0 -1
- package/dist/generators/dsl-writer/index.js +0 -226
- package/dist/generators/dsl-writer/index.js.map +0 -1
- package/dist/generators/scaffold-generator/index.d.ts +0 -162
- package/dist/generators/scaffold-generator/index.d.ts.map +0 -1
- package/dist/generators/scaffold-generator/index.js +0 -877
- package/dist/generators/scaffold-generator/index.js.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.d.ts +0 -56
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/ai-mapper.js +0 -457
- package/dist/generators/selector-mapper/ai-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +0 -67
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/hybrid-mapper.js +0 -349
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +0 -1
- package/dist/generators/selector-mapper/index.d.ts +0 -8
- package/dist/generators/selector-mapper/index.d.ts.map +0 -1
- package/dist/generators/selector-mapper/index.js +0 -12
- package/dist/generators/selector-mapper/index.js.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +0 -125
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +0 -1
- package/dist/generators/selector-mapper/intelligent-mapper.js +0 -391
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.d.ts +0 -27
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +0 -1
- package/dist/generators/test-generator/ai-step-mapper.js +0 -204
- package/dist/generators/test-generator/ai-step-mapper.js.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.d.ts +0 -18
- package/dist/generators/test-generator/auth-setup-generator.d.ts.map +0 -1
- package/dist/generators/test-generator/auth-setup-generator.js +0 -82
- package/dist/generators/test-generator/auth-setup-generator.js.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.js +0 -98
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +0 -1
- package/dist/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +0 -121
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/deep-scanner.js +0 -1113
- package/dist/generators/ui-model-builder/deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +0 -110
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +0 -608
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.d.ts +0 -107
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +0 -1
- package/dist/generators/ui-model-builder/react-scanner.js +0 -797
- package/dist/generators/ui-model-builder/react-scanner.js.map +0 -1
- package/dist/orchestrator/cache-manager.d.ts +0 -15
- package/dist/orchestrator/cache-manager.d.ts.map +0 -1
- package/dist/orchestrator/cache-manager.js +0 -62
- package/dist/orchestrator/cache-manager.js.map +0 -1
- package/dist/orchestrator/pipeline.d.ts +0 -56
- package/dist/orchestrator/pipeline.d.ts.map +0 -1
- package/dist/orchestrator/pipeline.js +0 -298
- package/dist/orchestrator/pipeline.js.map +0 -1
- package/dist/orchestrator/reporter.d.ts +0 -15
- package/dist/orchestrator/reporter.d.ts.map +0 -1
- package/dist/orchestrator/reporter.js +0 -30
- package/dist/orchestrator/reporter.js.map +0 -1
- package/src/cli/commands/cache-clear.ts +0 -22
- package/src/cli/commands/full.ts +0 -35
- package/src/cli/commands/live-scan.ts +0 -82
- package/src/cli/commands/map.ts +0 -97
- package/src/cli/commands/validate.ts +0 -43
- package/src/cli/utils.ts +0 -106
- package/src/config/ai-providers.yaml +0 -56
- package/src/config/config-loader.ts +0 -248
- package/src/config/config-schema.ts +0 -148
- package/src/config/default.config.yaml +0 -107
- package/src/config/framework.config.yaml +0 -52
- package/src/config/routes.yaml +0 -31
- package/src/core/live-scanner/config-reader.ts +0 -57
- package/src/core/live-scanner/element-finder.ts +0 -534
- package/src/core/live-scanner/index.ts +0 -7
- package/src/core/live-scanner/matrix-reader.ts +0 -65
- package/src/core/live-scanner/matrix-writer.ts +0 -77
- package/src/core/live-scanner/role-fallback.ts +0 -44
- package/src/core/live-scanner/scanner.ts +0 -321
- package/src/core/live-scanner/step-replayer.ts +0 -503
- package/src/core/live-scanner/types.ts +0 -58
- package/src/core/selector-base/annotation-handler.ts +0 -127
- package/src/core/selector-base/base-generator.ts +0 -234
- package/src/core/selector-base/gherkin-parser.ts +0 -57
- package/src/core/selector-mapper/priority-mapper.ts +0 -607
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +0 -216
- package/src/core/ui-scanner/react-scanner.ts +0 -156
- package/src/core/ui-scanner/scanner-interface.ts +0 -133
- package/src/core/ui-scanner/strict-scanner.ts +0 -629
- package/src/core/validator/data-validator.ts +0 -202
- package/src/core/validator/feature-validator.ts +0 -176
- package/src/core/validator/index.ts +0 -57
- package/src/core/validator/screen-validator.ts +0 -209
- package/src/core/validator/selector-validator.ts +0 -209
- package/src/external/ai-provider.ts +0 -90
- package/src/external/anthropic-provider.ts +0 -114
- package/src/generators/README.md +0 -410
- package/src/generators/cache/cache-manager.ts +0 -322
- package/src/generators/dsl-writer/index.ts +0 -253
- package/src/generators/scaffold-generator/index.ts +0 -1029
- package/src/generators/selector-mapper/ai-mapper.ts +0 -528
- package/src/generators/selector-mapper/hybrid-mapper.ts +0 -427
- package/src/generators/selector-mapper/index.ts +0 -10
- package/src/generators/selector-mapper/intelligent-mapper.ts +0 -530
- package/src/generators/test-generator/ai-step-mapper.ts +0 -224
- package/src/generators/test-generator/auth-setup-generator.ts +0 -59
- package/src/generators/test-generator/patterns/legacy-patterns.ts +0 -104
- package/src/generators/test-generator/templates/auth-setup.ts.hbs +0 -36
- package/src/generators/ui-model-builder/deep-scanner.ts +0 -1244
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +0 -731
- package/src/generators/ui-model-builder/react-scanner.ts +0 -959
- package/src/orchestrator/cache-manager.ts +0 -32
- package/src/orchestrator/pipeline.ts +0 -354
- package/src/orchestrator/reporter.ts +0 -36
|
@@ -1,38 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Test Generator
|
|
3
|
-
*
|
|
2
|
+
* Test Generator Types
|
|
3
|
+
* Core type definitions for the test generation compiler
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { RuntimeConfig } from '../../config/config-schema';
|
|
7
|
-
import { ParsedFeature } from '../../core/selector-base/gherkin-parser';
|
|
8
|
-
import * as path from 'path';
|
|
9
|
-
|
|
10
6
|
/**
|
|
11
|
-
*
|
|
12
|
-
*/
|
|
13
|
-
export interface TestGenerator {
|
|
14
|
-
readonly framework: string;
|
|
15
|
-
|
|
16
|
-
generate(
|
|
17
|
-
feature: ParsedFeature,
|
|
18
|
-
selectors: Record<string, any>,
|
|
19
|
-
testData: Record<string, any>,
|
|
20
|
-
config: RuntimeConfig
|
|
21
|
-
): Promise<GeneratedTest>;
|
|
22
|
-
|
|
23
|
-
getFileExtension(): string;
|
|
24
|
-
|
|
25
|
-
validate(): boolean;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Generated Test Result (executor-level)
|
|
7
|
+
* Generated Test Result
|
|
30
8
|
*/
|
|
31
9
|
export interface GeneratedTest {
|
|
32
|
-
|
|
33
|
-
|
|
10
|
+
featureName: string;
|
|
11
|
+
filePath: string;
|
|
34
12
|
code: string;
|
|
35
|
-
|
|
13
|
+
sourceFile?: string;
|
|
14
|
+
stepCount?: number;
|
|
36
15
|
}
|
|
37
16
|
|
|
38
17
|
/**
|
|
@@ -42,90 +21,6 @@ export interface GenerationStats {
|
|
|
42
21
|
totalScenarios: number;
|
|
43
22
|
totalSteps: number;
|
|
44
23
|
dictionaryMatched: number;
|
|
45
|
-
aiGenerated: number;
|
|
46
24
|
todoCount: number;
|
|
47
25
|
generationTime: number;
|
|
48
26
|
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Test Generator Factory
|
|
52
|
-
*/
|
|
53
|
-
export class TestGeneratorFactory {
|
|
54
|
-
static create(framework: string, config: RuntimeConfig): TestGenerator {
|
|
55
|
-
switch (framework) {
|
|
56
|
-
case 'playwright': {
|
|
57
|
-
const { CodeGenerator } = require('./code-generator');
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
framework: 'playwright',
|
|
61
|
-
|
|
62
|
-
async generate(
|
|
63
|
-
feature: ParsedFeature,
|
|
64
|
-
selectors: Record<string, any>,
|
|
65
|
-
testData: Record<string, any>,
|
|
66
|
-
cfg: RuntimeConfig
|
|
67
|
-
): Promise<GeneratedTest> {
|
|
68
|
-
const startTime = Date.now();
|
|
69
|
-
|
|
70
|
-
let screenName: string | undefined;
|
|
71
|
-
if (feature.sourceFile) {
|
|
72
|
-
const sourceDir = path.dirname(feature.sourceFile);
|
|
73
|
-
const parts = sourceDir.split(path.sep);
|
|
74
|
-
const screensIndex = parts.indexOf('screens');
|
|
75
|
-
if (screensIndex >= 0 && screensIndex < parts.length - 2) {
|
|
76
|
-
screenName = parts[screensIndex + 1];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const generator = new CodeGenerator({
|
|
81
|
-
useAI: cfg.testGenerator.enableAIFallback,
|
|
82
|
-
verbose: cfg.verbose,
|
|
83
|
-
screenName,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const outputDir = cfg.paths.specsDir;
|
|
87
|
-
const result = await generator.generateTest(feature, outputDir);
|
|
88
|
-
generator.writeTest(result);
|
|
89
|
-
|
|
90
|
-
const countSteps = (f: ParsedFeature) =>
|
|
91
|
-
f.scenarios.reduce((sum: number, s: any) => sum + (s.steps ? s.steps.length : 0), 0);
|
|
92
|
-
const countTodos = (code: string) => (code.match(/\/\/ TODO/g) || []).length;
|
|
93
|
-
|
|
94
|
-
const stats: GenerationStats = {
|
|
95
|
-
totalScenarios: feature.scenarios.length,
|
|
96
|
-
totalSteps: countSteps(feature),
|
|
97
|
-
dictionaryMatched: 0,
|
|
98
|
-
aiGenerated: 0,
|
|
99
|
-
todoCount: countTodos(result.code),
|
|
100
|
-
generationTime: Date.now() - startTime,
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
return {
|
|
104
|
-
feature: feature.name,
|
|
105
|
-
outputPath: result.filePath,
|
|
106
|
-
code: result.code,
|
|
107
|
-
stats,
|
|
108
|
-
};
|
|
109
|
-
},
|
|
110
|
-
|
|
111
|
-
getFileExtension() {
|
|
112
|
-
return '.spec.ts';
|
|
113
|
-
},
|
|
114
|
-
|
|
115
|
-
validate() {
|
|
116
|
-
return true;
|
|
117
|
-
},
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
case 'appium':
|
|
122
|
-
throw new Error('Appium generator not yet implemented');
|
|
123
|
-
|
|
124
|
-
case 'integration':
|
|
125
|
-
throw new Error('Integration test generator not yet implemented');
|
|
126
|
-
|
|
127
|
-
default:
|
|
128
|
-
throw new Error(`Unsupported test framework: ${framework}`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
@@ -190,15 +190,33 @@ function convertJapaneseToRomaji(text: string): string {
|
|
|
190
190
|
|
|
191
191
|
import { SelectorType } from '../../../utils/selector-types';
|
|
192
192
|
|
|
193
|
-
//
|
|
193
|
+
// Structured selector format v2
|
|
194
194
|
interface SelectorEntry {
|
|
195
|
-
locator?: string;
|
|
196
|
-
type?: SelectorType;
|
|
197
|
-
value?: string;
|
|
198
|
-
name?: string;
|
|
199
|
-
nth?: number;
|
|
200
|
-
exact?: boolean;
|
|
201
|
-
inputMethod?: string;
|
|
195
|
+
locator?: string; // CSS locator (optional, empty string means use type/value)
|
|
196
|
+
type?: SelectorType; // Locator strategy
|
|
197
|
+
value?: string; // Natural language value for the locator (e.g., 'button', 'link' for role)
|
|
198
|
+
name?: string; // Accessible name for role-based selectors (e.g., 'Login', 'Submit')
|
|
199
|
+
nth?: number; // Element index (0 = no index, 1+ = append .nth())
|
|
200
|
+
exact?: boolean; // Whether to use exact matching (default: false)
|
|
201
|
+
inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
|
|
202
|
+
|
|
203
|
+
// === v2: Disambiguation ===
|
|
204
|
+
scope?: string; // Parent landmark aria-label to scope within (e.g., 'desktop navigation')
|
|
205
|
+
match?: 'exact' | 'partial'; // For getByText matching (default: partial)
|
|
206
|
+
|
|
207
|
+
// === v2: Complex Elements ===
|
|
208
|
+
variant?: 'native' | 'custom' | 'dragdrop'; // Dropdown/upload subtype
|
|
209
|
+
trigger?: string; // Visible button that triggers hidden file input
|
|
210
|
+
frame?: string; // iframe selector for cross-frame elements
|
|
211
|
+
contenteditable?: boolean; // Rich text editor (contenteditable div)
|
|
212
|
+
|
|
213
|
+
// === v2: Table ===
|
|
214
|
+
columns?: Record<string, { index: number; header: string; elements?: Record<string, SelectorEntry> }>;
|
|
215
|
+
pagination?: Record<string, string>;
|
|
216
|
+
|
|
217
|
+
// === v2: Assertion Helpers ===
|
|
218
|
+
attribute?: string; // Attribute to check (for "has" assertions)
|
|
219
|
+
pattern?: string; // Regex for attribute value
|
|
202
220
|
}
|
|
203
221
|
|
|
204
222
|
// New selector file structure: flat key-value pairs
|
|
@@ -220,12 +238,24 @@ interface LegacySelectorFile {
|
|
|
220
238
|
export interface ResolvedSelector {
|
|
221
239
|
strategy: 'testid' | 'id' | 'placeholder' | 'label' | 'text' | 'css' | 'role' | 'locator';
|
|
222
240
|
value: string;
|
|
223
|
-
role?: string;
|
|
224
|
-
name?: string;
|
|
225
|
-
locator?: string;
|
|
226
|
-
nth?: number;
|
|
227
|
-
exact?: boolean;
|
|
241
|
+
role?: string; // For role-based selectors (e.g., 'button', 'link')
|
|
242
|
+
name?: string; // For accessible name in role selectors
|
|
243
|
+
locator?: string; // CSS locator for fallback
|
|
244
|
+
nth?: number; // Index for .nth() if multiple matches exist
|
|
245
|
+
exact?: boolean; // Whether to use exact matching (default: false)
|
|
228
246
|
inputMethod?: string; // 'pressSequentially' for contenteditable/rich-text elements
|
|
247
|
+
|
|
248
|
+
// === v2 fields ===
|
|
249
|
+
scope?: string; // Parent landmark to scope within
|
|
250
|
+
match?: 'exact' | 'partial'; // For getByText exact matching
|
|
251
|
+
variant?: 'native' | 'custom' | 'dragdrop'; // Dropdown/upload type
|
|
252
|
+
trigger?: string; // Button that triggers hidden file input
|
|
253
|
+
frame?: string; // iframe selector
|
|
254
|
+
contenteditable?: boolean; // Rich text editor
|
|
255
|
+
columns?: Record<string, { index: number; header: string; elements?: Record<string, any> }>;
|
|
256
|
+
pagination?: Record<string, string>;
|
|
257
|
+
attribute?: string; // Attribute to check
|
|
258
|
+
pattern?: string; // Regex for attribute value
|
|
229
259
|
}
|
|
230
260
|
|
|
231
261
|
/**
|
|
@@ -520,17 +550,32 @@ export class SelectorResolver {
|
|
|
520
550
|
// Check if name exists in entry (even if empty string), use it; otherwise use originalLabel
|
|
521
551
|
const name = entry.name !== undefined && entry.name !== null ? entry.name : originalLabel;
|
|
522
552
|
const nth = entry.nth || 0;
|
|
523
|
-
const exact = entry.exact === true;
|
|
553
|
+
const exact = entry.exact === true || entry.match === 'exact';
|
|
524
554
|
const inputMethod = entry.inputMethod;
|
|
525
555
|
|
|
526
|
-
//
|
|
527
|
-
const
|
|
528
|
-
|
|
556
|
+
// v2 fields
|
|
557
|
+
const v2Fields: Partial<ResolvedSelector> = {};
|
|
558
|
+
if (entry.scope) v2Fields.scope = entry.scope;
|
|
559
|
+
if (entry.match) v2Fields.match = entry.match;
|
|
560
|
+
if (entry.variant) v2Fields.variant = entry.variant;
|
|
561
|
+
if (entry.trigger) v2Fields.trigger = entry.trigger;
|
|
562
|
+
if (entry.frame) v2Fields.frame = entry.frame;
|
|
563
|
+
if (entry.contenteditable) v2Fields.contenteditable = true;
|
|
564
|
+
if (entry.columns) v2Fields.columns = entry.columns;
|
|
565
|
+
if (entry.pagination) v2Fields.pagination = entry.pagination;
|
|
566
|
+
if (entry.attribute) v2Fields.attribute = entry.attribute;
|
|
567
|
+
if (entry.pattern) v2Fields.pattern = entry.pattern;
|
|
568
|
+
|
|
569
|
+
// Helper to attach v2 fields and inputMethod
|
|
570
|
+
const withExtras = (resolved: ResolvedSelector): ResolvedSelector => {
|
|
571
|
+
if (inputMethod) resolved.inputMethod = inputMethod;
|
|
572
|
+
return { ...resolved, ...v2Fields };
|
|
573
|
+
};
|
|
529
574
|
|
|
530
575
|
// If type is 'locator', use locator field (or value as fallback) as the CSS locator directly
|
|
531
576
|
if (type === 'locator') {
|
|
532
577
|
const locatorValue = locator && locator.trim() ? locator : value;
|
|
533
|
-
return
|
|
578
|
+
return withExtras({
|
|
534
579
|
strategy: 'locator',
|
|
535
580
|
value: locatorValue,
|
|
536
581
|
locator: locatorValue,
|
|
@@ -540,7 +585,7 @@ export class SelectorResolver {
|
|
|
540
585
|
|
|
541
586
|
// If custom locator is provided and type is not 'locator', use it as CSS selector
|
|
542
587
|
if (locator && locator.trim()) {
|
|
543
|
-
return
|
|
588
|
+
return withExtras({
|
|
544
589
|
strategy: 'css',
|
|
545
590
|
value: locator,
|
|
546
591
|
locator: locator,
|
|
@@ -551,7 +596,7 @@ export class SelectorResolver {
|
|
|
551
596
|
// Use type-based strategy
|
|
552
597
|
switch (type) {
|
|
553
598
|
case 'placeholder':
|
|
554
|
-
return
|
|
599
|
+
return withExtras({
|
|
555
600
|
strategy: 'placeholder',
|
|
556
601
|
value,
|
|
557
602
|
nth,
|
|
@@ -559,7 +604,7 @@ export class SelectorResolver {
|
|
|
559
604
|
});
|
|
560
605
|
|
|
561
606
|
case 'role':
|
|
562
|
-
return
|
|
607
|
+
return withExtras({
|
|
563
608
|
strategy: 'role',
|
|
564
609
|
role: value,
|
|
565
610
|
name: name, // Use the name field for accessible name
|
|
@@ -569,14 +614,14 @@ export class SelectorResolver {
|
|
|
569
614
|
});
|
|
570
615
|
|
|
571
616
|
case 'testid':
|
|
572
|
-
return
|
|
617
|
+
return withExtras({
|
|
573
618
|
strategy: 'testid',
|
|
574
619
|
value,
|
|
575
620
|
nth,
|
|
576
621
|
});
|
|
577
622
|
|
|
578
623
|
case 'label':
|
|
579
|
-
return
|
|
624
|
+
return withExtras({
|
|
580
625
|
strategy: 'label',
|
|
581
626
|
value,
|
|
582
627
|
nth,
|
|
@@ -584,7 +629,7 @@ export class SelectorResolver {
|
|
|
584
629
|
});
|
|
585
630
|
|
|
586
631
|
case 'text':
|
|
587
|
-
return
|
|
632
|
+
return withExtras({
|
|
588
633
|
strategy: 'text',
|
|
589
634
|
value,
|
|
590
635
|
nth,
|
|
@@ -593,7 +638,7 @@ export class SelectorResolver {
|
|
|
593
638
|
|
|
594
639
|
default:
|
|
595
640
|
// Fallback to placeholder
|
|
596
|
-
return
|
|
641
|
+
return withExtras({
|
|
597
642
|
strategy: 'placeholder',
|
|
598
643
|
value,
|
|
599
644
|
nth,
|
|
@@ -46,6 +46,9 @@ export class ProjectInitializer {
|
|
|
46
46
|
// Create README
|
|
47
47
|
this.createReadme();
|
|
48
48
|
|
|
49
|
+
// Create AI rules files
|
|
50
|
+
this.createAIRules();
|
|
51
|
+
|
|
49
52
|
// Display summary
|
|
50
53
|
this.displaySummary(normalizedProjectName);
|
|
51
54
|
}
|
|
@@ -111,7 +114,8 @@ export class ProjectInitializer {
|
|
|
111
114
|
'specs/generated/',
|
|
112
115
|
'specs/.auth/',
|
|
113
116
|
'test-results/',
|
|
114
|
-
'playwright-report/'
|
|
117
|
+
'playwright-report/',
|
|
118
|
+
'.playwright-mcp/'
|
|
115
119
|
];
|
|
116
120
|
|
|
117
121
|
if (!fs.existsSync(gitignorePath)) {
|
|
@@ -178,10 +182,73 @@ export class ProjectInitializer {
|
|
|
178
182
|
if (projectName) {
|
|
179
183
|
console.log(` ${stepIndex++}. cd ${projectName}`);
|
|
180
184
|
}
|
|
181
|
-
console.log(` ${stepIndex++}.
|
|
182
|
-
console.log(` ${stepIndex++}.
|
|
183
|
-
console.log(` ${stepIndex++}.
|
|
184
|
-
console.log(` ${stepIndex++}.
|
|
185
|
+
console.log(` ${stepIndex++}. Create your first screen: sungen add --screen <name> --path <url-path>`);
|
|
186
|
+
console.log(` ${stepIndex++}. Use AI (Copilot/Claude) to generate Gherkin + selectors from the live page`);
|
|
187
|
+
console.log(` ${stepIndex++}. Compile tests: sungen generate --screen <name>`);
|
|
188
|
+
console.log(` ${stepIndex++}. Run tests: npx playwright test\n`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Create AI rules files for GitHub Copilot and Claude Code
|
|
193
|
+
*/
|
|
194
|
+
private createAIRules(): void {
|
|
195
|
+
const rulesContent = this.getAIRulesContent();
|
|
196
|
+
|
|
197
|
+
// GitHub Copilot: .github/copilot-instructions.md
|
|
198
|
+
const githubDir = path.join(this.cwd, '.github');
|
|
199
|
+
const copilotPath = path.join(githubDir, 'copilot-instructions.md');
|
|
200
|
+
if (!fs.existsSync(copilotPath)) {
|
|
201
|
+
if (!fs.existsSync(githubDir)) {
|
|
202
|
+
fs.mkdirSync(githubDir, { recursive: true });
|
|
203
|
+
}
|
|
204
|
+
fs.writeFileSync(copilotPath, rulesContent, 'utf-8');
|
|
205
|
+
this.createdItems.push('.github/copilot-instructions.md');
|
|
206
|
+
} else {
|
|
207
|
+
this.skippedItems.push('.github/copilot-instructions.md');
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Claude Code: CLAUDE.md
|
|
211
|
+
const claudePath = path.join(this.cwd, 'CLAUDE.md');
|
|
212
|
+
if (!fs.existsSync(claudePath)) {
|
|
213
|
+
fs.writeFileSync(claudePath, rulesContent, 'utf-8');
|
|
214
|
+
this.createdItems.push('CLAUDE.md');
|
|
215
|
+
} else {
|
|
216
|
+
this.skippedItems.push('CLAUDE.md');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Gherkin Dictionary: docs/gherkin-dictionary.md
|
|
220
|
+
const docsDir = path.join(this.cwd, 'docs');
|
|
221
|
+
const dictPath = path.join(docsDir, 'gherkin-dictionary.md');
|
|
222
|
+
if (!fs.existsSync(dictPath)) {
|
|
223
|
+
// Copy from sungen package if available, otherwise generate stub
|
|
224
|
+
const packageDictPath = path.join(__dirname, '..', '..', 'docs', 'gherkin-dictionary.md');
|
|
225
|
+
if (!fs.existsSync(docsDir)) {
|
|
226
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
|
227
|
+
}
|
|
228
|
+
if (fs.existsSync(packageDictPath)) {
|
|
229
|
+
fs.copyFileSync(packageDictPath, dictPath);
|
|
230
|
+
} else {
|
|
231
|
+
fs.writeFileSync(dictPath, '# Sungen Gherkin Dictionary\n\nSee https://github.com/sun-asterisk/sungen for the full dictionary.\n', 'utf-8');
|
|
232
|
+
}
|
|
233
|
+
this.createdItems.push('docs/gherkin-dictionary.md');
|
|
234
|
+
} else {
|
|
235
|
+
this.skippedItems.push('docs/gherkin-dictionary.md');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Read a template file from the templates directory
|
|
241
|
+
*/
|
|
242
|
+
private readTemplate(filename: string): string {
|
|
243
|
+
const templatePath = path.join(__dirname, 'templates', filename);
|
|
244
|
+
return fs.readFileSync(templatePath, 'utf-8');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Get AI rules content (shared between Copilot and Claude)
|
|
249
|
+
*/
|
|
250
|
+
private getAIRulesContent(): string {
|
|
251
|
+
return this.readTemplate('ai-rules.md');
|
|
185
252
|
}
|
|
186
253
|
|
|
187
254
|
/**
|
|
@@ -207,172 +274,20 @@ export class ProjectInitializer {
|
|
|
207
274
|
* Get Playwright configuration template
|
|
208
275
|
*/
|
|
209
276
|
private getPlaywrightConfigTemplate(): string {
|
|
210
|
-
return
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Read environment variables from file.
|
|
214
|
-
* https://github.com/motdotla/dotenv
|
|
215
|
-
*/
|
|
216
|
-
// import dotenv from 'dotenv';
|
|
217
|
-
// import path from 'path';
|
|
218
|
-
// dotenv.config({ path: path.resolve(__dirname, '.env') });
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* See https://playwright.dev/docs/test-configuration.
|
|
222
|
-
*/
|
|
223
|
-
export default defineConfig({
|
|
224
|
-
testDir: './specs/generated',
|
|
225
|
-
/* Run tests in files in parallel */
|
|
226
|
-
fullyParallel: true,
|
|
227
|
-
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
|
228
|
-
forbidOnly: !!process.env.CI,
|
|
229
|
-
/* Retry on CI only */
|
|
230
|
-
retries: process.env.CI ? 2 : 0,
|
|
231
|
-
/* Opt out of parallel tests on CI. */
|
|
232
|
-
workers: process.env.CI ? 1 : undefined,
|
|
233
|
-
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
|
234
|
-
reporter: 'html',
|
|
235
|
-
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
|
236
|
-
use: {
|
|
237
|
-
/* Base URL to use in actions like \`await page.goto('')\`. */
|
|
238
|
-
baseURL: 'https://example.com',
|
|
239
|
-
|
|
240
|
-
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
|
241
|
-
trace: 'on-first-retry',
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
/* Configure projects for major browsers */
|
|
245
|
-
projects: [
|
|
246
|
-
{
|
|
247
|
-
name: 'chromium',
|
|
248
|
-
use: { ...devices['Desktop Chrome'] },
|
|
249
|
-
},
|
|
250
|
-
|
|
251
|
-
/*
|
|
252
|
-
// {
|
|
253
|
-
// name: 'firefox',
|
|
254
|
-
// use: { ...devices['Desktop Firefox'] },
|
|
255
|
-
// },
|
|
256
|
-
|
|
257
|
-
// {
|
|
258
|
-
// name: 'webkit',
|
|
259
|
-
// use: { ...devices['Desktop Safari'] },
|
|
260
|
-
// },
|
|
261
|
-
|
|
262
|
-
/* Test against mobile viewports.
|
|
263
|
-
// {
|
|
264
|
-
// name: 'Mobile Chrome',
|
|
265
|
-
// use: { ...devices['Pixel 5'] },
|
|
266
|
-
// },
|
|
267
|
-
// {
|
|
268
|
-
// name: 'Mobile Safari',
|
|
269
|
-
// use: { ...devices['iPhone 12'] },
|
|
270
|
-
// },
|
|
271
|
-
|
|
272
|
-
/* Test against branded browsers. */
|
|
273
|
-
// {
|
|
274
|
-
// name: 'Microsoft Edge',
|
|
275
|
-
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
|
276
|
-
// },
|
|
277
|
-
// {
|
|
278
|
-
// name: 'Google Chrome',
|
|
279
|
-
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
|
280
|
-
// },
|
|
281
|
-
],
|
|
282
|
-
|
|
283
|
-
/* Run your local dev server before starting the tests */
|
|
284
|
-
// webServer: {
|
|
285
|
-
// command: 'npm run start',
|
|
286
|
-
// url: 'http://localhost:3000',
|
|
287
|
-
// reuseExistingServer: !process.env.CI,
|
|
288
|
-
// },
|
|
289
|
-
});
|
|
290
|
-
`;
|
|
277
|
+
return this.readTemplate('playwright.config.ts');
|
|
291
278
|
}
|
|
292
279
|
|
|
293
280
|
/**
|
|
294
281
|
* Get .gitignore template
|
|
295
282
|
*/
|
|
296
283
|
private getGitignoreTemplate(): string {
|
|
297
|
-
return
|
|
298
|
-
node_modules/
|
|
299
|
-
|
|
300
|
-
# Build output
|
|
301
|
-
dist/
|
|
302
|
-
build/
|
|
303
|
-
|
|
304
|
-
# Environment variables
|
|
305
|
-
.env
|
|
306
|
-
.env.local
|
|
307
|
-
|
|
308
|
-
# IDE
|
|
309
|
-
.vscode/
|
|
310
|
-
.idea/
|
|
311
|
-
*.swp
|
|
312
|
-
*.swo
|
|
313
|
-
`;
|
|
284
|
+
return this.readTemplate('gitignore');
|
|
314
285
|
}
|
|
315
286
|
|
|
316
287
|
/**
|
|
317
288
|
* Get README template
|
|
318
289
|
*/
|
|
319
290
|
private getReadmeTemplate(): string {
|
|
320
|
-
return
|
|
321
|
-
|
|
322
|
-
This project uses [Sungen](https://github.com/sun-asterisk/sungen) for AI-native E2E test generation.
|
|
323
|
-
|
|
324
|
-
## Directory Structure
|
|
325
|
-
|
|
326
|
-
\`\`\`
|
|
327
|
-
├── qa/
|
|
328
|
-
│ └── screens/ # Screen definitions and selectors
|
|
329
|
-
└── specs/
|
|
330
|
-
└── generated/ # Auto-generated Playwright tests
|
|
331
|
-
\`\`\`
|
|
332
|
-
|
|
333
|
-
## Workflow
|
|
334
|
-
|
|
335
|
-
### 1. Add new Screens
|
|
336
|
-
Define a new screen for your application:
|
|
337
|
-
|
|
338
|
-
\`\`\`bash
|
|
339
|
-
sungen add --screen login
|
|
340
|
-
\`\`\`
|
|
341
|
-
|
|
342
|
-
### 2. Generate mapped or full tests
|
|
343
|
-
Generate mapper elements for a specific screen or all screens:
|
|
344
|
-
|
|
345
|
-
\`\`\`bash
|
|
346
|
-
sungen map --screen login
|
|
347
|
-
# or
|
|
348
|
-
sungen map --all
|
|
349
|
-
\`\`\`
|
|
350
|
-
|
|
351
|
-
### 4. Generate full Playwright tests
|
|
352
|
-
Generate complete tests based on mapped elements:
|
|
353
|
-
|
|
354
|
-
\`\`\`bash
|
|
355
|
-
sungen generate --screen login
|
|
356
|
-
# or for all screens
|
|
357
|
-
sungen generate --all
|
|
358
|
-
\`\`\`
|
|
359
|
-
|
|
360
|
-
## Configuration
|
|
361
|
-
|
|
362
|
-
Edit \`sungen.config.yaml\` to customize:
|
|
363
|
-
- Source root directory
|
|
364
|
-
- UI framework (react/vue/html)
|
|
365
|
-
- AI provider settings
|
|
366
|
-
- Test generation options
|
|
367
|
-
|
|
368
|
-
## Documentation
|
|
369
|
-
|
|
370
|
-
- [Sungen Documentation](https://github.com/sun-asterisk/sungen)
|
|
371
|
-
- [Playwright Documentation](https://playwright.dev)
|
|
372
|
-
|
|
373
|
-
## Learn More
|
|
374
|
-
|
|
375
|
-
Visit the [Sungen GitHub repository](https://github.com/sun-asterisk/sungen) for detailed guides and examples.
|
|
376
|
-
`;
|
|
291
|
+
return this.readTemplate('readme.md');
|
|
377
292
|
}
|
|
378
293
|
}
|