@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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Bach Ngoc Hoai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
# Sungen - AI-Native E2E Test Generator
|
|
2
|
+
|
|
3
|
+
**Version**: 3.2.0 (Unreleased)
|
|
4
|
+
**Priority-Based E2E Test Generation with Deterministic Selector Mapping**
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## šÆ What is Sungen?
|
|
9
|
+
|
|
10
|
+
Sungen is a **deterministic-first** E2E test automation framework that generates Playwright tests from Gherkin features using a **priority-based approach**:
|
|
11
|
+
|
|
12
|
+
1. **Strict UI Scanning** - Filters only interactive elements (input, button, a, select, textarea)
|
|
13
|
+
2. **Priority-Based Selector Mapping**:
|
|
14
|
+
- **1ļøā£ Direct ID Match** - Exact `data-testid` matching (instant, free, deterministic)
|
|
15
|
+
- **2ļøā£ Accessibility Match** - Semantic `role` + `aria-label` matching
|
|
16
|
+
- **3ļøā£ AI Fallback** - Claude Sonnet as last resort (not primary solution)
|
|
17
|
+
3. **Auto-Tagging Tool** - Inject stable `data-testid` into source code proactively
|
|
18
|
+
4. **Test Generation** - Create production-ready Playwright test code
|
|
19
|
+
|
|
20
|
+
**Key Achievement**: **90%+ Direct ID match rate** with minimal AI dependency!
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## š Quick Start
|
|
25
|
+
|
|
26
|
+
### Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install -g @sungen/cli
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or use locally in your project:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install --save-dev @sungen/cli
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Setup
|
|
39
|
+
|
|
40
|
+
1. Initialize your Sungen project:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
sungen init
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This creates:
|
|
47
|
+
- `qa/screens/` - Screen definitions directory (use `sungen add --screen` to create)
|
|
48
|
+
- `spec/generated/` - Generated test code output directory
|
|
49
|
+
- `playwright.config.ts` - Playwright configuration
|
|
50
|
+
- `.gitignore` - Updated with Sungen patterns
|
|
51
|
+
|
|
52
|
+
**Note:** Use `sungen add --screen <name>` to create screen definitions with proper structure.
|
|
53
|
+
|
|
54
|
+
2. Set your API key:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
export ANTHROPIC_API_KEY=your_api_key_here
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
3. Create your first screen definition:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
sungen add --screen login --path /auth/login
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This creates a screen definition with:
|
|
67
|
+
- `qa/screens/login/features/login.feature` - Gherkin scenarios
|
|
68
|
+
- `qa/screens/login/selectors/login.yaml` - Element selectors
|
|
69
|
+
- `qa/screens/login/test-data/login.yaml` - Test data variables
|
|
70
|
+
|
|
71
|
+
4. Edit the generated feature file and run the pipeline:
|
|
72
|
+
|
|
73
|
+
### Usage
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Create a new screen definition
|
|
77
|
+
sungen add --screen login --path /auth/login
|
|
78
|
+
|
|
79
|
+
# Step by step:
|
|
80
|
+
sungen map --screen login # 2. Map selectors with AI
|
|
81
|
+
sungen generate --screen login # 3. Generate Playwright tests
|
|
82
|
+
|
|
83
|
+
# Clear cache
|
|
84
|
+
sungen cache-clear
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## š Project Structure
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
your-project/
|
|
93
|
+
āāā app/ # Your React source
|
|
94
|
+
ā āāā auth/
|
|
95
|
+
ā ā āāā page.tsx
|
|
96
|
+
ā āāā chat/
|
|
97
|
+
ā āāā page.tsx
|
|
98
|
+
ā
|
|
99
|
+
āāā qa/ # Input artifacts
|
|
100
|
+
ā āāā screens/ # Screen definitions (NEW structure)
|
|
101
|
+
ā āāā auth/
|
|
102
|
+
ā āāā features/ # Gherkin scenarios
|
|
103
|
+
ā ā āāā login.feature
|
|
104
|
+
ā ā āāā logout.feature
|
|
105
|
+
ā āāā selectors/ # Element mappings
|
|
106
|
+
ā ā āāā login.yaml
|
|
107
|
+
ā ā āāā logout.yaml
|
|
108
|
+
ā āāā test-data/ # Test variables
|
|
109
|
+
ā āāā login.yaml
|
|
110
|
+
ā āāā logout.yaml
|
|
111
|
+
ā
|
|
112
|
+
āāā specs/ # Output artifacts (sibling to qa/)
|
|
113
|
+
ā āāā generated/ # Generated Playwright tests
|
|
114
|
+
ā āāā auth
|
|
115
|
+
ā āāā login.spec.ts
|
|
116
|
+
ā āāā logout.spec.ts
|
|
117
|
+
ā
|
|
118
|
+
āāā sungen.config.yaml # Framework configuration
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
**Key Changes in v3.2:**
|
|
123
|
+
- Organized by screens: Each screen has its own directory
|
|
124
|
+
- Self-contained: Features, selectors, and test data grouped together
|
|
125
|
+
- Use `sungen add --screen <name>` to create new screen definitions
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## šØ Gherkin Syntax
|
|
130
|
+
|
|
131
|
+
Sungen uses a **simple, natural language grammar** for Gherkin:
|
|
132
|
+
|
|
133
|
+
**Pattern**: `User + action + [element] + with {{data}}`
|
|
134
|
+
|
|
135
|
+
### Example Feature File
|
|
136
|
+
|
|
137
|
+
```gherkin
|
|
138
|
+
Feature: Login Screen
|
|
139
|
+
|
|
140
|
+
As a user
|
|
141
|
+
I want to interact with the Login screen
|
|
142
|
+
So that I can access my account
|
|
143
|
+
Path: /auth/login
|
|
144
|
+
|
|
145
|
+
@high
|
|
146
|
+
Scenario: User logs in successfully
|
|
147
|
+
Given User open page
|
|
148
|
+
When User fill [Email] field with {{valid_email}}
|
|
149
|
+
And User fill [Password] field with {{valid_password}}
|
|
150
|
+
And User click [Login] button
|
|
151
|
+
Then User see [Welcome message !] text with {{success_message}}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Grammar Rules
|
|
155
|
+
|
|
156
|
+
| Component | Syntax | Example |
|
|
157
|
+
|-----------|--------|---------|
|
|
158
|
+
| **Actor** | `User` | `User open page` |
|
|
159
|
+
| **Action** | `click`, `fill`, `see` | `User click [button]` |
|
|
160
|
+
| **Element** | `[element name]` | `[Email] field`, `[submit] button` |
|
|
161
|
+
| **Data** | `{{variable}}` | `{{valid_email}}`, `{{success.message}}` |
|
|
162
|
+
| **Path** | `Path: /route` | `Path: /auth/login` |
|
|
163
|
+
|
|
164
|
+
### Common Actions
|
|
165
|
+
|
|
166
|
+
```gherkin
|
|
167
|
+
# Navigation
|
|
168
|
+
Given User open page
|
|
169
|
+
|
|
170
|
+
# Input
|
|
171
|
+
When User fill [element] field with {{data}}
|
|
172
|
+
|
|
173
|
+
# Click
|
|
174
|
+
When User click [element] button
|
|
175
|
+
|
|
176
|
+
# Verification
|
|
177
|
+
Then User see [element] text with {{expected_text}}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Test Data
|
|
181
|
+
|
|
182
|
+
Define variables in `test-data/<screen>.yaml`:
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
# test-data/login.yaml
|
|
186
|
+
valid_email: "user@example.com"
|
|
187
|
+
valid_password: "SecurePassword123"
|
|
188
|
+
success:
|
|
189
|
+
message: "Welcome back!"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Element Selectors
|
|
193
|
+
|
|
194
|
+
Map elements in `selectors/<screen>.yaml`:
|
|
195
|
+
|
|
196
|
+
```yaml
|
|
197
|
+
# selectors/login.yaml
|
|
198
|
+
email-input:
|
|
199
|
+
selector: ""
|
|
200
|
+
type: "testid"
|
|
201
|
+
|
|
202
|
+
submit-button:
|
|
203
|
+
selector: ""
|
|
204
|
+
type: "role"
|
|
205
|
+
value: "button"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## šļø Architecture
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## š CLI Commands
|
|
216
|
+
|
|
217
|
+
### `sungen init`
|
|
218
|
+
Initialize Sungen project structure
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
sungen init
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Creates:
|
|
225
|
+
- `qa/screens/` directory for screen definitions
|
|
226
|
+
- `spec/generated/` directory for generated tests
|
|
227
|
+
- `playwright.config.ts` if it doesn't exist
|
|
228
|
+
- Updates `.gitignore` with Sungen patterns
|
|
229
|
+
|
|
230
|
+
### `sungen add --screen` ā NEW
|
|
231
|
+
Create a new screen definition with scaffolded files. Supports multiple test scenarios per screen.
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
sungen add --screen <name> [options]
|
|
235
|
+
|
|
236
|
+
Options:
|
|
237
|
+
--screen <name> Screen name (required)
|
|
238
|
+
-p, --path <path> Screen route path - also controls filename
|
|
239
|
+
-d, --description Screen description
|
|
240
|
+
|
|
241
|
+
Examples:
|
|
242
|
+
# Create screen with default file
|
|
243
|
+
sungen add --screen login
|
|
244
|
+
|
|
245
|
+
# Create screen with custom path/filename
|
|
246
|
+
sungen add --screen login --path /login-valid --description "Valid login"
|
|
247
|
+
|
|
248
|
+
# Add additional test scenarios to existing screen
|
|
249
|
+
sungen add --screen login --path /login-invalid
|
|
250
|
+
sungen add --screen login --path /login-mfa
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**What it does:**
|
|
254
|
+
- **First call**: Creates `qa/screens/<name>/` directory structure
|
|
255
|
+
- **Subsequent calls**: Adds additional feature files to existing screen
|
|
256
|
+
- Generates `features/<filename>.feature` with Gherkin template
|
|
257
|
+
- Generates `selectors/<filename>.yaml` with selector structure
|
|
258
|
+
- Generates `test-data/<filename>.yaml` for test variables
|
|
259
|
+
- **Path option**: Controls both filename and Path metadata in feature file
|
|
260
|
+
|
|
261
|
+
**Multi-file workflow** (organizing test scenarios):
|
|
262
|
+
```bash
|
|
263
|
+
# Create base screen
|
|
264
|
+
sungen add --screen login
|
|
265
|
+
|
|
266
|
+
# Add valid login scenario
|
|
267
|
+
sungen add --screen login --path /login-valid
|
|
268
|
+
|
|
269
|
+
# Add invalid credentials scenario
|
|
270
|
+
sungen add --screen login --path /login-invalid
|
|
271
|
+
|
|
272
|
+
# Add 2FA scenario
|
|
273
|
+
sungen add --screen login --path /login-mfa
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Result:
|
|
277
|
+
```
|
|
278
|
+
qa/screens/login/
|
|
279
|
+
āāā features/
|
|
280
|
+
ā āāā login.feature
|
|
281
|
+
ā āāā login-valid.feature
|
|
282
|
+
ā āāā login-invalid.feature
|
|
283
|
+
ā āāā login-mfa.feature
|
|
284
|
+
āāā selectors/
|
|
285
|
+
ā āāā login.yaml
|
|
286
|
+
ā āāā login-valid.yaml
|
|
287
|
+
ā āāā login-invalid.yaml
|
|
288
|
+
ā āāā login-mfa.yaml
|
|
289
|
+
āāā test-data/
|
|
290
|
+
āāā login.yaml
|
|
291
|
+
āāā login-valid.yaml
|
|
292
|
+
āāā login-invalid.yaml
|
|
293
|
+
āāā login-mfa.yaml
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Backward compatible**: Default behavior (no `--path`) creates single file named after screen.
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
### `sungen map`
|
|
300
|
+
Map Gherkin references to actual selectors using AI
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
sungen map --screen <screen-name> [options]
|
|
304
|
+
|
|
305
|
+
Options:
|
|
306
|
+
--screen <name> Screen name to map (required)
|
|
307
|
+
--all Map all screens
|
|
308
|
+
--force Force regeneration, bypass cache, overwrite existing files
|
|
309
|
+
--verbose Detailed output
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Output:** Processes each feature file individually, generating separate YAML files for each:
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
Mapping screen: login
|
|
316
|
+
|
|
317
|
+
ā Mapped login.feature
|
|
318
|
+
ā selectors/login.yaml (5 elements)
|
|
319
|
+
ā test-data/login.yaml (3 variables)
|
|
320
|
+
|
|
321
|
+
ā Mapped login-valid.feature
|
|
322
|
+
ā selectors/login-valid.yaml (3 elements)
|
|
323
|
+
ā test-data/login-valid.yaml (2 variables)
|
|
324
|
+
|
|
325
|
+
Next step: sungen generate --screen login
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Multi-file support:** Each `.feature` file generates matching `.yaml` files, maintaining clean separation between test scenarios.
|
|
329
|
+
|
|
330
|
+
### `sungen generate`
|
|
331
|
+
Generate Playwright test code from features
|
|
332
|
+
|
|
333
|
+
```bash
|
|
334
|
+
sungen generate [options]
|
|
335
|
+
|
|
336
|
+
Options:
|
|
337
|
+
--ai-mapper Enable AI fallback for unknown Gherkin patterns
|
|
338
|
+
--framework <name> Test framework (playwright, appium, integration) - default: playwright
|
|
339
|
+
-s, --screen <name> Filter generation to specific screen (recommended)
|
|
340
|
+
-f, --force Force regeneration, bypass cache
|
|
341
|
+
|
|
342
|
+
Examples:
|
|
343
|
+
sungen generate --screen login # Generate tests for login screen
|
|
344
|
+
sungen generate -s login --force # Force regenerate login screen tests
|
|
345
|
+
sungen generate # Generate all tests (legacy)
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Output:** Shows per-file results with step counts:
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
Generating tests: login
|
|
352
|
+
|
|
353
|
+
ā Generated login.spec.ts
|
|
354
|
+
ā spec/generated/login/login.spec.ts (8 steps)
|
|
355
|
+
|
|
356
|
+
ā Generated login-valid.spec.ts
|
|
357
|
+
ā spec/generated/login/login-valid.spec.ts (5 steps)
|
|
358
|
+
|
|
359
|
+
ā Generated login-invalid.spec.ts
|
|
360
|
+
ā spec/generated/login/login-invalid.spec.ts (3 steps)
|
|
361
|
+
|
|
362
|
+
Next step: npx playwright test
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**Selector Merging:** Supports optional base + feature-specific selector files:
|
|
366
|
+
- **Base file**: `selectors/<screen>.yaml` - Shared selectors for all scenarios
|
|
367
|
+
- **Feature file**: `selectors/<feature-name>.yaml` - Scenario-specific selectors (required)
|
|
368
|
+
- Feature-specific selectors override base selectors when keys conflict
|
|
369
|
+
|
|
370
|
+
**Validation:** Checks for missing selector files before generation and suggests running `map` command if needed.
|
|
371
|
+
|
|
372
|
+
### `sungen full`
|
|
373
|
+
Run complete pipeline (discover + map + generate)
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
sungen full [options]
|
|
377
|
+
|
|
378
|
+
Options:
|
|
379
|
+
--screen <name> Process specific screen (optional)
|
|
380
|
+
--depth <num> Max component depth
|
|
381
|
+
--force Force regeneration
|
|
382
|
+
--verbose Detailed output
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### `sungen cache-clear`
|
|
386
|
+
Clear all cached data
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
sungen cache-clear
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### `sungen auto-tag` ā NEW
|
|
393
|
+
Auto-inject stable `data-testid` attributes into source code
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
sungen auto-tag [options]
|
|
397
|
+
|
|
398
|
+
Options:
|
|
399
|
+
--screen <name> Tag specific screen (optional, defaults to all)
|
|
400
|
+
--dry-run Preview changes without modifying files
|
|
401
|
+
--force Overwrite existing data-testid (use with caution)
|
|
402
|
+
--verbose Show detailed changes
|
|
403
|
+
|
|
404
|
+
Examples:
|
|
405
|
+
sungen auto-tag --screen login --dry-run # Preview changes
|
|
406
|
+
sungen auto-tag --screen login # Apply changes
|
|
407
|
+
sungen auto-tag # Tag all screens
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
**What it does:**
|
|
411
|
+
- Scans React/Vue/HTML source code for interactive elements
|
|
412
|
+
- Injects `data-testid="screen-element"` attributes
|
|
413
|
+
- Idempotent (skips if `data-testid` already exists)
|
|
414
|
+
- Preserves code formatting (Prettier/ESLint compatible)
|
|
415
|
+
|
|
416
|
+
**Before:**
|
|
417
|
+
```tsx
|
|
418
|
+
<input type="email" name="email" />
|
|
419
|
+
<button onClick={handleSubmit}>Login</button>
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**After:**
|
|
423
|
+
```tsx
|
|
424
|
+
<input type="email" name="email" data-testid="login-email-input" />
|
|
425
|
+
<button onClick={handleSubmit} data-testid="login-submit-btn">Login</button>
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## š Examples
|
|
431
|
+
|
|
432
|
+
See the `/examples` folder for complete working examples:
|
|
433
|
+
|
|
434
|
+
- **ai-chat** - Chat application with authentication
|
|
435
|
+
- More examples coming soon!
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## š Documentation
|
|
440
|
+
|
|
441
|
+
### Getting Started
|
|
442
|
+
- **[Documentation Index](docs/README.md)** - Start here for all documentation
|
|
443
|
+
- **[Implementation Guide](docs/IMPLEMENTATION_GUIDE.md)** ā **Core reference**
|
|
444
|
+
- Kim chį» nam (North Star Principles)
|
|
445
|
+
- Architecture overview
|
|
446
|
+
- Implementation roadmap
|
|
447
|
+
- Best practices
|
|
448
|
+
|
|
449
|
+
### Core Guides
|
|
450
|
+
- **[System Overview](docs/SYSTEM_OVERVIEW.md)** - High-level architecture
|
|
451
|
+
- **[Gherkin Standards](docs/GHERKIN_STANDARDS.md)** - Gherkin syntax and conventions
|
|
452
|
+
- **[Selector Override Guide](docs/SELECTOR_OVERRIDE_GUIDE.md)** - How to fix AI mapping errors
|
|
453
|
+
- **[Debugging Guide](docs/DEBUGGING_GUIDE.md)** - Troubleshooting common issues
|
|
454
|
+
|
|
455
|
+
### Recent Updates
|
|
456
|
+
- **[Improvement Summary](docs/IMPROVEMENT_SUMMARY.md)** - Latest fixes and improvements (Dec 2025)
|
|
457
|
+
- Test results: 1 ā 6 passed (+500%)
|
|
458
|
+
- Selector override mechanism
|
|
459
|
+
- Heuristic mapper implementation
|
|
460
|
+
- Complete test-data structure
|
|
461
|
+
|
|
462
|
+
### Quick Links
|
|
463
|
+
- **For QA**: Start with [Gherkin Standards](docs/GHERKIN_STANDARDS.md)
|
|
464
|
+
- **For Developers**: Read [Implementation Guide](docs/IMPLEMENTATION_GUIDE.md)
|
|
465
|
+
- **Fix AI Errors**: Use [Selector Override](docs/SELECTOR_OVERRIDE_GUIDE.md)
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
## š¤ Contributing
|
|
470
|
+
|
|
471
|
+
Contributions are welcome! Please read our contributing guidelines and follow the **Kim chį» nam (North Star Principles)** in the [Implementation Guide](docs/IMPLEMENTATION_GUIDE.md).
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## š License
|
|
476
|
+
|
|
477
|
+
MIT License - see LICENSE file for details
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## š Credits
|
|
482
|
+
|
|
483
|
+
- Built with [Claude Sonnet 4.5](https://www.anthropic.com/claude)
|
|
484
|
+
- Uses [@anthropic-ai/sdk](https://github.com/anthropics/anthropic-sdk-typescript)
|
|
485
|
+
- Powered by [Playwright](https://playwright.dev/)
|
|
486
|
+
- Gherkin parsing by [@cucumber/gherkin](https://github.com/cucumber/gherkin)
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
**Made with ā¤ļø by Bach Ngoc Hoai**
|
package/bin/sungen.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sungen CLI Entry Point
|
|
5
|
+
* This file is the executable entry point for the sungen command
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Import tsx loader and run the CLI
|
|
9
|
+
require('tsx/cjs/api').register();
|
|
10
|
+
|
|
11
|
+
// Load and execute the CLI
|
|
12
|
+
require('../src/cli/index.ts');
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Tag CLI Command
|
|
3
|
+
* Injects data-testid attributes into source code
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { RuntimeConfig } from '../../config/config-schema';
|
|
7
|
+
export declare function createAutoTagCommand(config: RuntimeConfig): Command;
|
|
8
|
+
//# sourceMappingURL=auto-tag-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-tag-command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auto-tag-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAqEnE"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Tag CLI Command
|
|
4
|
+
* Injects data-testid attributes into source code
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.createAutoTagCommand = createAutoTagCommand;
|
|
41
|
+
const commander_1 = require("commander");
|
|
42
|
+
const auto_tagger_1 = require("../../tools/auto-tagger");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
function createAutoTagCommand(config) {
|
|
45
|
+
const cmd = new commander_1.Command('auto-tag');
|
|
46
|
+
cmd
|
|
47
|
+
.description('Auto-inject stable data-testid attributes into source code')
|
|
48
|
+
.option('--screen <name>', 'Tag specific screen (optional, defaults to all)')
|
|
49
|
+
.option('--dry-run', 'Preview changes without modifying files', false)
|
|
50
|
+
.option('--force', 'Overwrite existing data-testid attributes', false)
|
|
51
|
+
.option('--verbose', 'Show detailed output', false)
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
try {
|
|
54
|
+
console.log('\nš·ļø Sungen Auto-Tagger\n');
|
|
55
|
+
// Build config
|
|
56
|
+
const autoTagConfig = {
|
|
57
|
+
sourceRoot: path.resolve(config.paths.sourceRoot),
|
|
58
|
+
projectRoot: process.cwd(),
|
|
59
|
+
screenName: options.screen,
|
|
60
|
+
dryRun: options.dryRun,
|
|
61
|
+
force: options.force,
|
|
62
|
+
verbose: options.verbose,
|
|
63
|
+
preserveFormatting: false,
|
|
64
|
+
};
|
|
65
|
+
if (options.dryRun) {
|
|
66
|
+
console.log('š DRY RUN MODE - No files will be modified\n');
|
|
67
|
+
}
|
|
68
|
+
if (options.screen) {
|
|
69
|
+
console.log(`š Tagging screen: ${options.screen}\n`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log('š Tagging all screens\n');
|
|
73
|
+
}
|
|
74
|
+
// Run auto-tagger
|
|
75
|
+
const tagger = new auto_tagger_1.AutoTagger(autoTagConfig);
|
|
76
|
+
const stats = await tagger.tag();
|
|
77
|
+
// Display results
|
|
78
|
+
console.log('\nš RESULTS:\n');
|
|
79
|
+
console.log(`Files Processed: ${stats.totalFiles}`);
|
|
80
|
+
console.log(`Files Modified: ${stats.modifiedFiles}`);
|
|
81
|
+
console.log(`Total Elements: ${stats.totalElements}`);
|
|
82
|
+
console.log(`Elements Tagged: ${stats.taggedElements}`);
|
|
83
|
+
console.log(`Elements Skipped: ${stats.skippedElements}`);
|
|
84
|
+
console.log(`Processing Time: ${stats.processingTime}ms`);
|
|
85
|
+
if (stats.taggedElements > 0) {
|
|
86
|
+
const coverage = ((stats.taggedElements / stats.totalElements) * 100).toFixed(1);
|
|
87
|
+
console.log(`\n⨠Coverage: ${coverage}% of interactive elements now have data-testid`);
|
|
88
|
+
}
|
|
89
|
+
if (options.dryRun && stats.taggedElements > 0) {
|
|
90
|
+
console.log(`\nš” Run without --dry-run to apply changes`);
|
|
91
|
+
}
|
|
92
|
+
if (!options.dryRun && stats.modifiedFiles > 0) {
|
|
93
|
+
console.log(`\nā
Successfully tagged ${stats.taggedElements} elements in ${stats.modifiedFiles} files`);
|
|
94
|
+
}
|
|
95
|
+
console.log('');
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('\nā Auto-tagging failed:', error.message);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return cmd;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=auto-tag-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-tag-command.js","sourceRoot":"","sources":["../../../src/cli/commands/auto-tag-command.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOH,oDAqEC;AA1ED,yCAAoC;AACpC,yDAAoE;AAEpE,2CAA6B;AAE7B,SAAgB,oBAAoB,CAAC,MAAqB;IACxD,MAAM,GAAG,GAAG,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC;IAEpC,GAAG;SACA,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;SAC5E,MAAM,CAAC,WAAW,EAAE,yCAAyC,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,SAAS,EAAE,2CAA2C,EAAE,KAAK,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,sBAAsB,EAAE,KAAK,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAE3C,eAAe;YACf,MAAM,aAAa,GAAkB;gBACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjD,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;gBAC1B,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,kBAAkB,EAAE,KAAK;aAC1B,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YAC1C,CAAC;YAED,kBAAkB;YAClB,MAAM,MAAM,GAAG,IAAI,wBAAU,CAAC,aAAa,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;YAEjC,kBAAkB;YAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;YAE9D,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,gDAAgD,CAAC,CAAC;YACzF,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,cAAc,gBAAgB,KAAK,CAAC,aAAa,QAAQ,CAAC,CAAC;YAC1G,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|