create-appraisejs 0.3.1-alpha.0 → 0.3.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/README.md +17 -17
  2. package/dist/cli.e2e.test.d.ts +2 -2
  3. package/dist/cli.e2e.test.js +74 -72
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/config.test.d.ts +2 -2
  7. package/dist/config.test.js +64 -64
  8. package/dist/copy-template.test.d.ts +2 -2
  9. package/dist/copy-template.test.js +70 -70
  10. package/dist/download-repo.test.d.ts +2 -2
  11. package/dist/download-repo.test.js +15 -13
  12. package/dist/install.test.d.ts +2 -2
  13. package/dist/install.test.js +115 -114
  14. package/dist/prepare-template-utils.d.ts.map +1 -1
  15. package/dist/prepare-template-utils.js.map +1 -1
  16. package/dist/prompts.d.ts.map +1 -1
  17. package/dist/prompts.js +2 -2
  18. package/dist/prompts.js.map +1 -1
  19. package/dist/prompts.test.d.ts +2 -2
  20. package/dist/prompts.test.js +54 -54
  21. package/dist/sync-templates-utils.d.ts.map +1 -1
  22. package/dist/sync-templates-utils.js +1 -5
  23. package/dist/sync-templates-utils.js.map +1 -1
  24. package/package.json +1 -1
  25. package/templates/blank/.editorconfig +11 -0
  26. package/templates/blank/.gitattributes +21 -0
  27. package/templates/blank/.gitconfig.appraise +14 -0
  28. package/templates/blank/.prettierrc +13 -0
  29. package/templates/blank/.vscode/settings.json +2 -0
  30. package/templates/blank/README.md +12 -12
  31. package/templates/blank/components.json +24 -24
  32. package/templates/blank/cucumber.mjs +16 -16
  33. package/templates/blank/e2e/README.md +56 -0
  34. package/templates/blank/e2e/apply-migrations.mjs +76 -0
  35. package/templates/blank/e2e/appraise-smoke.spec.ts +78 -0
  36. package/templates/blank/e2e/authoring.spec.ts +53 -0
  37. package/templates/blank/e2e/crud-configuration.spec.ts +138 -0
  38. package/templates/blank/e2e/crud-tests.spec.ts +76 -0
  39. package/templates/blank/e2e/helpers/forms.ts +186 -0
  40. package/templates/blank/e2e/helpers/navigation.ts +27 -0
  41. package/templates/blank/e2e/helpers/table.ts +45 -0
  42. package/templates/blank/e2e/helpers/test-data.ts +549 -0
  43. package/templates/blank/e2e/helpers/ui.ts +41 -0
  44. package/templates/blank/e2e/navigation.spec.ts +101 -0
  45. package/templates/blank/e2e/runs-and-reports.spec.ts +82 -0
  46. package/templates/blank/e2e/settings-sync.spec.ts +39 -0
  47. package/templates/blank/e2e/start-server.mjs +61 -0
  48. package/templates/blank/eslint.config.mjs +4 -4
  49. package/templates/blank/gitignore +0 -3
  50. package/templates/blank/next-env.d.ts +1 -1
  51. package/templates/blank/package-lock.json +58 -102
  52. package/templates/blank/package.json +10 -9
  53. package/templates/blank/packages/cucumber-runtime/package.json +13 -13
  54. package/templates/blank/packages/cucumber-runtime/src/cache.util.ts +93 -93
  55. package/templates/blank/packages/cucumber-runtime/src/cli.ts +77 -68
  56. package/templates/blank/packages/cucumber-runtime/src/environment.util.ts +21 -21
  57. package/templates/blank/packages/cucumber-runtime/src/executor.ts +32 -32
  58. package/templates/blank/packages/cucumber-runtime/src/index.ts +17 -17
  59. package/templates/blank/packages/cucumber-runtime/src/locator.util.ts +234 -234
  60. package/templates/blank/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  61. package/templates/blank/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  62. package/templates/blank/packages/cucumber-runtime/src/types.ts +13 -13
  63. package/templates/blank/packages/cucumber-runtime/src/world.ts +44 -44
  64. package/templates/blank/packages/cucumber-runtime/tsconfig.json +11 -11
  65. package/templates/blank/packages/locator-picker-companion/dist/cli.js +1 -1
  66. package/templates/blank/packages/locator-picker-companion/dist/index.d.ts +3 -3
  67. package/templates/blank/packages/locator-picker-companion/dist/index.js +3 -3
  68. package/templates/blank/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  69. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  70. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  71. package/templates/blank/packages/locator-picker-companion/src/cli.ts +1 -7
  72. package/templates/blank/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  73. package/templates/blank/packages/locator-picker-companion/src/launcher.ts +1 -3
  74. package/templates/blank/packages/locator-picker-companion/src/session-file.ts +4 -15
  75. package/templates/blank/packages/locator-picker-companion/src/types.ts +1 -8
  76. package/templates/blank/playwright.config.ts +46 -0
  77. package/templates/blank/postcss.config.mjs +8 -8
  78. package/templates/blank/prisma/dev.db +0 -0
  79. package/templates/blank/scripts/configure-git-line-endings.mjs +91 -0
  80. package/templates/blank/scripts/install-template-step.ts +5 -1
  81. package/templates/blank/scripts/lib/step-matcher.test.ts +3 -3
  82. package/templates/blank/scripts/lib/step-matcher.ts +5 -1
  83. package/templates/blank/scripts/lib/template-step-installer.test.ts +4 -2
  84. package/templates/blank/scripts/lib/template-step-installer.ts +16 -4
  85. package/templates/blank/scripts/lib/template-step-registry.test.ts +1 -1
  86. package/templates/blank/scripts/lib/template-step-registry.ts +4 -1
  87. package/templates/blank/scripts/run-fallow-commit.mjs +4 -6
  88. package/templates/blank/scripts/sync-all.ts +7 -6
  89. package/templates/blank/scripts/sync-appraise-base-template.ts +84 -77
  90. package/templates/blank/scripts/sync-environments.ts +47 -44
  91. package/templates/blank/scripts/sync-locator-groups.ts +67 -76
  92. package/templates/blank/scripts/sync-locators.ts +50 -53
  93. package/templates/blank/scripts/sync-modules.ts +42 -42
  94. package/templates/blank/scripts/sync-tags.ts +51 -51
  95. package/templates/blank/scripts/sync-template-step-groups.ts +34 -32
  96. package/templates/blank/scripts/sync-template-steps.ts +97 -97
  97. package/templates/blank/scripts/sync-test-cases.ts +65 -74
  98. package/templates/blank/scripts/sync-test-suites.ts +85 -80
  99. package/templates/blank/src/actions/server-action-boundary.test.ts +1 -7
  100. package/templates/blank/src/actions/settings/sync-actions.ts +3 -1
  101. package/templates/blank/src/actions/tags/tag-actions.ts +1 -7
  102. package/templates/blank/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  103. package/templates/blank/src/app/(base)/environments/create/page.tsx +28 -28
  104. package/templates/blank/src/app/(base)/environments/environment-form.tsx +3 -2
  105. package/templates/blank/src/app/(base)/environments/environment-helpers.ts +4 -1
  106. package/templates/blank/src/app/(base)/layout.tsx +10 -10
  107. package/templates/blank/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  108. package/templates/blank/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  109. package/templates/blank/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  110. package/templates/blank/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  111. package/templates/blank/src/app/(base)/locator-groups/page.tsx +9 -19
  112. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  113. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  114. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  115. package/templates/blank/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  116. package/templates/blank/src/app/(base)/locators/locator-file-sync.ts +1 -5
  117. package/templates/blank/src/app/(base)/locators/locator-helpers.ts +2 -12
  118. package/templates/blank/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  119. package/templates/blank/src/app/(base)/modules/module-form.tsx +3 -1
  120. package/templates/blank/src/app/(base)/reports/overview-chart.tsx +49 -49
  121. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  122. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  123. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  124. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  125. package/templates/blank/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  126. package/templates/blank/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  127. package/templates/blank/src/app/(base)/tags/tag-form.test.tsx +2 -10
  128. package/templates/blank/src/app/(base)/tags/tag-form.tsx +5 -3
  129. package/templates/blank/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  130. package/templates/blank/src/app/(base)/tags/tag-table.tsx +29 -29
  131. package/templates/blank/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  132. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  133. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  134. package/templates/blank/src/app/(base)/template-steps/paramChip.tsx +6 -10
  135. package/templates/blank/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  136. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  137. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  138. package/templates/blank/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  139. package/templates/blank/src/app/(base)/template-steps/template-step-types.ts +1 -5
  140. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  141. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  142. package/templates/blank/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  143. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  144. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  145. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  146. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  147. package/templates/blank/src/app/(base)/test-cases/create/page.tsx +1 -5
  148. package/templates/blank/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  149. package/templates/blank/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  150. package/templates/blank/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  151. package/templates/blank/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  152. package/templates/blank/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  153. package/templates/blank/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  154. package/templates/blank/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  155. package/templates/blank/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  156. package/templates/blank/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  157. package/templates/blank/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  158. package/templates/blank/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  159. package/templates/blank/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  160. package/templates/blank/src/assets/icons/empty-tube.tsx +23 -23
  161. package/templates/blank/src/assets/icons/tube-plus.tsx +29 -29
  162. package/templates/blank/src/components/data-visualization/info-card.tsx +56 -70
  163. package/templates/blank/src/components/data-visualization/info-grid.tsx +22 -22
  164. package/templates/blank/src/components/diagram/add-node-prompt-node.tsx +1 -1
  165. package/templates/blank/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  166. package/templates/blank/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  167. package/templates/blank/src/components/diagram/dynamic-parameters.tsx +0 -1
  168. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  169. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  170. package/templates/blank/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  171. package/templates/blank/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  172. package/templates/blank/src/components/diagram/flow-diagram-node-search.tsx +65 -65
  173. package/templates/blank/src/components/diagram/flow-diagram-toolbar.tsx +1 -3
  174. package/templates/blank/src/components/diagram/flow-diagram-view.tsx +1 -7
  175. package/templates/blank/src/components/diagram/flow-node-data-helpers.ts +1 -1
  176. package/templates/blank/src/components/diagram/node-form-fields-content.tsx +9 -2
  177. package/templates/blank/src/components/diagram/node-form-helpers.test.ts +3 -1
  178. package/templates/blank/src/components/diagram/node-form-helpers.ts +1 -4
  179. package/templates/blank/src/components/diagram/node-form-template-step-selection.ts +1 -4
  180. package/templates/blank/src/components/diagram/node-form.test.tsx +25 -0
  181. package/templates/blank/src/components/diagram/node-form.tsx +2 -12
  182. package/templates/blank/src/components/diagram/options-header-node.test.tsx +4 -1
  183. package/templates/blank/src/components/diagram/options-header-node.tsx +140 -130
  184. package/templates/blank/src/components/diagram/use-flow-diagram.ts +1 -2
  185. package/templates/blank/src/components/form/error-message.tsx +7 -7
  186. package/templates/blank/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  187. package/templates/blank/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  188. package/templates/blank/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  189. package/templates/blank/src/components/navigation/entity-search-command.tsx +3 -9
  190. package/templates/blank/src/components/navigation/nav-link.tsx +60 -60
  191. package/templates/blank/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  192. package/templates/blank/src/components/test-case/test-case-form-helpers.ts +1 -5
  193. package/templates/blank/src/components/test-case/test-case-picker-helpers.ts +8 -7
  194. package/templates/blank/src/components/test-case/test-case-picker.tsx +2 -6
  195. package/templates/blank/src/components/test-run/log-viewer.test.tsx +25 -0
  196. package/templates/blank/src/components/test-run/log-viewer.tsx +2 -2
  197. package/templates/blank/src/components/test-run/test-run-details-guards.ts +10 -1
  198. package/templates/blank/src/components/test-run/test-run-details.test.tsx +9 -19
  199. package/templates/blank/src/components/test-run/use-log-viewer.ts +2 -8
  200. package/templates/blank/src/components/test-run/use-test-run-header.ts +1 -4
  201. package/templates/blank/src/components/test-suite/test-suite-picker.tsx +1 -1
  202. package/templates/blank/src/components/theme/theme-provider.tsx +7 -1
  203. package/templates/blank/src/components/typography/page-header-subtitle.tsx +7 -7
  204. package/templates/blank/src/components/typography/page-header.tsx +7 -7
  205. package/templates/blank/src/components/ui/chart.tsx +2 -8
  206. package/templates/blank/src/components/ui/command.tsx +2 -5
  207. package/templates/blank/src/components/ui/data-table-column-header.tsx +3 -3
  208. package/templates/blank/src/components/ui/data-table.test.tsx +1 -8
  209. package/templates/blank/src/components/ui/dialog.tsx +1 -4
  210. package/templates/blank/src/components/ui/select.tsx +2 -2
  211. package/templates/blank/src/components/ui/separator.tsx +5 -1
  212. package/templates/blank/src/components/ui/skeleton.tsx +7 -7
  213. package/templates/blank/src/components/ui/table.tsx +1 -1
  214. package/templates/blank/src/components/ui/toaster.tsx +26 -26
  215. package/templates/blank/src/components/ui/tooltip.tsx +1 -1
  216. package/templates/blank/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  217. package/templates/blank/src/lib/locator-group-file-utils.ts +5 -1
  218. package/templates/blank/src/lib/locator-picker/session-manager.ts +1 -2
  219. package/templates/blank/src/lib/metrics/metric-calculator.test.ts +105 -6
  220. package/templates/blank/src/lib/metrics/metric-calculator.ts +39 -40
  221. package/templates/blank/src/lib/sync/sync-executor.ts +1 -4
  222. package/templates/blank/src/lib/sync/sync-pending-counts.test.ts +201 -7
  223. package/templates/blank/src/lib/sync/sync-pending-counts.ts +81 -13
  224. package/templates/blank/src/lib/template-automation-paths.ts +1 -1
  225. package/templates/blank/src/lib/template-sync-utils.d.ts +14 -7
  226. package/templates/blank/src/lib/test-case-utils.ts +6 -6
  227. package/templates/blank/src/lib/test-run/log-formatter.ts +82 -83
  228. package/templates/blank/src/lib/test-run/report-parser.ts +352 -352
  229. package/templates/blank/src/lib/transformers/gherkin-converter.ts +42 -42
  230. package/templates/blank/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  231. package/templates/blank/src/lib/utils/node-param-validation.ts +81 -81
  232. package/templates/blank/src/lib/utils/template-step-file-generator.ts +5 -3
  233. package/templates/blank/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  234. package/templates/blank/src/services/dashboard/dashboard-service.test.ts +28 -1
  235. package/templates/blank/src/services/dashboard/dashboard-service.ts +2 -0
  236. package/templates/blank/src/services/locator/locator-service.test.ts +1 -3
  237. package/templates/blank/src/services/locator/locator-service.ts +3 -1
  238. package/templates/blank/src/services/locator/locator-sync-utils.test.ts +1 -4
  239. package/templates/blank/src/services/module/module-service.ts +1 -4
  240. package/templates/blank/src/services/report/report-service.test.ts +70 -6
  241. package/templates/blank/src/services/report/report-service.ts +52 -9
  242. package/templates/blank/src/services/shared/errors.ts +2 -4
  243. package/templates/blank/src/services/template-step/template-step-service.ts +3 -1
  244. package/templates/blank/src/services/template-step-group/template-step-group-service.ts +3 -1
  245. package/templates/blank/src/services/test-case/test-case-service.ts +0 -5
  246. package/templates/blank/src/services/test-run/test-run-service.test.ts +3 -6
  247. package/templates/blank/src/services/test-run/test-run-service.ts +12 -7
  248. package/templates/blank/src/services/test-suite/test-suite-service.test.ts +1 -5
  249. package/templates/blank/src/services/test-suite/test-suite-service.ts +2 -4
  250. package/templates/blank/src/types/form/actionHandler.ts +1 -5
  251. package/templates/blank/tsconfig.json +8 -8
  252. package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +1 -1
  253. package/templates/default/packages/locator-picker-companion/dist/cli.js +313 -279
  254. package/templates/default/packages/locator-picker-companion/dist/index.d.ts +3 -3
  255. package/templates/default/packages/locator-picker-companion/dist/index.js +3 -3
  256. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +1 -1
  257. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +526 -481
  258. package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +13 -10
  259. package/templates/default/packages/locator-picker-companion/dist/launcher.js +47 -48
  260. package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  261. package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  262. package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +30 -22
  263. package/templates/default/packages/locator-picker-companion/dist/session-file.js +116 -104
  264. package/templates/default/packages/locator-picker-companion/dist/types.d.ts +25 -25
  265. package/templates/default/packages/locator-picker-companion/dist/types.js +1 -1
  266. package/templates/starter/.editorconfig +11 -0
  267. package/templates/starter/.gitattributes +21 -0
  268. package/templates/starter/.gitconfig.appraise +14 -0
  269. package/templates/starter/.prettierrc +13 -0
  270. package/templates/starter/.vscode/settings.json +2 -0
  271. package/templates/starter/README.md +12 -12
  272. package/templates/starter/automation/steps/actions/click.step.ts +56 -58
  273. package/templates/starter/automation/steps/actions/hover.step.ts +25 -27
  274. package/templates/starter/automation/steps/actions/input.step.ts +85 -108
  275. package/templates/starter/automation/steps/actions/navigation.step.ts +67 -70
  276. package/templates/starter/automation/steps/actions/random_data.step.ts +149 -143
  277. package/templates/starter/automation/steps/actions/store.step.ts +69 -1
  278. package/templates/starter/automation/steps/actions/wait.step.ts +84 -1
  279. package/templates/starter/automation/steps/validations/active_state_assertion.step.ts +28 -30
  280. package/templates/starter/automation/steps/validations/navigation_assertion.step.ts +20 -22
  281. package/templates/starter/automation/steps/validations/text_assertion.step.ts +67 -107
  282. package/templates/starter/automation/steps/validations/visibility_assertion.step.ts +24 -26
  283. package/templates/starter/components.json +24 -24
  284. package/templates/starter/cucumber.mjs +16 -16
  285. package/templates/starter/e2e/README.md +56 -0
  286. package/templates/starter/e2e/apply-migrations.mjs +76 -0
  287. package/templates/starter/e2e/appraise-smoke.spec.ts +78 -0
  288. package/templates/starter/e2e/authoring.spec.ts +53 -0
  289. package/templates/starter/e2e/crud-configuration.spec.ts +138 -0
  290. package/templates/starter/e2e/crud-tests.spec.ts +76 -0
  291. package/templates/starter/e2e/helpers/forms.ts +186 -0
  292. package/templates/starter/e2e/helpers/navigation.ts +27 -0
  293. package/templates/starter/e2e/helpers/table.ts +45 -0
  294. package/templates/starter/e2e/helpers/test-data.ts +549 -0
  295. package/templates/starter/e2e/helpers/ui.ts +41 -0
  296. package/templates/starter/e2e/navigation.spec.ts +101 -0
  297. package/templates/starter/e2e/runs-and-reports.spec.ts +82 -0
  298. package/templates/starter/e2e/settings-sync.spec.ts +39 -0
  299. package/templates/starter/e2e/start-server.mjs +61 -0
  300. package/templates/starter/eslint.config.mjs +4 -4
  301. package/templates/starter/gitignore +0 -3
  302. package/templates/starter/next-env.d.ts +1 -1
  303. package/templates/starter/package-lock.json +58 -102
  304. package/templates/starter/package.json +10 -9
  305. package/templates/starter/packages/cucumber-runtime/package.json +13 -13
  306. package/templates/starter/packages/cucumber-runtime/src/cache.util.ts +93 -93
  307. package/templates/starter/packages/cucumber-runtime/src/cli.ts +77 -68
  308. package/templates/starter/packages/cucumber-runtime/src/environment.util.ts +21 -21
  309. package/templates/starter/packages/cucumber-runtime/src/executor.ts +32 -32
  310. package/templates/starter/packages/cucumber-runtime/src/index.ts +17 -17
  311. package/templates/starter/packages/cucumber-runtime/src/locator.util.ts +234 -234
  312. package/templates/starter/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  313. package/templates/starter/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  314. package/templates/starter/packages/cucumber-runtime/src/types.ts +13 -13
  315. package/templates/starter/packages/cucumber-runtime/src/world.ts +44 -44
  316. package/templates/starter/packages/cucumber-runtime/tsconfig.json +11 -11
  317. package/templates/starter/packages/locator-picker-companion/dist/cli.js +1 -1
  318. package/templates/starter/packages/locator-picker-companion/dist/index.d.ts +3 -3
  319. package/templates/starter/packages/locator-picker-companion/dist/index.js +3 -3
  320. package/templates/starter/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  321. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  322. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  323. package/templates/starter/packages/locator-picker-companion/src/cli.ts +1 -7
  324. package/templates/starter/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  325. package/templates/starter/packages/locator-picker-companion/src/launcher.ts +1 -3
  326. package/templates/starter/packages/locator-picker-companion/src/session-file.ts +4 -15
  327. package/templates/starter/packages/locator-picker-companion/src/types.ts +1 -8
  328. package/templates/starter/playwright.config.ts +46 -0
  329. package/templates/starter/postcss.config.mjs +8 -8
  330. package/templates/starter/prisma/dev.db +0 -0
  331. package/templates/starter/scripts/configure-git-line-endings.mjs +91 -0
  332. package/templates/starter/scripts/install-template-step.ts +5 -1
  333. package/templates/starter/scripts/lib/step-matcher.test.ts +3 -3
  334. package/templates/starter/scripts/lib/step-matcher.ts +5 -1
  335. package/templates/starter/scripts/lib/template-step-installer.test.ts +4 -2
  336. package/templates/starter/scripts/lib/template-step-installer.ts +16 -4
  337. package/templates/starter/scripts/lib/template-step-registry.test.ts +1 -1
  338. package/templates/starter/scripts/lib/template-step-registry.ts +4 -1
  339. package/templates/starter/scripts/run-fallow-commit.mjs +4 -6
  340. package/templates/starter/scripts/sync-all.ts +7 -6
  341. package/templates/starter/scripts/sync-appraise-base-template.ts +84 -77
  342. package/templates/starter/scripts/sync-environments.ts +47 -44
  343. package/templates/starter/scripts/sync-locator-groups.ts +67 -76
  344. package/templates/starter/scripts/sync-locators.ts +50 -53
  345. package/templates/starter/scripts/sync-modules.ts +42 -42
  346. package/templates/starter/scripts/sync-tags.ts +51 -51
  347. package/templates/starter/scripts/sync-template-step-groups.ts +34 -32
  348. package/templates/starter/scripts/sync-template-steps.ts +97 -97
  349. package/templates/starter/scripts/sync-test-cases.ts +65 -74
  350. package/templates/starter/scripts/sync-test-suites.ts +85 -80
  351. package/templates/starter/src/actions/server-action-boundary.test.ts +1 -7
  352. package/templates/starter/src/actions/settings/sync-actions.ts +3 -1
  353. package/templates/starter/src/actions/tags/tag-actions.ts +1 -7
  354. package/templates/starter/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  355. package/templates/starter/src/app/(base)/environments/create/page.tsx +28 -28
  356. package/templates/starter/src/app/(base)/environments/environment-form.tsx +3 -2
  357. package/templates/starter/src/app/(base)/environments/environment-helpers.ts +4 -1
  358. package/templates/starter/src/app/(base)/layout.tsx +10 -10
  359. package/templates/starter/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  360. package/templates/starter/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  361. package/templates/starter/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  362. package/templates/starter/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  363. package/templates/starter/src/app/(base)/locator-groups/page.tsx +9 -19
  364. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  365. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  366. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  367. package/templates/starter/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  368. package/templates/starter/src/app/(base)/locators/locator-file-sync.ts +1 -5
  369. package/templates/starter/src/app/(base)/locators/locator-helpers.ts +2 -12
  370. package/templates/starter/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  371. package/templates/starter/src/app/(base)/modules/module-form.tsx +3 -1
  372. package/templates/starter/src/app/(base)/reports/overview-chart.tsx +49 -49
  373. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  374. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  375. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  376. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  377. package/templates/starter/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  378. package/templates/starter/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  379. package/templates/starter/src/app/(base)/tags/tag-form.test.tsx +2 -10
  380. package/templates/starter/src/app/(base)/tags/tag-form.tsx +5 -3
  381. package/templates/starter/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  382. package/templates/starter/src/app/(base)/tags/tag-table.tsx +29 -29
  383. package/templates/starter/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  384. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  385. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  386. package/templates/starter/src/app/(base)/template-steps/paramChip.tsx +6 -10
  387. package/templates/starter/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  388. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  389. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  390. package/templates/starter/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  391. package/templates/starter/src/app/(base)/template-steps/template-step-types.ts +1 -5
  392. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  393. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  394. package/templates/starter/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  395. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  396. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  397. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  398. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  399. package/templates/starter/src/app/(base)/test-cases/create/page.tsx +1 -5
  400. package/templates/starter/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  401. package/templates/starter/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  402. package/templates/starter/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  403. package/templates/starter/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  404. package/templates/starter/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  405. package/templates/starter/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  406. package/templates/starter/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  407. package/templates/starter/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  408. package/templates/starter/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  409. package/templates/starter/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  410. package/templates/starter/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  411. package/templates/starter/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  412. package/templates/starter/src/assets/icons/empty-tube.tsx +23 -23
  413. package/templates/starter/src/assets/icons/tube-plus.tsx +29 -29
  414. package/templates/starter/src/components/data-visualization/info-card.tsx +56 -70
  415. package/templates/starter/src/components/data-visualization/info-grid.tsx +22 -22
  416. package/templates/starter/src/components/diagram/add-node-prompt-node.tsx +1 -1
  417. package/templates/starter/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  418. package/templates/starter/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  419. package/templates/starter/src/components/diagram/dynamic-parameters.tsx +0 -1
  420. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  421. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  422. package/templates/starter/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  423. package/templates/starter/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  424. package/templates/starter/src/components/diagram/flow-diagram-node-search.tsx +65 -65
  425. package/templates/starter/src/components/diagram/flow-diagram-toolbar.tsx +1 -3
  426. package/templates/starter/src/components/diagram/flow-diagram-view.tsx +1 -7
  427. package/templates/starter/src/components/diagram/flow-node-data-helpers.ts +1 -1
  428. package/templates/starter/src/components/diagram/node-form-fields-content.tsx +9 -2
  429. package/templates/starter/src/components/diagram/node-form-helpers.test.ts +3 -1
  430. package/templates/starter/src/components/diagram/node-form-helpers.ts +1 -4
  431. package/templates/starter/src/components/diagram/node-form-template-step-selection.ts +1 -4
  432. package/templates/starter/src/components/diagram/node-form.test.tsx +25 -0
  433. package/templates/starter/src/components/diagram/node-form.tsx +2 -12
  434. package/templates/starter/src/components/diagram/options-header-node.test.tsx +4 -1
  435. package/templates/starter/src/components/diagram/options-header-node.tsx +140 -130
  436. package/templates/starter/src/components/diagram/use-flow-diagram.ts +1 -2
  437. package/templates/starter/src/components/form/error-message.tsx +7 -7
  438. package/templates/starter/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  439. package/templates/starter/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  440. package/templates/starter/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  441. package/templates/starter/src/components/navigation/entity-search-command.tsx +3 -9
  442. package/templates/starter/src/components/navigation/nav-link.tsx +60 -60
  443. package/templates/starter/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  444. package/templates/starter/src/components/test-case/test-case-form-helpers.ts +1 -5
  445. package/templates/starter/src/components/test-case/test-case-picker-helpers.ts +8 -7
  446. package/templates/starter/src/components/test-case/test-case-picker.tsx +2 -6
  447. package/templates/starter/src/components/test-run/log-viewer.test.tsx +25 -0
  448. package/templates/starter/src/components/test-run/log-viewer.tsx +2 -2
  449. package/templates/starter/src/components/test-run/test-run-details-guards.ts +10 -1
  450. package/templates/starter/src/components/test-run/test-run-details.test.tsx +9 -19
  451. package/templates/starter/src/components/test-run/use-log-viewer.ts +2 -8
  452. package/templates/starter/src/components/test-run/use-test-run-header.ts +1 -4
  453. package/templates/starter/src/components/test-suite/test-suite-picker.tsx +1 -1
  454. package/templates/starter/src/components/theme/theme-provider.tsx +7 -1
  455. package/templates/starter/src/components/typography/page-header-subtitle.tsx +7 -7
  456. package/templates/starter/src/components/typography/page-header.tsx +7 -7
  457. package/templates/starter/src/components/ui/chart.tsx +2 -8
  458. package/templates/starter/src/components/ui/command.tsx +2 -5
  459. package/templates/starter/src/components/ui/data-table-column-header.tsx +3 -3
  460. package/templates/starter/src/components/ui/data-table.test.tsx +1 -8
  461. package/templates/starter/src/components/ui/dialog.tsx +1 -4
  462. package/templates/starter/src/components/ui/select.tsx +2 -2
  463. package/templates/starter/src/components/ui/separator.tsx +5 -1
  464. package/templates/starter/src/components/ui/skeleton.tsx +7 -7
  465. package/templates/starter/src/components/ui/table.tsx +1 -1
  466. package/templates/starter/src/components/ui/toaster.tsx +26 -26
  467. package/templates/starter/src/components/ui/tooltip.tsx +1 -1
  468. package/templates/starter/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  469. package/templates/starter/src/lib/locator-group-file-utils.ts +5 -1
  470. package/templates/starter/src/lib/locator-picker/session-manager.ts +1 -2
  471. package/templates/starter/src/lib/metrics/metric-calculator.test.ts +105 -6
  472. package/templates/starter/src/lib/metrics/metric-calculator.ts +39 -40
  473. package/templates/starter/src/lib/sync/sync-executor.ts +1 -4
  474. package/templates/starter/src/lib/sync/sync-pending-counts.test.ts +201 -7
  475. package/templates/starter/src/lib/sync/sync-pending-counts.ts +81 -13
  476. package/templates/starter/src/lib/template-automation-paths.ts +1 -1
  477. package/templates/starter/src/lib/template-sync-utils.d.ts +14 -7
  478. package/templates/starter/src/lib/test-case-utils.ts +6 -6
  479. package/templates/starter/src/lib/test-run/log-formatter.ts +82 -83
  480. package/templates/starter/src/lib/test-run/report-parser.ts +352 -352
  481. package/templates/starter/src/lib/transformers/gherkin-converter.ts +42 -42
  482. package/templates/starter/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  483. package/templates/starter/src/lib/utils/node-param-validation.ts +81 -81
  484. package/templates/starter/src/lib/utils/template-step-file-generator.ts +5 -3
  485. package/templates/starter/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  486. package/templates/starter/src/services/dashboard/dashboard-service.test.ts +28 -1
  487. package/templates/starter/src/services/dashboard/dashboard-service.ts +2 -0
  488. package/templates/starter/src/services/locator/locator-service.test.ts +1 -3
  489. package/templates/starter/src/services/locator/locator-service.ts +3 -1
  490. package/templates/starter/src/services/locator/locator-sync-utils.test.ts +1 -4
  491. package/templates/starter/src/services/module/module-service.ts +1 -4
  492. package/templates/starter/src/services/report/report-service.test.ts +70 -6
  493. package/templates/starter/src/services/report/report-service.ts +52 -9
  494. package/templates/starter/src/services/shared/errors.ts +2 -4
  495. package/templates/starter/src/services/template-step/template-step-service.ts +3 -1
  496. package/templates/starter/src/services/template-step-group/template-step-group-service.ts +3 -1
  497. package/templates/starter/src/services/test-case/test-case-service.ts +0 -5
  498. package/templates/starter/src/services/test-run/test-run-service.test.ts +3 -6
  499. package/templates/starter/src/services/test-run/test-run-service.ts +12 -7
  500. package/templates/starter/src/services/test-suite/test-suite-service.test.ts +1 -5
  501. package/templates/starter/src/services/test-suite/test-suite-service.ts +2 -4
  502. package/templates/starter/src/types/form/actionHandler.ts +1 -5
  503. package/templates/starter/tsconfig.json +8 -8
@@ -206,42 +206,44 @@ async function syncStepGroupsToDatabase(stepGroups: StepGroupData[]): Promise<Sy
206
206
  * Generates and displays sync summary
207
207
  */
208
208
  async function main(): Promise<SyncResult> {
209
- console.log('šŸ”„ Starting template step group sync...')
210
- console.log('This will scan step definition files and sync step groups to database.\n')
209
+ console.log('šŸ”„ Starting template step group sync...')
210
+ console.log('This will scan step definition files and sync step groups to database.\n')
211
211
 
212
- const baseDir = process.cwd()
212
+ const baseDir = process.cwd()
213
213
 
214
- // Read step groups from files
215
- console.log('šŸ“ Scanning step definition files...')
216
- const stepGroups = await readStepGroupsFromFiles(baseDir)
217
- console.log(` Found ${stepGroups.length} step group(s) with valid JSDoc`)
214
+ // Read step groups from files
215
+ console.log('šŸ“ Scanning step definition files...')
216
+ const stepGroups = await readStepGroupsFromFiles(baseDir)
217
+ console.log(` Found ${stepGroups.length} step group(s) with valid JSDoc`)
218
218
 
219
- if (stepGroups.length === 0) {
220
- console.log('\nāš ļø No step groups found. Continuing so the database can be reconciled with an empty filesystem state.')
221
- }
222
-
223
- // Sync to database
224
- console.log('\nāœ… Syncing step groups to database...')
225
- const result = await syncStepGroupsToDatabase(stepGroups)
226
-
227
- printSyncSummary(
228
- [
229
- { label: 'šŸ“ Step groups scanned', value: result.groupsScanned },
230
- { label: 'āœ… Step groups existing', value: result.groupsExisting },
231
- { label: 'āž• Step groups created', value: result.groupsCreated },
232
- { label: 'šŸ—‘ļø Step groups deleted', value: result.groupsDeleted },
233
- { label: 'āš ļø Step groups skipped', value: result.groupsSkipped },
234
- { label: 'āŒ Errors', value: result.errors.length },
235
- ],
236
- [
237
- { title: 'Created step groups', items: result.createdGroups },
238
- { title: 'Existing step groups', items: result.existingGroups },
239
- { title: 'Deleted step groups', items: result.deletedGroups },
240
- { title: 'Skipped step groups (have template steps)', items: result.skippedGroups },
241
- { title: 'Errors', items: result.errors },
242
- ],
219
+ if (stepGroups.length === 0) {
220
+ console.log(
221
+ '\nāš ļø No step groups found. Continuing so the database can be reconciled with an empty filesystem state.',
243
222
  )
244
- return result
223
+ }
224
+
225
+ // Sync to database
226
+ console.log('\nāœ… Syncing step groups to database...')
227
+ const result = await syncStepGroupsToDatabase(stepGroups)
228
+
229
+ printSyncSummary(
230
+ [
231
+ { label: 'šŸ“ Step groups scanned', value: result.groupsScanned },
232
+ { label: 'āœ… Step groups existing', value: result.groupsExisting },
233
+ { label: 'āž• Step groups created', value: result.groupsCreated },
234
+ { label: 'šŸ—‘ļø Step groups deleted', value: result.groupsDeleted },
235
+ { label: 'āš ļø Step groups skipped', value: result.groupsSkipped },
236
+ { label: 'āŒ Errors', value: result.errors.length },
237
+ ],
238
+ [
239
+ { title: 'Created step groups', items: result.createdGroups },
240
+ { title: 'Existing step groups', items: result.existingGroups },
241
+ { title: 'Deleted step groups', items: result.deletedGroups },
242
+ { title: 'Skipped step groups (have template steps)', items: result.skippedGroups },
243
+ { title: 'Errors', items: result.errors },
244
+ ],
245
+ )
246
+ return result
245
247
  }
246
248
 
247
249
  runSyncScript(main)
@@ -267,120 +267,120 @@ async function syncStepsToDatabase(
267
267
  * Generates and displays sync summary
268
268
  */
269
269
  async function main(): Promise<SyncResult | void> {
270
- console.log('šŸ”„ Starting template step sync...')
271
- console.log('This will scan step definition files and sync template steps to database.')
272
- console.log('Filesystem is the source of truth - steps in DB but not in FS will be deleted.\n')
270
+ console.log('šŸ”„ Starting template step sync...')
271
+ console.log('This will scan step definition files and sync template steps to database.')
272
+ console.log('Filesystem is the source of truth - steps in DB but not in FS will be deleted.\n')
273
273
 
274
- const baseDir = process.cwd()
274
+ const baseDir = process.cwd()
275
275
 
276
- // Scan step files
277
- console.log('šŸ“ Scanning step definition files...')
278
- const stepFiles = await scanStepFiles(baseDir)
279
- console.log(` Found ${stepFiles.length} step file(s)`)
276
+ // Scan step files
277
+ console.log('šŸ“ Scanning step definition files...')
278
+ const stepFiles = await scanStepFiles(baseDir)
279
+ console.log(` Found ${stepFiles.length} step file(s)`)
280
280
 
281
- if (stepFiles.length === 0) {
282
- console.log('\nāš ļø No step files found. Nothing to sync.')
283
- return
284
- }
285
-
286
- // Parse all files
287
- console.log('\nšŸ“– Parsing step files...')
288
- const allSteps: Array<{ step: ParsedStep; groupName: string; filePath: string }> = []
289
- const errors: string[] = []
281
+ if (stepFiles.length === 0) {
282
+ console.log('\nāš ļø No step files found. Nothing to sync.')
283
+ return
284
+ }
290
285
 
291
- for (const file of stepFiles) {
292
- try {
293
- const filePath = join(baseDir, file)
294
- const content = await fs.readFile(filePath, 'utf-8')
295
- const stepData = parseStepFile(content, file)
296
-
297
- if (!stepData) {
298
- errors.push(`File '${file}' does not have a valid group JSDoc comment`)
299
- console.log(` āš ļø Skipped '${file}' (no group JSDoc)`)
300
- continue
301
- }
286
+ // Parse all files
287
+ console.log('\nšŸ“– Parsing step files...')
288
+ const allSteps: Array<{ step: ParsedStep; groupName: string; filePath: string }> = []
289
+ const errors: string[] = []
302
290
 
303
- if (stepData.steps.length === 0) {
304
- console.log(` āš ļø No steps found in '${file}'`)
305
- continue
306
- }
291
+ for (const file of stepFiles) {
292
+ try {
293
+ const filePath = join(baseDir, file)
294
+ const content = await fs.readFile(filePath, 'utf-8')
295
+ const stepData = parseStepFile(content, file)
307
296
 
308
- console.log(` āœ“ Parsed '${file}' (${stepData.steps.length} step(s))`)
297
+ if (!stepData) {
298
+ errors.push(`File '${file}' does not have a valid group JSDoc comment`)
299
+ console.log(` āš ļø Skipped '${file}' (no group JSDoc)`)
300
+ continue
301
+ }
309
302
 
310
- for (const step of stepData.steps) {
311
- allSteps.push({
312
- step,
313
- groupName: stepData.group.name,
314
- filePath: file,
315
- })
316
- }
317
- } catch (error) {
318
- const errorMsg = `Error parsing file '${file}': ${error}`
319
- errors.push(errorMsg)
320
- console.error(` āŒ ${errorMsg}`)
303
+ if (stepData.steps.length === 0) {
304
+ console.log(` āš ļø No steps found in '${file}'`)
305
+ continue
321
306
  }
322
- }
323
307
 
324
- if (errors.length > 0 && allSteps.length === 0) {
325
- console.log('\nāš ļø No valid steps found. Please check the errors above.')
326
- process.exit(1)
327
- }
308
+ console.log(` āœ“ Parsed '${file}' (${stepData.steps.length} step(s))`)
328
309
 
329
- // Check for duplicate signatures
330
- const signatureMap = new Map<string, string[]>()
331
- for (const { step, filePath } of allSteps) {
332
- if (!signatureMap.has(step.signature)) {
333
- signatureMap.set(step.signature, [])
310
+ for (const step of stepData.steps) {
311
+ allSteps.push({
312
+ step,
313
+ groupName: stepData.group.name,
314
+ filePath: file,
315
+ })
334
316
  }
335
- signatureMap.get(step.signature)!.push(filePath)
317
+ } catch (error) {
318
+ const errorMsg = `Error parsing file '${file}': ${error}`
319
+ errors.push(errorMsg)
320
+ console.error(` āŒ ${errorMsg}`)
336
321
  }
322
+ }
337
323
 
338
- for (const [signature, files] of signatureMap.entries()) {
339
- if (files.length > 1) {
340
- const errorMsg = `Duplicate signature found: "${signature}" in files: ${files.join(', ')}`
341
- errors.push(errorMsg)
342
- console.error(` āŒ ${errorMsg}`)
343
- }
324
+ if (errors.length > 0 && allSteps.length === 0) {
325
+ console.log('\nāš ļø No valid steps found. Please check the errors above.')
326
+ process.exit(1)
327
+ }
328
+
329
+ // Check for duplicate signatures
330
+ const signatureMap = new Map<string, string[]>()
331
+ for (const { step, filePath } of allSteps) {
332
+ if (!signatureMap.has(step.signature)) {
333
+ signatureMap.set(step.signature, [])
344
334
  }
335
+ signatureMap.get(step.signature)!.push(filePath)
336
+ }
345
337
 
346
- if (errors.length > 0 && allSteps.length === 0) {
347
- console.log('\nāš ļø Cannot proceed due to errors. Please fix the issues above.')
348
- process.exit(1)
338
+ for (const [signature, files] of signatureMap.entries()) {
339
+ if (files.length > 1) {
340
+ const errorMsg = `Duplicate signature found: "${signature}" in files: ${files.join(', ')}`
341
+ errors.push(errorMsg)
342
+ console.error(` āŒ ${errorMsg}`)
349
343
  }
344
+ }
350
345
 
351
- // Sync to database
352
- console.log('\nāœ… Syncing template steps to database...')
353
- const result = await syncStepsToDatabase(allSteps)
354
-
355
- // Add parsing errors to result
356
- result.errors.push(...errors)
357
-
358
- printSyncSummary(
359
- [
360
- { label: 'šŸ“ Steps scanned', value: result.stepsScanned },
361
- { label: 'āœ… Steps existing', value: result.stepsExisting },
362
- { label: 'āž• Steps created', value: result.stepsCreated },
363
- { label: 'šŸ”„ Steps updated', value: result.stepsUpdated },
364
- { label: 'šŸ—‘ļø Steps deleted', value: result.stepsDeleted },
365
- { label: 'āŒ Errors', value: result.errors.length },
366
- ],
367
- [
368
- {
369
- title: 'Created steps',
370
- items: result.createdSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
371
- },
372
- {
373
- title: 'Updated steps',
374
- items: result.updatedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
375
- },
376
- {
377
- title: 'Deleted steps',
378
- items: result.deletedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
379
- },
380
- { title: 'Errors', items: result.errors },
381
- ],
382
- )
383
- return result
346
+ if (errors.length > 0 && allSteps.length === 0) {
347
+ console.log('\nāš ļø Cannot proceed due to errors. Please fix the issues above.')
348
+ process.exit(1)
349
+ }
350
+
351
+ // Sync to database
352
+ console.log('\nāœ… Syncing template steps to database...')
353
+ const result = await syncStepsToDatabase(allSteps)
354
+
355
+ // Add parsing errors to result
356
+ result.errors.push(...errors)
357
+
358
+ printSyncSummary(
359
+ [
360
+ { label: 'šŸ“ Steps scanned', value: result.stepsScanned },
361
+ { label: 'āœ… Steps existing', value: result.stepsExisting },
362
+ { label: 'āž• Steps created', value: result.stepsCreated },
363
+ { label: 'šŸ”„ Steps updated', value: result.stepsUpdated },
364
+ { label: 'šŸ—‘ļø Steps deleted', value: result.stepsDeleted },
365
+ { label: 'āŒ Errors', value: result.errors.length },
366
+ ],
367
+ [
368
+ {
369
+ title: 'Created steps',
370
+ items: result.createdSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
371
+ },
372
+ {
373
+ title: 'Updated steps',
374
+ items: result.updatedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
375
+ },
376
+ {
377
+ title: 'Deleted steps',
378
+ items: result.deletedSteps.map(step => `${step.name} (${step.signature}) [${step.group}]`),
379
+ },
380
+ { title: 'Errors', items: result.errors },
381
+ ],
382
+ )
383
+ return result
384
384
  }
385
385
 
386
386
  runSyncScript(main)
@@ -10,11 +10,7 @@
10
10
  */
11
11
 
12
12
  import prisma from '../src/config/db-config'
13
- import {
14
- scanFeatureFiles,
15
- extractModulePathFromFilePath,
16
- ParsedStep,
17
- } from '../src/lib/gherkin-parser'
13
+ import { scanFeatureFiles, extractModulePathFromFilePath, ParsedStep } from '../src/lib/gherkin-parser'
18
14
  import { buildModuleHierarchy, findModuleByPath } from '../src/lib/module-hierarchy-builder'
19
15
  import { StepParameterType, TagType } from '@prisma/client'
20
16
  import { ensureAutomationWorkspaceReady, getAutomationFeaturesDir } from '../src/lib/automation/paths'
@@ -25,11 +21,7 @@ import {
25
21
  } from '../src/lib/sync/projected-feature-utils'
26
22
  import { extractTestSuiteNameFromFilename } from './lib/filename-utils'
27
23
  import { splitTagLine } from './lib/tag-parsing'
28
- import {
29
- determineStepTypeAndIcon,
30
- findMatchingTemplateStep,
31
- sameResolvedParameters,
32
- } from './lib/step-matcher'
24
+ import { determineStepTypeAndIcon, findMatchingTemplateStep, sameResolvedParameters } from './lib/step-matcher'
33
25
  import { printSyncSummary } from './lib/sync-summary'
34
26
  import { runSyncScript } from './lib/sync-script-runner'
35
27
 
@@ -187,10 +179,7 @@ async function findOrCreateTag(tagExpression: string, type: TagType): Promise<st
187
179
  }
188
180
  }
189
181
 
190
- async function deleteTestCaseWithCascade(
191
- testCaseId: string,
192
- identifierTagId?: string,
193
- ): Promise<void> {
182
+ async function deleteTestCaseWithCascade(testCaseId: string, identifierTagId?: string): Promise<void> {
194
183
  // Keep deletes in dependency order to satisfy RESTRICT constraints and
195
184
  // mirror domain-level delete behavior in a single transactional boundary.
196
185
  await prisma.$transaction(async tx => {
@@ -263,7 +252,9 @@ async function syncTestCaseSteps(
263
252
 
264
253
  // Order is the stable identity within a scenario for synchronization.
265
254
  const existingStepsMap = new Map(existingSteps.map(step => [step.order, step]))
266
- const projectedExistingStepsMap = new Map(normalizeProjectedDbTestCaseSteps(existingSteps).map(step => [step.order, step]))
255
+ const projectedExistingStepsMap = new Map(
256
+ normalizeProjectedDbTestCaseSteps(existingSteps).map(step => [step.order, step]),
257
+ )
267
258
 
268
259
  // Process each step from filesystem
269
260
  for (const step of steps) {
@@ -647,71 +638,71 @@ async function syncTestCasesToDatabase(testCasesFromFS: TestCaseFromFS[], result
647
638
  * Generates and displays sync summary
648
639
  */
649
640
  async function main(): Promise<SyncResult | void> {
650
- console.log('šŸ”„ Starting test cases sync...')
651
- console.log('This will scan feature files and sync test cases to database.')
652
- console.log('Filesystem is the source of truth - test cases in DB but not in FS will be deleted.\n')
641
+ console.log('šŸ”„ Starting test cases sync...')
642
+ console.log('This will scan feature files and sync test cases to database.')
643
+ console.log('Filesystem is the source of truth - test cases in DB but not in FS will be deleted.\n')
653
644
 
654
- await ensureAutomationWorkspaceReady()
655
- const featuresDir = getAutomationFeaturesDir()
645
+ await ensureAutomationWorkspaceReady()
646
+ const featuresDir = getAutomationFeaturesDir()
656
647
 
657
- // Scan test cases from filesystem
658
- const testCasesFromFS = await scanTestCasesFromFilesystem(featuresDir)
648
+ // Scan test cases from filesystem
649
+ const testCasesFromFS = await scanTestCasesFromFilesystem(featuresDir)
659
650
 
660
- if (testCasesFromFS.length === 0) {
661
- console.log('\nāš ļø No test cases found in feature files. Nothing to sync.')
662
- return
663
- }
651
+ if (testCasesFromFS.length === 0) {
652
+ console.log('\nāš ļø No test cases found in feature files. Nothing to sync.')
653
+ return
654
+ }
664
655
 
665
- console.log(`\nšŸ“‹ Found ${testCasesFromFS.length} test case(s) from feature files:`)
666
- for (const tc of testCasesFromFS) {
667
- console.log(` - ${tc.title} (${tc.identifierTag}) in ${tc.testSuiteName}`)
668
- }
656
+ console.log(`\nšŸ“‹ Found ${testCasesFromFS.length} test case(s) from feature files:`)
657
+ for (const tc of testCasesFromFS) {
658
+ console.log(` - ${tc.title} (${tc.identifierTag}) in ${tc.testSuiteName}`)
659
+ }
669
660
 
670
- // Initialize result
671
- const result: SyncResult = {
672
- testCasesScanned: testCasesFromFS.length,
673
- testCasesExisting: 0,
674
- testCasesCreated: 0,
675
- testCasesUpdated: 0,
676
- testCasesDeleted: 0,
677
- errors: [],
678
- warnings: [],
679
- createdTestCases: [],
680
- updatedTestCases: [],
681
- deletedTestCases: [],
682
- }
661
+ // Initialize result
662
+ const result: SyncResult = {
663
+ testCasesScanned: testCasesFromFS.length,
664
+ testCasesExisting: 0,
665
+ testCasesCreated: 0,
666
+ testCasesUpdated: 0,
667
+ testCasesDeleted: 0,
668
+ errors: [],
669
+ warnings: [],
670
+ createdTestCases: [],
671
+ updatedTestCases: [],
672
+ deletedTestCases: [],
673
+ }
683
674
 
684
- // Sync to database
685
- await syncTestCasesToDatabase(testCasesFromFS, result)
686
-
687
- printSyncSummary(
688
- [
689
- { label: 'šŸ“ Test cases scanned', value: result.testCasesScanned },
690
- { label: 'āœ… Test cases existing', value: result.testCasesExisting },
691
- { label: 'āž• Test cases created', value: result.testCasesCreated },
692
- { label: 'šŸ”„ Test cases updated', value: result.testCasesUpdated },
693
- { label: 'šŸ—‘ļø Test cases deleted', value: result.testCasesDeleted },
694
- { label: 'āš ļø Warnings', value: result.warnings.length },
695
- { label: 'āŒ Errors', value: result.errors.length },
696
- ],
697
- [
698
- {
699
- title: 'Created test cases',
700
- items: result.createdTestCases.map(tc => `${tc.title} (${tc.identifierTag})`),
701
- },
702
- {
703
- title: 'Updated test cases',
704
- items: result.updatedTestCases.map(tc => `${tc.title} (${tc.identifierTag})`),
705
- },
706
- {
707
- title: 'Deleted test cases',
708
- items: result.deletedTestCases.map(tc => `${tc.title} (${tc.identifierTag})`),
709
- },
710
- { title: 'Warnings', items: result.warnings },
711
- { title: 'Errors', items: result.errors },
712
- ],
713
- )
714
- return result
675
+ // Sync to database
676
+ await syncTestCasesToDatabase(testCasesFromFS, result)
677
+
678
+ printSyncSummary(
679
+ [
680
+ { label: 'šŸ“ Test cases scanned', value: result.testCasesScanned },
681
+ { label: 'āœ… Test cases existing', value: result.testCasesExisting },
682
+ { label: 'āž• Test cases created', value: result.testCasesCreated },
683
+ { label: 'šŸ”„ Test cases updated', value: result.testCasesUpdated },
684
+ { label: 'šŸ—‘ļø Test cases deleted', value: result.testCasesDeleted },
685
+ { label: 'āš ļø Warnings', value: result.warnings.length },
686
+ { label: 'āŒ Errors', value: result.errors.length },
687
+ ],
688
+ [
689
+ {
690
+ title: 'Created test cases',
691
+ items: result.createdTestCases.map(tc => `${tc.title} (${tc.identifierTag})`),
692
+ },
693
+ {
694
+ title: 'Updated test cases',
695
+ items: result.updatedTestCases.map(tc => `${tc.title} (${tc.identifierTag})`),
696
+ },
697
+ {
698
+ title: 'Deleted test cases',
699
+ items: result.deletedTestCases.map(tc => `${tc.title} (${tc.identifierTag})`),
700
+ },
701
+ { title: 'Warnings', items: result.warnings },
702
+ { title: 'Errors', items: result.errors },
703
+ ],
704
+ )
705
+ return result
715
706
  }
716
707
 
717
708
  runSyncScript(main)