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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/README.md +17 -17
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/prepare-template-utils.d.ts.map +1 -1
  5. package/dist/prepare-template-utils.js.map +1 -1
  6. package/dist/prompts.d.ts.map +1 -1
  7. package/dist/prompts.js +2 -2
  8. package/dist/prompts.js.map +1 -1
  9. package/dist/sync-templates-utils.d.ts.map +1 -1
  10. package/dist/sync-templates-utils.js +1 -5
  11. package/dist/sync-templates-utils.js.map +1 -1
  12. package/package.json +1 -1
  13. package/templates/blank/.editorconfig +11 -0
  14. package/templates/blank/.env.example +2 -2
  15. package/templates/blank/.gitattributes +21 -0
  16. package/templates/blank/.gitconfig.appraise +14 -0
  17. package/templates/blank/.prettierrc +13 -0
  18. package/templates/blank/.vscode/settings.json +2 -0
  19. package/templates/blank/README.md +12 -12
  20. package/templates/blank/components.json +24 -24
  21. package/templates/blank/cucumber.mjs +27 -16
  22. package/templates/blank/e2e/README.md +56 -0
  23. package/templates/blank/e2e/apply-migrations.mjs +76 -0
  24. package/templates/blank/e2e/appraise-smoke.spec.ts +78 -0
  25. package/templates/blank/e2e/authoring.spec.ts +53 -0
  26. package/templates/blank/e2e/crud-configuration.spec.ts +138 -0
  27. package/templates/blank/e2e/crud-tests.spec.ts +76 -0
  28. package/templates/blank/e2e/helpers/forms.ts +186 -0
  29. package/templates/blank/e2e/helpers/navigation.ts +27 -0
  30. package/templates/blank/e2e/helpers/table.ts +45 -0
  31. package/templates/blank/e2e/helpers/test-data.ts +559 -0
  32. package/templates/blank/e2e/helpers/ui.ts +41 -0
  33. package/templates/blank/e2e/navigation.spec.ts +101 -0
  34. package/templates/blank/e2e/runs-and-reports.spec.ts +82 -0
  35. package/templates/blank/e2e/settings-sync.spec.ts +39 -0
  36. package/templates/blank/e2e/start-server.mjs +61 -0
  37. package/templates/blank/eslint.config.mjs +4 -4
  38. package/templates/blank/gitignore +0 -3
  39. package/templates/blank/next-env.d.ts +6 -6
  40. package/templates/blank/package-lock.json +60 -104
  41. package/templates/blank/package.json +11 -10
  42. package/templates/blank/packages/cucumber-runtime/package.json +14 -13
  43. package/templates/blank/packages/cucumber-runtime/src/cache.util.ts +93 -93
  44. package/templates/blank/packages/cucumber-runtime/src/cli.ts +77 -68
  45. package/templates/blank/packages/cucumber-runtime/src/environment.util.ts +21 -21
  46. package/templates/blank/packages/cucumber-runtime/src/executor.ts +32 -32
  47. package/templates/blank/packages/cucumber-runtime/src/index.ts +17 -17
  48. package/templates/blank/packages/cucumber-runtime/src/locator.util.ts +234 -234
  49. package/templates/blank/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  50. package/templates/blank/packages/cucumber-runtime/src/paths.ts +22 -5
  51. package/templates/blank/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  52. package/templates/blank/packages/cucumber-runtime/src/types.ts +13 -13
  53. package/templates/blank/packages/cucumber-runtime/src/world.ts +44 -44
  54. package/templates/blank/packages/cucumber-runtime/tsconfig.json +11 -11
  55. package/templates/blank/packages/locator-picker-companion/dist/cli.js +1 -1
  56. package/templates/blank/packages/locator-picker-companion/dist/index.d.ts +3 -3
  57. package/templates/blank/packages/locator-picker-companion/dist/index.js +3 -3
  58. package/templates/blank/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  59. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  60. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  61. package/templates/blank/packages/locator-picker-companion/package.json +2 -1
  62. package/templates/blank/packages/locator-picker-companion/src/cli.ts +1 -7
  63. package/templates/blank/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  64. package/templates/blank/packages/locator-picker-companion/src/launcher.ts +1 -3
  65. package/templates/blank/packages/locator-picker-companion/src/session-file.ts +4 -15
  66. package/templates/blank/packages/locator-picker-companion/src/types.ts +1 -8
  67. package/templates/blank/playwright.config.ts +46 -0
  68. package/templates/blank/postcss.config.mjs +8 -8
  69. package/templates/blank/prisma/dev.db +0 -0
  70. package/templates/blank/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  71. package/templates/blank/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  72. package/templates/blank/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  73. package/templates/blank/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  74. package/templates/blank/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  75. package/templates/blank/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  76. package/templates/blank/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  77. package/templates/blank/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  78. package/templates/blank/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  79. package/templates/blank/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  80. package/templates/blank/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  81. package/templates/blank/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  82. package/templates/blank/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  83. package/templates/blank/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  84. package/templates/blank/scripts/configure-git-line-endings.mjs +91 -0
  85. package/templates/blank/scripts/install-template-step.ts +5 -1
  86. package/templates/blank/scripts/lib/step-matcher.test.ts +3 -3
  87. package/templates/blank/scripts/lib/step-matcher.ts +5 -1
  88. package/templates/blank/scripts/lib/template-step-installer.test.ts +4 -2
  89. package/templates/blank/scripts/lib/template-step-installer.ts +16 -4
  90. package/templates/blank/scripts/lib/template-step-registry.test.ts +1 -1
  91. package/templates/blank/scripts/lib/template-step-registry.ts +4 -1
  92. package/templates/blank/scripts/run-fallow-commit.mjs +4 -6
  93. package/templates/blank/scripts/setup-env.ts +0 -0
  94. package/templates/blank/scripts/sync-all.ts +7 -6
  95. package/templates/blank/scripts/sync-appraise-base-template.ts +84 -77
  96. package/templates/blank/scripts/sync-environments.ts +47 -44
  97. package/templates/blank/scripts/sync-locator-groups.ts +67 -76
  98. package/templates/blank/scripts/sync-locators.ts +50 -53
  99. package/templates/blank/scripts/sync-modules.ts +42 -42
  100. package/templates/blank/scripts/sync-tags.ts +51 -51
  101. package/templates/blank/scripts/sync-template-step-groups.ts +34 -32
  102. package/templates/blank/scripts/sync-template-steps.ts +97 -97
  103. package/templates/blank/scripts/sync-test-cases.ts +125 -84
  104. package/templates/blank/scripts/sync-test-suites.ts +85 -80
  105. package/templates/blank/src/actions/server-action-boundary.test.ts +1 -7
  106. package/templates/blank/src/actions/settings/sync-actions.ts +3 -1
  107. package/templates/blank/src/actions/tags/tag-actions.ts +1 -7
  108. package/templates/blank/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  109. package/templates/blank/src/app/(base)/environments/create/page.tsx +28 -28
  110. package/templates/blank/src/app/(base)/environments/environment-form.tsx +3 -2
  111. package/templates/blank/src/app/(base)/environments/environment-helpers.ts +4 -1
  112. package/templates/blank/src/app/(base)/layout.tsx +10 -10
  113. package/templates/blank/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  114. package/templates/blank/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  115. package/templates/blank/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  116. package/templates/blank/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  117. package/templates/blank/src/app/(base)/locator-groups/page.tsx +9 -19
  118. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  119. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  120. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  121. package/templates/blank/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  122. package/templates/blank/src/app/(base)/locators/locator-file-sync.ts +1 -5
  123. package/templates/blank/src/app/(base)/locators/locator-helpers.ts +2 -12
  124. package/templates/blank/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  125. package/templates/blank/src/app/(base)/modules/module-form.tsx +3 -1
  126. package/templates/blank/src/app/(base)/reports/overview-chart.tsx +49 -49
  127. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  128. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  129. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  130. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  131. package/templates/blank/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  132. package/templates/blank/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  133. package/templates/blank/src/app/(base)/tags/tag-form.test.tsx +2 -10
  134. package/templates/blank/src/app/(base)/tags/tag-form.tsx +5 -3
  135. package/templates/blank/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  136. package/templates/blank/src/app/(base)/tags/tag-table.tsx +29 -29
  137. package/templates/blank/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  138. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  139. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  140. package/templates/blank/src/app/(base)/template-steps/paramChip.tsx +6 -10
  141. package/templates/blank/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  142. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  143. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  144. package/templates/blank/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  145. package/templates/blank/src/app/(base)/template-steps/template-step-types.ts +1 -5
  146. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  147. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  148. package/templates/blank/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  149. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  150. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  151. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  152. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  153. package/templates/blank/src/app/(base)/test-cases/create/page.tsx +1 -5
  154. package/templates/blank/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  155. package/templates/blank/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  156. package/templates/blank/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  157. package/templates/blank/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  158. package/templates/blank/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  159. package/templates/blank/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  160. package/templates/blank/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  161. package/templates/blank/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  162. package/templates/blank/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  163. package/templates/blank/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  164. package/templates/blank/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  165. package/templates/blank/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  166. package/templates/blank/src/assets/icons/empty-tube.tsx +23 -23
  167. package/templates/blank/src/assets/icons/tube-plus.tsx +29 -29
  168. package/templates/blank/src/components/data-visualization/info-card.tsx +56 -70
  169. package/templates/blank/src/components/data-visualization/info-grid.tsx +22 -22
  170. package/templates/blank/src/components/diagram/add-node-prompt-node.tsx +1 -1
  171. package/templates/blank/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  172. package/templates/blank/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  173. package/templates/blank/src/components/diagram/dynamic-parameters.tsx +0 -1
  174. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  175. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  176. package/templates/blank/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  177. package/templates/blank/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  178. package/templates/blank/src/components/diagram/flow-diagram-node-search.tsx +73 -66
  179. package/templates/blank/src/components/diagram/flow-diagram-toolbar.tsx +35 -3
  180. package/templates/blank/src/components/diagram/flow-diagram-view.tsx +1 -7
  181. package/templates/blank/src/components/diagram/flow-diagram.test.tsx +225 -0
  182. package/templates/blank/src/components/diagram/flow-node-data-helpers.ts +1 -1
  183. package/templates/blank/src/components/diagram/node-form-fields-content.tsx +9 -2
  184. package/templates/blank/src/components/diagram/node-form-helpers.test.ts +3 -1
  185. package/templates/blank/src/components/diagram/node-form-helpers.ts +1 -4
  186. package/templates/blank/src/components/diagram/node-form-template-step-selection.ts +1 -4
  187. package/templates/blank/src/components/diagram/node-form.test.tsx +25 -0
  188. package/templates/blank/src/components/diagram/node-form.tsx +2 -12
  189. package/templates/blank/src/components/diagram/options-header-node.test.tsx +4 -1
  190. package/templates/blank/src/components/diagram/options-header-node.tsx +140 -130
  191. package/templates/blank/src/components/diagram/use-flow-diagram-search.ts +2 -0
  192. package/templates/blank/src/components/diagram/use-flow-diagram.ts +93 -1
  193. package/templates/blank/src/components/form/error-message.tsx +7 -7
  194. package/templates/blank/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  195. package/templates/blank/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  196. package/templates/blank/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  197. package/templates/blank/src/components/navigation/entity-search-command.tsx +3 -9
  198. package/templates/blank/src/components/navigation/nav-link.tsx +60 -60
  199. package/templates/blank/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  200. package/templates/blank/src/components/test-case/test-case-form-helpers.ts +1 -5
  201. package/templates/blank/src/components/test-case/test-case-picker-helpers.ts +8 -7
  202. package/templates/blank/src/components/test-case/test-case-picker.tsx +2 -6
  203. package/templates/blank/src/components/test-run/log-viewer.test.tsx +25 -0
  204. package/templates/blank/src/components/test-run/log-viewer.tsx +2 -2
  205. package/templates/blank/src/components/test-run/test-run-details-guards.ts +10 -1
  206. package/templates/blank/src/components/test-run/test-run-details.test.tsx +9 -19
  207. package/templates/blank/src/components/test-run/use-log-viewer.ts +2 -8
  208. package/templates/blank/src/components/test-run/use-test-run-header.ts +1 -4
  209. package/templates/blank/src/components/test-suite/test-suite-picker.tsx +1 -1
  210. package/templates/blank/src/components/theme/theme-provider.tsx +7 -1
  211. package/templates/blank/src/components/typography/page-header-subtitle.tsx +7 -7
  212. package/templates/blank/src/components/typography/page-header.tsx +7 -7
  213. package/templates/blank/src/components/ui/chart.tsx +2 -8
  214. package/templates/blank/src/components/ui/command.tsx +2 -5
  215. package/templates/blank/src/components/ui/data-table-column-header.tsx +3 -3
  216. package/templates/blank/src/components/ui/data-table.test.tsx +1 -8
  217. package/templates/blank/src/components/ui/dialog.tsx +1 -4
  218. package/templates/blank/src/components/ui/select.tsx +2 -2
  219. package/templates/blank/src/components/ui/separator.tsx +5 -1
  220. package/templates/blank/src/components/ui/skeleton.tsx +7 -7
  221. package/templates/blank/src/components/ui/table.tsx +1 -1
  222. package/templates/blank/src/components/ui/toaster.tsx +26 -26
  223. package/templates/blank/src/components/ui/tooltip.tsx +1 -1
  224. package/templates/blank/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  225. package/templates/blank/src/lib/appraise-test-case-metadata.test.ts +78 -0
  226. package/templates/blank/src/lib/appraise-test-case-metadata.ts +220 -0
  227. package/templates/blank/src/lib/automation/automation-path-roots.test.ts +14 -0
  228. package/templates/blank/src/lib/automation/automation-path-roots.ts +10 -2
  229. package/templates/blank/src/lib/database-sync.ts +166 -15
  230. package/templates/blank/src/lib/executor/local-executor-adapter.ts +6 -2
  231. package/templates/blank/src/lib/feature-file-generator.ts +54 -10
  232. package/templates/blank/src/lib/gherkin-parser.test.ts +52 -0
  233. package/templates/blank/src/lib/gherkin-parser.ts +39 -1
  234. package/templates/blank/src/lib/locator-group-file-utils.ts +5 -1
  235. package/templates/blank/src/lib/locator-picker/session-manager.ts +1 -2
  236. package/templates/blank/src/lib/metrics/metric-calculator.test.ts +105 -6
  237. package/templates/blank/src/lib/metrics/metric-calculator.ts +39 -40
  238. package/templates/blank/src/lib/sync/projected-feature-utils.ts +5 -1
  239. package/templates/blank/src/lib/sync/sync-executor.ts +1 -4
  240. package/templates/blank/src/lib/sync/sync-pending-counts.test.ts +316 -7
  241. package/templates/blank/src/lib/sync/sync-pending-counts.ts +189 -26
  242. package/templates/blank/src/lib/template-automation-paths.ts +1 -1
  243. package/templates/blank/src/lib/template-sync-utils.d.ts +14 -7
  244. package/templates/blank/src/lib/test-case-utils.ts +6 -6
  245. package/templates/blank/src/lib/test-run/log-formatter.ts +82 -83
  246. package/templates/blank/src/lib/test-run/report-parser.ts +352 -352
  247. package/templates/blank/src/lib/transformers/gherkin-converter.ts +42 -42
  248. package/templates/blank/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  249. package/templates/blank/src/lib/utils/node-param-validation.ts +81 -81
  250. package/templates/blank/src/lib/utils/template-step-file-generator.ts +5 -3
  251. package/templates/blank/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  252. package/templates/blank/src/services/dashboard/dashboard-service.test.ts +28 -1
  253. package/templates/blank/src/services/dashboard/dashboard-service.ts +2 -0
  254. package/templates/blank/src/services/locator/locator-service.test.ts +1 -3
  255. package/templates/blank/src/services/locator/locator-service.ts +3 -1
  256. package/templates/blank/src/services/locator/locator-sync-utils.test.ts +1 -4
  257. package/templates/blank/src/services/module/module-service.ts +1 -4
  258. package/templates/blank/src/services/report/report-service.test.ts +70 -6
  259. package/templates/blank/src/services/report/report-service.ts +52 -9
  260. package/templates/blank/src/services/shared/errors.ts +2 -4
  261. package/templates/blank/src/services/template-step/template-step-service.ts +3 -1
  262. package/templates/blank/src/services/template-step-group/template-step-group-service.ts +3 -1
  263. package/templates/blank/src/services/test-case/test-case-service.ts +0 -5
  264. package/templates/blank/src/services/test-run/test-run-service.test.ts +13 -6
  265. package/templates/blank/src/services/test-run/test-run-service.ts +53 -8
  266. package/templates/blank/src/services/test-suite/test-suite-service.test.ts +1 -5
  267. package/templates/blank/src/services/test-suite/test-suite-service.ts +2 -4
  268. package/templates/blank/src/types/form/actionHandler.ts +1 -5
  269. package/templates/blank/tsconfig.json +8 -8
  270. package/templates/starter/.editorconfig +11 -0
  271. package/templates/starter/.env.example +2 -2
  272. package/templates/starter/.gitattributes +21 -0
  273. package/templates/starter/.gitconfig.appraise +14 -0
  274. package/templates/starter/.prettierrc +13 -0
  275. package/templates/starter/.vscode/settings.json +2 -0
  276. package/templates/starter/README.md +12 -12
  277. package/templates/starter/automation/steps/actions/click.step.ts +56 -58
  278. package/templates/starter/automation/steps/actions/hover.step.ts +25 -27
  279. package/templates/starter/automation/steps/actions/input.step.ts +85 -108
  280. package/templates/starter/automation/steps/actions/navigation.step.ts +67 -70
  281. package/templates/starter/automation/steps/actions/random_data.step.ts +149 -143
  282. package/templates/starter/automation/steps/actions/store.step.ts +69 -1
  283. package/templates/starter/automation/steps/actions/wait.step.ts +84 -1
  284. package/templates/starter/automation/steps/validations/active_state_assertion.step.ts +28 -30
  285. package/templates/starter/automation/steps/validations/navigation_assertion.step.ts +20 -22
  286. package/templates/starter/automation/steps/validations/text_assertion.step.ts +67 -107
  287. package/templates/starter/automation/steps/validations/visibility_assertion.step.ts +24 -26
  288. package/templates/starter/components.json +24 -24
  289. package/templates/starter/cucumber.mjs +27 -16
  290. package/templates/starter/e2e/README.md +56 -0
  291. package/templates/starter/e2e/apply-migrations.mjs +76 -0
  292. package/templates/starter/e2e/appraise-smoke.spec.ts +78 -0
  293. package/templates/starter/e2e/authoring.spec.ts +53 -0
  294. package/templates/starter/e2e/crud-configuration.spec.ts +138 -0
  295. package/templates/starter/e2e/crud-tests.spec.ts +76 -0
  296. package/templates/starter/e2e/helpers/forms.ts +186 -0
  297. package/templates/starter/e2e/helpers/navigation.ts +27 -0
  298. package/templates/starter/e2e/helpers/table.ts +45 -0
  299. package/templates/starter/e2e/helpers/test-data.ts +559 -0
  300. package/templates/starter/e2e/helpers/ui.ts +41 -0
  301. package/templates/starter/e2e/navigation.spec.ts +101 -0
  302. package/templates/starter/e2e/runs-and-reports.spec.ts +82 -0
  303. package/templates/starter/e2e/settings-sync.spec.ts +39 -0
  304. package/templates/starter/e2e/start-server.mjs +61 -0
  305. package/templates/starter/eslint.config.mjs +4 -4
  306. package/templates/starter/gitignore +0 -3
  307. package/templates/starter/next-env.d.ts +6 -6
  308. package/templates/starter/package-lock.json +60 -104
  309. package/templates/starter/package.json +11 -10
  310. package/templates/starter/packages/cucumber-runtime/package.json +14 -13
  311. package/templates/starter/packages/cucumber-runtime/src/cache.util.ts +93 -93
  312. package/templates/starter/packages/cucumber-runtime/src/cli.ts +77 -68
  313. package/templates/starter/packages/cucumber-runtime/src/environment.util.ts +21 -21
  314. package/templates/starter/packages/cucumber-runtime/src/executor.ts +32 -32
  315. package/templates/starter/packages/cucumber-runtime/src/index.ts +17 -17
  316. package/templates/starter/packages/cucumber-runtime/src/locator.util.ts +234 -234
  317. package/templates/starter/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  318. package/templates/starter/packages/cucumber-runtime/src/paths.ts +22 -5
  319. package/templates/starter/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  320. package/templates/starter/packages/cucumber-runtime/src/types.ts +13 -13
  321. package/templates/starter/packages/cucumber-runtime/src/world.ts +44 -44
  322. package/templates/starter/packages/cucumber-runtime/tsconfig.json +11 -11
  323. package/templates/starter/packages/locator-picker-companion/dist/cli.js +1 -1
  324. package/templates/starter/packages/locator-picker-companion/dist/index.d.ts +3 -3
  325. package/templates/starter/packages/locator-picker-companion/dist/index.js +3 -3
  326. package/templates/starter/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  327. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  328. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  329. package/templates/starter/packages/locator-picker-companion/package.json +2 -1
  330. package/templates/starter/packages/locator-picker-companion/src/cli.ts +1 -7
  331. package/templates/starter/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  332. package/templates/starter/packages/locator-picker-companion/src/launcher.ts +1 -3
  333. package/templates/starter/packages/locator-picker-companion/src/session-file.ts +4 -15
  334. package/templates/starter/packages/locator-picker-companion/src/types.ts +1 -8
  335. package/templates/starter/playwright.config.ts +46 -0
  336. package/templates/starter/postcss.config.mjs +8 -8
  337. package/templates/starter/prisma/dev.db +0 -0
  338. package/templates/starter/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
  339. package/templates/starter/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
  340. package/templates/starter/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
  341. package/templates/starter/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
  342. package/templates/starter/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
  343. package/templates/starter/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
  344. package/templates/starter/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
  345. package/templates/starter/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
  346. package/templates/starter/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
  347. package/templates/starter/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
  348. package/templates/starter/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
  349. package/templates/starter/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
  350. package/templates/starter/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
  351. package/templates/starter/prisma/migrations/20260313093000_add_report_step_screenshot_path/migration.sql +1 -1
  352. package/templates/starter/scripts/configure-git-line-endings.mjs +91 -0
  353. package/templates/starter/scripts/install-template-step.ts +5 -1
  354. package/templates/starter/scripts/lib/step-matcher.test.ts +3 -3
  355. package/templates/starter/scripts/lib/step-matcher.ts +5 -1
  356. package/templates/starter/scripts/lib/template-step-installer.test.ts +4 -2
  357. package/templates/starter/scripts/lib/template-step-installer.ts +16 -4
  358. package/templates/starter/scripts/lib/template-step-registry.test.ts +1 -1
  359. package/templates/starter/scripts/lib/template-step-registry.ts +4 -1
  360. package/templates/starter/scripts/run-fallow-commit.mjs +4 -6
  361. package/templates/starter/scripts/setup-env.ts +0 -0
  362. package/templates/starter/scripts/sync-all.ts +7 -6
  363. package/templates/starter/scripts/sync-appraise-base-template.ts +84 -77
  364. package/templates/starter/scripts/sync-environments.ts +47 -44
  365. package/templates/starter/scripts/sync-locator-groups.ts +67 -76
  366. package/templates/starter/scripts/sync-locators.ts +50 -53
  367. package/templates/starter/scripts/sync-modules.ts +42 -42
  368. package/templates/starter/scripts/sync-tags.ts +51 -51
  369. package/templates/starter/scripts/sync-template-step-groups.ts +34 -32
  370. package/templates/starter/scripts/sync-template-steps.ts +97 -97
  371. package/templates/starter/scripts/sync-test-cases.ts +125 -84
  372. package/templates/starter/scripts/sync-test-suites.ts +85 -80
  373. package/templates/starter/src/actions/server-action-boundary.test.ts +1 -7
  374. package/templates/starter/src/actions/settings/sync-actions.ts +3 -1
  375. package/templates/starter/src/actions/tags/tag-actions.ts +1 -7
  376. package/templates/starter/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  377. package/templates/starter/src/app/(base)/environments/create/page.tsx +28 -28
  378. package/templates/starter/src/app/(base)/environments/environment-form.tsx +3 -2
  379. package/templates/starter/src/app/(base)/environments/environment-helpers.ts +4 -1
  380. package/templates/starter/src/app/(base)/layout.tsx +10 -10
  381. package/templates/starter/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  382. package/templates/starter/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  383. package/templates/starter/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  384. package/templates/starter/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  385. package/templates/starter/src/app/(base)/locator-groups/page.tsx +9 -19
  386. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  387. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  388. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  389. package/templates/starter/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  390. package/templates/starter/src/app/(base)/locators/locator-file-sync.ts +1 -5
  391. package/templates/starter/src/app/(base)/locators/locator-helpers.ts +2 -12
  392. package/templates/starter/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  393. package/templates/starter/src/app/(base)/modules/module-form.tsx +3 -1
  394. package/templates/starter/src/app/(base)/reports/overview-chart.tsx +49 -49
  395. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  396. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  397. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  398. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  399. package/templates/starter/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  400. package/templates/starter/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  401. package/templates/starter/src/app/(base)/tags/tag-form.test.tsx +2 -10
  402. package/templates/starter/src/app/(base)/tags/tag-form.tsx +5 -3
  403. package/templates/starter/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  404. package/templates/starter/src/app/(base)/tags/tag-table.tsx +29 -29
  405. package/templates/starter/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  406. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  407. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  408. package/templates/starter/src/app/(base)/template-steps/paramChip.tsx +6 -10
  409. package/templates/starter/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  410. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  411. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  412. package/templates/starter/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  413. package/templates/starter/src/app/(base)/template-steps/template-step-types.ts +1 -5
  414. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  415. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  416. package/templates/starter/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  417. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  418. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  419. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  420. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  421. package/templates/starter/src/app/(base)/test-cases/create/page.tsx +1 -5
  422. package/templates/starter/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  423. package/templates/starter/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  424. package/templates/starter/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  425. package/templates/starter/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  426. package/templates/starter/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  427. package/templates/starter/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  428. package/templates/starter/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  429. package/templates/starter/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  430. package/templates/starter/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  431. package/templates/starter/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  432. package/templates/starter/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  433. package/templates/starter/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  434. package/templates/starter/src/assets/icons/empty-tube.tsx +23 -23
  435. package/templates/starter/src/assets/icons/tube-plus.tsx +29 -29
  436. package/templates/starter/src/components/data-visualization/info-card.tsx +56 -70
  437. package/templates/starter/src/components/data-visualization/info-grid.tsx +22 -22
  438. package/templates/starter/src/components/diagram/add-node-prompt-node.tsx +1 -1
  439. package/templates/starter/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  440. package/templates/starter/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  441. package/templates/starter/src/components/diagram/dynamic-parameters.tsx +0 -1
  442. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  443. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  444. package/templates/starter/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  445. package/templates/starter/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  446. package/templates/starter/src/components/diagram/flow-diagram-node-search.tsx +73 -66
  447. package/templates/starter/src/components/diagram/flow-diagram-toolbar.tsx +35 -3
  448. package/templates/starter/src/components/diagram/flow-diagram-view.tsx +1 -7
  449. package/templates/starter/src/components/diagram/flow-diagram.test.tsx +225 -0
  450. package/templates/starter/src/components/diagram/flow-node-data-helpers.ts +1 -1
  451. package/templates/starter/src/components/diagram/node-form-fields-content.tsx +9 -2
  452. package/templates/starter/src/components/diagram/node-form-helpers.test.ts +3 -1
  453. package/templates/starter/src/components/diagram/node-form-helpers.ts +1 -4
  454. package/templates/starter/src/components/diagram/node-form-template-step-selection.ts +1 -4
  455. package/templates/starter/src/components/diagram/node-form.test.tsx +25 -0
  456. package/templates/starter/src/components/diagram/node-form.tsx +2 -12
  457. package/templates/starter/src/components/diagram/options-header-node.test.tsx +4 -1
  458. package/templates/starter/src/components/diagram/options-header-node.tsx +140 -130
  459. package/templates/starter/src/components/diagram/use-flow-diagram-search.ts +2 -0
  460. package/templates/starter/src/components/diagram/use-flow-diagram.ts +93 -1
  461. package/templates/starter/src/components/form/error-message.tsx +7 -7
  462. package/templates/starter/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  463. package/templates/starter/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  464. package/templates/starter/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  465. package/templates/starter/src/components/navigation/entity-search-command.tsx +3 -9
  466. package/templates/starter/src/components/navigation/nav-link.tsx +60 -60
  467. package/templates/starter/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  468. package/templates/starter/src/components/test-case/test-case-form-helpers.ts +1 -5
  469. package/templates/starter/src/components/test-case/test-case-picker-helpers.ts +8 -7
  470. package/templates/starter/src/components/test-case/test-case-picker.tsx +2 -6
  471. package/templates/starter/src/components/test-run/log-viewer.test.tsx +25 -0
  472. package/templates/starter/src/components/test-run/log-viewer.tsx +2 -2
  473. package/templates/starter/src/components/test-run/test-run-details-guards.ts +10 -1
  474. package/templates/starter/src/components/test-run/test-run-details.test.tsx +9 -19
  475. package/templates/starter/src/components/test-run/use-log-viewer.ts +2 -8
  476. package/templates/starter/src/components/test-run/use-test-run-header.ts +1 -4
  477. package/templates/starter/src/components/test-suite/test-suite-picker.tsx +1 -1
  478. package/templates/starter/src/components/theme/theme-provider.tsx +7 -1
  479. package/templates/starter/src/components/typography/page-header-subtitle.tsx +7 -7
  480. package/templates/starter/src/components/typography/page-header.tsx +7 -7
  481. package/templates/starter/src/components/ui/chart.tsx +2 -8
  482. package/templates/starter/src/components/ui/command.tsx +2 -5
  483. package/templates/starter/src/components/ui/data-table-column-header.tsx +3 -3
  484. package/templates/starter/src/components/ui/data-table.test.tsx +1 -8
  485. package/templates/starter/src/components/ui/dialog.tsx +1 -4
  486. package/templates/starter/src/components/ui/select.tsx +2 -2
  487. package/templates/starter/src/components/ui/separator.tsx +5 -1
  488. package/templates/starter/src/components/ui/skeleton.tsx +7 -7
  489. package/templates/starter/src/components/ui/table.tsx +1 -1
  490. package/templates/starter/src/components/ui/toaster.tsx +26 -26
  491. package/templates/starter/src/components/ui/tooltip.tsx +1 -1
  492. package/templates/starter/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  493. package/templates/starter/src/lib/appraise-test-case-metadata.test.ts +78 -0
  494. package/templates/starter/src/lib/appraise-test-case-metadata.ts +220 -0
  495. package/templates/starter/src/lib/automation/automation-path-roots.test.ts +14 -0
  496. package/templates/starter/src/lib/automation/automation-path-roots.ts +10 -2
  497. package/templates/starter/src/lib/database-sync.ts +166 -15
  498. package/templates/starter/src/lib/executor/local-executor-adapter.ts +6 -2
  499. package/templates/starter/src/lib/feature-file-generator.ts +54 -10
  500. package/templates/starter/src/lib/gherkin-parser.test.ts +52 -0
  501. package/templates/starter/src/lib/gherkin-parser.ts +39 -1
  502. package/templates/starter/src/lib/locator-group-file-utils.ts +5 -1
  503. package/templates/starter/src/lib/locator-picker/session-manager.ts +1 -2
  504. package/templates/starter/src/lib/metrics/metric-calculator.test.ts +105 -6
  505. package/templates/starter/src/lib/metrics/metric-calculator.ts +39 -40
  506. package/templates/starter/src/lib/sync/projected-feature-utils.ts +5 -1
  507. package/templates/starter/src/lib/sync/sync-executor.ts +1 -4
  508. package/templates/starter/src/lib/sync/sync-pending-counts.test.ts +316 -7
  509. package/templates/starter/src/lib/sync/sync-pending-counts.ts +189 -26
  510. package/templates/starter/src/lib/template-automation-paths.ts +1 -1
  511. package/templates/starter/src/lib/template-sync-utils.d.ts +14 -7
  512. package/templates/starter/src/lib/test-case-utils.ts +6 -6
  513. package/templates/starter/src/lib/test-run/log-formatter.ts +82 -83
  514. package/templates/starter/src/lib/test-run/report-parser.ts +352 -352
  515. package/templates/starter/src/lib/transformers/gherkin-converter.ts +42 -42
  516. package/templates/starter/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  517. package/templates/starter/src/lib/utils/node-param-validation.ts +81 -81
  518. package/templates/starter/src/lib/utils/template-step-file-generator.ts +5 -3
  519. package/templates/starter/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  520. package/templates/starter/src/services/dashboard/dashboard-service.test.ts +28 -1
  521. package/templates/starter/src/services/dashboard/dashboard-service.ts +2 -0
  522. package/templates/starter/src/services/locator/locator-service.test.ts +1 -3
  523. package/templates/starter/src/services/locator/locator-service.ts +3 -1
  524. package/templates/starter/src/services/locator/locator-sync-utils.test.ts +1 -4
  525. package/templates/starter/src/services/module/module-service.ts +1 -4
  526. package/templates/starter/src/services/report/report-service.test.ts +70 -6
  527. package/templates/starter/src/services/report/report-service.ts +52 -9
  528. package/templates/starter/src/services/shared/errors.ts +2 -4
  529. package/templates/starter/src/services/template-step/template-step-service.ts +3 -1
  530. package/templates/starter/src/services/template-step-group/template-step-group-service.ts +3 -1
  531. package/templates/starter/src/services/test-case/test-case-service.ts +0 -5
  532. package/templates/starter/src/services/test-run/test-run-service.test.ts +13 -6
  533. package/templates/starter/src/services/test-run/test-run-service.ts +53 -8
  534. package/templates/starter/src/services/test-suite/test-suite-service.test.ts +1 -5
  535. package/templates/starter/src/services/test-suite/test-suite-service.ts +2 -4
  536. package/templates/starter/src/types/form/actionHandler.ts +1 -5
  537. package/templates/starter/tsconfig.json +8 -8
  538. package/dist/cli.e2e.test.d.ts +0 -2
  539. package/dist/cli.e2e.test.d.ts.map +0 -1
  540. package/dist/cli.e2e.test.js +0 -73
  541. package/dist/cli.e2e.test.js.map +0 -1
  542. package/dist/config.test.d.ts +0 -2
  543. package/dist/config.test.d.ts.map +0 -1
  544. package/dist/config.test.js +0 -65
  545. package/dist/config.test.js.map +0 -1
  546. package/dist/copy-template.test.d.ts +0 -2
  547. package/dist/copy-template.test.d.ts.map +0 -1
  548. package/dist/copy-template.test.js +0 -71
  549. package/dist/copy-template.test.js.map +0 -1
  550. package/dist/download-repo.test.d.ts +0 -2
  551. package/dist/download-repo.test.d.ts.map +0 -1
  552. package/dist/download-repo.test.js +0 -14
  553. package/dist/download-repo.test.js.map +0 -1
  554. package/dist/install.test.d.ts +0 -2
  555. package/dist/install.test.d.ts.map +0 -1
  556. package/dist/install.test.js +0 -119
  557. package/dist/install.test.js.map +0 -1
  558. package/dist/prompts.test.d.ts +0 -2
  559. package/dist/prompts.test.d.ts.map +0 -1
  560. package/dist/prompts.test.js +0 -58
  561. package/dist/prompts.test.js.map +0 -1
  562. package/templates/default/next-env.d.ts +0 -6
  563. package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +0 -1
  564. package/templates/default/packages/locator-picker-companion/dist/cli.js +0 -302
  565. package/templates/default/packages/locator-picker-companion/dist/index.d.ts +0 -3
  566. package/templates/default/packages/locator-picker-companion/dist/index.js +0 -3
  567. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +0 -1
  568. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +0 -615
  569. package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +0 -11
  570. package/templates/default/packages/locator-picker-companion/dist/launcher.js +0 -59
  571. package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +0 -3
  572. package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +0 -257
  573. package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +0 -22
  574. package/templates/default/packages/locator-picker-companion/dist/session-file.js +0 -150
  575. package/templates/default/packages/locator-picker-companion/dist/types.d.ts +0 -31
  576. package/templates/default/packages/locator-picker-companion/dist/types.js +0 -1
  577. package/templates/default/prisma/dev.db +0 -0
@@ -200,7 +200,7 @@ function displaySummary(summary: SyncSummary): void {
200
200
  const status = result.success ? 'āœ…' : 'āŒ'
201
201
  const duration = `${(result.duration / 1000).toFixed(2)}s`
202
202
  console.log(` ${index + 1}. ${status} ${result.name} (${result.description}) - ${duration}`)
203
-
203
+
204
204
  if (!result.success) {
205
205
  if (result.exitCode !== null) {
206
206
  console.log(` Exit code: ${result.exitCode}`)
@@ -252,7 +252,7 @@ async function main(): Promise<number> {
252
252
  for (const scriptId of SYNC_SCRIPT_IDS) {
253
253
  const result = await executeSyncScript(scriptId)
254
254
  results.push(result)
255
-
255
+
256
256
  // Continue execution even if script failed (as per user requirement)
257
257
  // The script will log the failure but continue with remaining scripts
258
258
  }
@@ -278,10 +278,11 @@ async function main(): Promise<number> {
278
278
  }
279
279
 
280
280
  // Run the main function
281
- main().catch(error => {
282
- console.error('\nāŒ Fatal error during sync orchestration:', error)
283
- return 1
284
- })
281
+ main()
282
+ .catch(error => {
283
+ console.error('\nāŒ Fatal error during sync orchestration:', error)
284
+ return 1
285
+ })
285
286
  .then(exitCode => {
286
287
  process.exit(exitCode)
287
288
  })
@@ -145,89 +145,96 @@ function main(): void {
145
145
  console.log('Copying src/...')
146
146
  copyDirWithFilter(join(repoRoot, 'src'), join(target, 'src'))
147
147
 
148
- console.log('Copying automation/...')
149
- copyDirWithFilter(join(repoRoot, 'automation'), join(target, 'automation'))
150
- syncLegacyEnvironmentConfig()
151
- resetAutomationReports(target)
152
- resetAutomationLocatorMap(target)
153
-
154
- for (const internalPackage of INTERNAL_PACKAGES) {
155
- console.log(`Copying internal package ${internalPackage.name}...`)
156
- syncInternalPackage(internalPackage)
157
- }
158
-
159
- console.log('Copying prisma/...')
160
- copyDirWithFilter(join(repoRoot, 'prisma'), join(target, 'prisma'))
161
- console.log('Copying public/...')
162
- copyDirWithFilter(join(repoRoot, 'public'), join(target, 'public'))
163
- console.log('Copying scripts/...')
164
- copyDirWithFilter(join(repoRoot, 'scripts'), join(target, 'scripts'))
148
+ console.log('Copying automation/...')
149
+ copyDirWithFilter(join(repoRoot, 'automation'), join(target, 'automation'))
150
+ syncLegacyEnvironmentConfig()
151
+ resetAutomationReports(target)
152
+ resetAutomationLocatorMap(target)
153
+
154
+ for (const internalPackage of INTERNAL_PACKAGES) {
155
+ console.log(`Copying internal package ${internalPackage.name}...`)
156
+ syncInternalPackage(internalPackage)
157
+ }
165
158
 
166
- const legacyTestsRoot = join(target, 'src', 'tests')
167
- if (existsSync(legacyTestsRoot)) {
168
- rmSync(legacyTestsRoot, { recursive: true, force: true })
169
- }
159
+ console.log('Copying prisma/...')
160
+ copyDirWithFilter(join(repoRoot, 'prisma'), join(target, 'prisma'))
161
+ console.log('Copying public/...')
162
+ copyDirWithFilter(join(repoRoot, 'public'), join(target, 'public'))
163
+ console.log('Copying scripts/...')
164
+ copyDirWithFilter(join(repoRoot, 'scripts'), join(target, 'scripts'))
165
+ console.log('Copying e2e/...')
166
+ copyDirWithFilter(join(repoRoot, 'e2e'), join(target, 'e2e'))
167
+
168
+ const legacyTestsRoot = join(target, 'src', 'tests')
169
+ if (existsSync(legacyTestsRoot)) {
170
+ rmSync(legacyTestsRoot, { recursive: true, force: true })
171
+ }
170
172
 
171
- const configFiles = [
172
- '.gitignore',
173
- 'eslint.config.mjs',
174
- 'tailwind.config.ts',
175
- 'tsconfig.json',
176
- 'postcss.config.mjs',
177
- 'components.json',
178
- 'next.config.ts',
179
- 'next-env.d.ts',
180
- '.env.example',
181
- 'package-lock.json',
182
- 'yarn.lock',
183
- 'pnpm-lock.yaml',
184
- 'bun.lockb',
185
- ]
186
- for (const name of configFiles) {
187
- const src = join(repoRoot, name)
188
- if (existsSync(src)) {
189
- copyFile(src, join(target, name))
173
+ const configFiles = [
174
+ '.gitattributes',
175
+ '.gitconfig.appraise',
176
+ '.editorconfig',
177
+ '.prettierrc',
178
+ '.gitignore',
179
+ 'eslint.config.mjs',
180
+ 'tailwind.config.ts',
181
+ 'tsconfig.json',
182
+ 'postcss.config.mjs',
183
+ 'components.json',
184
+ 'next.config.ts',
185
+ 'next-env.d.ts',
186
+ 'playwright.config.ts',
187
+ '.env.example',
188
+ 'package-lock.json',
189
+ 'yarn.lock',
190
+ 'pnpm-lock.yaml',
191
+ 'bun.lockb',
192
+ ]
193
+ for (const name of configFiles) {
194
+ const src = join(repoRoot, name)
195
+ if (existsSync(src)) {
196
+ copyFile(src, join(target, name))
197
+ }
190
198
  }
191
- }
192
199
 
193
- const cucumberSource = join(repoRoot, 'cucumber.mjs')
194
- if (existsSync(cucumberSource)) {
195
- copyFile(cucumberSource, join(target, 'cucumber.mjs'))
196
- console.log('Synced cucumber.mjs to template')
197
- }
200
+ const cucumberSource = join(repoRoot, 'cucumber.mjs')
201
+ if (existsSync(cucumberSource)) {
202
+ copyFile(cucumberSource, join(target, 'cucumber.mjs'))
203
+ console.log('Synced cucumber.mjs to template')
204
+ }
198
205
 
199
- const vscodeSource = join(repoRoot, '.vscode')
200
- if (existsSync(vscodeSource)) {
201
- cpSync(vscodeSource, join(target, '.vscode'), { recursive: true, force: true })
202
- console.log('Synced .vscode to template')
203
- }
206
+ const vscodeSource = join(repoRoot, '.vscode')
207
+ if (existsSync(vscodeSource)) {
208
+ cpSync(vscodeSource, join(target, '.vscode'), { recursive: true, force: true })
209
+ console.log('Synced .vscode to template')
210
+ }
204
211
 
205
- const rootPkg = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8')) as {
206
- scripts: Record<string, string>
207
- [key: string]: unknown
208
- }
209
- rootPkg.scripts = {
210
- ...rootPkg.scripts,
211
- build: 'npm run build:local',
212
- 'build:local':
213
- 'npm run generate-db-client && npm run build:cucumber-runtime && npm run build:locator-picker-companion && next build',
214
- start: 'next start',
215
- 'generate-db-client': 'npx prisma generate --schema prisma/schema.prisma',
216
- 'migrate-db': 'npx prisma migrate deploy',
217
- 'install-playwright': 'npx playwright install',
218
- setup: 'npm run install-dependencies && npm run setup:db && npm run build:local && npm run protect-seeded-files',
219
- 'setup:db': 'npm run setup-env && npm run generate-db-client && npm run migrate-db && npm run sync-all',
220
- 'setup:full':
221
- 'npm run install-dependencies && npm run setup:db && npm run build:local && npm run protect-seeded-files',
222
- 'protect-seeded-files': 'npx tsx scripts/protect-seeded-files.ts',
223
- 'appraisejs:setup': 'npm run setup',
224
- 'appraisejs:sync': 'npm run sync-all',
225
- 'appraisejs:install-step': 'npx tsx scripts/install-template-step.ts',
226
- }
227
- delete rootPkg.scripts['build:appraisejs']
228
- delete rootPkg.scripts['build-step-registry']
229
- writeFileSync(join(target, 'package.json'), JSON.stringify(rootPkg, null, 2) + '\n')
230
- console.log('Wrote template package.json with production-first scaffold scripts.')
212
+ const rootPkg = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8')) as {
213
+ scripts: Record<string, string>
214
+ [key: string]: unknown
215
+ }
216
+ rootPkg.scripts = {
217
+ ...rootPkg.scripts,
218
+ build: 'npm run build:local',
219
+ 'build:local':
220
+ 'npm run generate-db-client && npm run build:cucumber-runtime && npm run build:locator-picker-companion && next build',
221
+ start: 'next start',
222
+ 'generate-db-client': 'npx prisma generate --schema prisma/schema.prisma',
223
+ 'migrate-db': 'npx prisma migrate deploy',
224
+ 'install-playwright': 'npx playwright install',
225
+ setup: 'npm run install-dependencies && npm run setup:db && npm run build:local && npm run protect-seeded-files',
226
+ 'setup:db': 'npm run setup-env && npm run generate-db-client && npm run migrate-db && npm run sync-all',
227
+ 'setup:full':
228
+ 'npm run install-dependencies && npm run setup:db && npm run build:local && npm run protect-seeded-files',
229
+ 'protect-seeded-files': 'npx tsx scripts/protect-seeded-files.ts',
230
+ 'appraisejs:setup': 'npm run setup',
231
+ 'appraisejs:sync': 'npm run sync-all',
232
+ 'appraisejs:install-step': 'npx tsx scripts/install-template-step.ts',
233
+ }
234
+ delete rootPkg.scripts['build:appraisejs']
235
+ delete rootPkg.scripts['build-step-registry']
236
+ writeFileSync(join(target, 'package.json'), JSON.stringify(rootPkg, null, 2) + '\n')
237
+ console.log('Wrote template package.json with production-first scaffold scripts.')
231
238
 
232
239
  if (savedReadme) {
233
240
  writeFileSync(readmePath, savedReadme)
@@ -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)