@sun-asterisk/sungen 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +490 -0
- package/bin/sungen.js +12 -0
- package/dist/cli/commands/auto-tag-command.d.ts +8 -0
- package/dist/cli/commands/auto-tag-command.d.ts.map +1 -0
- package/dist/cli/commands/auto-tag-command.js +104 -0
- package/dist/cli/commands/auto-tag-command.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +196 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/ai-providers.yaml +56 -0
- package/dist/config/config-loader.d.ts +51 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +216 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-schema.d.ts +121 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +7 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/config/default.config.yaml +101 -0
- package/dist/config/framework.config.yaml +52 -0
- package/dist/config/routes.yaml +31 -0
- package/dist/core/selector-base/annotation-handler.d.ts +45 -0
- package/dist/core/selector-base/annotation-handler.d.ts.map +1 -0
- package/dist/core/selector-base/annotation-handler.js +102 -0
- package/dist/core/selector-base/annotation-handler.js.map +1 -0
- package/dist/core/selector-base/base-generator.d.ts +49 -0
- package/dist/core/selector-base/base-generator.d.ts.map +1 -0
- package/dist/core/selector-base/base-generator.js +214 -0
- package/dist/core/selector-base/base-generator.js.map +1 -0
- package/dist/core/selector-base/gherkin-parser.d.ts +24 -0
- package/dist/core/selector-base/gherkin-parser.d.ts.map +1 -0
- package/dist/core/selector-base/gherkin-parser.js +42 -0
- package/dist/core/selector-base/gherkin-parser.js.map +1 -0
- package/dist/core/selector-mapper/priority-mapper.d.ts +74 -0
- package/dist/core/selector-mapper/priority-mapper.d.ts.map +1 -0
- package/dist/core/selector-mapper/priority-mapper.js +477 -0
- package/dist/core/selector-mapper/priority-mapper.js.map +1 -0
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts +91 -0
- package/dist/core/ui-scanner/heuristics/base-heuristic.d.ts.map +1 -0
- package/dist/core/ui-scanner/heuristics/base-heuristic.js +175 -0
- package/dist/core/ui-scanner/heuristics/base-heuristic.js.map +1 -0
- package/dist/core/ui-scanner/react-scanner.d.ts +32 -0
- package/dist/core/ui-scanner/react-scanner.d.ts.map +1 -0
- package/dist/core/ui-scanner/react-scanner.js +163 -0
- package/dist/core/ui-scanner/react-scanner.js.map +1 -0
- package/dist/core/ui-scanner/scanner-interface.d.ts +94 -0
- package/dist/core/ui-scanner/scanner-interface.d.ts.map +1 -0
- package/dist/core/ui-scanner/scanner-interface.js +33 -0
- package/dist/core/ui-scanner/scanner-interface.js.map +1 -0
- package/dist/core/ui-scanner/strict-scanner.d.ts +81 -0
- package/dist/core/ui-scanner/strict-scanner.d.ts.map +1 -0
- package/dist/core/ui-scanner/strict-scanner.js +511 -0
- package/dist/core/ui-scanner/strict-scanner.js.map +1 -0
- package/dist/executor/playwright/playwright-generator.d.ts +33 -0
- package/dist/executor/playwright/playwright-generator.d.ts.map +1 -0
- package/dist/executor/playwright/playwright-generator.js +136 -0
- package/dist/executor/playwright/playwright-generator.js.map +1 -0
- package/dist/executor/test-generator.d.ts +63 -0
- package/dist/executor/test-generator.d.ts.map +1 -0
- package/dist/executor/test-generator.js +30 -0
- package/dist/executor/test-generator.js.map +1 -0
- package/dist/external/ai-provider.d.ts +60 -0
- package/dist/external/ai-provider.d.ts.map +1 -0
- package/dist/external/ai-provider.js +30 -0
- package/dist/external/ai-provider.js.map +1 -0
- package/dist/external/anthropic-provider.d.ts +29 -0
- package/dist/external/anthropic-provider.d.ts.map +1 -0
- package/dist/external/anthropic-provider.js +85 -0
- package/dist/external/anthropic-provider.js.map +1 -0
- package/dist/generators/cache/cache-manager.d.ts +66 -0
- package/dist/generators/cache/cache-manager.d.ts.map +1 -0
- package/dist/generators/cache/cache-manager.js +286 -0
- package/dist/generators/cache/cache-manager.js.map +1 -0
- package/dist/generators/cli.d.ts +7 -0
- package/dist/generators/cli.d.ts.map +1 -0
- package/dist/generators/cli.js +570 -0
- package/dist/generators/cli.js.map +1 -0
- package/dist/generators/dsl-writer/index.d.ts +33 -0
- package/dist/generators/dsl-writer/index.d.ts.map +1 -0
- package/dist/generators/dsl-writer/index.js +226 -0
- package/dist/generators/dsl-writer/index.js.map +1 -0
- package/dist/generators/gherkin-parser/index.d.ts +47 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -0
- package/dist/generators/gherkin-parser/index.js +149 -0
- package/dist/generators/gherkin-parser/index.js.map +1 -0
- package/dist/generators/gherkin-parser/selector-extractor.d.ts +37 -0
- package/dist/generators/gherkin-parser/selector-extractor.d.ts.map +1 -0
- package/dist/generators/gherkin-parser/selector-extractor.js +108 -0
- package/dist/generators/gherkin-parser/selector-extractor.js.map +1 -0
- package/dist/generators/scaffold-generator/index.d.ts +111 -0
- package/dist/generators/scaffold-generator/index.d.ts.map +1 -0
- package/dist/generators/scaffold-generator/index.js +408 -0
- package/dist/generators/scaffold-generator/index.js.map +1 -0
- package/dist/generators/selector-mapper/ai-mapper.d.ts +56 -0
- package/dist/generators/selector-mapper/ai-mapper.d.ts.map +1 -0
- package/dist/generators/selector-mapper/ai-mapper.js +457 -0
- package/dist/generators/selector-mapper/ai-mapper.js.map +1 -0
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts +67 -0
- package/dist/generators/selector-mapper/hybrid-mapper.d.ts.map +1 -0
- package/dist/generators/selector-mapper/hybrid-mapper.js +349 -0
- package/dist/generators/selector-mapper/hybrid-mapper.js.map +1 -0
- package/dist/generators/selector-mapper/index.d.ts +8 -0
- package/dist/generators/selector-mapper/index.d.ts.map +1 -0
- package/dist/generators/selector-mapper/index.js +12 -0
- package/dist/generators/selector-mapper/index.js.map +1 -0
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts +125 -0
- package/dist/generators/selector-mapper/intelligent-mapper.d.ts.map +1 -0
- package/dist/generators/selector-mapper/intelligent-mapper.js +391 -0
- package/dist/generators/selector-mapper/intelligent-mapper.js.map +1 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +49 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -0
- package/dist/generators/test-generator/adapters/adapter-interface.js +7 -0
- package/dist/generators/test-generator/adapters/adapter-interface.js.map +1 -0
- package/dist/generators/test-generator/adapters/adapter-registry.d.ts +29 -0
- package/dist/generators/test-generator/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/generators/test-generator/adapters/adapter-registry.js +50 -0
- package/dist/generators/test-generator/adapters/adapter-registry.js.map +1 -0
- package/dist/generators/test-generator/adapters/index.d.ts +4 -0
- package/dist/generators/test-generator/adapters/index.d.ts.map +1 -0
- package/dist/generators/test-generator/adapters/index.js +13 -0
- package/dist/generators/test-generator/adapters/index.js.map +1 -0
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +23 -0
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -0
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js +38 -0
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/before-each.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +5 -0
- package/dist/generators/test-generator/adapters/playwright/templates/scenario.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/check-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/clear-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/double-click-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/hover-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/press-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/uncheck-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/active-state-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-selector.hbs +5 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/ai-response-assertion-simple.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/application-running.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-visible-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/check-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/checkbox.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/checked-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-auth.hbs +6 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-browser-state.hbs +6 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/clear-database.hbs +4 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/clear.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/click-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/click.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/contain-text-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/contains-text-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/count-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/count-greater-than.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/count-less-than.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/disabled-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-containing-text.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/displayed-with-text.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/double-click-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion-advanced.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/empty-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/enabled-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/error-message-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/fill-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/fill.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/focused-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/generic-message-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-attribute.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-class.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-count.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-image-src.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-link.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-placeholder.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/has-value.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/have-text-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/hover-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/html5-validation-check.hbs +4 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/is-checked.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/is-editable.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/is-focused.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/is-hidden.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/is-unchecked.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/locator.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/login.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-body.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/message-assertion-selector.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/message-count-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/not-checked-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/not-visible.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/notification-assertion.hbs +4 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/press-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/press-enter.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/redirect-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/route-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/screen-navigation.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/scroll-bottom-assertion.hbs +5 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/select-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/select.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/application-running.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-auth.hbs +6 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-browser-state.hbs +6 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/clear-database.hbs +4 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/setup/user-login-todo.hbs +6 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/text-matches-pattern.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/uncheck-action.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/user-login-todo.hbs +6 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/visibility-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/visible-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-for-element.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/wait-timeout.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/wait.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/test-file.hbs +19 -0
- package/dist/generators/test-generator/ai-step-mapper.d.ts +27 -0
- package/dist/generators/test-generator/ai-step-mapper.d.ts.map +1 -0
- package/dist/generators/test-generator/ai-step-mapper.js +204 -0
- package/dist/generators/test-generator/ai-step-mapper.js.map +1 -0
- package/dist/generators/test-generator/code-generator.d.ts +52 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -0
- package/dist/generators/test-generator/code-generator.js +191 -0
- package/dist/generators/test-generator/code-generator.js.map +1 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js +173 -0
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/form-patterns.d.ts +8 -0
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/form-patterns.js +110 -0
- package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/index.d.ts +45 -0
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/index.js +106 -0
- package/dist/generators/test-generator/patterns/index.js.map +1 -0
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/interaction-patterns.js +100 -0
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +8 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.js +92 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/setup-patterns.js +84 -0
- package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/types.d.ts +38 -0
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/types.js +3 -0
- package/dist/generators/test-generator/patterns/types.js.map +1 -0
- package/dist/generators/test-generator/step-mapper-old.d.ts +180 -0
- package/dist/generators/test-generator/step-mapper-old.d.ts.map +1 -0
- package/dist/generators/test-generator/step-mapper-old.js +752 -0
- package/dist/generators/test-generator/step-mapper-old.js.map +1 -0
- package/dist/generators/test-generator/step-mapper-refactored.d.ts +47 -0
- package/dist/generators/test-generator/step-mapper-refactored.d.ts.map +1 -0
- package/dist/generators/test-generator/step-mapper-refactored.js +182 -0
- package/dist/generators/test-generator/step-mapper-refactored.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +66 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -0
- package/dist/generators/test-generator/step-mapper.js +248 -0
- package/dist/generators/test-generator/step-mapper.js.map +1 -0
- package/dist/generators/test-generator/template-engine.d.ts +33 -0
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -0
- package/dist/generators/test-generator/template-engine.js +129 -0
- package/dist/generators/test-generator/template-engine.js.map +1 -0
- package/dist/generators/test-generator/utils/data-resolver.d.ts +39 -0
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/data-resolver.js +162 -0
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -0
- package/dist/generators/test-generator/utils/path-inference.d.ts +49 -0
- package/dist/generators/test-generator/utils/path-inference.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/path-inference.js +286 -0
- package/dist/generators/test-generator/utils/path-inference.js.map +1 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +93 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/selector-resolver.js +408 -0
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -0
- package/dist/generators/types.d.ts +118 -0
- package/dist/generators/types.d.ts.map +1 -0
- package/dist/generators/types.js +48 -0
- package/dist/generators/types.js.map +1 -0
- package/dist/generators/ui-model-builder/deep-scanner.d.ts +121 -0
- package/dist/generators/ui-model-builder/deep-scanner.d.ts.map +1 -0
- package/dist/generators/ui-model-builder/deep-scanner.js +1113 -0
- package/dist/generators/ui-model-builder/deep-scanner.js.map +1 -0
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts +110 -0
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.d.ts.map +1 -0
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js +608 -0
- package/dist/generators/ui-model-builder/enhanced-deep-scanner.js.map +1 -0
- package/dist/generators/ui-model-builder/react-scanner.d.ts +107 -0
- package/dist/generators/ui-model-builder/react-scanner.d.ts.map +1 -0
- package/dist/generators/ui-model-builder/react-scanner.js +797 -0
- package/dist/generators/ui-model-builder/react-scanner.js.map +1 -0
- package/dist/input/cli-adapter.d.ts +63 -0
- package/dist/input/cli-adapter.d.ts.map +1 -0
- package/dist/input/cli-adapter.js +173 -0
- package/dist/input/cli-adapter.js.map +1 -0
- package/dist/input/config-adapter.d.ts +25 -0
- package/dist/input/config-adapter.d.ts.map +1 -0
- package/dist/input/config-adapter.js +70 -0
- package/dist/input/config-adapter.js.map +1 -0
- package/dist/input/input-adapter.d.ts +28 -0
- package/dist/input/input-adapter.d.ts.map +1 -0
- package/dist/input/input-adapter.js +17 -0
- package/dist/input/input-adapter.js.map +1 -0
- package/dist/input/vscode-adapter.d.ts +62 -0
- package/dist/input/vscode-adapter.d.ts.map +1 -0
- package/dist/input/vscode-adapter.js +64 -0
- package/dist/input/vscode-adapter.js.map +1 -0
- package/dist/orchestrator/cache-manager.d.ts +37 -0
- package/dist/orchestrator/cache-manager.d.ts.map +1 -0
- package/dist/orchestrator/cache-manager.js +148 -0
- package/dist/orchestrator/cache-manager.js.map +1 -0
- package/dist/orchestrator/pipeline.d.ts +73 -0
- package/dist/orchestrator/pipeline.d.ts.map +1 -0
- package/dist/orchestrator/pipeline.js +607 -0
- package/dist/orchestrator/pipeline.js.map +1 -0
- package/dist/orchestrator/project-initializer.d.ts +51 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -0
- package/dist/orchestrator/project-initializer.js +326 -0
- package/dist/orchestrator/project-initializer.js.map +1 -0
- package/dist/orchestrator/reporter.d.ts +15 -0
- package/dist/orchestrator/reporter.d.ts.map +1 -0
- package/dist/orchestrator/reporter.js +30 -0
- package/dist/orchestrator/reporter.js.map +1 -0
- package/dist/orchestrator/screen-manager.d.ts +47 -0
- package/dist/orchestrator/screen-manager.d.ts.map +1 -0
- package/dist/orchestrator/screen-manager.js +271 -0
- package/dist/orchestrator/screen-manager.js.map +1 -0
- package/dist/tools/auto-tagger.d.ts +107 -0
- package/dist/tools/auto-tagger.d.ts.map +1 -0
- package/dist/tools/auto-tagger.js +502 -0
- package/dist/tools/auto-tagger.js.map +1 -0
- package/package.json +73 -0
- package/src/cli/commands/auto-tag-command.ts +80 -0
- package/src/cli/index.ts +205 -0
- package/src/config/ai-providers.yaml +56 -0
- package/src/config/config-loader.ts +248 -0
- package/src/config/config-schema.ts +148 -0
- package/src/config/default.config.yaml +101 -0
- package/src/config/framework.config.yaml +52 -0
- package/src/config/routes.yaml +31 -0
- package/src/core/selector-base/annotation-handler.ts +127 -0
- package/src/core/selector-base/base-generator.ts +234 -0
- package/src/core/selector-base/gherkin-parser.ts +57 -0
- package/src/core/selector-mapper/priority-mapper.ts +607 -0
- package/src/core/ui-scanner/heuristics/base-heuristic.ts +216 -0
- package/src/core/ui-scanner/react-scanner.ts +156 -0
- package/src/core/ui-scanner/scanner-interface.ts +133 -0
- package/src/core/ui-scanner/strict-scanner.ts +629 -0
- package/src/executor/playwright/playwright-generator.ts +125 -0
- package/src/executor/test-generator.ts +90 -0
- package/src/external/ai-provider.ts +90 -0
- package/src/external/anthropic-provider.ts +114 -0
- package/src/generators/README.md +410 -0
- package/src/generators/cache/cache-manager.ts +322 -0
- package/src/generators/cli.ts +640 -0
- package/src/generators/dsl-writer/index.ts +253 -0
- package/src/generators/gherkin-parser/index.ts +155 -0
- package/src/generators/gherkin-parser/selector-extractor.ts +142 -0
- package/src/generators/scaffold-generator/index.ts +524 -0
- package/src/generators/selector-mapper/ai-mapper.ts +528 -0
- package/src/generators/selector-mapper/hybrid-mapper.ts +427 -0
- package/src/generators/selector-mapper/index.ts +10 -0
- package/src/generators/selector-mapper/intelligent-mapper.ts +530 -0
- package/src/generators/test-generator/adapters/adapter-interface.ts +49 -0
- package/src/generators/test-generator/adapters/adapter-registry.ts +56 -0
- package/src/generators/test-generator/adapters/index.ts +9 -0
- package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +40 -0
- package/src/generators/test-generator/adapters/playwright/templates/before-each.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +5 -0
- package/src/generators/test-generator/adapters/playwright/templates/scenario.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/check-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/clear-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/double-click-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/fill-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/hover-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/press-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/uncheck-action.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-visible-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/route-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-timeout.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/setup/application-running.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-auth.hbs +6 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-browser-state.hbs +6 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/setup/clear-database.hbs +4 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/setup/user-login-todo.hbs +6 -0
- package/src/generators/test-generator/adapters/playwright/templates/test-file.hbs +19 -0
- package/src/generators/test-generator/ai-step-mapper.ts +224 -0
- package/src/generators/test-generator/code-generator.ts +235 -0
- package/src/generators/test-generator/patterns/assertion-patterns.ts +183 -0
- package/src/generators/test-generator/patterns/form-patterns.ts +124 -0
- package/src/generators/test-generator/patterns/index.ts +97 -0
- package/src/generators/test-generator/patterns/interaction-patterns.ts +119 -0
- package/src/generators/test-generator/patterns/navigation-patterns.ts +110 -0
- package/src/generators/test-generator/patterns/setup-patterns.ts +94 -0
- package/src/generators/test-generator/patterns/types.ts +41 -0
- package/src/generators/test-generator/step-mapper.ts +254 -0
- package/src/generators/test-generator/template-engine.ts +160 -0
- package/src/generators/test-generator/utils/data-resolver.ts +147 -0
- package/src/generators/test-generator/utils/path-inference.ts +344 -0
- package/src/generators/test-generator/utils/selector-resolver.ts +480 -0
- package/src/generators/types.ts +226 -0
- package/src/generators/ui-model-builder/deep-scanner.ts +1244 -0
- package/src/generators/ui-model-builder/enhanced-deep-scanner.ts +731 -0
- package/src/generators/ui-model-builder/react-scanner.ts +959 -0
- package/src/input/cli-adapter.ts +185 -0
- package/src/input/config-adapter.ts +71 -0
- package/src/input/input-adapter.ts +32 -0
- package/src/input/vscode-adapter.ts +90 -0
- package/src/orchestrator/cache-manager.ts +138 -0
- package/src/orchestrator/pipeline.ts +713 -0
- package/src/orchestrator/project-initializer.ts +315 -0
- package/src/orchestrator/reporter.ts +36 -0
- package/src/orchestrator/screen-manager.ts +268 -0
- package/src/tools/auto-tagger.ts +572 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Initializer
|
|
3
|
+
* Creates essential directory structure for Sungen pipeline
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
|
|
9
|
+
export class ProjectInitializer {
|
|
10
|
+
private cwd: string;
|
|
11
|
+
private createdItems: string[] = [];
|
|
12
|
+
private skippedItems: string[] = [];
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
this.cwd = process.cwd();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Initialize project with essential directories and config
|
|
20
|
+
*/
|
|
21
|
+
async initialize(): Promise<void> {
|
|
22
|
+
console.log('🚀 Initializing Sungen project...\n');
|
|
23
|
+
|
|
24
|
+
// Create directories
|
|
25
|
+
this.createDirectories();
|
|
26
|
+
|
|
27
|
+
// Create playwright config if doesn't exist
|
|
28
|
+
this.createPlaywrightConfig();
|
|
29
|
+
|
|
30
|
+
// Create/update .gitignore
|
|
31
|
+
this.updateGitignore();
|
|
32
|
+
|
|
33
|
+
// Create README
|
|
34
|
+
this.createReadme();
|
|
35
|
+
|
|
36
|
+
// Display summary
|
|
37
|
+
this.displaySummary();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Create essential directories only
|
|
42
|
+
*/
|
|
43
|
+
private createDirectories(): void {
|
|
44
|
+
const dirs = [
|
|
45
|
+
'qa',
|
|
46
|
+
'qa/screens',
|
|
47
|
+
'specs',
|
|
48
|
+
'specs/generated'
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
for (const dir of dirs) {
|
|
52
|
+
const fullPath = path.join(this.cwd, dir);
|
|
53
|
+
if (!fs.existsSync(fullPath)) {
|
|
54
|
+
fs.mkdirSync(fullPath, { recursive: true });
|
|
55
|
+
this.createdItems.push(dir + '/');
|
|
56
|
+
} else {
|
|
57
|
+
this.skippedItems.push(dir + '/');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Create Playwright configuration
|
|
64
|
+
*/
|
|
65
|
+
private createPlaywrightConfig(): void {
|
|
66
|
+
const configPath = path.join(this.cwd, 'playwright.config.ts');
|
|
67
|
+
|
|
68
|
+
if (fs.existsSync(configPath)) {
|
|
69
|
+
this.skippedItems.push('playwright.config.ts');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const configContent = this.getPlaywrightConfigTemplate();
|
|
74
|
+
fs.writeFileSync(configPath, configContent, 'utf-8');
|
|
75
|
+
this.createdItems.push('playwright.config.ts');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Update .gitignore with Sungen-specific entries
|
|
80
|
+
*/
|
|
81
|
+
private updateGitignore(): void {
|
|
82
|
+
const gitignorePath = path.join(this.cwd, '.gitignore');
|
|
83
|
+
const sungenEntries = [
|
|
84
|
+
'# Sungen generated files',
|
|
85
|
+
'specs/generated/',
|
|
86
|
+
'test-results/',
|
|
87
|
+
'playwright-report/'
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
91
|
+
// Create new .gitignore with Node.js patterns
|
|
92
|
+
const content = this.getGitignoreTemplate() + '\n' + sungenEntries.join('\n') + '\n';
|
|
93
|
+
fs.writeFileSync(gitignorePath, content, 'utf-8');
|
|
94
|
+
this.createdItems.push('.gitignore');
|
|
95
|
+
} else {
|
|
96
|
+
// Append Sungen entries if not already present
|
|
97
|
+
let content = fs.readFileSync(gitignorePath, 'utf-8');
|
|
98
|
+
const needsUpdate = !content.includes('specs/generated/');
|
|
99
|
+
|
|
100
|
+
if (needsUpdate) {
|
|
101
|
+
content += '\n' + sungenEntries.join('\n') + '\n';
|
|
102
|
+
fs.writeFileSync(gitignorePath, content, 'utf-8');
|
|
103
|
+
this.createdItems.push('.gitignore (updated)');
|
|
104
|
+
} else {
|
|
105
|
+
this.skippedItems.push('.gitignore');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Create README documentation
|
|
112
|
+
*/
|
|
113
|
+
private createReadme(): void {
|
|
114
|
+
const readmePath = path.join(this.cwd, 'README.md');
|
|
115
|
+
|
|
116
|
+
if (fs.existsSync(readmePath)) {
|
|
117
|
+
this.skippedItems.push('README.md');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const readmeContent = this.getReadmeTemplate();
|
|
122
|
+
fs.writeFileSync(readmePath, readmeContent, 'utf-8');
|
|
123
|
+
this.createdItems.push('README.md');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Display initialization summary
|
|
128
|
+
*/
|
|
129
|
+
private displaySummary(): void {
|
|
130
|
+
console.log('✅ Sungen initialized successfully!\n');
|
|
131
|
+
|
|
132
|
+
if (this.createdItems.length > 0) {
|
|
133
|
+
console.log('Created:');
|
|
134
|
+
this.createdItems.forEach(item => {
|
|
135
|
+
console.log(` ✓ ${item}`);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (this.skippedItems.length > 0) {
|
|
140
|
+
console.log('\nAlready exists:');
|
|
141
|
+
this.skippedItems.forEach(item => {
|
|
142
|
+
console.log(` ⊳ ${item}`);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Check for Playwright installation
|
|
147
|
+
this.checkDependencies();
|
|
148
|
+
|
|
149
|
+
console.log('\nNext steps:');
|
|
150
|
+
console.log(' 1. Review README.md for workflow overview');
|
|
151
|
+
console.log(' 2. Create your first screen with: sungen add --screen <name>');
|
|
152
|
+
console.log(' 3. Generate mapped tests with: sungen map --screen <name> | sungen map --all');
|
|
153
|
+
console.log(' 4. Generate tests with: sungen generate --screen <name> | sungen generate --all\n');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Check for required dependencies
|
|
158
|
+
*/
|
|
159
|
+
private checkDependencies(): void {
|
|
160
|
+
try {
|
|
161
|
+
const packageJsonPath = path.join(this.cwd, 'package.json');
|
|
162
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
163
|
+
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
164
|
+
|
|
165
|
+
if (!deps['@playwright/test']) {
|
|
166
|
+
console.log('\n⚠️ Playwright not detected. Install with:');
|
|
167
|
+
console.log(' npm install -D @playwright/test');
|
|
168
|
+
console.log(' npx playwright install');
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
// Ignore if can't read package.json
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Get Playwright configuration template
|
|
177
|
+
*/
|
|
178
|
+
private getPlaywrightConfigTemplate(): string {
|
|
179
|
+
return `import { defineConfig, devices } from '@playwright/test';
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Playwright Test Configuration
|
|
183
|
+
* See https://playwright.dev/docs/test-configuration
|
|
184
|
+
*/
|
|
185
|
+
export default defineConfig({
|
|
186
|
+
testDir: './specs/generated',
|
|
187
|
+
|
|
188
|
+
fullyParallel: true,
|
|
189
|
+
|
|
190
|
+
forbidOnly: !!process.env.CI,
|
|
191
|
+
|
|
192
|
+
retries: process.env.CI ? 2 : 0,
|
|
193
|
+
|
|
194
|
+
workers: process.env.CI ? 1 : undefined,
|
|
195
|
+
|
|
196
|
+
reporter: 'html',
|
|
197
|
+
|
|
198
|
+
use: {
|
|
199
|
+
baseURL: 'http://localhost:3000',
|
|
200
|
+
|
|
201
|
+
trace: 'on-first-retry',
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
projects: [
|
|
205
|
+
{
|
|
206
|
+
name: 'chromium',
|
|
207
|
+
use: { ...devices['Desktop Chrome'] },
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
{
|
|
211
|
+
name: 'firefox',
|
|
212
|
+
use: { ...devices['Desktop Firefox'] },
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
{
|
|
216
|
+
name: 'webkit',
|
|
217
|
+
use: { ...devices['Desktop Safari'] },
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
|
|
221
|
+
webServer: {
|
|
222
|
+
command: 'npm run dev',
|
|
223
|
+
url: 'http://localhost:3000',
|
|
224
|
+
reuseExistingServer: !process.env.CI,
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
`;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Get .gitignore template
|
|
232
|
+
*/
|
|
233
|
+
private getGitignoreTemplate(): string {
|
|
234
|
+
return `# Dependencies
|
|
235
|
+
node_modules/
|
|
236
|
+
|
|
237
|
+
# Build output
|
|
238
|
+
dist/
|
|
239
|
+
build/
|
|
240
|
+
|
|
241
|
+
# Environment variables
|
|
242
|
+
.env
|
|
243
|
+
.env.local
|
|
244
|
+
|
|
245
|
+
# IDE
|
|
246
|
+
.vscode/
|
|
247
|
+
.idea/
|
|
248
|
+
*.swp
|
|
249
|
+
*.swo
|
|
250
|
+
`;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Get README template
|
|
255
|
+
*/
|
|
256
|
+
private getReadmeTemplate(): string {
|
|
257
|
+
return `# Sungen Test Automation
|
|
258
|
+
|
|
259
|
+
This project uses [Sungen](https://github.com/sun-asterisk/sungen) for AI-native E2E test generation.
|
|
260
|
+
|
|
261
|
+
## Directory Structure
|
|
262
|
+
|
|
263
|
+
\`\`\`
|
|
264
|
+
├── qa/
|
|
265
|
+
│ └── screens/ # Screen definitions and selectors
|
|
266
|
+
└── specs/
|
|
267
|
+
└── generated/ # Auto-generated Playwright tests
|
|
268
|
+
\`\`\`
|
|
269
|
+
|
|
270
|
+
## Workflow
|
|
271
|
+
|
|
272
|
+
### 1. Add new Screens
|
|
273
|
+
Define a new screen for your application:
|
|
274
|
+
|
|
275
|
+
\`\`\`bash
|
|
276
|
+
sungen add --screen login
|
|
277
|
+
\`\`\`
|
|
278
|
+
|
|
279
|
+
### 2. Generate mapped or full tests
|
|
280
|
+
Generate mapper elements for a specific screen or all screens:
|
|
281
|
+
|
|
282
|
+
\`\`\`bash
|
|
283
|
+
sungen map --screen login
|
|
284
|
+
# or
|
|
285
|
+
sungen map --all
|
|
286
|
+
\`\`\`
|
|
287
|
+
|
|
288
|
+
### 4. Generate full Playwright tests
|
|
289
|
+
Generate complete tests based on mapped elements:
|
|
290
|
+
|
|
291
|
+
\`\`\`bash
|
|
292
|
+
sungen generate --screen login
|
|
293
|
+
# or for all screens
|
|
294
|
+
sungen generate --all
|
|
295
|
+
\`\`\`
|
|
296
|
+
|
|
297
|
+
## Configuration
|
|
298
|
+
|
|
299
|
+
Edit \`sungen.config.yaml\` to customize:
|
|
300
|
+
- Source root directory
|
|
301
|
+
- UI framework (react/vue/html)
|
|
302
|
+
- AI provider settings
|
|
303
|
+
- Test generation options
|
|
304
|
+
|
|
305
|
+
## Documentation
|
|
306
|
+
|
|
307
|
+
- [Sungen Documentation](https://github.com/sun-asterisk/sungen)
|
|
308
|
+
- [Playwright Documentation](https://playwright.dev)
|
|
309
|
+
|
|
310
|
+
## Learn More
|
|
311
|
+
|
|
312
|
+
Visit the [Sungen GitHub repository](https://github.com/sun-asterisk/sungen) for detailed guides and examples.
|
|
313
|
+
`;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reporter
|
|
3
|
+
* Generates reports for test generation results
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { RuntimeConfig } from '../config/config-schema';
|
|
9
|
+
import { GeneratedTest } from '../executor/test-generator';
|
|
10
|
+
|
|
11
|
+
export class Reporter {
|
|
12
|
+
private config: RuntimeConfig;
|
|
13
|
+
|
|
14
|
+
constructor(config: RuntimeConfig) {
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate report for test generation results
|
|
20
|
+
*/
|
|
21
|
+
async generate(results: GeneratedTest[]): Promise<void> {
|
|
22
|
+
if (!this.config.verbose) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const totalScenarios = results.reduce((sum, r) => sum + r.stats.totalScenarios, 0);
|
|
27
|
+
const totalSteps = results.reduce((sum, r) => sum + r.stats.totalSteps, 0);
|
|
28
|
+
const totalTodos = results.reduce((sum, r) => sum + r.stats.todoCount, 0);
|
|
29
|
+
|
|
30
|
+
console.log('\n📊 Generation Report:');
|
|
31
|
+
console.log(` Features: ${results.length}`);
|
|
32
|
+
console.log(` Scenarios: ${totalScenarios}`);
|
|
33
|
+
console.log(` Steps: ${totalSteps}`);
|
|
34
|
+
console.log(` TODOs: ${totalTodos}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Screen Manager
|
|
3
|
+
* Manages screen definition files in qa/screens directory
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
|
|
9
|
+
export interface ScreenOptions {
|
|
10
|
+
name: string;
|
|
11
|
+
path?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class ScreenManager {
|
|
16
|
+
private cwd: string;
|
|
17
|
+
private screensDir: string;
|
|
18
|
+
|
|
19
|
+
constructor() {
|
|
20
|
+
this.cwd = process.cwd();
|
|
21
|
+
this.screensDir = path.join(this.cwd, 'qa', 'screens');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Add a new screen definition
|
|
26
|
+
*/
|
|
27
|
+
async addScreen(options: ScreenOptions): Promise<void> {
|
|
28
|
+
console.log(`📱 Adding screen: ${options.name}...\n`);
|
|
29
|
+
|
|
30
|
+
// Validate screen name
|
|
31
|
+
this.validateScreenName(options.name);
|
|
32
|
+
|
|
33
|
+
// Normalize screen name for directory
|
|
34
|
+
const screenName = this.normalizeScreenName(options.name);
|
|
35
|
+
const screenDir = path.join(this.screensDir, screenName);
|
|
36
|
+
|
|
37
|
+
// Derive filename from path or use screen name
|
|
38
|
+
const filename = options.path
|
|
39
|
+
? this.extractFilenameFromPath(options.path)
|
|
40
|
+
: screenName;
|
|
41
|
+
|
|
42
|
+
// Create directory structure
|
|
43
|
+
const featuresDir = path.join(screenDir, 'features');
|
|
44
|
+
const selectorsDir = path.join(screenDir, 'selectors');
|
|
45
|
+
const testDataDir = path.join(screenDir, 'test-data');
|
|
46
|
+
|
|
47
|
+
// File paths
|
|
48
|
+
const featurePath = path.join(featuresDir, `${filename}.feature`);
|
|
49
|
+
const selectorPath = path.join(selectorsDir, `${filename}.yaml`);
|
|
50
|
+
const testDataPath = path.join(testDataDir, `${filename}.yaml`);
|
|
51
|
+
|
|
52
|
+
// Smart behavior: Create dirs only if first file
|
|
53
|
+
const isFirstFile = !fs.existsSync(screenDir);
|
|
54
|
+
|
|
55
|
+
if (isFirstFile) {
|
|
56
|
+
console.log(`📱 Creating screen: ${options.name}...\n`);
|
|
57
|
+
|
|
58
|
+
// Create directories
|
|
59
|
+
try {
|
|
60
|
+
if (!fs.existsSync(this.screensDir)) {
|
|
61
|
+
fs.mkdirSync(this.screensDir, { recursive: true });
|
|
62
|
+
console.log(`✓ Created directory: qa/screens/\n`);
|
|
63
|
+
}
|
|
64
|
+
fs.mkdirSync(featuresDir, { recursive: true });
|
|
65
|
+
fs.mkdirSync(selectorsDir, { recursive: true });
|
|
66
|
+
fs.mkdirSync(testDataDir, { recursive: true });
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(`❌ Error: Failed to create directories`);
|
|
69
|
+
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
70
|
+
console.error(' Check file permissions and try again.\n');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
console.log(`📄 Adding feature to screen: ${options.name}...\n`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Check file existence to prevent overwrite
|
|
78
|
+
if (fs.existsSync(featurePath)) {
|
|
79
|
+
console.error(`❌ Error: Feature file "${filename}.feature" already exists`);
|
|
80
|
+
console.error(` Path: ${featurePath}`);
|
|
81
|
+
console.error(` Use a different --path value or delete existing file.`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Generate and write feature file
|
|
86
|
+
const featureContent = this.generateFeatureTemplate(options, filename);
|
|
87
|
+
try {
|
|
88
|
+
fs.writeFileSync(featurePath, featureContent, 'utf-8');
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error(`❌ Error: Failed to create feature file at ${featurePath}`);
|
|
91
|
+
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Generate and write selector file
|
|
96
|
+
const selectorContent = this.generateSelectorTemplate(options, filename);
|
|
97
|
+
try {
|
|
98
|
+
fs.writeFileSync(selectorPath, selectorContent, 'utf-8');
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.error(`❌ Error: Failed to create selector file at ${selectorPath}`);
|
|
101
|
+
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Generate and write test data file
|
|
106
|
+
const testDataContent = this.generateTestDataTemplate(options);
|
|
107
|
+
try {
|
|
108
|
+
fs.writeFileSync(testDataPath, testDataContent, 'utf-8');
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error(`❌ Error: Failed to create test data file at ${testDataPath}`);
|
|
111
|
+
console.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Display success message
|
|
116
|
+
if (isFirstFile) {
|
|
117
|
+
console.log(`✓ Created screen: ${options.name} at ${screenDir}`);
|
|
118
|
+
} else {
|
|
119
|
+
console.log(`✓ Added feature: ${filename} to ${screenName}`);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
this.displaySuccess(options.name, filename, screenDir);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Validate screen name
|
|
127
|
+
*/
|
|
128
|
+
private validateScreenName(name: string): void {
|
|
129
|
+
if (!name || name.trim().length === 0) {
|
|
130
|
+
console.error('❌ Error: Screen name cannot be empty');
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Check if name contains at least one alphanumeric character
|
|
135
|
+
if (!/[a-zA-Z0-9]/.test(name)) {
|
|
136
|
+
console.error('❌ Error: Screen name must contain at least one alphanumeric character');
|
|
137
|
+
console.error(' Valid examples: login, user-profile, Dashboard');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Normalize screen name to kebab-case for filename
|
|
144
|
+
*/
|
|
145
|
+
private normalizeScreenName(name: string): string {
|
|
146
|
+
return name
|
|
147
|
+
.toLowerCase()
|
|
148
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
149
|
+
.replace(/^-+|-+$/g, '')
|
|
150
|
+
.replace(/-+/g, '-');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Extract filename from path value
|
|
155
|
+
*/
|
|
156
|
+
private extractFilenameFromPath(pathString: string): string {
|
|
157
|
+
// Remove leading and trailing slashes
|
|
158
|
+
const cleanPath = pathString.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
159
|
+
|
|
160
|
+
// Split by '/' and take last segment
|
|
161
|
+
const segments = cleanPath.split('/');
|
|
162
|
+
const lastSegment = segments[segments.length - 1];
|
|
163
|
+
|
|
164
|
+
// Normalize to kebab-case
|
|
165
|
+
return this.normalizeScreenName(lastSegment);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Generate feature file template
|
|
170
|
+
*/
|
|
171
|
+
private generateFeatureTemplate(options: ScreenOptions, filename: string): string {
|
|
172
|
+
const screenName = this.normalizeScreenName(options.name);
|
|
173
|
+
const featurePath = options.path || `/${screenName}`;
|
|
174
|
+
const description = options.description || `interact with the ${options.name} screen`;
|
|
175
|
+
|
|
176
|
+
return `Feature: ${options.name} Screen
|
|
177
|
+
|
|
178
|
+
As a user
|
|
179
|
+
I want to ${description}
|
|
180
|
+
So that I can accomplish my tasks
|
|
181
|
+
Path: ${featurePath}
|
|
182
|
+
|
|
183
|
+
@high
|
|
184
|
+
Scenario: Sample scenario for ${options.name}
|
|
185
|
+
Given User open page
|
|
186
|
+
When User click [element] button
|
|
187
|
+
Then User see [result] text with {{success}}
|
|
188
|
+
`;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Generate selector YAML template
|
|
193
|
+
*/
|
|
194
|
+
private generateSelectorTemplate(options: ScreenOptions, filename: string): string {
|
|
195
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
196
|
+
const screenPath = options.path || '';
|
|
197
|
+
|
|
198
|
+
return `# ${options.name} Screen Selectors
|
|
199
|
+
# Created: ${timestamp}
|
|
200
|
+
${screenPath ? `# Path: ${screenPath}` : '# Path: (not specified - update as needed)'}
|
|
201
|
+
|
|
202
|
+
# Example element - replace with actual elements or use 'sungen map'
|
|
203
|
+
#
|
|
204
|
+
# Element structure:
|
|
205
|
+
# key: element-identifier
|
|
206
|
+
# selector: "" # Playwright selector
|
|
207
|
+
# type: text|role|placeholder|testid|xpath
|
|
208
|
+
# value: "text content" # Element value/text/label
|
|
209
|
+
# name: "Display Name" # Optional: readable name
|
|
210
|
+
# nth: 0 # Optional: element index if multiple matches
|
|
211
|
+
|
|
212
|
+
# element:
|
|
213
|
+
# selector: ""
|
|
214
|
+
# type: role
|
|
215
|
+
# value: "button"
|
|
216
|
+
# name: "element"
|
|
217
|
+
# nth: 0
|
|
218
|
+
|
|
219
|
+
# Next steps:
|
|
220
|
+
# 1. Edit the feature file: qa/screens/${filename}/features/${filename}.feature
|
|
221
|
+
# 2. Run: sungen map --screen ${filename}
|
|
222
|
+
# This will populate selectors from your feature file
|
|
223
|
+
#
|
|
224
|
+
# Documentation: https://github.com/sun-asterisk/sungen
|
|
225
|
+
`;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Generate test data YAML template
|
|
230
|
+
*/
|
|
231
|
+
private generateTestDataTemplate(options: ScreenOptions): string {
|
|
232
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
233
|
+
|
|
234
|
+
return `# ${options.name} Screen Test Data
|
|
235
|
+
# Created: ${timestamp}
|
|
236
|
+
|
|
237
|
+
# Define test data variables here
|
|
238
|
+
# Example:
|
|
239
|
+
# success: "Operation completed successfully"
|
|
240
|
+
# username: "testuser@example.com"
|
|
241
|
+
# password: "SecurePassword123"
|
|
242
|
+
|
|
243
|
+
# Next steps:
|
|
244
|
+
# 1. Add test data variables referenced in your feature scenarios
|
|
245
|
+
# 2. Use {{variable}} syntax in your feature files to reference these values
|
|
246
|
+
`;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Display success message with next steps
|
|
251
|
+
*/
|
|
252
|
+
private displaySuccess(name: string, filename: string, screenDir: string): void {
|
|
253
|
+
console.log('✅ Screen definition created successfully!\n');
|
|
254
|
+
console.log(`Screen: ${name}`);
|
|
255
|
+
console.log(`Path: ${screenDir}\n`);
|
|
256
|
+
|
|
257
|
+
console.log('Created files:');
|
|
258
|
+
console.log(` 📄 ${path.join(screenDir, 'features', `${filename}.feature`)}`);
|
|
259
|
+
console.log(` 📄 ${path.join(screenDir, 'selectors', `${filename}.yaml`)}`);
|
|
260
|
+
console.log(` 📄 ${path.join(screenDir, 'test-data', `${filename}.yaml`)}\n`);
|
|
261
|
+
|
|
262
|
+
console.log('Next steps:');
|
|
263
|
+
console.log(` 1. Edit the Gherkin feature file to define test scenarios`);
|
|
264
|
+
console.log(` 2. Run: sungen map --screen ${filename}`);
|
|
265
|
+
console.log(` This will generate selector mappings from your feature file\n`);
|
|
266
|
+
console.log('Documentation: https://github.com/sun-asterisk/sungen');
|
|
267
|
+
}
|
|
268
|
+
}
|