create-appraise 0.1.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 (330) hide show
  1. package/README.md +52 -0
  2. package/package.json +63 -0
  3. package/templates/default/.env.example +2 -0
  4. package/templates/default/README.md +51 -0
  5. package/templates/default/appraise.config.json +4 -0
  6. package/templates/default/components.json +24 -0
  7. package/templates/default/eslint.config.mjs +15 -0
  8. package/templates/default/next-env.d.ts +6 -0
  9. package/templates/default/next.config.ts +7 -0
  10. package/templates/default/package-lock.json +14321 -0
  11. package/templates/default/package.json +124 -0
  12. package/templates/default/postcss.config.mjs +8 -0
  13. package/templates/default/prisma/migrations/20251026202316_migrate_back_to_sqlite/migration.sql +257 -0
  14. package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -0
  15. package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -0
  16. package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -0
  17. package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -0
  18. package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -0
  19. package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -0
  20. package/templates/default/prisma/migrations/20251130190737_add_trace_path_to_test_run_test_case/migration.sql +2 -0
  21. package/templates/default/prisma/migrations/20251213074835_add_log_path_to_test_run/migration.sql +2 -0
  22. package/templates/default/prisma/migrations/20251213183952_add_name_property_for_the_test_run_entities/migration.sql +30 -0
  23. package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -0
  24. package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -0
  25. package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -0
  26. package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -0
  27. package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -0
  28. package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -0
  29. package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -0
  30. package/templates/default/prisma/migrations/migration_lock.toml +3 -0
  31. package/templates/default/prisma/schema.prisma +554 -0
  32. package/templates/default/public/favicon.ico +0 -0
  33. package/templates/default/public/file.svg +1 -0
  34. package/templates/default/public/globe.svg +1 -0
  35. package/templates/default/public/next.svg +1 -0
  36. package/templates/default/public/vercel.svg +1 -0
  37. package/templates/default/public/window.svg +1 -0
  38. package/templates/default/scripts/regenerate-features.ts +94 -0
  39. package/templates/default/scripts/setup-env.ts +19 -0
  40. package/templates/default/scripts/sync-all.ts +341 -0
  41. package/templates/default/scripts/sync-environments.ts +323 -0
  42. package/templates/default/scripts/sync-locator-groups.ts +413 -0
  43. package/templates/default/scripts/sync-locators.ts +402 -0
  44. package/templates/default/scripts/sync-modules.ts +349 -0
  45. package/templates/default/scripts/sync-tags.ts +292 -0
  46. package/templates/default/scripts/sync-template-step-groups.ts +399 -0
  47. package/templates/default/scripts/sync-template-steps.ts +806 -0
  48. package/templates/default/scripts/sync-test-cases.ts +905 -0
  49. package/templates/default/scripts/sync-test-suites.ts +411 -0
  50. package/templates/default/src/actions/conflict/conflict.action.ts +33 -0
  51. package/templates/default/src/actions/dashboard/dashboard-actions.ts +241 -0
  52. package/templates/default/src/actions/environments/environment-actions.ts +205 -0
  53. package/templates/default/src/actions/locator/locator-actions.ts +547 -0
  54. package/templates/default/src/actions/locator-groups/locator-group-actions.ts +344 -0
  55. package/templates/default/src/actions/modules/module-actions.ts +133 -0
  56. package/templates/default/src/actions/reports/report-actions.ts +614 -0
  57. package/templates/default/src/actions/review/review-actions.ts +147 -0
  58. package/templates/default/src/actions/tags/tag-actions.ts +104 -0
  59. package/templates/default/src/actions/template-step/template-step-actions.ts +332 -0
  60. package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +278 -0
  61. package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +238 -0
  62. package/templates/default/src/actions/test-case/test-case-actions.ts +419 -0
  63. package/templates/default/src/actions/test-run/test-run-actions.ts +1185 -0
  64. package/templates/default/src/actions/test-suite/test-suite-actions.ts +253 -0
  65. package/templates/default/src/actions/user/user-actions.ts +13 -0
  66. package/templates/default/src/app/(base)/environments/create/page.tsx +28 -0
  67. package/templates/default/src/app/(base)/environments/environment-form.tsx +219 -0
  68. package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -0
  69. package/templates/default/src/app/(base)/environments/environment-table.tsx +24 -0
  70. package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +46 -0
  71. package/templates/default/src/app/(base)/environments/page.tsx +59 -0
  72. package/templates/default/src/app/(base)/layout.tsx +10 -0
  73. package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -0
  74. package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -0
  75. package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -0
  76. package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -0
  77. package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -0
  78. package/templates/default/src/app/(base)/locator-groups/page.tsx +61 -0
  79. package/templates/default/src/app/(base)/locators/create/page.tsx +38 -0
  80. package/templates/default/src/app/(base)/locators/locator-form.tsx +163 -0
  81. package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +90 -0
  82. package/templates/default/src/app/(base)/locators/locator-table.tsx +28 -0
  83. package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +45 -0
  84. package/templates/default/src/app/(base)/locators/page.tsx +65 -0
  85. package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +66 -0
  86. package/templates/default/src/app/(base)/modules/create/page.tsx +34 -0
  87. package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +46 -0
  88. package/templates/default/src/app/(base)/modules/module-form.tsx +126 -0
  89. package/templates/default/src/app/(base)/modules/module-table-columns.tsx +85 -0
  90. package/templates/default/src/app/(base)/modules/module-table.tsx +24 -0
  91. package/templates/default/src/app/(base)/modules/page.tsx +59 -0
  92. package/templates/default/src/app/(base)/reports/[id]/page.tsx +517 -0
  93. package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -0
  94. package/templates/default/src/app/(base)/reports/feature-chart.tsx +78 -0
  95. package/templates/default/src/app/(base)/reports/overview-chart.tsx +46 -0
  96. package/templates/default/src/app/(base)/reports/page.tsx +98 -0
  97. package/templates/default/src/app/(base)/reports/report-metric-card.tsx +16 -0
  98. package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -0
  99. package/templates/default/src/app/(base)/reports/report-table.tsx +72 -0
  100. package/templates/default/src/app/(base)/reports/report-view-table-columns.tsx +131 -0
  101. package/templates/default/src/app/(base)/reports/report-view-table.tsx +82 -0
  102. package/templates/default/src/app/(base)/reports/test-cases/page.tsx +42 -0
  103. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -0
  104. package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -0
  105. package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -0
  106. package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -0
  107. package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -0
  108. package/templates/default/src/app/(base)/reports/view-logs-button.tsx +60 -0
  109. package/templates/default/src/app/(base)/reviews/create/page.tsx +26 -0
  110. package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +15 -0
  111. package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +26 -0
  112. package/templates/default/src/app/(base)/reviews/page.tsx +26 -0
  113. package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +26 -0
  114. package/templates/default/src/app/(base)/reviews/review-form.tsx +11 -0
  115. package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +9 -0
  116. package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +9 -0
  117. package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +15 -0
  118. package/templates/default/src/app/(base)/tags/create/page.tsx +39 -0
  119. package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -0
  120. package/templates/default/src/app/(base)/tags/page.tsx +58 -0
  121. package/templates/default/src/app/(base)/tags/tag-form.tsx +147 -0
  122. package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -0
  123. package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -0
  124. package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -0
  125. package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +45 -0
  126. package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -0
  127. package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +167 -0
  128. package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -0
  129. package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +32 -0
  130. package/templates/default/src/app/(base)/template-steps/create/page.tsx +37 -0
  131. package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +49 -0
  132. package/templates/default/src/app/(base)/template-steps/page.tsx +59 -0
  133. package/templates/default/src/app/(base)/template-steps/paramChip.tsx +213 -0
  134. package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +384 -0
  135. package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +158 -0
  136. package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +24 -0
  137. package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -0
  138. package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -0
  139. package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -0
  140. package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +84 -0
  141. package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +262 -0
  142. package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -0
  143. package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -0
  144. package/templates/default/src/app/(base)/test-cases/create/page.tsx +76 -0
  145. package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +96 -0
  146. package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +38 -0
  147. package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +73 -0
  148. package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -0
  149. package/templates/default/src/app/(base)/test-cases/page.tsx +60 -0
  150. package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +82 -0
  151. package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +395 -0
  152. package/templates/default/src/app/(base)/test-cases/test-case-table-columns.tsx +90 -0
  153. package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +35 -0
  154. package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +56 -0
  155. package/templates/default/src/app/(base)/test-runs/create/page.tsx +47 -0
  156. package/templates/default/src/app/(base)/test-runs/page.tsx +60 -0
  157. package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +512 -0
  158. package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -0
  159. package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -0
  160. package/templates/default/src/app/(base)/test-suites/create/page.tsx +45 -0
  161. package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +55 -0
  162. package/templates/default/src/app/(base)/test-suites/page.tsx +82 -0
  163. package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +269 -0
  164. package/templates/default/src/app/(base)/test-suites/test-suite-table-columns.tsx +97 -0
  165. package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +29 -0
  166. package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -0
  167. package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +13 -0
  168. package/templates/default/src/app/(dashboard-components)/data-card.tsx +27 -0
  169. package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +57 -0
  170. package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -0
  171. package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +45 -0
  172. package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +133 -0
  173. package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +420 -0
  174. package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -0
  175. package/templates/default/src/app/favicon.ico +0 -0
  176. package/templates/default/src/app/globals.css +147 -0
  177. package/templates/default/src/app/layout.tsx +171 -0
  178. package/templates/default/src/app/page.tsx +64 -0
  179. package/templates/default/src/assets/icons/empty-tube.tsx +23 -0
  180. package/templates/default/src/assets/icons/tube-plus.tsx +29 -0
  181. package/templates/default/src/components/base-node.tsx +21 -0
  182. package/templates/default/src/components/chart/pie-chart.tsx +73 -0
  183. package/templates/default/src/components/data-extraction/locator-inspector.tsx +460 -0
  184. package/templates/default/src/components/data-state/empty-state.tsx +40 -0
  185. package/templates/default/src/components/data-visualization/info-card.tsx +70 -0
  186. package/templates/default/src/components/data-visualization/info-grid.tsx +22 -0
  187. package/templates/default/src/components/devtools/providers.tsx +13 -0
  188. package/templates/default/src/components/diagram/button-edge.tsx +54 -0
  189. package/templates/default/src/components/diagram/dynamic-parameters.tsx +438 -0
  190. package/templates/default/src/components/diagram/edit-header-option.tsx +36 -0
  191. package/templates/default/src/components/diagram/flow-diagram.tsx +470 -0
  192. package/templates/default/src/components/diagram/node-form.tsx +262 -0
  193. package/templates/default/src/components/diagram/options-header-node.tsx +57 -0
  194. package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -0
  195. package/templates/default/src/components/form/error-message.tsx +7 -0
  196. package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -0
  197. package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -0
  198. package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -0
  199. package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -0
  200. package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -0
  201. package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -0
  202. package/templates/default/src/components/logo.tsx +15 -0
  203. package/templates/default/src/components/navigation/command-badge.tsx +34 -0
  204. package/templates/default/src/components/navigation/command-chain-input.tsx +51 -0
  205. package/templates/default/src/components/navigation/entity-search-command.tsx +116 -0
  206. package/templates/default/src/components/navigation/nav-card.tsx +31 -0
  207. package/templates/default/src/components/navigation/nav-command.tsx +508 -0
  208. package/templates/default/src/components/navigation/nav-link.tsx +60 -0
  209. package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -0
  210. package/templates/default/src/components/node-header.tsx +159 -0
  211. package/templates/default/src/components/reports/test-case-logs-modal.tsx +253 -0
  212. package/templates/default/src/components/table/table-actions.tsx +172 -0
  213. package/templates/default/src/components/test-run/download-logs-button.tsx +99 -0
  214. package/templates/default/src/components/test-run/log-viewer.tsx +445 -0
  215. package/templates/default/src/components/test-run/test-run-details.tsx +611 -0
  216. package/templates/default/src/components/test-run/test-run-header.tsx +149 -0
  217. package/templates/default/src/components/test-run/view-report-button.tsx +102 -0
  218. package/templates/default/src/components/theme/mode-toggle.tsx +54 -0
  219. package/templates/default/src/components/theme/theme-provider.tsx +8 -0
  220. package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -0
  221. package/templates/default/src/components/typography/page-header.tsx +7 -0
  222. package/templates/default/src/components/ui/alert-dialog.tsx +106 -0
  223. package/templates/default/src/components/ui/alert.tsx +43 -0
  224. package/templates/default/src/components/ui/avatar.tsx +40 -0
  225. package/templates/default/src/components/ui/badge.tsx +29 -0
  226. package/templates/default/src/components/ui/button.tsx +47 -0
  227. package/templates/default/src/components/ui/calendar.tsx +158 -0
  228. package/templates/default/src/components/ui/card.tsx +43 -0
  229. package/templates/default/src/components/ui/chart.tsx +369 -0
  230. package/templates/default/src/components/ui/checkbox.tsx +28 -0
  231. package/templates/default/src/components/ui/command.tsx +135 -0
  232. package/templates/default/src/components/ui/data-table-column-header.tsx +61 -0
  233. package/templates/default/src/components/ui/data-table-pagination.tsx +87 -0
  234. package/templates/default/src/components/ui/data-table-view-options.tsx +50 -0
  235. package/templates/default/src/components/ui/data-table.tsx +267 -0
  236. package/templates/default/src/components/ui/dialog.tsx +97 -0
  237. package/templates/default/src/components/ui/dropdown-menu.tsx +182 -0
  238. package/templates/default/src/components/ui/empty.tsx +104 -0
  239. package/templates/default/src/components/ui/input.tsx +22 -0
  240. package/templates/default/src/components/ui/kbd.tsx +28 -0
  241. package/templates/default/src/components/ui/label.tsx +19 -0
  242. package/templates/default/src/components/ui/loading.tsx +12 -0
  243. package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -0
  244. package/templates/default/src/components/ui/multi-select.tsx +142 -0
  245. package/templates/default/src/components/ui/navigation-menu.tsx +120 -0
  246. package/templates/default/src/components/ui/popover.tsx +33 -0
  247. package/templates/default/src/components/ui/progress.tsx +25 -0
  248. package/templates/default/src/components/ui/radio-group.tsx +44 -0
  249. package/templates/default/src/components/ui/scroll-area.tsx +40 -0
  250. package/templates/default/src/components/ui/select.tsx +144 -0
  251. package/templates/default/src/components/ui/separator.tsx +22 -0
  252. package/templates/default/src/components/ui/skeleton.tsx +7 -0
  253. package/templates/default/src/components/ui/table.tsx +76 -0
  254. package/templates/default/src/components/ui/tabs.tsx +55 -0
  255. package/templates/default/src/components/ui/textarea.tsx +21 -0
  256. package/templates/default/src/components/ui/toast.tsx +113 -0
  257. package/templates/default/src/components/ui/toaster.tsx +26 -0
  258. package/templates/default/src/components/ui/tooltip.tsx +32 -0
  259. package/templates/default/src/components/user-prompt/delete-prompt.tsx +87 -0
  260. package/templates/default/src/config/db-config.ts +10 -0
  261. package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -0
  262. package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -0
  263. package/templates/default/src/constants/form-opts/locator-form-opts.ts +20 -0
  264. package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -0
  265. package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -0
  266. package/templates/default/src/constants/form-opts/review-form-opts.ts +23 -0
  267. package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -0
  268. package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -0
  269. package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -0
  270. package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -0
  271. package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -0
  272. package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -0
  273. package/templates/default/src/constants/form-opts/test-run-form-opts.ts +31 -0
  274. package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -0
  275. package/templates/default/src/hooks/use-toast.ts +187 -0
  276. package/templates/default/src/lib/bidirectional-sync.ts +432 -0
  277. package/templates/default/src/lib/database-sync.ts +531 -0
  278. package/templates/default/src/lib/environment-file-utils.ts +221 -0
  279. package/templates/default/src/lib/feature-file-generator.ts +411 -0
  280. package/templates/default/src/lib/gherkin-parser.ts +259 -0
  281. package/templates/default/src/lib/locator-group-file-utils.ts +370 -0
  282. package/templates/default/src/lib/metrics/metric-calculator.ts +613 -0
  283. package/templates/default/src/lib/module-hierarchy-builder.ts +205 -0
  284. package/templates/default/src/lib/path-helpers/module-path.ts +71 -0
  285. package/templates/default/src/lib/test-case-utils.ts +6 -0
  286. package/templates/default/src/lib/test-run/log-formatter.ts +83 -0
  287. package/templates/default/src/lib/test-run/process-manager.ts +191 -0
  288. package/templates/default/src/lib/test-run/report-parser.ts +316 -0
  289. package/templates/default/src/lib/test-run/test-run-executor.ts +144 -0
  290. package/templates/default/src/lib/test-run/winston-logger.ts +95 -0
  291. package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -0
  292. package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -0
  293. package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -0
  294. package/templates/default/src/lib/utils/node-param-validation.ts +81 -0
  295. package/templates/default/src/lib/utils/template-step-file-generator.ts +167 -0
  296. package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +723 -0
  297. package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -0
  298. package/templates/default/src/lib/utils.ts +31 -0
  299. package/templates/default/src/tests/config/environments/environments.json +14 -0
  300. package/templates/default/src/tests/config/executor/world.ts +41 -0
  301. package/templates/default/src/tests/executor.ts +80 -0
  302. package/templates/default/src/tests/hooks/hooks.ts +99 -0
  303. package/templates/default/src/tests/mapping/locator-map.json +1 -0
  304. package/templates/default/src/tests/steps/actions/click.step.ts +62 -0
  305. package/templates/default/src/tests/steps/actions/hover.step.ts +31 -0
  306. package/templates/default/src/tests/steps/actions/input.step.ts +149 -0
  307. package/templates/default/src/tests/steps/actions/navigation.step.ts +72 -0
  308. package/templates/default/src/tests/steps/actions/random_data.step.ts +146 -0
  309. package/templates/default/src/tests/steps/actions/store.step.ts +90 -0
  310. package/templates/default/src/tests/steps/actions/wait.step.ts +107 -0
  311. package/templates/default/src/tests/steps/validations/active_state_assertion.step.ts +34 -0
  312. package/templates/default/src/tests/steps/validations/navigation_assertion.step.ts +23 -0
  313. package/templates/default/src/tests/steps/validations/text_assertion.step.ts +111 -0
  314. package/templates/default/src/tests/steps/validations/visibility_assertion.step.ts +30 -0
  315. package/templates/default/src/tests/support/parameter-types.ts +12 -0
  316. package/templates/default/src/tests/utils/cache.util.ts +260 -0
  317. package/templates/default/src/tests/utils/cli.util.ts +177 -0
  318. package/templates/default/src/tests/utils/environment.util.ts +65 -0
  319. package/templates/default/src/tests/utils/locator.util.ts +248 -0
  320. package/templates/default/src/tests/utils/random-data.util.ts +45 -0
  321. package/templates/default/src/tests/utils/spawner.util.ts +617 -0
  322. package/templates/default/src/types/diagram/diagram.ts +34 -0
  323. package/templates/default/src/types/diagram/template-step.ts +11 -0
  324. package/templates/default/src/types/executor/browser.type.ts +1 -0
  325. package/templates/default/src/types/form/actionHandler.ts +6 -0
  326. package/templates/default/src/types/locator/locator.type.ts +11 -0
  327. package/templates/default/src/types/step/step.type.ts +1 -0
  328. package/templates/default/src/types/table/data-table.ts +6 -0
  329. package/templates/default/tailwind.config.ts +62 -0
  330. package/templates/default/tsconfig.json +28 -0
@@ -0,0 +1,160 @@
1
+ import {
2
+ TemplateTestCase,
3
+ TemplateTestCaseStep,
4
+ TemplateTestCaseStepParameter,
5
+ TemplateStepIcon,
6
+ StepParameterType,
7
+ } from '@prisma/client'
8
+ import { NodeOrderMap } from '@/types/diagram/diagram'
9
+
10
+ export interface ConvertedTestCaseData {
11
+ title: string
12
+ description: string
13
+ testSuiteIds: string[]
14
+ nodesOrder: NodeOrderMap
15
+ }
16
+
17
+ export interface TestCaseFormData {
18
+ title: string
19
+ description: string
20
+ testSuiteIds: string[]
21
+ steps: {
22
+ gherkinStep: string
23
+ label: string
24
+ icon: TemplateStepIcon
25
+ parameters: {
26
+ name: string
27
+ value: string
28
+ type: StepParameterType
29
+ order: number
30
+ }[]
31
+ order: number
32
+ templateStepId: string
33
+ }[]
34
+ }
35
+
36
+ /**
37
+ * Converts a template test case to the format expected by the test case form component
38
+ * @param templateTestCase - The template test case with steps and parameters
39
+ * @returns Converted data in the format expected by TestCaseForm
40
+ */
41
+ export const templateTestCaseToTestCaseConverter = (
42
+ templateTestCase: TemplateTestCase & {
43
+ steps: (TemplateTestCaseStep & {
44
+ parameters: TemplateTestCaseStepParameter[]
45
+ })[]
46
+ },
47
+ ): ConvertedTestCaseData => {
48
+ // Convert template test case to test case format
49
+ const title = templateTestCase.name
50
+ const description = templateTestCase.description || ''
51
+ const testSuiteIds: string[] = [] // Will be populated by user selection
52
+
53
+ // Convert steps to NodeOrderMap format
54
+ const nodesOrder: NodeOrderMap = {}
55
+
56
+ templateTestCase.steps.forEach((step, index) => {
57
+ const nodeId = `node-${index}`
58
+
59
+ // Convert parameters from template format to test case format
60
+ const parameters = step.parameters.map(param => ({
61
+ name: param.name,
62
+ value: param.defaultValue, // Convert defaultValue to value
63
+ type: param.type,
64
+ order: param.order,
65
+ }))
66
+
67
+ nodesOrder[nodeId] = {
68
+ order: step.order,
69
+ label: step.label,
70
+ gherkinStep: step.gherkinStep,
71
+ icon: step.icon as TemplateStepIcon,
72
+ parameters,
73
+ templateStepId: step.templateStepId,
74
+ }
75
+ })
76
+
77
+ return {
78
+ title,
79
+ description,
80
+ testSuiteIds,
81
+ nodesOrder,
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Converts NodeOrderMap to the format expected by TestCaseForm and createTestCaseAction
87
+ * @param nodesOrder - The NodeOrderMap from the converter
88
+ * @returns Data in the format expected by the test case form
89
+ */
90
+ export const convertNodeOrderMapToTestCaseFormData = (nodesOrder: NodeOrderMap): TestCaseFormData['steps'] => {
91
+ return Object.entries(nodesOrder)
92
+ .map(([, nodeData]) => ({
93
+ gherkinStep: nodeData.gherkinStep || '',
94
+ label: nodeData.label,
95
+ icon: nodeData.icon as TemplateStepIcon,
96
+ parameters: nodeData.parameters,
97
+ order: nodeData.order,
98
+ templateStepId: nodeData.templateStepId,
99
+ }))
100
+ .sort((a, b) => a.order - b.order)
101
+ }
102
+
103
+ /**
104
+ * Converts a template test case directly to the format expected by createTestCaseAction
105
+ * @param templateTestCase - The template test case with steps and parameters
106
+ * @param testSuiteIds - Optional test suite IDs to assign
107
+ * @returns Data ready for test case creation
108
+ */
109
+ export const templateTestCaseToTestCaseFormData = (
110
+ templateTestCase: TemplateTestCase & {
111
+ steps: (TemplateTestCaseStep & {
112
+ parameters: TemplateTestCaseStepParameter[]
113
+ })[]
114
+ },
115
+ testSuiteIds: string[] = [],
116
+ ): TestCaseFormData => {
117
+ const convertedData = templateTestCaseToTestCaseConverter(templateTestCase)
118
+
119
+ return {
120
+ title: convertedData.title,
121
+ description: convertedData.description,
122
+ testSuiteIds: testSuiteIds.length > 0 ? testSuiteIds : convertedData.testSuiteIds,
123
+ steps: convertNodeOrderMapToTestCaseFormData(convertedData.nodesOrder),
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Validates if the converted data is ready for test case creation
129
+ * @param convertedData - The converted test case data
130
+ * @returns Validation result with any errors
131
+ */
132
+ export const validateConvertedTestCaseData = (
133
+ convertedData: ConvertedTestCaseData,
134
+ ): { isValid: boolean; errors: string[] } => {
135
+ const errors: string[] = []
136
+
137
+ if (!convertedData.title || convertedData.title.trim().length < 3) {
138
+ errors.push('Title must be at least 3 characters long')
139
+ }
140
+
141
+ if (Object.keys(convertedData.nodesOrder).length === 0) {
142
+ errors.push('At least one step is required')
143
+ }
144
+
145
+ // Validate each step
146
+ Object.entries(convertedData.nodesOrder).forEach(([nodeId, nodeData]) => {
147
+ if (!nodeData.label || nodeData.label.trim().length === 0) {
148
+ errors.push(`Step ${nodeId}: Label is required`)
149
+ }
150
+
151
+ if (!nodeData.templateStepId) {
152
+ errors.push(`Step ${nodeId}: Template step ID is required`)
153
+ }
154
+ })
155
+
156
+ return {
157
+ isValid: errors.length === 0,
158
+ errors,
159
+ }
160
+ }
@@ -0,0 +1,81 @@
1
+ import { StepParameterType, TemplateStepParameter } from '@prisma/client'
2
+
3
+ /**
4
+ * Type for node data with parameters needed for validation
5
+ */
6
+ type NodeDataForValidation = {
7
+ templateStepId: string
8
+ parameters: {
9
+ name: string
10
+ value: string
11
+ type: StepParameterType
12
+ order: number
13
+ }[]
14
+ }
15
+
16
+ /**
17
+ * Checks if a node has missing mandatory parameters
18
+ * @param nodeData - The node data to validate (must have templateStepId and parameters)
19
+ * @param templateStepParams - All available template step parameters
20
+ * @param defaultValueInput - If true, all parameters are optional (skip validation)
21
+ * @returns true if any mandatory parameter is missing, false otherwise
22
+ */
23
+ export function checkMissingMandatoryParams(
24
+ nodeData: NodeDataForValidation,
25
+ templateStepParams: TemplateStepParameter[],
26
+ defaultValueInput: boolean,
27
+ ): boolean {
28
+ // Skip all validation if defaultValueInput is true (all fields are optional)
29
+ if (defaultValueInput) {
30
+ return false
31
+ }
32
+
33
+ // Get all template step parameters for this node's templateStepId
34
+ const nodeParams = templateStepParams.filter(param => param.templateStepId === nodeData.templateStepId)
35
+
36
+ // Create a map of node parameters by name for quick lookup
37
+ const nodeParamMap = new Map(nodeData.parameters.map(param => [param.name, param.value]))
38
+
39
+ // Check each required parameter
40
+ for (const param of nodeParams) {
41
+ const value = nodeParamMap.get(param.name)
42
+
43
+ // LOCATOR: Check if value is empty (we can't check locator group selection from node data)
44
+ if (param.type === 'LOCATOR') {
45
+ if (!value || value.trim() === '') {
46
+ return true
47
+ }
48
+ }
49
+
50
+ // STRING: Check if value is empty
51
+ if (param.type === 'STRING') {
52
+ if (!value || value.trim() === '') {
53
+ return true
54
+ }
55
+ }
56
+
57
+ // NUMBER: Check if value is empty
58
+ if (param.type === 'NUMBER') {
59
+ if (!value || value.trim() === '') {
60
+ return true
61
+ }
62
+ }
63
+
64
+ // DATE: Check if value is empty or invalid
65
+ if (param.type === 'DATE') {
66
+ if (!value || value.trim() === '') {
67
+ return true
68
+ }
69
+ // Try to parse the date to check if it's valid
70
+ const date = new Date(value)
71
+ if (isNaN(date.getTime())) {
72
+ return true
73
+ }
74
+ }
75
+
76
+ // BOOLEAN: Always has a value (true/false), so skip validation
77
+ // No validation needed for BOOLEAN type
78
+ }
79
+
80
+ return false
81
+ }
@@ -0,0 +1,167 @@
1
+ import { promises as fs } from 'fs'
2
+ import { join } from 'path'
3
+ import prettier from 'prettier'
4
+ import { TemplateStep, TemplateStepGroupType } from '@prisma/client'
5
+
6
+ /**
7
+ * Sanitizes a template step group name for file naming
8
+ * Converts to kebab-case (lowercase with underscores for spaces)
9
+ */
10
+ export function sanitizeFileName(groupName: string): string {
11
+ return groupName
12
+ .toLowerCase()
13
+ .trim()
14
+ .replace(/\s+/g, '_') // Replace spaces with underscores
15
+ .replace(/[^a-z0-9_]/g, '') // Remove special characters except underscores
16
+ }
17
+
18
+ /**
19
+ * Generates the content for a template step group file
20
+ * Concatenates all function definitions from template steps in the group
21
+ */
22
+ export function generateFileContent(templateSteps: TemplateStep[]): string {
23
+ // Required imports for all template step group files
24
+ const requiredImports = `import { When } from '@cucumber/cucumber';
25
+ import { CustomWorld } from '../../config/executor/world.js';
26
+ import { SelectorName } from '@/types/locator/locator.type';
27
+ import { resolveLocator } from '../../utils/locator.util';
28
+
29
+ `
30
+
31
+ if (!templateSteps || templateSteps.length === 0) {
32
+ return (
33
+ requiredImports + '// This file is generated automatically. Add template steps to this group to generate content.'
34
+ )
35
+ }
36
+
37
+ // Extract and concatenate function definitions
38
+ const functionDefinitions = templateSteps
39
+ .map(step => step.functionDefinition)
40
+ .filter(Boolean) // Remove undefined/null values
41
+ .join('\n\n')
42
+
43
+ return requiredImports + functionDefinitions
44
+ }
45
+
46
+ /**
47
+ * Formats the file content using Prettier
48
+ */
49
+ export async function formatFileContent(content: string): Promise<string> {
50
+ try {
51
+ const formattedContent = await prettier.format(content, {
52
+ parser: 'typescript',
53
+ semi: true,
54
+ singleQuote: true,
55
+ trailingComma: 'es5',
56
+ printWidth: 80,
57
+ tabWidth: 2,
58
+ })
59
+ return formattedContent
60
+ } catch (error) {
61
+ console.error('Prettier formatting failed:', error)
62
+ // Return original content if formatting fails
63
+ return content
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Gets the subdirectory name for a given template step group type
69
+ */
70
+ export function getSubdirectoryName(type: TemplateStepGroupType | string): string {
71
+ const typeStr = String(type)
72
+ return typeStr === 'ACTION' ? 'actions' : 'validations'
73
+ }
74
+
75
+ /**
76
+ * Ensures the steps directory and subdirectories exist, creates them if they don't
77
+ */
78
+ export async function ensureStepsDirectory(): Promise<string> {
79
+ const stepsDir = join(process.cwd(), 'src', 'tests', 'steps')
80
+
81
+ try {
82
+ await fs.access(stepsDir)
83
+ } catch {
84
+ // Directory doesn't exist, create it
85
+ await fs.mkdir(stepsDir, { recursive: true })
86
+ }
87
+
88
+ // Ensure both subdirectories exist
89
+ const actionsDir = join(stepsDir, 'actions')
90
+ const validationsDir = join(stepsDir, 'validations')
91
+
92
+ try {
93
+ await fs.access(actionsDir)
94
+ } catch {
95
+ await fs.mkdir(actionsDir, { recursive: true })
96
+ }
97
+
98
+ try {
99
+ await fs.access(validationsDir)
100
+ } catch {
101
+ await fs.mkdir(validationsDir, { recursive: true })
102
+ }
103
+
104
+ return stepsDir
105
+ }
106
+
107
+ /**
108
+ * Generates the full file path for a template step group
109
+ */
110
+ export function getFilePath(groupName: string, type: TemplateStepGroupType | string): string {
111
+ const sanitizedName = sanitizeFileName(groupName)
112
+ const subdirectory = getSubdirectoryName(type)
113
+ return join(process.cwd(), 'src', 'tests', 'steps', subdirectory, `${sanitizedName}.step.ts`)
114
+ }
115
+
116
+ /**
117
+ * Writes content to a template step group file
118
+ */
119
+ export async function writeTemplateStepFile(
120
+ groupName: string,
121
+ content: string,
122
+ type: TemplateStepGroupType | string,
123
+ ): Promise<void> {
124
+ try {
125
+ // Ensure directory exists
126
+ await ensureStepsDirectory()
127
+
128
+ // Format content with Prettier
129
+ const formattedContent = await formatFileContent(content)
130
+
131
+ // Get file path
132
+ const filePath = getFilePath(groupName, type)
133
+
134
+ // Write file
135
+ await fs.writeFile(filePath, formattedContent, 'utf8')
136
+
137
+ console.log(`Template step file generated: ${filePath}`)
138
+ } catch (error) {
139
+ console.error(`Failed to write template step file for group "${groupName}":`, error)
140
+ throw new Error(`File generation failed: ${error}`)
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Deletes a template step group file
146
+ */
147
+ export async function deleteTemplateStepFile(groupName: string, type: TemplateStepGroupType | string): Promise<void> {
148
+ try {
149
+ const filePath = getFilePath(groupName, type)
150
+
151
+ // Check if file exists before trying to delete
152
+ try {
153
+ await fs.access(filePath)
154
+ } catch {
155
+ // File doesn't exist, nothing to delete
156
+ return
157
+ }
158
+
159
+ // Delete file
160
+ await fs.unlink(filePath)
161
+
162
+ console.log(`Template step file deleted: ${filePath}`)
163
+ } catch (error) {
164
+ console.error(`Failed to delete template step file for group "${groupName}":`, error)
165
+ throw new Error(`File deletion failed: ${error}`)
166
+ }
167
+ }