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
@@ -1,352 +1,352 @@
1
- import { readFile } from 'fs/promises'
2
- import { StepStatus, StepKeyword } from '@prisma/client'
3
-
4
- const SCREENSHOT_ATTACHMENT_MEDIA_TYPE = 'application/vnd.appraisejs.report-step-screenshot+json'
5
-
6
- /**
7
- * Parsed report structure matching cucumber.json format
8
- */
9
- export interface ParsedReport {
10
- features: Array<{
11
- name: string
12
- description: string
13
- uri: string
14
- line: number
15
- keyword: string
16
- tags: Array<{ name: string; line: number }>
17
- scenarios: Array<{
18
- name: string
19
- description: string
20
- line: number
21
- keyword: string
22
- type: string
23
- cucumberId: string
24
- tags: Array<{ name: string; line: number }>
25
- steps: Array<{
26
- keyword: string
27
- line: number | null
28
- name: string
29
- matchLocation?: string
30
- status: string
31
- duration: number
32
- errorMessage?: string
33
- errorTrace?: string
34
- screenshotPath?: string
35
- hidden: boolean
36
- order: number
37
- }>
38
- hooks: Array<{
39
- keyword: string
40
- status: string
41
- duration: number
42
- errorMessage?: string
43
- errorTrace?: string
44
- hidden: boolean
45
- }>
46
- }>
47
- }>
48
- }
49
-
50
- /**
51
- * Cucumber JSON report structure (as received from cucumber-js)
52
- */
53
- interface CucumberJsonFeature {
54
- description: string
55
- elements: Array<{
56
- description: string
57
- id: string
58
- keyword: string
59
- line: number
60
- name: string
61
- steps: Array<{
62
- keyword: string
63
- line?: number
64
- name?: string
65
- hidden?: boolean
66
- match?: {
67
- location: string
68
- }
69
- result?: {
70
- status: string
71
- duration?: number
72
- error_message?: string
73
- }
74
- embeddings?: Array<{
75
- data?: string
76
- mime_type?: string
77
- }>
78
- }>
79
- tags: Array<{
80
- name: string
81
- line: number
82
- }>
83
- type: string
84
- }>
85
- id: string
86
- line: number
87
- keyword: string
88
- name: string
89
- tags: Array<{
90
- name: string
91
- line: number
92
- }>
93
- uri: string
94
- }
95
-
96
- function extractScreenshotPath(
97
- embeddings: Array<{ data?: string; mime_type?: string }> | undefined,
98
- ): string | undefined {
99
- const screenshotAttachment = embeddings?.find(embedding => embedding.mime_type === SCREENSHOT_ATTACHMENT_MEDIA_TYPE)
100
-
101
- if (!screenshotAttachment?.data) {
102
- return undefined
103
- }
104
-
105
- const parsePayload = (payload: string): string | undefined => {
106
- try {
107
- const parsedPayload = JSON.parse(payload) as { screenshotPath?: unknown }
108
- return typeof parsedPayload.screenshotPath === 'string' ? parsedPayload.screenshotPath : undefined
109
- } catch {
110
- return undefined
111
- }
112
- }
113
-
114
- const directPayload = parsePayload(screenshotAttachment.data)
115
- if (directPayload) {
116
- return directPayload
117
- }
118
-
119
- const decodedPayload = Buffer.from(screenshotAttachment.data, 'base64').toString('utf8')
120
- return parsePayload(decodedPayload)
121
- }
122
-
123
- /**
124
- * Maps cucumber step status to Prisma StepStatus enum
125
- */
126
- function mapStepStatus(status: string): StepStatus {
127
- const upperStatus = status.toUpperCase()
128
- switch (upperStatus) {
129
- case 'PASSED':
130
- return StepStatus.PASSED
131
- case 'FAILED':
132
- return StepStatus.FAILED
133
- case 'SKIPPED':
134
- return StepStatus.SKIPPED
135
- case 'PENDING':
136
- return StepStatus.PENDING
137
- case 'UNDEFINED':
138
- return StepStatus.UNDEFINED
139
- default:
140
- return StepStatus.PENDING
141
- }
142
- }
143
-
144
- /**
145
- * Maps cucumber step keyword to Prisma StepKeyword enum
146
- */
147
- function mapStepKeyword(keyword: string): StepKeyword {
148
- const trimmedKeyword = keyword.trim()
149
- const upperKeyword = trimmedKeyword.toUpperCase()
150
- switch (upperKeyword) {
151
- case 'GIVEN':
152
- return StepKeyword.GIVEN
153
- case 'WHEN':
154
- return StepKeyword.WHEN
155
- case 'THEN':
156
- return StepKeyword.THEN
157
- case 'AND':
158
- return StepKeyword.AND
159
- case 'BUT':
160
- return StepKeyword.BUT
161
- case 'BEFORE':
162
- return StepKeyword.BEFORE
163
- case 'AFTER':
164
- return StepKeyword.AFTER
165
- default:
166
- // Default to GIVEN for unknown keywords
167
- return StepKeyword.GIVEN
168
- }
169
- }
170
-
171
- /**
172
- * Separates error message from stack trace
173
- * Cucumber's error_message typically contains both the error message and stack trace
174
- * The stack trace usually starts with "at" or contains file paths
175
- *
176
- * @param errorMessage - The full error message from Cucumber
177
- * @returns Object with separated message and trace
178
- */
179
- function separateErrorMessageAndTrace(errorMessage: string | undefined): {
180
- message: string | undefined
181
- trace: string | undefined
182
- } {
183
- if (!errorMessage) {
184
- return { message: undefined, trace: undefined }
185
- }
186
-
187
- // Look for common stack trace indicators
188
- // Stack traces typically start with "at", " at", or contain file paths with line numbers
189
- const stackTracePatterns = [
190
- /\n\s*at\s/, // "at" at the start of a line (with optional whitespace)
191
- /\n\s+at\s/, // "at" with leading whitespace
192
- /Error:\s*$/m, // Error: at end of line (message ends, trace starts)
193
- ]
194
-
195
- // Find the first occurrence of a stack trace pattern
196
- let splitIndex = -1
197
- for (const pattern of stackTracePatterns) {
198
- const match = errorMessage.match(pattern)
199
- if (match && match.index !== undefined) {
200
- // If we find "at" pattern, split before it (include the newline before "at")
201
- // If we find "Error:" pattern, split after it
202
- if (pattern.source.includes('Error:')) {
203
- splitIndex = match.index + match[0].length
204
- } else {
205
- splitIndex = match.index
206
- }
207
- break
208
- }
209
- }
210
-
211
- // If no stack trace pattern found, check if it looks like just a message (short, no file paths)
212
- if (splitIndex === -1) {
213
- // Check if it contains file paths (common in stack traces)
214
- const hasFilePath = /[\/\\][\w\-\.]+:\d+/.test(errorMessage)
215
- if (hasFilePath && errorMessage.length > 200) {
216
- // Likely contains a trace, try to find where message ends
217
- // Usually the first few lines are the message, rest is trace
218
- const lines = errorMessage.split('\n')
219
- // Look for the first line that starts with whitespace and "at" or contains a file path
220
- for (let i = 0; i < lines.length; i++) {
221
- if (/^\s*at\s/.test(lines[i]) || /[\/\\][\w\-\.]+:\d+/.test(lines[i])) {
222
- splitIndex = errorMessage.indexOf(lines[i])
223
- break
224
- }
225
- }
226
- }
227
- }
228
-
229
- if (splitIndex > 0) {
230
- const message = errorMessage.substring(0, splitIndex).trim()
231
- const trace = errorMessage.substring(splitIndex).trim()
232
- return {
233
- message: message || undefined,
234
- trace: trace || undefined,
235
- }
236
- }
237
-
238
- // If we can't separate them, treat the whole thing as the message
239
- // and leave trace as undefined (better than duplicating)
240
- return {
241
- message: errorMessage.trim() || undefined,
242
- trace: undefined,
243
- }
244
- }
245
-
246
- /**
247
- * Parses a cucumber.json report file into a structured ParsedReport object
248
- *
249
- * @param reportPath - Path to the cucumber.json file
250
- * @returns Parsed report structure
251
- * @throws Error if file cannot be read or parsed
252
- */
253
- export async function parseCucumberReport(reportPath: string): Promise<ParsedReport> {
254
- try {
255
- // Read the report file
256
- const fileContent = await readFile(reportPath, 'utf-8')
257
- const cucumberData: CucumberJsonFeature[] = JSON.parse(fileContent)
258
-
259
- // Parse features
260
- const features = cucumberData.map(feature => {
261
- // Separate steps into regular steps and hooks
262
- const scenarios = feature.elements.map(element => {
263
- const steps: ParsedReport['features'][0]['scenarios'][0]['steps'] = []
264
- const hooks: ParsedReport['features'][0]['scenarios'][0]['hooks'] = []
265
-
266
- element.steps.forEach((step, index) => {
267
- const isHook = step.keyword === 'Before' || step.keyword === 'After'
268
- const stepStatus = step.result?.status || 'pending'
269
- const duration = step.result?.duration || 0
270
-
271
- // Separate error message from stack trace
272
- const { message: errorMessage, trace: errorTrace } = separateErrorMessageAndTrace(step.result?.error_message)
273
- const screenshotPath = extractScreenshotPath(step.embeddings)
274
-
275
- if (isHook) {
276
- hooks.push({
277
- keyword: step.keyword,
278
- status: stepStatus,
279
- duration,
280
- errorMessage,
281
- errorTrace,
282
- hidden: step.hidden || false,
283
- })
284
- } else {
285
- steps.push({
286
- keyword: step.keyword.trim(),
287
- line: step.line || null,
288
- name: step.name || '',
289
- matchLocation: step.match?.location,
290
- status: stepStatus,
291
- duration,
292
- errorMessage,
293
- errorTrace,
294
- screenshotPath,
295
- hidden: step.hidden || false,
296
- order: index,
297
- })
298
- }
299
- })
300
-
301
- return {
302
- name: element.name,
303
- description: element.description || '',
304
- line: element.line,
305
- keyword: element.keyword,
306
- type: element.type,
307
- cucumberId: element.id,
308
- tags: element.tags.map(tag => ({
309
- name: tag.name,
310
- line: tag.line,
311
- })),
312
- steps,
313
- hooks,
314
- }
315
- })
316
-
317
- return {
318
- name: feature.name,
319
- description: feature.description || '',
320
- uri: feature.uri,
321
- line: feature.line,
322
- keyword: feature.keyword,
323
- tags: feature.tags.map(tag => ({
324
- name: tag.name,
325
- line: tag.line,
326
- })),
327
- scenarios,
328
- }
329
- })
330
-
331
- return { features }
332
- } catch (error) {
333
- if (error instanceof Error) {
334
- throw new Error(`Failed to parse cucumber report at ${reportPath}: ${error.message}`)
335
- }
336
- throw new Error(`Failed to parse cucumber report at ${reportPath}: Unknown error`)
337
- }
338
- }
339
-
340
- /**
341
- * Helper function to convert parsed step status to Prisma enum
342
- */
343
- export function getStepStatusEnum(status: string): StepStatus {
344
- return mapStepStatus(status)
345
- }
346
-
347
- /**
348
- * Helper function to convert parsed step keyword to Prisma enum
349
- */
350
- export function getStepKeywordEnum(keyword: string): StepKeyword {
351
- return mapStepKeyword(keyword)
352
- }
1
+ import { readFile } from 'fs/promises'
2
+ import { StepStatus, StepKeyword } from '@prisma/client'
3
+
4
+ const SCREENSHOT_ATTACHMENT_MEDIA_TYPE = 'application/vnd.appraisejs.report-step-screenshot+json'
5
+
6
+ /**
7
+ * Parsed report structure matching cucumber.json format
8
+ */
9
+ export interface ParsedReport {
10
+ features: Array<{
11
+ name: string
12
+ description: string
13
+ uri: string
14
+ line: number
15
+ keyword: string
16
+ tags: Array<{ name: string; line: number }>
17
+ scenarios: Array<{
18
+ name: string
19
+ description: string
20
+ line: number
21
+ keyword: string
22
+ type: string
23
+ cucumberId: string
24
+ tags: Array<{ name: string; line: number }>
25
+ steps: Array<{
26
+ keyword: string
27
+ line: number | null
28
+ name: string
29
+ matchLocation?: string
30
+ status: string
31
+ duration: number
32
+ errorMessage?: string
33
+ errorTrace?: string
34
+ screenshotPath?: string
35
+ hidden: boolean
36
+ order: number
37
+ }>
38
+ hooks: Array<{
39
+ keyword: string
40
+ status: string
41
+ duration: number
42
+ errorMessage?: string
43
+ errorTrace?: string
44
+ hidden: boolean
45
+ }>
46
+ }>
47
+ }>
48
+ }
49
+
50
+ /**
51
+ * Cucumber JSON report structure (as received from cucumber-js)
52
+ */
53
+ interface CucumberJsonFeature {
54
+ description: string
55
+ elements: Array<{
56
+ description: string
57
+ id: string
58
+ keyword: string
59
+ line: number
60
+ name: string
61
+ steps: Array<{
62
+ keyword: string
63
+ line?: number
64
+ name?: string
65
+ hidden?: boolean
66
+ match?: {
67
+ location: string
68
+ }
69
+ result?: {
70
+ status: string
71
+ duration?: number
72
+ error_message?: string
73
+ }
74
+ embeddings?: Array<{
75
+ data?: string
76
+ mime_type?: string
77
+ }>
78
+ }>
79
+ tags: Array<{
80
+ name: string
81
+ line: number
82
+ }>
83
+ type: string
84
+ }>
85
+ id: string
86
+ line: number
87
+ keyword: string
88
+ name: string
89
+ tags: Array<{
90
+ name: string
91
+ line: number
92
+ }>
93
+ uri: string
94
+ }
95
+
96
+ function extractScreenshotPath(
97
+ embeddings: Array<{ data?: string; mime_type?: string }> | undefined,
98
+ ): string | undefined {
99
+ const screenshotAttachment = embeddings?.find(embedding => embedding.mime_type === SCREENSHOT_ATTACHMENT_MEDIA_TYPE)
100
+
101
+ if (!screenshotAttachment?.data) {
102
+ return undefined
103
+ }
104
+
105
+ const parsePayload = (payload: string): string | undefined => {
106
+ try {
107
+ const parsedPayload = JSON.parse(payload) as { screenshotPath?: unknown }
108
+ return typeof parsedPayload.screenshotPath === 'string' ? parsedPayload.screenshotPath : undefined
109
+ } catch {
110
+ return undefined
111
+ }
112
+ }
113
+
114
+ const directPayload = parsePayload(screenshotAttachment.data)
115
+ if (directPayload) {
116
+ return directPayload
117
+ }
118
+
119
+ const decodedPayload = Buffer.from(screenshotAttachment.data, 'base64').toString('utf8')
120
+ return parsePayload(decodedPayload)
121
+ }
122
+
123
+ /**
124
+ * Maps cucumber step status to Prisma StepStatus enum
125
+ */
126
+ function mapStepStatus(status: string): StepStatus {
127
+ const upperStatus = status.toUpperCase()
128
+ switch (upperStatus) {
129
+ case 'PASSED':
130
+ return StepStatus.PASSED
131
+ case 'FAILED':
132
+ return StepStatus.FAILED
133
+ case 'SKIPPED':
134
+ return StepStatus.SKIPPED
135
+ case 'PENDING':
136
+ return StepStatus.PENDING
137
+ case 'UNDEFINED':
138
+ return StepStatus.UNDEFINED
139
+ default:
140
+ return StepStatus.PENDING
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Maps cucumber step keyword to Prisma StepKeyword enum
146
+ */
147
+ function mapStepKeyword(keyword: string): StepKeyword {
148
+ const trimmedKeyword = keyword.trim()
149
+ const upperKeyword = trimmedKeyword.toUpperCase()
150
+ switch (upperKeyword) {
151
+ case 'GIVEN':
152
+ return StepKeyword.GIVEN
153
+ case 'WHEN':
154
+ return StepKeyword.WHEN
155
+ case 'THEN':
156
+ return StepKeyword.THEN
157
+ case 'AND':
158
+ return StepKeyword.AND
159
+ case 'BUT':
160
+ return StepKeyword.BUT
161
+ case 'BEFORE':
162
+ return StepKeyword.BEFORE
163
+ case 'AFTER':
164
+ return StepKeyword.AFTER
165
+ default:
166
+ // Default to GIVEN for unknown keywords
167
+ return StepKeyword.GIVEN
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Separates error message from stack trace
173
+ * Cucumber's error_message typically contains both the error message and stack trace
174
+ * The stack trace usually starts with "at" or contains file paths
175
+ *
176
+ * @param errorMessage - The full error message from Cucumber
177
+ * @returns Object with separated message and trace
178
+ */
179
+ function separateErrorMessageAndTrace(errorMessage: string | undefined): {
180
+ message: string | undefined
181
+ trace: string | undefined
182
+ } {
183
+ if (!errorMessage) {
184
+ return { message: undefined, trace: undefined }
185
+ }
186
+
187
+ // Look for common stack trace indicators
188
+ // Stack traces typically start with "at", " at", or contain file paths with line numbers
189
+ const stackTracePatterns = [
190
+ /\n\s*at\s/, // "at" at the start of a line (with optional whitespace)
191
+ /\n\s+at\s/, // "at" with leading whitespace
192
+ /Error:\s*$/m, // Error: at end of line (message ends, trace starts)
193
+ ]
194
+
195
+ // Find the first occurrence of a stack trace pattern
196
+ let splitIndex = -1
197
+ for (const pattern of stackTracePatterns) {
198
+ const match = errorMessage.match(pattern)
199
+ if (match && match.index !== undefined) {
200
+ // If we find "at" pattern, split before it (include the newline before "at")
201
+ // If we find "Error:" pattern, split after it
202
+ if (pattern.source.includes('Error:')) {
203
+ splitIndex = match.index + match[0].length
204
+ } else {
205
+ splitIndex = match.index
206
+ }
207
+ break
208
+ }
209
+ }
210
+
211
+ // If no stack trace pattern found, check if it looks like just a message (short, no file paths)
212
+ if (splitIndex === -1) {
213
+ // Check if it contains file paths (common in stack traces)
214
+ const hasFilePath = /[\/\\][\w\-\.]+:\d+/.test(errorMessage)
215
+ if (hasFilePath && errorMessage.length > 200) {
216
+ // Likely contains a trace, try to find where message ends
217
+ // Usually the first few lines are the message, rest is trace
218
+ const lines = errorMessage.split('\n')
219
+ // Look for the first line that starts with whitespace and "at" or contains a file path
220
+ for (let i = 0; i < lines.length; i++) {
221
+ if (/^\s*at\s/.test(lines[i]) || /[\/\\][\w\-\.]+:\d+/.test(lines[i])) {
222
+ splitIndex = errorMessage.indexOf(lines[i])
223
+ break
224
+ }
225
+ }
226
+ }
227
+ }
228
+
229
+ if (splitIndex > 0) {
230
+ const message = errorMessage.substring(0, splitIndex).trim()
231
+ const trace = errorMessage.substring(splitIndex).trim()
232
+ return {
233
+ message: message || undefined,
234
+ trace: trace || undefined,
235
+ }
236
+ }
237
+
238
+ // If we can't separate them, treat the whole thing as the message
239
+ // and leave trace as undefined (better than duplicating)
240
+ return {
241
+ message: errorMessage.trim() || undefined,
242
+ trace: undefined,
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Parses a cucumber.json report file into a structured ParsedReport object
248
+ *
249
+ * @param reportPath - Path to the cucumber.json file
250
+ * @returns Parsed report structure
251
+ * @throws Error if file cannot be read or parsed
252
+ */
253
+ export async function parseCucumberReport(reportPath: string): Promise<ParsedReport> {
254
+ try {
255
+ // Read the report file
256
+ const fileContent = await readFile(reportPath, 'utf-8')
257
+ const cucumberData: CucumberJsonFeature[] = JSON.parse(fileContent)
258
+
259
+ // Parse features
260
+ const features = cucumberData.map(feature => {
261
+ // Separate steps into regular steps and hooks
262
+ const scenarios = feature.elements.map(element => {
263
+ const steps: ParsedReport['features'][0]['scenarios'][0]['steps'] = []
264
+ const hooks: ParsedReport['features'][0]['scenarios'][0]['hooks'] = []
265
+
266
+ element.steps.forEach((step, index) => {
267
+ const isHook = step.keyword === 'Before' || step.keyword === 'After'
268
+ const stepStatus = step.result?.status || 'pending'
269
+ const duration = step.result?.duration || 0
270
+
271
+ // Separate error message from stack trace
272
+ const { message: errorMessage, trace: errorTrace } = separateErrorMessageAndTrace(step.result?.error_message)
273
+ const screenshotPath = extractScreenshotPath(step.embeddings)
274
+
275
+ if (isHook) {
276
+ hooks.push({
277
+ keyword: step.keyword,
278
+ status: stepStatus,
279
+ duration,
280
+ errorMessage,
281
+ errorTrace,
282
+ hidden: step.hidden || false,
283
+ })
284
+ } else {
285
+ steps.push({
286
+ keyword: step.keyword.trim(),
287
+ line: step.line || null,
288
+ name: step.name || '',
289
+ matchLocation: step.match?.location,
290
+ status: stepStatus,
291
+ duration,
292
+ errorMessage,
293
+ errorTrace,
294
+ screenshotPath,
295
+ hidden: step.hidden || false,
296
+ order: index,
297
+ })
298
+ }
299
+ })
300
+
301
+ return {
302
+ name: element.name,
303
+ description: element.description || '',
304
+ line: element.line,
305
+ keyword: element.keyword,
306
+ type: element.type,
307
+ cucumberId: element.id,
308
+ tags: element.tags.map(tag => ({
309
+ name: tag.name,
310
+ line: tag.line,
311
+ })),
312
+ steps,
313
+ hooks,
314
+ }
315
+ })
316
+
317
+ return {
318
+ name: feature.name,
319
+ description: feature.description || '',
320
+ uri: feature.uri,
321
+ line: feature.line,
322
+ keyword: feature.keyword,
323
+ tags: feature.tags.map(tag => ({
324
+ name: tag.name,
325
+ line: tag.line,
326
+ })),
327
+ scenarios,
328
+ }
329
+ })
330
+
331
+ return { features }
332
+ } catch (error) {
333
+ if (error instanceof Error) {
334
+ throw new Error(`Failed to parse cucumber report at ${reportPath}: ${error.message}`)
335
+ }
336
+ throw new Error(`Failed to parse cucumber report at ${reportPath}: Unknown error`)
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Helper function to convert parsed step status to Prisma enum
342
+ */
343
+ export function getStepStatusEnum(status: string): StepStatus {
344
+ return mapStepStatus(status)
345
+ }
346
+
347
+ /**
348
+ * Helper function to convert parsed step keyword to Prisma enum
349
+ */
350
+ export function getStepKeywordEnum(keyword: string): StepKeyword {
351
+ return mapStepKeyword(keyword)
352
+ }