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
@@ -101,9 +101,7 @@ function getEnvironmentIdentityKey(name: string): string {
101
101
  * Builds Environment objects from JSON content
102
102
  * Maps JSON structure to Prisma Environment model
103
103
  */
104
- function buildEnvironmentObjects(
105
- jsonContent: Record<string, EnvironmentConfig>,
106
- ): EnvironmentData[] {
104
+ function buildEnvironmentObjects(jsonContent: Record<string, EnvironmentConfig>): EnvironmentData[] {
107
105
  const environments: EnvironmentData[] = []
108
106
 
109
107
  for (const [key, config] of Object.entries(jsonContent)) {
@@ -162,7 +160,14 @@ async function syncEnvironmentsToDatabase(environments: EnvironmentData[]): Prom
162
160
  // Create a case-insensitive map: normalized name -> actual DB name
163
161
  const dbEnvironmentsByNormalizedName = new Map<
164
162
  string,
165
- { id: string; name: string; baseUrl: string; apiBaseUrl: string | null; username: string | null; password: string | null }
163
+ {
164
+ id: string
165
+ name: string
166
+ baseUrl: string
167
+ apiBaseUrl: string | null
168
+ username: string | null
169
+ password: string | null
170
+ }
166
171
  >()
167
172
  for (const dbEnv of allDbEnvironments) {
168
173
  const normalizedName = getEnvironmentIdentityKey(dbEnv.name)
@@ -260,46 +265,44 @@ async function syncEnvironmentsToDatabase(environments: EnvironmentData[]): Prom
260
265
  * Generates and displays sync summary
261
266
  */
262
267
  async function main(): Promise<SyncResult> {
263
- console.log('šŸ”„ Starting environments sync...')
264
- console.log('This will scan environments.json and sync environments to database.\n')
265
-
266
- await ensureAutomationWorkspaceReady()
267
-
268
- // Read environments from file
269
- console.log('šŸ“ Reading environments.json...')
270
- const jsonContent = await readEnvironmentsFromFile()
271
- const environmentKeys = Object.keys(jsonContent)
272
- console.log(` Found ${environmentKeys.length} environment(s): ${environmentKeys.join(', ') || 'none'}`)
273
-
274
- // Build environment objects
275
- console.log('\nšŸ” Building environment objects...')
276
- const environments = buildEnvironmentObjects(jsonContent)
277
- console.log(` Built ${environments.length} environment object(s)`)
278
-
279
- // Sync to database
280
- console.log('\nāœ… Syncing environments to database...')
281
- const result = await syncEnvironmentsToDatabase(environments)
282
-
283
- printSyncSummary(
284
- [
285
- { label: 'šŸ“ Environments scanned', value: result.environmentsScanned },
286
- { label: 'āœ… Environments existing', value: result.environmentsExisting },
287
- { label: 'āž• Environments created', value: result.environmentsCreated },
288
- { label: 'šŸ—‘ļø Environments deleted', value: result.environmentsDeleted },
289
- { label: 'āš ļø Environments skipped', value: result.environmentsSkipped },
290
- { label: 'āŒ Errors', value: result.errors.length },
291
- ],
292
- [
293
- { title: 'Created environments', items: result.createdEnvironments },
294
- { title: 'Existing environments', items: result.existingEnvironments },
295
- { title: 'Deleted environments', items: result.deletedEnvironments },
296
- { title: 'Skipped environments (have test runs)', items: result.skippedEnvironments },
297
- { title: 'Errors', items: result.errors },
298
- ],
299
- )
300
- return result
268
+ console.log('šŸ”„ Starting environments sync...')
269
+ console.log('This will scan environments.json and sync environments to database.\n')
270
+
271
+ await ensureAutomationWorkspaceReady()
272
+
273
+ // Read environments from file
274
+ console.log('šŸ“ Reading environments.json...')
275
+ const jsonContent = await readEnvironmentsFromFile()
276
+ const environmentKeys = Object.keys(jsonContent)
277
+ console.log(` Found ${environmentKeys.length} environment(s): ${environmentKeys.join(', ') || 'none'}`)
278
+
279
+ // Build environment objects
280
+ console.log('\nšŸ” Building environment objects...')
281
+ const environments = buildEnvironmentObjects(jsonContent)
282
+ console.log(` Built ${environments.length} environment object(s)`)
283
+
284
+ // Sync to database
285
+ console.log('\nāœ… Syncing environments to database...')
286
+ const result = await syncEnvironmentsToDatabase(environments)
287
+
288
+ printSyncSummary(
289
+ [
290
+ { label: 'šŸ“ Environments scanned', value: result.environmentsScanned },
291
+ { label: 'āœ… Environments existing', value: result.environmentsExisting },
292
+ { label: 'āž• Environments created', value: result.environmentsCreated },
293
+ { label: 'šŸ—‘ļø Environments deleted', value: result.environmentsDeleted },
294
+ { label: 'āš ļø Environments skipped', value: result.environmentsSkipped },
295
+ { label: 'āŒ Errors', value: result.errors.length },
296
+ ],
297
+ [
298
+ { title: 'Created environments', items: result.createdEnvironments },
299
+ { title: 'Existing environments', items: result.existingEnvironments },
300
+ { title: 'Deleted environments', items: result.deletedEnvironments },
301
+ { title: 'Skipped environments (have test runs)', items: result.skippedEnvironments },
302
+ { title: 'Errors', items: result.errors },
303
+ ],
304
+ )
305
+ return result
301
306
  }
302
307
 
303
308
  runSyncScript(main)
304
-
305
-
@@ -115,10 +115,7 @@ function buildLocatorMapRouteMap(locatorMap: LocatorMapEntry[]): Map<string, str
115
115
  * Builds locator groups from filesystem
116
116
  * Combines information from locator-map.json and directory structure
117
117
  */
118
- async function buildLocatorGroupsFromFS(
119
- baseDir: string,
120
- locatorMap: LocatorMapEntry[],
121
- ): Promise<LocatorGroupFromFS[]> {
118
+ async function buildLocatorGroupsFromFS(baseDir: string, locatorMap: LocatorMapEntry[]): Promise<LocatorGroupFromFS[]> {
122
119
  const locatorGroups: LocatorGroupFromFS[] = []
123
120
  const routeMap = buildLocatorMapRouteMap(locatorMap)
124
121
 
@@ -201,10 +198,7 @@ async function createOrUpdateLocatorGroup(
201
198
  /**
202
199
  * Syncs locator groups from filesystem to database
203
200
  */
204
- async function syncLocatorGroupsToDatabase(
205
- locatorGroups: LocatorGroupFromFS[],
206
- result: SyncResult,
207
- ): Promise<void> {
201
+ async function syncLocatorGroupsToDatabase(locatorGroups: LocatorGroupFromFS[], result: SyncResult): Promise<void> {
208
202
  console.log('\nāœ… Syncing locator groups to database...')
209
203
 
210
204
  for (const locatorGroup of locatorGroups) {
@@ -230,10 +224,7 @@ async function syncLocatorGroupsToDatabase(
230
224
  /**
231
225
  * Deletes orphaned locator groups (groups in DB but not in FS)
232
226
  */
233
- async function deleteOrphanedLocatorGroups(
234
- fsLocatorGroupNames: Set<string>,
235
- result: SyncResult,
236
- ): Promise<void> {
227
+ async function deleteOrphanedLocatorGroups(fsLocatorGroupNames: Set<string>, result: SyncResult): Promise<void> {
237
228
  console.log('\nšŸ” Checking for orphaned locator groups (not in filesystem)...')
238
229
 
239
230
  try {
@@ -287,72 +278,72 @@ async function deleteOrphanedLocatorGroups(
287
278
  * Generates and displays sync summary
288
279
  */
289
280
  async function main(): Promise<SyncResult> {
290
- console.log('šŸ”„ Starting locator groups sync...')
291
- console.log('This will scan filesystem directories and sync locator groups to database.')
292
- console.log('Filesystem is the source of truth - locator groups in DB but not in FS will be deleted.\n')
293
-
294
- const baseDir = process.cwd()
295
-
296
- // Initialize result
297
- const result: SyncResult = {
298
- locatorGroupsScanned: 0,
299
- locatorGroupsExisting: 0,
300
- locatorGroupsCreated: 0,
301
- locatorGroupsUpdated: 0,
302
- locatorGroupsDeleted: 0,
303
- errors: [],
304
- createdLocatorGroups: [],
305
- updatedLocatorGroups: [],
306
- deletedLocatorGroups: [],
307
- }
281
+ console.log('šŸ”„ Starting locator groups sync...')
282
+ console.log('This will scan filesystem directories and sync locator groups to database.')
283
+ console.log('Filesystem is the source of truth - locator groups in DB but not in FS will be deleted.\n')
284
+
285
+ const baseDir = process.cwd()
286
+
287
+ // Initialize result
288
+ const result: SyncResult = {
289
+ locatorGroupsScanned: 0,
290
+ locatorGroupsExisting: 0,
291
+ locatorGroupsCreated: 0,
292
+ locatorGroupsUpdated: 0,
293
+ locatorGroupsDeleted: 0,
294
+ errors: [],
295
+ createdLocatorGroups: [],
296
+ updatedLocatorGroups: [],
297
+ deletedLocatorGroups: [],
298
+ }
308
299
 
309
- // Read locator map
310
- console.log('šŸ“„ Reading locator-map.json...')
311
- const locatorMap = await readLocatorMap(baseDir)
312
- console.log(` Found ${locatorMap.length} entry(ies) in locator map`)
313
-
314
- // Build locator groups from filesystem
315
- console.log('\nšŸ“ Scanning automation/locators directory...')
316
- const locatorGroups = await buildLocatorGroupsFromFS(baseDir, locatorMap)
317
- result.locatorGroupsScanned = locatorGroups.length
318
- console.log(` Found ${locatorGroups.length} locator group(s) in filesystem`)
319
-
320
- if (locatorGroups.length > 0) {
321
- console.log('\n Locator groups found:')
322
- locatorGroups.forEach((group, index) => {
323
- console.log(` ${index + 1}. ${group.name} (route: ${group.route}, module: ${group.modulePath})`)
324
- })
325
- }
300
+ // Read locator map
301
+ console.log('šŸ“„ Reading locator-map.json...')
302
+ const locatorMap = await readLocatorMap(baseDir)
303
+ console.log(` Found ${locatorMap.length} entry(ies) in locator map`)
304
+
305
+ // Build locator groups from filesystem
306
+ console.log('\nšŸ“ Scanning automation/locators directory...')
307
+ const locatorGroups = await buildLocatorGroupsFromFS(baseDir, locatorMap)
308
+ result.locatorGroupsScanned = locatorGroups.length
309
+ console.log(` Found ${locatorGroups.length} locator group(s) in filesystem`)
310
+
311
+ if (locatorGroups.length > 0) {
312
+ console.log('\n Locator groups found:')
313
+ locatorGroups.forEach((group, index) => {
314
+ console.log(` ${index + 1}. ${group.name} (route: ${group.route}, module: ${group.modulePath})`)
315
+ })
316
+ }
326
317
 
327
- // Sync to database
328
- await syncLocatorGroupsToDatabase(locatorGroups, result)
329
-
330
- // Delete orphaned locator groups
331
- const fsLocatorGroupNames = new Set(locatorGroups.map(g => g.name))
332
- await deleteOrphanedLocatorGroups(fsLocatorGroupNames, result)
333
-
334
- printSyncSummary(
335
- [
336
- { label: 'šŸ“ Locator groups scanned', value: result.locatorGroupsScanned },
337
- { label: 'āœ… Locator groups existing', value: result.locatorGroupsExisting },
338
- { label: 'āž• Locator groups created', value: result.locatorGroupsCreated },
339
- { label: 'šŸ”„ Locator groups updated', value: result.locatorGroupsUpdated },
340
- { label: 'šŸ—‘ļø Locator groups deleted', value: result.locatorGroupsDeleted },
341
- { label: 'āŒ Errors', value: result.errors.length },
342
- ],
343
- [
344
- { title: 'Created locator groups', items: result.createdLocatorGroups },
345
- { title: 'Updated locator groups', items: result.updatedLocatorGroups },
346
- {
347
- title: 'Deleted locator groups',
348
- items: result.deletedLocatorGroups.map(
349
- group => `${group.name} (${group.locatorCount} locator(s) cascade deleted)`,
350
- ),
351
- },
352
- { title: 'Errors', items: result.errors },
353
- ],
354
- )
355
- return result
318
+ // Sync to database
319
+ await syncLocatorGroupsToDatabase(locatorGroups, result)
320
+
321
+ // Delete orphaned locator groups
322
+ const fsLocatorGroupNames = new Set(locatorGroups.map(g => g.name))
323
+ await deleteOrphanedLocatorGroups(fsLocatorGroupNames, result)
324
+
325
+ printSyncSummary(
326
+ [
327
+ { label: 'šŸ“ Locator groups scanned', value: result.locatorGroupsScanned },
328
+ { label: 'āœ… Locator groups existing', value: result.locatorGroupsExisting },
329
+ { label: 'āž• Locator groups created', value: result.locatorGroupsCreated },
330
+ { label: 'šŸ”„ Locator groups updated', value: result.locatorGroupsUpdated },
331
+ { label: 'šŸ—‘ļø Locator groups deleted', value: result.locatorGroupsDeleted },
332
+ { label: 'āŒ Errors', value: result.errors.length },
333
+ ],
334
+ [
335
+ { title: 'Created locator groups', items: result.createdLocatorGroups },
336
+ { title: 'Updated locator groups', items: result.updatedLocatorGroups },
337
+ {
338
+ title: 'Deleted locator groups',
339
+ items: result.deletedLocatorGroups.map(
340
+ group => `${group.name} (${group.locatorCount} locator(s) cascade deleted)`,
341
+ ),
342
+ },
343
+ { title: 'Errors', items: result.errors },
344
+ ],
345
+ )
346
+ return result
356
347
  }
357
348
 
358
349
  runSyncScript(main)
@@ -78,10 +78,7 @@ async function readLocatorFile(filePath: string): Promise<Record<string, string>
78
78
  /**
79
79
  * Finds or creates a LocatorGroup
80
80
  */
81
- async function findOrCreateLocatorGroup(
82
- groupName: string,
83
- moduleId: string,
84
- ): Promise<string> {
81
+ async function findOrCreateLocatorGroup(groupName: string, moduleId: string): Promise<string> {
85
82
  // Try to find existing locator group
86
83
  const existingGroup = await prisma.locatorGroup.findFirst({
87
84
  where: {
@@ -129,7 +126,7 @@ async function syncLocatorsFromFile(
129
126
 
130
127
  // Find or create locator group
131
128
  const locatorGroupId = await findOrCreateLocatorGroup(groupName, moduleId)
132
-
129
+
133
130
  // Track this group as processed (has a file)
134
131
  processedGroupIds.add(locatorGroupId)
135
132
 
@@ -208,7 +205,7 @@ async function deleteOrphanedLocatorGroups(
208
205
  result: SyncResult,
209
206
  ): Promise<void> {
210
207
  console.log('\nšŸ” Checking for orphaned locator groups (no file in filesystem)...')
211
-
208
+
212
209
  try {
213
210
  // Get all locator groups from database
214
211
  const allLocatorGroups = await prisma.locatorGroup.findMany({
@@ -292,57 +289,57 @@ async function syncLocatorsToDatabase(files: string[], baseDir: string): Promise
292
289
  * Generates and displays sync summary
293
290
  */
294
291
  async function main(): Promise<SyncResult | void> {
295
- console.log('šŸ”„ Starting locators sync...')
296
- console.log('This will scan locator JSON files and sync locators to database.')
297
- console.log('Filesystem is the source of truth - locators in DB but not in FS will be deleted.\n')
292
+ console.log('šŸ”„ Starting locators sync...')
293
+ console.log('This will scan locator JSON files and sync locators to database.')
294
+ console.log('Filesystem is the source of truth - locators in DB but not in FS will be deleted.\n')
298
295
 
299
- const baseDir = process.cwd()
296
+ const baseDir = process.cwd()
300
297
 
301
- // Scan locator files
302
- console.log('šŸ“ Scanning automation/locators...')
303
- const files = await scanLocatorFiles(baseDir)
304
- console.log(` Found ${files.length} locator file(s)`)
298
+ // Scan locator files
299
+ console.log('šŸ“ Scanning automation/locators...')
300
+ const files = await scanLocatorFiles(baseDir)
301
+ console.log(` Found ${files.length} locator file(s)`)
305
302
 
306
- if (files.length === 0) {
307
- console.log('\nāš ļø No locator files found. Nothing to sync.')
308
- return
309
- }
303
+ if (files.length === 0) {
304
+ console.log('\nāš ļø No locator files found. Nothing to sync.')
305
+ return
306
+ }
310
307
 
311
- // Sync to database
312
- console.log('\nāœ… Syncing locators to database...')
313
- const result = await syncLocatorsToDatabase(files, baseDir)
314
-
315
- printSyncSummary(
316
- [
317
- { label: 'šŸ“ Locators scanned', value: result.locatorsScanned },
318
- { label: 'āœ… Locators existing', value: result.locatorsExisting },
319
- { label: 'āž• Locators created', value: result.locatorsCreated },
320
- { label: 'šŸ”„ Locators updated', value: result.locatorsUpdated },
321
- { label: 'šŸ—‘ļø Locators deleted', value: result.locatorsDeleted },
322
- { label: 'šŸ—‘ļø Locator groups deleted', value: result.locatorGroupsDeleted },
323
- { label: 'āŒ Errors', value: result.errors.length },
324
- ],
325
- [
326
- {
327
- title: 'Created locators',
328
- items: result.createdLocators.map(loc => `${loc.name} (group: ${loc.group})`),
329
- },
330
- {
331
- title: 'Updated locators',
332
- items: result.updatedLocators.map(loc => `${loc.name} (group: ${loc.group})`),
333
- },
334
- {
335
- title: 'Deleted locators',
336
- items: result.deletedLocators.map(loc => `${loc.name} (group: ${loc.group})`),
337
- },
338
- {
339
- title: 'Deleted locator groups',
340
- items: result.deletedLocatorGroups.map(group => `${group.name} (${group.locatorCount} locator(s) deleted)`),
341
- },
342
- { title: 'Errors', items: result.errors },
343
- ],
344
- )
345
- return result
308
+ // Sync to database
309
+ console.log('\nāœ… Syncing locators to database...')
310
+ const result = await syncLocatorsToDatabase(files, baseDir)
311
+
312
+ printSyncSummary(
313
+ [
314
+ { label: 'šŸ“ Locators scanned', value: result.locatorsScanned },
315
+ { label: 'āœ… Locators existing', value: result.locatorsExisting },
316
+ { label: 'āž• Locators created', value: result.locatorsCreated },
317
+ { label: 'šŸ”„ Locators updated', value: result.locatorsUpdated },
318
+ { label: 'šŸ—‘ļø Locators deleted', value: result.locatorsDeleted },
319
+ { label: 'šŸ—‘ļø Locator groups deleted', value: result.locatorGroupsDeleted },
320
+ { label: 'āŒ Errors', value: result.errors.length },
321
+ ],
322
+ [
323
+ {
324
+ title: 'Created locators',
325
+ items: result.createdLocators.map(loc => `${loc.name} (group: ${loc.group})`),
326
+ },
327
+ {
328
+ title: 'Updated locators',
329
+ items: result.updatedLocators.map(loc => `${loc.name} (group: ${loc.group})`),
330
+ },
331
+ {
332
+ title: 'Deleted locators',
333
+ items: result.deletedLocators.map(loc => `${loc.name} (group: ${loc.group})`),
334
+ },
335
+ {
336
+ title: 'Deleted locator groups',
337
+ items: result.deletedLocatorGroups.map(group => `${group.name} (${group.locatorCount} locator(s) deleted)`),
338
+ },
339
+ { title: 'Errors', items: result.errors },
340
+ ],
341
+ )
342
+ return result
346
343
  }
347
344
 
348
345
  runSyncScript(main)
@@ -248,55 +248,55 @@ async function deleteOrphanedModules(fsModulePaths: Set<string>, result: SyncRes
248
248
  * Generates and displays sync summary
249
249
  */
250
250
  async function main(): Promise<SyncResult> {
251
- console.log('šŸ”„ Starting modules sync...')
252
- console.log('This will scan filesystem directories and sync module hierarchy to database.')
253
- console.log('Filesystem is the source of truth - modules in DB but not in FS will be deleted.\n')
251
+ console.log('šŸ”„ Starting modules sync...')
252
+ console.log('This will scan filesystem directories and sync module hierarchy to database.')
253
+ console.log('Filesystem is the source of truth - modules in DB but not in FS will be deleted.\n')
254
254
 
255
- const baseDir = process.cwd()
255
+ const baseDir = process.cwd()
256
256
 
257
- // Scan directories
258
- console.log('šŸ“ Scanning automation/locators...')
259
- const locatorModulePaths = await scanLocatorDirectories(baseDir)
260
- console.log(` Found ${locatorModulePaths.length} module path(s): ${locatorModulePaths.join(', ') || 'none'}`)
257
+ // Scan directories
258
+ console.log('šŸ“ Scanning automation/locators...')
259
+ const locatorModulePaths = await scanLocatorDirectories(baseDir)
260
+ console.log(` Found ${locatorModulePaths.length} module path(s): ${locatorModulePaths.join(', ') || 'none'}`)
261
261
 
262
- console.log('\nšŸ“ Scanning automation/features...')
263
- const featureModulePaths = await scanFeatureDirectories(baseDir)
264
- console.log(` Found ${featureModulePaths.length} module path(s): ${featureModulePaths.join(', ') || 'none'}`)
262
+ console.log('\nšŸ“ Scanning automation/features...')
263
+ const featureModulePaths = await scanFeatureDirectories(baseDir)
264
+ console.log(` Found ${featureModulePaths.length} module path(s): ${featureModulePaths.join(', ') || 'none'}`)
265
265
 
266
- // Combine and deduplicate
267
- const allModulePaths = Array.from(new Set([...locatorModulePaths, ...featureModulePaths]))
268
- console.log(`\nšŸ” Building module hierarchy from ${allModulePaths.length} unique module path(s)...`)
266
+ // Combine and deduplicate
267
+ const allModulePaths = Array.from(new Set([...locatorModulePaths, ...featureModulePaths]))
268
+ console.log(`\nšŸ” Building module hierarchy from ${allModulePaths.length} unique module path(s)...`)
269
269
 
270
- // Build module tree
271
- const moduleTree = buildModuleTree(allModulePaths)
270
+ // Build module tree
271
+ const moduleTree = buildModuleTree(allModulePaths)
272
272
 
273
- // Sync to database (create missing modules)
274
- console.log('\nāœ… Syncing modules to database...')
275
- const result = await syncModulesToDatabase(moduleTree)
273
+ // Sync to database (create missing modules)
274
+ console.log('\nāœ… Syncing modules to database...')
275
+ const result = await syncModulesToDatabase(moduleTree)
276
276
 
277
- // Delete orphaned modules (modules in DB but not in FS)
278
- const fsModulePathsSet = new Set(allModulePaths)
279
- // Also add all parent paths from the tree
280
- for (const path of moduleTree.keys()) {
281
- fsModulePathsSet.add(path)
282
- }
283
- await deleteOrphanedModules(fsModulePathsSet, result)
284
-
285
- printSyncSummary(
286
- [
287
- { label: 'šŸ“ Modules scanned', value: result.modulesScanned },
288
- { label: 'āœ… Modules existing', value: result.modulesExisting },
289
- { label: 'āž• Modules created', value: result.modulesCreated },
290
- { label: 'šŸ—‘ļø Modules deleted', value: result.modulesDeleted },
291
- { label: 'āŒ Errors', value: result.errors.length },
292
- ],
293
- [
294
- { title: 'Created modules', items: result.createdModules },
295
- { title: 'Deleted modules', items: result.deletedModules },
296
- { title: 'Errors', items: result.errors },
297
- ],
298
- )
299
- return result
277
+ // Delete orphaned modules (modules in DB but not in FS)
278
+ const fsModulePathsSet = new Set(allModulePaths)
279
+ // Also add all parent paths from the tree
280
+ for (const path of moduleTree.keys()) {
281
+ fsModulePathsSet.add(path)
282
+ }
283
+ await deleteOrphanedModules(fsModulePathsSet, result)
284
+
285
+ printSyncSummary(
286
+ [
287
+ { label: 'šŸ“ Modules scanned', value: result.modulesScanned },
288
+ { label: 'āœ… Modules existing', value: result.modulesExisting },
289
+ { label: 'āž• Modules created', value: result.modulesCreated },
290
+ { label: 'šŸ—‘ļø Modules deleted', value: result.modulesDeleted },
291
+ { label: 'āŒ Errors', value: result.errors.length },
292
+ ],
293
+ [
294
+ { title: 'Created modules', items: result.createdModules },
295
+ { title: 'Deleted modules', items: result.deletedModules },
296
+ { title: 'Errors', items: result.errors },
297
+ ],
298
+ )
299
+ return result
300
300
  }
301
301
 
302
302
  runSyncScript(main)
@@ -191,65 +191,65 @@ async function syncTagsToDatabase(tagObjects: TagData[]): Promise<SyncResult> {
191
191
  * Generates and displays sync summary
192
192
  */
193
193
  async function main(): Promise<SyncResult | void> {
194
- console.log('šŸ”„ Starting tags sync...')
195
- console.log('This will scan feature files and sync tags to database.')
196
- console.log('Filesystem is the source of truth - tags in DB but not in FS will be deleted.\n')
194
+ console.log('šŸ”„ Starting tags sync...')
195
+ console.log('This will scan feature files and sync tags to database.')
196
+ console.log('Filesystem is the source of truth - tags in DB but not in FS will be deleted.\n')
197
197
 
198
- const baseDir = process.cwd()
199
- const featuresDir = join(baseDir, 'automation', 'features')
198
+ const baseDir = process.cwd()
199
+ const featuresDir = join(baseDir, 'automation', 'features')
200
200
 
201
- // Scan feature files
202
- console.log('šŸ“ Scanning feature files in automation/features...')
203
- const parsedFeatures = await scanFeatureFiles(featuresDir)
204
- console.log(` Found ${parsedFeatures.length} feature file(s)`)
201
+ // Scan feature files
202
+ console.log('šŸ“ Scanning feature files in automation/features...')
203
+ const parsedFeatures = await scanFeatureFiles(featuresDir)
204
+ console.log(` Found ${parsedFeatures.length} feature file(s)`)
205
205
 
206
- if (parsedFeatures.length === 0) {
207
- console.log('\nāš ļø No feature files found. Nothing to sync.')
208
- return
209
- }
206
+ if (parsedFeatures.length === 0) {
207
+ console.log('\nāš ļø No feature files found. Nothing to sync.')
208
+ return
209
+ }
210
210
 
211
- // Extract unique tags
212
- console.log('\nšŸ” Extracting unique tags from feature files...')
213
- const uniqueTagExpressions = extractUniqueTags(parsedFeatures)
214
- console.log(` Found ${uniqueTagExpressions.size} unique tag(s)`)
211
+ // Extract unique tags
212
+ console.log('\nšŸ” Extracting unique tags from feature files...')
213
+ const uniqueTagExpressions = extractUniqueTags(parsedFeatures)
214
+ console.log(` Found ${uniqueTagExpressions.size} unique tag(s)`)
215
215
 
216
- if (uniqueTagExpressions.size === 0) {
217
- console.log('\nāš ļø No tags found in feature files. Nothing to sync.')
218
- return
219
- }
216
+ if (uniqueTagExpressions.size === 0) {
217
+ console.log('\nāš ļø No tags found in feature files. Nothing to sync.')
218
+ return
219
+ }
220
220
 
221
- // Build tag objects
222
- console.log('\nšŸ”Ø Building tag objects...')
223
- const tagObjects = buildTagObjects(uniqueTagExpressions)
224
- console.log(` Built ${tagObjects.length} tag object(s)`)
221
+ // Build tag objects
222
+ console.log('\nšŸ”Ø Building tag objects...')
223
+ const tagObjects = buildTagObjects(uniqueTagExpressions)
224
+ console.log(` Built ${tagObjects.length} tag object(s)`)
225
225
 
226
- // Log tag details
227
- console.log('\n Tag details:')
228
- for (const tag of tagObjects) {
229
- console.log(` - ${tag.tagExpression} → name: '${tag.name}', type: ${tag.type}`)
230
- }
226
+ // Log tag details
227
+ console.log('\n Tag details:')
228
+ for (const tag of tagObjects) {
229
+ console.log(` - ${tag.tagExpression} → name: '${tag.name}', type: ${tag.type}`)
230
+ }
231
231
 
232
- // Sync to database
233
- const result = await syncTagsToDatabase(tagObjects)
234
-
235
- printSyncSummary(
236
- [
237
- { label: 'šŸ“ Tags scanned', value: result.tagsScanned },
238
- { label: 'āœ… Tags existing', value: result.tagsExisting },
239
- { label: 'āž• Tags created', value: result.tagsCreated },
240
- { label: 'šŸ”„ Tags updated', value: result.tagsUpdated },
241
- { label: 'šŸ—‘ļø Tags deleted', value: result.tagsDeleted },
242
- { label: 'āŒ Errors', value: result.errors.length },
243
- ],
244
- [
245
- { title: 'Updated tags', items: result.updatedTags },
246
- { title: 'Created tags', items: result.createdTags },
247
- { title: 'Deleted tags', items: result.deletedTags },
248
- { title: 'Errors', items: result.errors },
249
- ],
250
- )
251
-
252
- return result
232
+ // Sync to database
233
+ const result = await syncTagsToDatabase(tagObjects)
234
+
235
+ printSyncSummary(
236
+ [
237
+ { label: 'šŸ“ Tags scanned', value: result.tagsScanned },
238
+ { label: 'āœ… Tags existing', value: result.tagsExisting },
239
+ { label: 'āž• Tags created', value: result.tagsCreated },
240
+ { label: 'šŸ”„ Tags updated', value: result.tagsUpdated },
241
+ { label: 'šŸ—‘ļø Tags deleted', value: result.tagsDeleted },
242
+ { label: 'āŒ Errors', value: result.errors.length },
243
+ ],
244
+ [
245
+ { title: 'Updated tags', items: result.updatedTags },
246
+ { title: 'Created tags', items: result.createdTags },
247
+ { title: 'Deleted tags', items: result.deletedTags },
248
+ { title: 'Errors', items: result.errors },
249
+ ],
250
+ )
251
+
252
+ return result
253
253
  }
254
254
 
255
255
  runSyncScript(main)