create-appraisejs 0.3.1-alpha.0 → 0.4.0-alpha.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.
Files changed (577) hide show
  1. package/README.md +17 -17
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/prepare-template-utils.d.ts.map +1 -1
  5. package/dist/prepare-template-utils.js.map +1 -1
  6. package/dist/prompts.d.ts.map +1 -1
  7. package/dist/prompts.js +2 -2
  8. package/dist/prompts.js.map +1 -1
  9. package/dist/sync-templates-utils.d.ts.map +1 -1
  10. package/dist/sync-templates-utils.js +1 -5
  11. package/dist/sync-templates-utils.js.map +1 -1
  12. package/package.json +1 -1
  13. package/templates/blank/.editorconfig +11 -0
  14. package/templates/blank/.env.example +2 -2
  15. package/templates/blank/.gitattributes +21 -0
  16. package/templates/blank/.gitconfig.appraise +14 -0
  17. package/templates/blank/.prettierrc +13 -0
  18. package/templates/blank/.vscode/settings.json +2 -0
  19. package/templates/blank/README.md +12 -12
  20. package/templates/blank/components.json +24 -24
  21. package/templates/blank/cucumber.mjs +27 -16
  22. package/templates/blank/e2e/README.md +56 -0
  23. package/templates/blank/e2e/apply-migrations.mjs +76 -0
  24. package/templates/blank/e2e/appraise-smoke.spec.ts +78 -0
  25. package/templates/blank/e2e/authoring.spec.ts +53 -0
  26. package/templates/blank/e2e/crud-configuration.spec.ts +138 -0
  27. package/templates/blank/e2e/crud-tests.spec.ts +76 -0
  28. package/templates/blank/e2e/helpers/forms.ts +186 -0
  29. package/templates/blank/e2e/helpers/navigation.ts +27 -0
  30. package/templates/blank/e2e/helpers/table.ts +45 -0
  31. package/templates/blank/e2e/helpers/test-data.ts +559 -0
  32. package/templates/blank/e2e/helpers/ui.ts +41 -0
  33. package/templates/blank/e2e/navigation.spec.ts +101 -0
  34. package/templates/blank/e2e/runs-and-reports.spec.ts +82 -0
  35. package/templates/blank/e2e/settings-sync.spec.ts +39 -0
  36. package/templates/blank/e2e/start-server.mjs +61 -0
  37. package/templates/blank/eslint.config.mjs +4 -4
  38. package/templates/blank/gitignore +0 -3
  39. package/templates/blank/next-env.d.ts +6 -6
  40. package/templates/blank/package-lock.json +60 -104
  41. package/templates/blank/package.json +11 -10
  42. package/templates/blank/packages/cucumber-runtime/package.json +14 -13
  43. package/templates/blank/packages/cucumber-runtime/src/cache.util.ts +93 -93
  44. package/templates/blank/packages/cucumber-runtime/src/cli.ts +77 -68
  45. package/templates/blank/packages/cucumber-runtime/src/environment.util.ts +21 -21
  46. package/templates/blank/packages/cucumber-runtime/src/executor.ts +32 -32
  47. package/templates/blank/packages/cucumber-runtime/src/index.ts +17 -17
  48. package/templates/blank/packages/cucumber-runtime/src/locator.util.ts +234 -234
  49. package/templates/blank/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  50. package/templates/blank/packages/cucumber-runtime/src/paths.ts +22 -5
  51. package/templates/blank/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  52. package/templates/blank/packages/cucumber-runtime/src/types.ts +13 -13
  53. package/templates/blank/packages/cucumber-runtime/src/world.ts +44 -44
  54. package/templates/blank/packages/cucumber-runtime/tsconfig.json +11 -11
  55. package/templates/blank/packages/locator-picker-companion/dist/cli.js +1 -1
  56. package/templates/blank/packages/locator-picker-companion/dist/index.d.ts +3 -3
  57. package/templates/blank/packages/locator-picker-companion/dist/index.js +3 -3
  58. package/templates/blank/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  59. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  60. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  61. package/templates/blank/packages/locator-picker-companion/package.json +2 -1
  62. package/templates/blank/packages/locator-picker-companion/src/cli.ts +1 -7
  63. package/templates/blank/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  64. package/templates/blank/packages/locator-picker-companion/src/launcher.ts +1 -3
  65. package/templates/blank/packages/locator-picker-companion/src/session-file.ts +4 -15
  66. package/templates/blank/packages/locator-picker-companion/src/types.ts +1 -8
  67. package/templates/blank/playwright.config.ts +46 -0
  68. package/templates/blank/postcss.config.mjs +8 -8
  69. package/templates/blank/prisma/dev.db +0 -0
  70. package/templates/blank/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  71. package/templates/blank/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  72. package/templates/blank/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  73. package/templates/blank/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  74. package/templates/blank/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  75. package/templates/blank/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  76. package/templates/blank/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  77. package/templates/blank/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  78. package/templates/blank/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  79. package/templates/blank/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  80. package/templates/blank/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  81. package/templates/blank/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  82. package/templates/blank/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  83. package/templates/blank/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  84. package/templates/blank/scripts/configure-git-line-endings.mjs +91 -0
  85. package/templates/blank/scripts/install-template-step.ts +5 -1
  86. package/templates/blank/scripts/lib/step-matcher.test.ts +3 -3
  87. package/templates/blank/scripts/lib/step-matcher.ts +5 -1
  88. package/templates/blank/scripts/lib/template-step-installer.test.ts +4 -2
  89. package/templates/blank/scripts/lib/template-step-installer.ts +16 -4
  90. package/templates/blank/scripts/lib/template-step-registry.test.ts +1 -1
  91. package/templates/blank/scripts/lib/template-step-registry.ts +4 -1
  92. package/templates/blank/scripts/run-fallow-commit.mjs +4 -6
  93. package/templates/blank/scripts/setup-env.ts +0 -0
  94. package/templates/blank/scripts/sync-all.ts +7 -6
  95. package/templates/blank/scripts/sync-appraise-base-template.ts +84 -77
  96. package/templates/blank/scripts/sync-environments.ts +47 -44
  97. package/templates/blank/scripts/sync-locator-groups.ts +67 -76
  98. package/templates/blank/scripts/sync-locators.ts +50 -53
  99. package/templates/blank/scripts/sync-modules.ts +42 -42
  100. package/templates/blank/scripts/sync-tags.ts +51 -51
  101. package/templates/blank/scripts/sync-template-step-groups.ts +34 -32
  102. package/templates/blank/scripts/sync-template-steps.ts +97 -97
  103. package/templates/blank/scripts/sync-test-cases.ts +125 -84
  104. package/templates/blank/scripts/sync-test-suites.ts +85 -80
  105. package/templates/blank/src/actions/server-action-boundary.test.ts +1 -7
  106. package/templates/blank/src/actions/settings/sync-actions.ts +3 -1
  107. package/templates/blank/src/actions/tags/tag-actions.ts +1 -7
  108. package/templates/blank/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  109. package/templates/blank/src/app/(base)/environments/create/page.tsx +28 -28
  110. package/templates/blank/src/app/(base)/environments/environment-form.tsx +3 -2
  111. package/templates/blank/src/app/(base)/environments/environment-helpers.ts +4 -1
  112. package/templates/blank/src/app/(base)/layout.tsx +10 -10
  113. package/templates/blank/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  114. package/templates/blank/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  115. package/templates/blank/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  116. package/templates/blank/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  117. package/templates/blank/src/app/(base)/locator-groups/page.tsx +9 -19
  118. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  119. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  120. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  121. package/templates/blank/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  122. package/templates/blank/src/app/(base)/locators/locator-file-sync.ts +1 -5
  123. package/templates/blank/src/app/(base)/locators/locator-helpers.ts +2 -12
  124. package/templates/blank/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  125. package/templates/blank/src/app/(base)/modules/module-form.tsx +3 -1
  126. package/templates/blank/src/app/(base)/reports/overview-chart.tsx +49 -49
  127. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  128. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  129. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  130. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  131. package/templates/blank/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  132. package/templates/blank/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  133. package/templates/blank/src/app/(base)/tags/tag-form.test.tsx +2 -10
  134. package/templates/blank/src/app/(base)/tags/tag-form.tsx +5 -3
  135. package/templates/blank/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  136. package/templates/blank/src/app/(base)/tags/tag-table.tsx +29 -29
  137. package/templates/blank/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  138. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  139. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  140. package/templates/blank/src/app/(base)/template-steps/paramChip.tsx +6 -10
  141. package/templates/blank/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  142. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  143. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  144. package/templates/blank/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  145. package/templates/blank/src/app/(base)/template-steps/template-step-types.ts +1 -5
  146. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  147. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  148. package/templates/blank/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  149. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  150. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  151. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  152. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  153. package/templates/blank/src/app/(base)/test-cases/create/page.tsx +1 -5
  154. package/templates/blank/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  155. package/templates/blank/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  156. package/templates/blank/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  157. package/templates/blank/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  158. package/templates/blank/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  159. package/templates/blank/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  160. package/templates/blank/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  161. package/templates/blank/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  162. package/templates/blank/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  163. package/templates/blank/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  164. package/templates/blank/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  165. package/templates/blank/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  166. package/templates/blank/src/assets/icons/empty-tube.tsx +23 -23
  167. package/templates/blank/src/assets/icons/tube-plus.tsx +29 -29
  168. package/templates/blank/src/components/data-visualization/info-card.tsx +56 -70
  169. package/templates/blank/src/components/data-visualization/info-grid.tsx +22 -22
  170. package/templates/blank/src/components/diagram/add-node-prompt-node.tsx +1 -1
  171. package/templates/blank/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  172. package/templates/blank/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  173. package/templates/blank/src/components/diagram/dynamic-parameters.tsx +0 -1
  174. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  175. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  176. package/templates/blank/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  177. package/templates/blank/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  178. package/templates/blank/src/components/diagram/flow-diagram-node-search.tsx +73 -66
  179. package/templates/blank/src/components/diagram/flow-diagram-toolbar.tsx +35 -3
  180. package/templates/blank/src/components/diagram/flow-diagram-view.tsx +1 -7
  181. package/templates/blank/src/components/diagram/flow-diagram.test.tsx +225 -0
  182. package/templates/blank/src/components/diagram/flow-node-data-helpers.ts +1 -1
  183. package/templates/blank/src/components/diagram/node-form-fields-content.tsx +9 -2
  184. package/templates/blank/src/components/diagram/node-form-helpers.test.ts +3 -1
  185. package/templates/blank/src/components/diagram/node-form-helpers.ts +1 -4
  186. package/templates/blank/src/components/diagram/node-form-template-step-selection.ts +1 -4
  187. package/templates/blank/src/components/diagram/node-form.test.tsx +25 -0
  188. package/templates/blank/src/components/diagram/node-form.tsx +2 -12
  189. package/templates/blank/src/components/diagram/options-header-node.test.tsx +4 -1
  190. package/templates/blank/src/components/diagram/options-header-node.tsx +140 -130
  191. package/templates/blank/src/components/diagram/use-flow-diagram-search.ts +2 -0
  192. package/templates/blank/src/components/diagram/use-flow-diagram.ts +93 -1
  193. package/templates/blank/src/components/form/error-message.tsx +7 -7
  194. package/templates/blank/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  195. package/templates/blank/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  196. package/templates/blank/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  197. package/templates/blank/src/components/navigation/entity-search-command.tsx +3 -9
  198. package/templates/blank/src/components/navigation/nav-link.tsx +60 -60
  199. package/templates/blank/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  200. package/templates/blank/src/components/test-case/test-case-form-helpers.ts +1 -5
  201. package/templates/blank/src/components/test-case/test-case-picker-helpers.ts +8 -7
  202. package/templates/blank/src/components/test-case/test-case-picker.tsx +2 -6
  203. package/templates/blank/src/components/test-run/log-viewer.test.tsx +25 -0
  204. package/templates/blank/src/components/test-run/log-viewer.tsx +2 -2
  205. package/templates/blank/src/components/test-run/test-run-details-guards.ts +10 -1
  206. package/templates/blank/src/components/test-run/test-run-details.test.tsx +9 -19
  207. package/templates/blank/src/components/test-run/use-log-viewer.ts +2 -8
  208. package/templates/blank/src/components/test-run/use-test-run-header.ts +1 -4
  209. package/templates/blank/src/components/test-suite/test-suite-picker.tsx +1 -1
  210. package/templates/blank/src/components/theme/theme-provider.tsx +7 -1
  211. package/templates/blank/src/components/typography/page-header-subtitle.tsx +7 -7
  212. package/templates/blank/src/components/typography/page-header.tsx +7 -7
  213. package/templates/blank/src/components/ui/chart.tsx +2 -8
  214. package/templates/blank/src/components/ui/command.tsx +2 -5
  215. package/templates/blank/src/components/ui/data-table-column-header.tsx +3 -3
  216. package/templates/blank/src/components/ui/data-table.test.tsx +1 -8
  217. package/templates/blank/src/components/ui/dialog.tsx +1 -4
  218. package/templates/blank/src/components/ui/select.tsx +2 -2
  219. package/templates/blank/src/components/ui/separator.tsx +5 -1
  220. package/templates/blank/src/components/ui/skeleton.tsx +7 -7
  221. package/templates/blank/src/components/ui/table.tsx +1 -1
  222. package/templates/blank/src/components/ui/toaster.tsx +26 -26
  223. package/templates/blank/src/components/ui/tooltip.tsx +1 -1
  224. package/templates/blank/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  225. package/templates/blank/src/lib/appraise-test-case-metadata.test.ts +78 -0
  226. package/templates/blank/src/lib/appraise-test-case-metadata.ts +220 -0
  227. package/templates/blank/src/lib/automation/automation-path-roots.test.ts +14 -0
  228. package/templates/blank/src/lib/automation/automation-path-roots.ts +10 -2
  229. package/templates/blank/src/lib/database-sync.ts +166 -15
  230. package/templates/blank/src/lib/executor/local-executor-adapter.ts +6 -2
  231. package/templates/blank/src/lib/feature-file-generator.ts +54 -10
  232. package/templates/blank/src/lib/gherkin-parser.test.ts +52 -0
  233. package/templates/blank/src/lib/gherkin-parser.ts +39 -1
  234. package/templates/blank/src/lib/locator-group-file-utils.ts +5 -1
  235. package/templates/blank/src/lib/locator-picker/session-manager.ts +1 -2
  236. package/templates/blank/src/lib/metrics/metric-calculator.test.ts +105 -6
  237. package/templates/blank/src/lib/metrics/metric-calculator.ts +39 -40
  238. package/templates/blank/src/lib/sync/projected-feature-utils.ts +5 -1
  239. package/templates/blank/src/lib/sync/sync-executor.ts +1 -4
  240. package/templates/blank/src/lib/sync/sync-pending-counts.test.ts +316 -7
  241. package/templates/blank/src/lib/sync/sync-pending-counts.ts +189 -26
  242. package/templates/blank/src/lib/template-automation-paths.ts +1 -1
  243. package/templates/blank/src/lib/template-sync-utils.d.ts +14 -7
  244. package/templates/blank/src/lib/test-case-utils.ts +6 -6
  245. package/templates/blank/src/lib/test-run/log-formatter.ts +82 -83
  246. package/templates/blank/src/lib/test-run/report-parser.ts +352 -352
  247. package/templates/blank/src/lib/transformers/gherkin-converter.ts +42 -42
  248. package/templates/blank/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  249. package/templates/blank/src/lib/utils/node-param-validation.ts +81 -81
  250. package/templates/blank/src/lib/utils/template-step-file-generator.ts +5 -3
  251. package/templates/blank/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  252. package/templates/blank/src/services/dashboard/dashboard-service.test.ts +28 -1
  253. package/templates/blank/src/services/dashboard/dashboard-service.ts +2 -0
  254. package/templates/blank/src/services/locator/locator-service.test.ts +1 -3
  255. package/templates/blank/src/services/locator/locator-service.ts +3 -1
  256. package/templates/blank/src/services/locator/locator-sync-utils.test.ts +1 -4
  257. package/templates/blank/src/services/module/module-service.ts +1 -4
  258. package/templates/blank/src/services/report/report-service.test.ts +70 -6
  259. package/templates/blank/src/services/report/report-service.ts +52 -9
  260. package/templates/blank/src/services/shared/errors.ts +2 -4
  261. package/templates/blank/src/services/template-step/template-step-service.ts +3 -1
  262. package/templates/blank/src/services/template-step-group/template-step-group-service.ts +3 -1
  263. package/templates/blank/src/services/test-case/test-case-service.ts +0 -5
  264. package/templates/blank/src/services/test-run/test-run-service.test.ts +13 -6
  265. package/templates/blank/src/services/test-run/test-run-service.ts +53 -8
  266. package/templates/blank/src/services/test-suite/test-suite-service.test.ts +1 -5
  267. package/templates/blank/src/services/test-suite/test-suite-service.ts +2 -4
  268. package/templates/blank/src/types/form/actionHandler.ts +1 -5
  269. package/templates/blank/tsconfig.json +8 -8
  270. package/templates/starter/.editorconfig +11 -0
  271. package/templates/starter/.env.example +2 -2
  272. package/templates/starter/.gitattributes +21 -0
  273. package/templates/starter/.gitconfig.appraise +14 -0
  274. package/templates/starter/.prettierrc +13 -0
  275. package/templates/starter/.vscode/settings.json +2 -0
  276. package/templates/starter/README.md +12 -12
  277. package/templates/starter/automation/steps/actions/click.step.ts +56 -58
  278. package/templates/starter/automation/steps/actions/hover.step.ts +25 -27
  279. package/templates/starter/automation/steps/actions/input.step.ts +85 -108
  280. package/templates/starter/automation/steps/actions/navigation.step.ts +67 -70
  281. package/templates/starter/automation/steps/actions/random_data.step.ts +149 -143
  282. package/templates/starter/automation/steps/actions/store.step.ts +69 -1
  283. package/templates/starter/automation/steps/actions/wait.step.ts +84 -1
  284. package/templates/starter/automation/steps/validations/active_state_assertion.step.ts +28 -30
  285. package/templates/starter/automation/steps/validations/navigation_assertion.step.ts +20 -22
  286. package/templates/starter/automation/steps/validations/text_assertion.step.ts +67 -107
  287. package/templates/starter/automation/steps/validations/visibility_assertion.step.ts +24 -26
  288. package/templates/starter/components.json +24 -24
  289. package/templates/starter/cucumber.mjs +27 -16
  290. package/templates/starter/e2e/README.md +56 -0
  291. package/templates/starter/e2e/apply-migrations.mjs +76 -0
  292. package/templates/starter/e2e/appraise-smoke.spec.ts +78 -0
  293. package/templates/starter/e2e/authoring.spec.ts +53 -0
  294. package/templates/starter/e2e/crud-configuration.spec.ts +138 -0
  295. package/templates/starter/e2e/crud-tests.spec.ts +76 -0
  296. package/templates/starter/e2e/helpers/forms.ts +186 -0
  297. package/templates/starter/e2e/helpers/navigation.ts +27 -0
  298. package/templates/starter/e2e/helpers/table.ts +45 -0
  299. package/templates/starter/e2e/helpers/test-data.ts +559 -0
  300. package/templates/starter/e2e/helpers/ui.ts +41 -0
  301. package/templates/starter/e2e/navigation.spec.ts +101 -0
  302. package/templates/starter/e2e/runs-and-reports.spec.ts +82 -0
  303. package/templates/starter/e2e/settings-sync.spec.ts +39 -0
  304. package/templates/starter/e2e/start-server.mjs +61 -0
  305. package/templates/starter/eslint.config.mjs +4 -4
  306. package/templates/starter/gitignore +0 -3
  307. package/templates/starter/next-env.d.ts +6 -6
  308. package/templates/starter/package-lock.json +60 -104
  309. package/templates/starter/package.json +11 -10
  310. package/templates/starter/packages/cucumber-runtime/package.json +14 -13
  311. package/templates/starter/packages/cucumber-runtime/src/cache.util.ts +93 -93
  312. package/templates/starter/packages/cucumber-runtime/src/cli.ts +77 -68
  313. package/templates/starter/packages/cucumber-runtime/src/environment.util.ts +21 -21
  314. package/templates/starter/packages/cucumber-runtime/src/executor.ts +32 -32
  315. package/templates/starter/packages/cucumber-runtime/src/index.ts +17 -17
  316. package/templates/starter/packages/cucumber-runtime/src/locator.util.ts +234 -234
  317. package/templates/starter/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  318. package/templates/starter/packages/cucumber-runtime/src/paths.ts +22 -5
  319. package/templates/starter/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  320. package/templates/starter/packages/cucumber-runtime/src/types.ts +13 -13
  321. package/templates/starter/packages/cucumber-runtime/src/world.ts +44 -44
  322. package/templates/starter/packages/cucumber-runtime/tsconfig.json +11 -11
  323. package/templates/starter/packages/locator-picker-companion/dist/cli.js +1 -1
  324. package/templates/starter/packages/locator-picker-companion/dist/index.d.ts +3 -3
  325. package/templates/starter/packages/locator-picker-companion/dist/index.js +3 -3
  326. package/templates/starter/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  327. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  328. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  329. package/templates/starter/packages/locator-picker-companion/package.json +2 -1
  330. package/templates/starter/packages/locator-picker-companion/src/cli.ts +1 -7
  331. package/templates/starter/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  332. package/templates/starter/packages/locator-picker-companion/src/launcher.ts +1 -3
  333. package/templates/starter/packages/locator-picker-companion/src/session-file.ts +4 -15
  334. package/templates/starter/packages/locator-picker-companion/src/types.ts +1 -8
  335. package/templates/starter/playwright.config.ts +46 -0
  336. package/templates/starter/postcss.config.mjs +8 -8
  337. package/templates/starter/prisma/dev.db +0 -0
  338. package/templates/starter/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  339. package/templates/starter/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  340. package/templates/starter/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  341. package/templates/starter/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  342. package/templates/starter/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  343. package/templates/starter/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  344. package/templates/starter/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  345. package/templates/starter/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  346. package/templates/starter/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  347. package/templates/starter/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  348. package/templates/starter/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  349. package/templates/starter/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  350. package/templates/starter/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  351. package/templates/starter/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  352. package/templates/starter/scripts/configure-git-line-endings.mjs +91 -0
  353. package/templates/starter/scripts/install-template-step.ts +5 -1
  354. package/templates/starter/scripts/lib/step-matcher.test.ts +3 -3
  355. package/templates/starter/scripts/lib/step-matcher.ts +5 -1
  356. package/templates/starter/scripts/lib/template-step-installer.test.ts +4 -2
  357. package/templates/starter/scripts/lib/template-step-installer.ts +16 -4
  358. package/templates/starter/scripts/lib/template-step-registry.test.ts +1 -1
  359. package/templates/starter/scripts/lib/template-step-registry.ts +4 -1
  360. package/templates/starter/scripts/run-fallow-commit.mjs +4 -6
  361. package/templates/starter/scripts/setup-env.ts +0 -0
  362. package/templates/starter/scripts/sync-all.ts +7 -6
  363. package/templates/starter/scripts/sync-appraise-base-template.ts +84 -77
  364. package/templates/starter/scripts/sync-environments.ts +47 -44
  365. package/templates/starter/scripts/sync-locator-groups.ts +67 -76
  366. package/templates/starter/scripts/sync-locators.ts +50 -53
  367. package/templates/starter/scripts/sync-modules.ts +42 -42
  368. package/templates/starter/scripts/sync-tags.ts +51 -51
  369. package/templates/starter/scripts/sync-template-step-groups.ts +34 -32
  370. package/templates/starter/scripts/sync-template-steps.ts +97 -97
  371. package/templates/starter/scripts/sync-test-cases.ts +125 -84
  372. package/templates/starter/scripts/sync-test-suites.ts +85 -80
  373. package/templates/starter/src/actions/server-action-boundary.test.ts +1 -7
  374. package/templates/starter/src/actions/settings/sync-actions.ts +3 -1
  375. package/templates/starter/src/actions/tags/tag-actions.ts +1 -7
  376. package/templates/starter/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  377. package/templates/starter/src/app/(base)/environments/create/page.tsx +28 -28
  378. package/templates/starter/src/app/(base)/environments/environment-form.tsx +3 -2
  379. package/templates/starter/src/app/(base)/environments/environment-helpers.ts +4 -1
  380. package/templates/starter/src/app/(base)/layout.tsx +10 -10
  381. package/templates/starter/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  382. package/templates/starter/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  383. package/templates/starter/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  384. package/templates/starter/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  385. package/templates/starter/src/app/(base)/locator-groups/page.tsx +9 -19
  386. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  387. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  388. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  389. package/templates/starter/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  390. package/templates/starter/src/app/(base)/locators/locator-file-sync.ts +1 -5
  391. package/templates/starter/src/app/(base)/locators/locator-helpers.ts +2 -12
  392. package/templates/starter/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  393. package/templates/starter/src/app/(base)/modules/module-form.tsx +3 -1
  394. package/templates/starter/src/app/(base)/reports/overview-chart.tsx +49 -49
  395. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  396. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  397. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  398. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  399. package/templates/starter/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  400. package/templates/starter/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  401. package/templates/starter/src/app/(base)/tags/tag-form.test.tsx +2 -10
  402. package/templates/starter/src/app/(base)/tags/tag-form.tsx +5 -3
  403. package/templates/starter/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  404. package/templates/starter/src/app/(base)/tags/tag-table.tsx +29 -29
  405. package/templates/starter/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  406. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  407. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  408. package/templates/starter/src/app/(base)/template-steps/paramChip.tsx +6 -10
  409. package/templates/starter/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  410. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  411. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  412. package/templates/starter/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  413. package/templates/starter/src/app/(base)/template-steps/template-step-types.ts +1 -5
  414. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  415. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  416. package/templates/starter/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  417. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  418. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  419. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  420. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  421. package/templates/starter/src/app/(base)/test-cases/create/page.tsx +1 -5
  422. package/templates/starter/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  423. package/templates/starter/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  424. package/templates/starter/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  425. package/templates/starter/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  426. package/templates/starter/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  427. package/templates/starter/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  428. package/templates/starter/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  429. package/templates/starter/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  430. package/templates/starter/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  431. package/templates/starter/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  432. package/templates/starter/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  433. package/templates/starter/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  434. package/templates/starter/src/assets/icons/empty-tube.tsx +23 -23
  435. package/templates/starter/src/assets/icons/tube-plus.tsx +29 -29
  436. package/templates/starter/src/components/data-visualization/info-card.tsx +56 -70
  437. package/templates/starter/src/components/data-visualization/info-grid.tsx +22 -22
  438. package/templates/starter/src/components/diagram/add-node-prompt-node.tsx +1 -1
  439. package/templates/starter/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  440. package/templates/starter/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  441. package/templates/starter/src/components/diagram/dynamic-parameters.tsx +0 -1
  442. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  443. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  444. package/templates/starter/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  445. package/templates/starter/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  446. package/templates/starter/src/components/diagram/flow-diagram-node-search.tsx +73 -66
  447. package/templates/starter/src/components/diagram/flow-diagram-toolbar.tsx +35 -3
  448. package/templates/starter/src/components/diagram/flow-diagram-view.tsx +1 -7
  449. package/templates/starter/src/components/diagram/flow-diagram.test.tsx +225 -0
  450. package/templates/starter/src/components/diagram/flow-node-data-helpers.ts +1 -1
  451. package/templates/starter/src/components/diagram/node-form-fields-content.tsx +9 -2
  452. package/templates/starter/src/components/diagram/node-form-helpers.test.ts +3 -1
  453. package/templates/starter/src/components/diagram/node-form-helpers.ts +1 -4
  454. package/templates/starter/src/components/diagram/node-form-template-step-selection.ts +1 -4
  455. package/templates/starter/src/components/diagram/node-form.test.tsx +25 -0
  456. package/templates/starter/src/components/diagram/node-form.tsx +2 -12
  457. package/templates/starter/src/components/diagram/options-header-node.test.tsx +4 -1
  458. package/templates/starter/src/components/diagram/options-header-node.tsx +140 -130
  459. package/templates/starter/src/components/diagram/use-flow-diagram-search.ts +2 -0
  460. package/templates/starter/src/components/diagram/use-flow-diagram.ts +93 -1
  461. package/templates/starter/src/components/form/error-message.tsx +7 -7
  462. package/templates/starter/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  463. package/templates/starter/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  464. package/templates/starter/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  465. package/templates/starter/src/components/navigation/entity-search-command.tsx +3 -9
  466. package/templates/starter/src/components/navigation/nav-link.tsx +60 -60
  467. package/templates/starter/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  468. package/templates/starter/src/components/test-case/test-case-form-helpers.ts +1 -5
  469. package/templates/starter/src/components/test-case/test-case-picker-helpers.ts +8 -7
  470. package/templates/starter/src/components/test-case/test-case-picker.tsx +2 -6
  471. package/templates/starter/src/components/test-run/log-viewer.test.tsx +25 -0
  472. package/templates/starter/src/components/test-run/log-viewer.tsx +2 -2
  473. package/templates/starter/src/components/test-run/test-run-details-guards.ts +10 -1
  474. package/templates/starter/src/components/test-run/test-run-details.test.tsx +9 -19
  475. package/templates/starter/src/components/test-run/use-log-viewer.ts +2 -8
  476. package/templates/starter/src/components/test-run/use-test-run-header.ts +1 -4
  477. package/templates/starter/src/components/test-suite/test-suite-picker.tsx +1 -1
  478. package/templates/starter/src/components/theme/theme-provider.tsx +7 -1
  479. package/templates/starter/src/components/typography/page-header-subtitle.tsx +7 -7
  480. package/templates/starter/src/components/typography/page-header.tsx +7 -7
  481. package/templates/starter/src/components/ui/chart.tsx +2 -8
  482. package/templates/starter/src/components/ui/command.tsx +2 -5
  483. package/templates/starter/src/components/ui/data-table-column-header.tsx +3 -3
  484. package/templates/starter/src/components/ui/data-table.test.tsx +1 -8
  485. package/templates/starter/src/components/ui/dialog.tsx +1 -4
  486. package/templates/starter/src/components/ui/select.tsx +2 -2
  487. package/templates/starter/src/components/ui/separator.tsx +5 -1
  488. package/templates/starter/src/components/ui/skeleton.tsx +7 -7
  489. package/templates/starter/src/components/ui/table.tsx +1 -1
  490. package/templates/starter/src/components/ui/toaster.tsx +26 -26
  491. package/templates/starter/src/components/ui/tooltip.tsx +1 -1
  492. package/templates/starter/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  493. package/templates/starter/src/lib/appraise-test-case-metadata.test.ts +78 -0
  494. package/templates/starter/src/lib/appraise-test-case-metadata.ts +220 -0
  495. package/templates/starter/src/lib/automation/automation-path-roots.test.ts +14 -0
  496. package/templates/starter/src/lib/automation/automation-path-roots.ts +10 -2
  497. package/templates/starter/src/lib/database-sync.ts +166 -15
  498. package/templates/starter/src/lib/executor/local-executor-adapter.ts +6 -2
  499. package/templates/starter/src/lib/feature-file-generator.ts +54 -10
  500. package/templates/starter/src/lib/gherkin-parser.test.ts +52 -0
  501. package/templates/starter/src/lib/gherkin-parser.ts +39 -1
  502. package/templates/starter/src/lib/locator-group-file-utils.ts +5 -1
  503. package/templates/starter/src/lib/locator-picker/session-manager.ts +1 -2
  504. package/templates/starter/src/lib/metrics/metric-calculator.test.ts +105 -6
  505. package/templates/starter/src/lib/metrics/metric-calculator.ts +39 -40
  506. package/templates/starter/src/lib/sync/projected-feature-utils.ts +5 -1
  507. package/templates/starter/src/lib/sync/sync-executor.ts +1 -4
  508. package/templates/starter/src/lib/sync/sync-pending-counts.test.ts +316 -7
  509. package/templates/starter/src/lib/sync/sync-pending-counts.ts +189 -26
  510. package/templates/starter/src/lib/template-automation-paths.ts +1 -1
  511. package/templates/starter/src/lib/template-sync-utils.d.ts +14 -7
  512. package/templates/starter/src/lib/test-case-utils.ts +6 -6
  513. package/templates/starter/src/lib/test-run/log-formatter.ts +82 -83
  514. package/templates/starter/src/lib/test-run/report-parser.ts +352 -352
  515. package/templates/starter/src/lib/transformers/gherkin-converter.ts +42 -42
  516. package/templates/starter/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  517. package/templates/starter/src/lib/utils/node-param-validation.ts +81 -81
  518. package/templates/starter/src/lib/utils/template-step-file-generator.ts +5 -3
  519. package/templates/starter/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  520. package/templates/starter/src/services/dashboard/dashboard-service.test.ts +28 -1
  521. package/templates/starter/src/services/dashboard/dashboard-service.ts +2 -0
  522. package/templates/starter/src/services/locator/locator-service.test.ts +1 -3
  523. package/templates/starter/src/services/locator/locator-service.ts +3 -1
  524. package/templates/starter/src/services/locator/locator-sync-utils.test.ts +1 -4
  525. package/templates/starter/src/services/module/module-service.ts +1 -4
  526. package/templates/starter/src/services/report/report-service.test.ts +70 -6
  527. package/templates/starter/src/services/report/report-service.ts +52 -9
  528. package/templates/starter/src/services/shared/errors.ts +2 -4
  529. package/templates/starter/src/services/template-step/template-step-service.ts +3 -1
  530. package/templates/starter/src/services/template-step-group/template-step-group-service.ts +3 -1
  531. package/templates/starter/src/services/test-case/test-case-service.ts +0 -5
  532. package/templates/starter/src/services/test-run/test-run-service.test.ts +13 -6
  533. package/templates/starter/src/services/test-run/test-run-service.ts +53 -8
  534. package/templates/starter/src/services/test-suite/test-suite-service.test.ts +1 -5
  535. package/templates/starter/src/services/test-suite/test-suite-service.ts +2 -4
  536. package/templates/starter/src/types/form/actionHandler.ts +1 -5
  537. package/templates/starter/tsconfig.json +8 -8
  538. package/dist/cli.e2e.test.d.ts +0 -2
  539. package/dist/cli.e2e.test.d.ts.map +0 -1
  540. package/dist/cli.e2e.test.js +0 -73
  541. package/dist/cli.e2e.test.js.map +0 -1
  542. package/dist/config.test.d.ts +0 -2
  543. package/dist/config.test.d.ts.map +0 -1
  544. package/dist/config.test.js +0 -65
  545. package/dist/config.test.js.map +0 -1
  546. package/dist/copy-template.test.d.ts +0 -2
  547. package/dist/copy-template.test.d.ts.map +0 -1
  548. package/dist/copy-template.test.js +0 -71
  549. package/dist/copy-template.test.js.map +0 -1
  550. package/dist/download-repo.test.d.ts +0 -2
  551. package/dist/download-repo.test.d.ts.map +0 -1
  552. package/dist/download-repo.test.js +0 -14
  553. package/dist/download-repo.test.js.map +0 -1
  554. package/dist/install.test.d.ts +0 -2
  555. package/dist/install.test.d.ts.map +0 -1
  556. package/dist/install.test.js +0 -119
  557. package/dist/install.test.js.map +0 -1
  558. package/dist/prompts.test.d.ts +0 -2
  559. package/dist/prompts.test.d.ts.map +0 -1
  560. package/dist/prompts.test.js +0 -58
  561. package/dist/prompts.test.js.map +0 -1
  562. package/templates/default/next-env.d.ts +0 -6
  563. package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +0 -1
  564. package/templates/default/packages/locator-picker-companion/dist/cli.js +0 -302
  565. package/templates/default/packages/locator-picker-companion/dist/index.d.ts +0 -3
  566. package/templates/default/packages/locator-picker-companion/dist/index.js +0 -3
  567. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +0 -1
  568. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +0 -615
  569. package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +0 -11
  570. package/templates/default/packages/locator-picker-companion/dist/launcher.js +0 -59
  571. package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +0 -3
  572. package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +0 -257
  573. package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +0 -22
  574. package/templates/default/packages/locator-picker-companion/dist/session-file.js +0 -150
  575. package/templates/default/packages/locator-picker-companion/dist/types.d.ts +0 -31
  576. package/templates/default/packages/locator-picker-companion/dist/types.js +0 -1
  577. package/templates/default/prisma/dev.db +0 -0
@@ -0,0 +1,138 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ import {
4
+ disconnectPrisma,
5
+ findEnvironmentByName,
6
+ findModuleByName,
7
+ findTagByName,
8
+ resetE2eData,
9
+ seedCoreData,
10
+ seededIds,
11
+ } from './helpers/test-data'
12
+ import {
13
+ createLocator,
14
+ createLocatorGroup,
15
+ createTemplateStep,
16
+ createTemplateStepGroup,
17
+ createTemplateTestCase,
18
+ editEnvironment,
19
+ editTag,
20
+ } from './helpers/forms'
21
+ import { createEnvironment, createModule, createTag, expectPageHeading, saveForm } from './helpers/ui'
22
+ import { deleteRowByName, editRowByName, expectRowHidden, filterTableByName } from './helpers/table'
23
+
24
+ test.describe('Configuration CRUD @crud', () => {
25
+ test.beforeEach(async () => {
26
+ await resetE2eData()
27
+ await seedCoreData()
28
+ })
29
+
30
+ test.afterAll(async () => {
31
+ await disconnectPrisma()
32
+ })
33
+
34
+ test('environment tag and locator entities support create edit and delete', async ({ page }) => {
35
+ const environmentName = 'E2E Config Environment'
36
+ const editedEnvironmentName = 'E2E Config Environment Edited'
37
+ const tagName = 'E2E Config Tag'
38
+ const editedTagName = 'E2E Config Tag Edited'
39
+ const locatorGroupName = 'E2E Config Locator Group'
40
+ const locatorName = 'E2E Config Locator'
41
+
42
+ await createEnvironment(page, environmentName)
43
+ const createdEnvironment = await findEnvironmentByName(environmentName)
44
+ expect(createdEnvironment).not.toBeNull()
45
+ await editEnvironment(page, createdEnvironment!.id, editedEnvironmentName)
46
+ await expect(page.getByText(editedEnvironmentName, { exact: true }).first()).toBeVisible()
47
+
48
+ await createTag(page, tagName, '@e2e-config')
49
+ const createdTag = await findTagByName(tagName)
50
+ expect(createdTag).not.toBeNull()
51
+ await editTag(page, createdTag!.id, editedTagName, '@e2e-config-edited')
52
+ await expect(page.getByText(editedTagName, { exact: true }).first()).toBeVisible()
53
+
54
+ await createLocatorGroup(page, locatorGroupName, 'E2E Auth', '/config-login')
55
+ await createLocator(page, locatorName, 'text=Config button', locatorGroupName)
56
+
57
+ await page.goto(`/locators/modify/${seededIds.locator}`)
58
+ await expect(page.getByRole('button', { name: 'Update Locator' })).toBeVisible()
59
+ await page.getByLabel('Locator Name').fill('E2E Sign In Button Edited')
60
+ await page.getByRole('button', { name: 'Update Locator' }).click()
61
+ await expect(page).toHaveURL(/\/locators$/)
62
+ await expect(page.getByText('E2E Sign In Button Edited', { exact: true }).first()).toBeVisible()
63
+
64
+ await deleteRowByName(page, locatorName)
65
+ await page.reload()
66
+ await expectRowHidden(page, locatorName)
67
+
68
+ await page.goto('/locator-groups')
69
+ await deleteRowByName(page, locatorGroupName)
70
+ await page.reload()
71
+ await expectRowHidden(page, locatorGroupName)
72
+
73
+ await page.goto('/tags')
74
+ await deleteRowByName(page, editedTagName)
75
+ await page.reload()
76
+ await expectRowHidden(page, editedTagName)
77
+
78
+ await page.goto('/environments')
79
+ await deleteRowByName(page, editedEnvironmentName)
80
+ await page.reload()
81
+ await expectRowHidden(page, editedEnvironmentName)
82
+ })
83
+
84
+ test('template catalog entities support create edit and delete', async ({ page }) => {
85
+ const groupName = 'E2E Config Template Group'
86
+ const stepName = 'E2E Config Template Step'
87
+ const templateCaseName = 'E2E Config Template Case'
88
+
89
+ await createTemplateStepGroup(page, groupName)
90
+ await createTemplateStep(page, stepName, groupName)
91
+ await createTemplateTestCase(page, templateCaseName)
92
+
93
+ await page.goto('/template-step-groups')
94
+ await editRowByName(page, groupName)
95
+ await page.getByLabel('Name').fill(`${groupName} Edited`)
96
+ await saveForm(page)
97
+ await expect(page.getByText(`${groupName} Edited`, { exact: true }).first()).toBeVisible()
98
+
99
+ await page.goto('/template-steps')
100
+ await editRowByName(page, stepName)
101
+ await page.getByLabel('Name').fill(`${stepName} Edited`)
102
+ await page.getByRole('button', { name: /^Save$/ }).click()
103
+ await expect(page.getByText(`${stepName} Edited`, { exact: true }).first()).toBeVisible()
104
+
105
+ await page.goto('/template-test-cases')
106
+ await deleteRowByName(page, templateCaseName)
107
+ await page.reload()
108
+ await expectRowHidden(page, templateCaseName)
109
+
110
+ await page.goto('/template-steps')
111
+ await deleteRowByName(page, `${stepName} Edited`)
112
+ await page.reload()
113
+ await expectRowHidden(page, `${stepName} Edited`)
114
+
115
+ await page.goto('/template-step-groups')
116
+ await deleteRowByName(page, `${groupName} Edited`)
117
+ await page.reload()
118
+ await expectRowHidden(page, `${groupName} Edited`)
119
+ })
120
+
121
+ test('module create edit delete remains available for configuration flows', async ({ page }) => {
122
+ const moduleName = 'E2E Config Module'
123
+ const editedModuleName = 'E2E Config Module Edited'
124
+
125
+ await createModule(page, moduleName)
126
+ const createdModule = await findModuleByName(moduleName)
127
+ expect(createdModule).not.toBeNull()
128
+
129
+ await page.goto(`/modules/modify/${createdModule?.id}`)
130
+ await page.getByLabel('Name').fill(editedModuleName)
131
+ await saveForm(page)
132
+ await expect(page.getByText(editedModuleName, { exact: true }).first()).toBeVisible()
133
+
134
+ await deleteRowByName(page, editedModuleName)
135
+ await page.reload()
136
+ await expectRowHidden(page, editedModuleName)
137
+ })
138
+ })
@@ -0,0 +1,76 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ import { disconnectPrisma, findModuleByName, resetE2eData, seedCoreData, seededIds } from './helpers/test-data'
4
+ import { createTestCaseWithSeededStep, createTestSuite } from './helpers/forms'
5
+ import { expectPageHeading, saveForm } from './helpers/ui'
6
+ import { deleteRowByName, editRowByName, expectRowHidden, filterTableByName } from './helpers/table'
7
+ import { selectFilterTags, selectTestSuites } from './helpers/forms'
8
+
9
+ test.describe('Test hierarchy CRUD @crud', () => {
10
+ test.beforeEach(async () => {
11
+ await resetE2eData()
12
+ await seedCoreData()
13
+ })
14
+
15
+ test.afterAll(async () => {
16
+ await disconnectPrisma()
17
+ })
18
+
19
+ test('test suite create edit and delete assign seeded cases', async ({ page }) => {
20
+ const suiteName = 'E2E UI Suite'
21
+ const editedSuiteName = 'E2E UI Suite Edited'
22
+
23
+ await createTestSuite(page, suiteName, 'E2E Auth', 'E2E seeded login works')
24
+
25
+ await editRowByName(page, suiteName)
26
+ await page.getByPlaceholder('Enter name for your test suite').fill(editedSuiteName)
27
+ await saveForm(page)
28
+ await expect(page.getByText(editedSuiteName, { exact: true }).first()).toBeVisible()
29
+
30
+ await deleteRowByName(page, editedSuiteName)
31
+ await page.reload()
32
+ await expectRowHidden(page, editedSuiteName)
33
+ })
34
+
35
+ test('test case create modify preview and delete', async ({ page }) => {
36
+ const caseTitle = 'E2E UI Auth Case'
37
+
38
+ await createTestCaseWithSeededStep(page, caseTitle)
39
+
40
+ await page.goto(`/test-cases/modify/${seededIds.testCase}`)
41
+ await expectPageHeading(page, 'Modify Test Case')
42
+ await page.getByRole('textbox', { name: 'Title' }).fill('E2E seeded login works updated')
43
+ await page.getByRole('button', { name: /Continue/ }).click()
44
+ await page.getByRole('button', { name: 'Show test scenario preview' }).click()
45
+ await expect(page.getByText('Test Scenario(Preview)')).toBeVisible()
46
+
47
+ await page.goto('/test-cases')
48
+ await deleteRowByName(page, caseTitle, 'Filter by title...')
49
+ await page.reload()
50
+ await expectRowHidden(page, caseTitle, 'Filter by title...')
51
+ })
52
+
53
+ test('create test case from template lands on modify with prefilled flow', async ({ page }) => {
54
+ await page.goto('/test-cases/create-from-template')
55
+ await expectPageHeading(page, 'Create Test Case From Template')
56
+ await page.getByLabel('Template Test Case').click()
57
+ await page.getByRole('option', { name: 'E2E Login Template' }).click()
58
+ await page.getByRole('button', { name: /Continue/ }).click()
59
+ await page.getByRole('textbox', { name: 'Title' }).fill('E2E From Template Case')
60
+ await selectTestSuites(page, 'E2E Auth Suite')
61
+ await selectFilterTags(page, 'E2E Smoke')
62
+ await page.getByRole('button', { name: /Continue/ }).click()
63
+ await expect(page.getByText('Test Case Flow', { exact: true }).first()).toBeVisible()
64
+ await page.getByRole('button', { name: 'Save test case' }).click()
65
+ await expect(page).toHaveURL(/\/test-cases$/)
66
+ await expect(page.getByText('E2E From Template Case', { exact: true }).first()).toBeVisible()
67
+ })
68
+
69
+ test('secondary module suite seed is visible for assignment coverage', async ({ page }) => {
70
+ await page.goto('/test-suites')
71
+ await expect(page.getByText('E2E Secondary Suite', { exact: true }).first()).toBeVisible()
72
+
73
+ const secondModule = await findModuleByName('E2E Secondary')
74
+ expect(secondModule).not.toBeNull()
75
+ })
76
+ })
@@ -0,0 +1,186 @@
1
+ import { expect, type Locator, type Page } from '@playwright/test'
2
+
3
+ import { saveForm, expectPageHeading } from './ui'
4
+
5
+ function labeledMultiSelectCombobox(page: Page, label: string): Locator {
6
+ return page.getByText(label, { exact: true }).locator('..').getByRole('combobox', { name: 'Select options' })
7
+ }
8
+
9
+ export async function selectFilterTags(page: Page, ...tagNames: string[]): Promise<void> {
10
+ const combobox = labeledMultiSelectCombobox(page, 'Filter Tags')
11
+
12
+ for (const tagName of tagNames) {
13
+ await combobox.click()
14
+ await page.getByRole('option', { name: tagName }).click()
15
+ }
16
+ }
17
+
18
+ export async function selectTestSuites(page: Page, ...suiteNames: string[]): Promise<void> {
19
+ const combobox = labeledMultiSelectCombobox(page, 'Test Suites')
20
+
21
+ for (const suiteName of suiteNames) {
22
+ await combobox.click()
23
+ await page.getByRole('option', { name: suiteName }).click()
24
+ }
25
+ }
26
+
27
+ export async function addTemplateStepToFlow(page: Page, stepName = 'Open seeded page'): Promise<void> {
28
+ const emptyStateAdd = page.getByRole('button', { name: 'Add node', exact: true })
29
+ const toolbarAdd = page.getByRole('button', { name: 'Add Node' })
30
+
31
+ if (await emptyStateAdd.isVisible()) {
32
+ await emptyStateAdd.click()
33
+ } else {
34
+ await toolbarAdd.click()
35
+ }
36
+
37
+ await expect(page.getByRole('dialog', { name: 'Add Node' })).toBeVisible()
38
+ const addNodeDialog = page.getByRole('dialog', { name: 'Add Node' })
39
+ await addNodeDialog.getByRole('textbox', { name: 'Label' }).fill(stepName)
40
+ await addNodeDialog.getByRole('combobox', { name: 'Template Step' }).click()
41
+ await page.getByPlaceholder('Search template steps…').fill(stepName)
42
+ await page.getByRole('option', { name: stepName }).click()
43
+ const urlParameter = addNodeDialog.getByRole('textbox', { name: /^url/i })
44
+ if (await urlParameter.isVisible()) {
45
+ await urlParameter.fill('/')
46
+ }
47
+ await addNodeDialog.getByRole('button', { name: /^Save$/ }).click()
48
+ await expect(addNodeDialog).toBeHidden()
49
+ await expect(page.getByText(stepName, { exact: true }).first()).toBeVisible()
50
+ }
51
+
52
+ export async function editRecordName(page: Page, name: string, nextName: string): Promise<void> {
53
+ await page.getByLabel('Name').fill(nextName)
54
+ await saveForm(page)
55
+ await expect(page.getByText(nextName, { exact: true }).first()).toBeVisible()
56
+ await expect(page.getByText(name, { exact: true }).first()).toBeHidden()
57
+ }
58
+
59
+ export async function createLocatorGroup(
60
+ page: Page,
61
+ name: string,
62
+ moduleName: string,
63
+ route = '/login',
64
+ ): Promise<void> {
65
+ await page.goto('/locator-groups/create')
66
+ await expectPageHeading(page, 'Create Locator Group')
67
+ await page.getByLabel('Name').fill(name)
68
+ await page.getByRole('combobox').click()
69
+ await page.getByRole('option', { name: moduleName }).click()
70
+ await page.getByLabel('Route').fill(route)
71
+ await saveForm(page)
72
+ await expect(page).toHaveURL(/\/locator-groups$/)
73
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
74
+ }
75
+
76
+ export async function createLocator(page: Page, name: string, selector: string, groupName: string): Promise<void> {
77
+ await page.goto('/locators/create')
78
+ await expectPageHeading(page, 'Create Locator')
79
+ await page.getByLabel('Locator Name').fill(name)
80
+ await page.getByLabel('Selector').fill(selector)
81
+ await page.getByRole('radio', { name: /Use existing group/i }).click()
82
+ await page.getByRole('combobox', { name: 'Locator Group' }).click()
83
+ await page.getByRole('option', { name: groupName }).click()
84
+ await page.getByRole('button', { name: 'Save Locator' }).click()
85
+ await expect(page).toHaveURL(/\/locators$/)
86
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
87
+ }
88
+
89
+ export async function createTemplateStepGroup(page: Page, name: string): Promise<void> {
90
+ await page.goto('/template-step-groups/create')
91
+ await expectPageHeading(page, 'Create Template Step Group')
92
+ await page.getByLabel('Name').fill(name)
93
+ await saveForm(page)
94
+ await expect(page).toHaveURL(/\/template-step-groups$/)
95
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
96
+ }
97
+
98
+ export async function createTemplateStep(page: Page, name: string, groupName: string): Promise<void> {
99
+ await page.goto('/template-steps/create')
100
+ await expectPageHeading(page, 'Create Template Step')
101
+ await page.getByLabel('Name').fill(name)
102
+ await page.getByText('Template Step Group').locator('..').getByRole('combobox').click()
103
+ await page.getByRole('option', { name: groupName }).click()
104
+ await page.getByLabel('Signature').fill(`Given I ${name.toLowerCase()}`)
105
+ await page.getByRole('button', { name: /^Save$/ }).click()
106
+ await expect(page).toHaveURL(/\/template-steps$/)
107
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
108
+ }
109
+
110
+ export async function createTemplateTestCase(page: Page, name: string): Promise<void> {
111
+ await page.goto('/template-test-cases/create')
112
+ await expectPageHeading(page, 'Create Template Test Case')
113
+ await page.getByLabel('Title').fill(name)
114
+ await addTemplateStepToFlow(page)
115
+ await page.getByRole('button', { name: /^Save$/ }).click()
116
+ await expect(page).toHaveURL(/\/template-test-cases$/)
117
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
118
+ }
119
+
120
+ export async function createTestSuite(
121
+ page: Page,
122
+ name: string,
123
+ moduleName: string,
124
+ testCaseTitle?: string,
125
+ ): Promise<void> {
126
+ await page.goto('/test-suites/create')
127
+ await expectPageHeading(page, 'Create Test Suite')
128
+ await page.getByPlaceholder('Enter name for your test suite').fill(name)
129
+ await page.getByLabel('Module').click()
130
+ await page.getByRole('option', { name: moduleName }).click()
131
+ if (testCaseTitle) {
132
+ await page.getByRole('button', { name: 'Select test case(s)' }).click()
133
+ await page.getByPlaceholder('Search by title, description, or tag...').fill(testCaseTitle)
134
+ await page
135
+ .getByRole('row', { name: new RegExp(testCaseTitle) })
136
+ .getByRole('checkbox')
137
+ .click()
138
+ await page.getByRole('button', { name: /^Save$/ }).click()
139
+ }
140
+ await page.getByRole('button', { name: /^Save$/ }).click()
141
+ await expect(page).toHaveURL(/\/test-suites$/)
142
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
143
+ }
144
+
145
+ export async function fillTestCaseDetails(
146
+ page: Page,
147
+ title: string,
148
+ tagName = 'E2E Smoke',
149
+ suiteName = 'E2E Auth Suite',
150
+ ): Promise<void> {
151
+ await page.getByRole('textbox', { name: 'Title' }).fill(title)
152
+ await selectTestSuites(page, suiteName)
153
+ await selectFilterTags(page, tagName)
154
+ await page.getByRole('button', { name: /Continue/ }).click()
155
+ }
156
+
157
+ export async function saveTestCase(page: Page): Promise<void> {
158
+ await page.getByRole('button', { name: 'Save test case' }).click()
159
+ await expect(page).toHaveURL(/\/test-cases$/)
160
+ }
161
+
162
+ export async function createTestCaseWithSeededStep(page: Page, title: string): Promise<void> {
163
+ await page.goto('/test-cases/create')
164
+ await expectPageHeading(page, 'Create New Test Case')
165
+ await fillTestCaseDetails(page, title)
166
+ await expect(page.getByText('Test Case Flow', { exact: true }).first()).toBeVisible()
167
+ await addTemplateStepToFlow(page)
168
+ await saveTestCase(page)
169
+ await expect(page.getByText(title, { exact: true }).first()).toBeVisible()
170
+ }
171
+
172
+ export async function editEnvironment(page: Page, id: string, nextName: string): Promise<void> {
173
+ await page.goto(`/environments/modify/${id}`)
174
+ await expectPageHeading(page, 'Modify Environment')
175
+ await page.getByRole('textbox', { name: 'Name', exact: true }).fill(nextName)
176
+ await saveForm(page)
177
+ await expect(page).toHaveURL(/\/environments$/)
178
+ }
179
+
180
+ export async function editTag(page: Page, id: string, nextName: string, expression: string): Promise<void> {
181
+ await page.goto(`/tags/modify/${id}`)
182
+ await page.getByRole('textbox', { name: 'Name', exact: true }).fill(nextName)
183
+ await page.getByRole('textbox', { name: 'Tag Expression', exact: true }).fill(expression)
184
+ await saveForm(page)
185
+ await expect(page).toHaveURL(/\/tags$/)
186
+ }
@@ -0,0 +1,27 @@
1
+ import { expect, type Page } from '@playwright/test'
2
+
3
+ import { expectPageHeading } from './ui'
4
+
5
+ export type RouteExpectation = {
6
+ path: string
7
+ heading: string | RegExp
8
+ }
9
+
10
+ export async function gotoAndExpectHeading(page: Page, path: string, heading: string | RegExp): Promise<void> {
11
+ await page.goto(path)
12
+ await expectPageHeading(page, heading)
13
+ }
14
+
15
+ export async function visitRoutes(page: Page, routes: RouteExpectation[]): Promise<void> {
16
+ for (const route of routes) {
17
+ await gotoAndExpectHeading(page, route.path, route.heading)
18
+ }
19
+ }
20
+
21
+ export function buildModifyPath(basePath: string, id: string): string {
22
+ return `${basePath}/modify/${id}`
23
+ }
24
+
25
+ export async function expectUrl(page: Page, urlPattern: string | RegExp): Promise<void> {
26
+ await expect(page).toHaveURL(urlPattern)
27
+ }
@@ -0,0 +1,45 @@
1
+ import { expect, type Page } from '@playwright/test'
2
+
3
+ export async function filterTableByName(page: Page, value: string, placeholder = 'Filter by name...'): Promise<void> {
4
+ await page.getByPlaceholder(placeholder).first().fill(value)
5
+ }
6
+
7
+ export async function openRowMenu(page: Page, rowIndex = 0): Promise<void> {
8
+ await page.getByRole('button', { name: 'Open menu' }).nth(rowIndex).click()
9
+ }
10
+
11
+ export async function editRowByName(page: Page, name: string): Promise<void> {
12
+ await filterTableByName(page, name)
13
+ await openRowMenu(page)
14
+ await page.getByRole('menuitem', { name: /Edit/ }).getByRole('link').click()
15
+ await expect(page).toHaveURL(/\/modify\//)
16
+ }
17
+
18
+ export async function confirmDeleteDialog(page: Page): Promise<void> {
19
+ await page.getByRole('menuitem', { name: /Delete/ }).click()
20
+ await page.getByRole('button', { name: /^Delete$/ }).click()
21
+ await expect(page.getByText('Item(s) deleted successfully', { exact: true })).toBeVisible()
22
+ }
23
+
24
+ export async function deleteRowByName(
25
+ page: Page,
26
+ name: string,
27
+ filterPlaceholder = 'Filter by name...',
28
+ ): Promise<void> {
29
+ await filterTableByName(page, name, filterPlaceholder)
30
+ await openRowMenu(page)
31
+ await confirmDeleteDialog(page)
32
+ }
33
+
34
+ export async function expectRowHidden(
35
+ page: Page,
36
+ name: string,
37
+ filterPlaceholder = 'Filter by name...',
38
+ ): Promise<void> {
39
+ await filterTableByName(page, name, filterPlaceholder)
40
+ await expect(page.getByRole('row', { name: new RegExp(name) })).toHaveCount(0)
41
+ }
42
+
43
+ export async function expectRowVisible(page: Page, name: string): Promise<void> {
44
+ await expect(page.getByText(name, { exact: true }).first()).toBeVisible()
45
+ }