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,554 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "sqlite"
7
+ url = env("DATABASE_URL")
8
+ }
9
+
10
+ model TestSuite {
11
+ id String @id @default(uuid())
12
+ name String
13
+ description String?
14
+ createdAt DateTime @default(now())
15
+ updatedAt DateTime @updatedAt
16
+ moduleId String
17
+ module Module @relation(fields: [moduleId], references: [id], onDelete: Cascade)
18
+ testCases TestCase[] @relation("TestSuiteTestCases")
19
+ tags Tag[]
20
+ metrics TestSuiteMetrics?
21
+ }
22
+
23
+ model Review {
24
+ id String @id @default(uuid())
25
+ testCaseId String
26
+ reviewerId String
27
+ status ReviewStatus
28
+ comments String?
29
+ createdAt DateTime @default(now())
30
+ updatedAt DateTime @updatedAt
31
+ testCase TestCase @relation(fields: [testCaseId], references: [id])
32
+ }
33
+
34
+ model LinkedJiraTicket {
35
+ id String @id @default(uuid())
36
+ testCaseId String
37
+ jiraTicketId String
38
+ jiraTicketUrl String
39
+ jiraStatus String?
40
+ createdAt DateTime @default(now())
41
+ updatedAt DateTime @updatedAt
42
+ testCase TestCase @relation(fields: [testCaseId], references: [id])
43
+ }
44
+
45
+ model TemplateStep {
46
+ id String @id @default(uuid())
47
+ name String
48
+ description String?
49
+ createdAt DateTime @default(now())
50
+ updatedAt DateTime @updatedAt
51
+ signature String
52
+ functionDefinition String?
53
+ type TemplateStepType
54
+ icon TemplateStepIcon
55
+ templateStepGroupId String
56
+ templateStepGroup TemplateStepGroup @relation("TemplateStepGroupSteps", fields: [templateStepGroupId], references: [id], onDelete: Cascade)
57
+ parameters TemplateStepParameter[]
58
+ TemplateTestCaseStep TemplateTestCaseStep[]
59
+ TestCaseStep TestCaseStep[]
60
+ }
61
+
62
+ model TemplateStepParameter {
63
+ id String @id @default(uuid())
64
+ name String
65
+ createdAt DateTime @default(now())
66
+ updatedAt DateTime @updatedAt
67
+ templateStepId String
68
+ order Int
69
+ type StepParameterType
70
+ templateStep TemplateStep @relation(fields: [templateStepId], references: [id], onDelete: Cascade)
71
+ }
72
+
73
+ model TemplateStepGroup {
74
+ id String @id @default(uuid())
75
+ name String
76
+ description String?
77
+ type TemplateStepGroupType @default(ACTION)
78
+ createdAt DateTime @default(now())
79
+ updatedAt DateTime @updatedAt
80
+ templateSteps TemplateStep[] @relation("TemplateStepGroupSteps")
81
+ }
82
+
83
+ model TestCase {
84
+ id String @id @default(uuid())
85
+ title String
86
+ description String
87
+ createdAt DateTime @default(now())
88
+ updatedAt DateTime @updatedAt
89
+ linkedJiraTickets LinkedJiraTicket[]
90
+ reviews Review[]
91
+ steps TestCaseStep[]
92
+ TestSuite TestSuite[] @relation("TestSuiteTestCases")
93
+ TestRunTestCase TestRunTestCase[]
94
+ tags Tag[]
95
+ metrics TestCaseMetrics?
96
+ }
97
+
98
+ model TestCaseStep {
99
+ id String @id @default(uuid())
100
+ testCaseId String
101
+ order Int
102
+ gherkinStep String
103
+ icon TemplateStepIcon
104
+ label String
105
+ templateStepId String
106
+ TemplateStep TemplateStep @relation(fields: [templateStepId], references: [id], onDelete: Cascade)
107
+ testCase TestCase @relation(fields: [testCaseId], references: [id])
108
+ parameters TestCaseStepParameter[]
109
+ }
110
+
111
+ model TemplateTestCase {
112
+ id String @id @default(uuid())
113
+ name String
114
+ description String?
115
+ createdAt DateTime @default(now())
116
+ updatedAt DateTime @updatedAt
117
+ steps TemplateTestCaseStep[]
118
+ }
119
+
120
+ model TemplateTestCaseStep {
121
+ id String @id @default(uuid())
122
+ order Int
123
+ gherkinStep String
124
+ icon TemplateStepIcon
125
+ label String
126
+ templateTestCaseId String
127
+ templateStepId String
128
+ TemplateStep TemplateStep @relation(fields: [templateStepId], references: [id], onDelete: Cascade)
129
+ templateTestCase TemplateTestCase @relation(fields: [templateTestCaseId], references: [id])
130
+ parameters TemplateTestCaseStepParameter[]
131
+ }
132
+
133
+ model TemplateTestCaseStepParameter {
134
+ id String @id @default(uuid())
135
+ name String
136
+ defaultValue String
137
+ order Int
138
+ testCaseStepId String
139
+ locatorId String?
140
+ type StepParameterType
141
+ defaultLocatorId String?
142
+ defaultLocator Locator? @relation(fields: [defaultLocatorId], references: [id])
143
+ templateTestCaseStep TemplateTestCaseStep @relation(fields: [testCaseStepId], references: [id], onDelete: Cascade)
144
+ }
145
+
146
+ model TestCaseStepParameter {
147
+ id String @id @default(uuid())
148
+ name String
149
+ value String
150
+ order Int
151
+ testCaseStepId String
152
+ locatorId String?
153
+ type StepParameterType
154
+ Locator Locator? @relation(fields: [locatorId], references: [id])
155
+ testCaseStep TestCaseStep @relation(fields: [testCaseStepId], references: [id], onDelete: Cascade)
156
+ }
157
+
158
+ model Locator {
159
+ id String @id @default(uuid())
160
+ name String
161
+ value String
162
+ createdAt DateTime @default(now())
163
+ updatedAt DateTime @updatedAt
164
+ locatorGroupId String?
165
+ locatorGroup LocatorGroup? @relation(fields: [locatorGroupId], references: [id], onDelete: Cascade)
166
+ TemplateTestCaseStepParameter TemplateTestCaseStepParameter[]
167
+ stepParameters TestCaseStepParameter[]
168
+ conflicts ConflictResolution[]
169
+ }
170
+
171
+ model LocatorGroup {
172
+ id String @id @default(uuid())
173
+ name String @unique
174
+ route String @default("/")
175
+ createdAt DateTime @default(now())
176
+ updatedAt DateTime @updatedAt
177
+ moduleId String
178
+ locators Locator[]
179
+ module Module @relation(fields: [moduleId], references: [id], onDelete: Cascade)
180
+ }
181
+
182
+ model Module {
183
+ id String @id @default(uuid())
184
+ name String
185
+ parentId String?
186
+ createdAt DateTime @default(now())
187
+ updatedAt DateTime @updatedAt
188
+ locatorGroups LocatorGroup[]
189
+ parent Module? @relation("ModuleHierarchy", fields: [parentId], references: [id], onDelete: Cascade)
190
+ children Module[] @relation("ModuleHierarchy")
191
+ testSuites TestSuite[]
192
+ }
193
+
194
+ model TestRunTestCase {
195
+ id String @id @default(uuid())
196
+ testRunId String
197
+ testCaseId String
198
+ status TestRunTestCaseStatus @default(PENDING)
199
+ result TestRunTestCaseResult @default(UNTESTED)
200
+ tracePath String?
201
+ testRun TestRun @relation(fields: [testRunId], references: [id], onDelete: Cascade)
202
+ testCase TestCase @relation(fields: [testCaseId], references: [id], onDelete: Cascade)
203
+ reportTestCases ReportTestCase[]
204
+ }
205
+
206
+ model TestRun {
207
+ id String @id @default(uuid())
208
+ name String @unique
209
+ runId String @unique @default(uuid())
210
+ startedAt DateTime @default(now())
211
+ completedAt DateTime?
212
+ status TestRunStatus @default(QUEUED)
213
+ result TestRunResult @default(PENDING)
214
+ testCases TestRunTestCase[]
215
+ updatedAt DateTime @updatedAt
216
+ environment Environment @relation(fields: [environmentId], references: [id])
217
+ environmentId String
218
+ tags Tag[]
219
+ testWorkersCount Int? @default(1)
220
+ browserEngine BrowserEngine @default(CHROMIUM)
221
+ logs TestRunLog?
222
+ logPath String?
223
+ reportPath String?
224
+ reports Report[]
225
+
226
+ @@index([completedAt])
227
+ @@index([result])
228
+ }
229
+
230
+ model TestRunLog {
231
+ id String @id @default(uuid())
232
+ testRunId String @unique
233
+ logs String
234
+ createdAt DateTime @default(now())
235
+ updatedAt DateTime @updatedAt
236
+ testRun TestRun @relation(fields: [testRunId], references: [runId], onDelete: Cascade)
237
+ }
238
+
239
+ model Environment {
240
+ id String @id @default(uuid())
241
+ name String @unique
242
+ baseUrl String
243
+ apiBaseUrl String?
244
+ username String?
245
+ password String?
246
+ createdAt DateTime @default(now())
247
+ updatedAt DateTime @updatedAt
248
+ testRuns TestRun[]
249
+ }
250
+
251
+ model Tag {
252
+ id String @id @default(uuid())
253
+ name String
254
+ tagExpression String
255
+ type TagType @default(FILTER)
256
+ createdAt DateTime @default(now())
257
+ updatedAt DateTime @updatedAt
258
+ testRuns TestRun[]
259
+ testSuites TestSuite[]
260
+ testCases TestCase[]
261
+ }
262
+
263
+ model ConflictResolution {
264
+ id String @id @default(uuid())
265
+ entityType EntityType
266
+ entityId String
267
+ conflictType ConflictType
268
+ conflictingEntityId String?
269
+ resolved Boolean @default(false)
270
+ createdAt DateTime @default(now())
271
+ updatedAt DateTime @updatedAt
272
+ locator Locator? @relation(fields: [entityId], references: [id], onDelete: Cascade)
273
+ }
274
+
275
+ model ReportTestCase {
276
+ id String @id @default(uuid())
277
+ reportId String
278
+ testCaseId String
279
+ testRunTestCaseId String
280
+ reportScenarioId String?
281
+ testRunTestCase TestRunTestCase @relation(fields: [testRunTestCaseId], references: [id], onDelete: Cascade)
282
+ report Report @relation(fields: [reportId], references: [id], onDelete: Cascade)
283
+ reportScenario ReportScenario? @relation(fields: [reportScenarioId], references: [id], onDelete: SetNull)
284
+ duration String
285
+ }
286
+
287
+ model Report {
288
+ id String @id @default(uuid())
289
+ name String
290
+ description String?
291
+ reportPath String?
292
+ createdAt DateTime @default(now())
293
+ updatedAt DateTime @updatedAt
294
+ testRunId String
295
+ testRun TestRun @relation(fields: [testRunId], references: [id], onDelete: Cascade)
296
+ testCases ReportTestCase[]
297
+ features ReportFeature[]
298
+ }
299
+
300
+ model ReportFeature {
301
+ id String @id @default(uuid())
302
+ reportId String
303
+ name String
304
+ description String?
305
+ uri String
306
+ line Int
307
+ keyword String
308
+ createdAt DateTime @default(now())
309
+ updatedAt DateTime @updatedAt
310
+ report Report @relation(fields: [reportId], references: [id], onDelete: Cascade)
311
+ tags ReportFeatureTag[]
312
+ scenarios ReportScenario[]
313
+ }
314
+
315
+ model ReportFeatureTag {
316
+ id String @id @default(uuid())
317
+ reportFeatureId String
318
+ tagName String
319
+ line Int
320
+ createdAt DateTime @default(now())
321
+ reportFeature ReportFeature @relation(fields: [reportFeatureId], references: [id], onDelete: Cascade)
322
+ }
323
+
324
+ model ReportScenario {
325
+ id String @id @default(uuid())
326
+ reportFeatureId String
327
+ name String
328
+ description String?
329
+ line Int
330
+ keyword String
331
+ type String
332
+ cucumberId String
333
+ createdAt DateTime @default(now())
334
+ updatedAt DateTime @updatedAt
335
+ reportFeature ReportFeature @relation(fields: [reportFeatureId], references: [id], onDelete: Cascade)
336
+ tags ReportScenarioTag[]
337
+ steps ReportStep[]
338
+ hooks ReportHook[]
339
+ reportTestCases ReportTestCase[]
340
+ }
341
+
342
+ model ReportScenarioTag {
343
+ id String @id @default(uuid())
344
+ reportScenarioId String
345
+ tagName String
346
+ line Int
347
+ createdAt DateTime @default(now())
348
+ reportScenario ReportScenario @relation(fields: [reportScenarioId], references: [id], onDelete: Cascade)
349
+ }
350
+
351
+ model ReportStep {
352
+ id String @id @default(uuid())
353
+ reportScenarioId String
354
+ keyword StepKeyword
355
+ line Int?
356
+ name String
357
+ matchLocation String?
358
+ status StepStatus
359
+ duration String
360
+ errorMessage String?
361
+ errorTrace String?
362
+ hidden Boolean @default(false)
363
+ order Int
364
+ createdAt DateTime @default(now())
365
+ updatedAt DateTime @updatedAt
366
+ reportScenario ReportScenario @relation(fields: [reportScenarioId], references: [id], onDelete: Cascade)
367
+ }
368
+
369
+ model ReportHook {
370
+ id String @id @default(uuid())
371
+ reportScenarioId String
372
+ keyword StepKeyword
373
+ status StepStatus
374
+ duration String
375
+ errorMessage String?
376
+ errorTrace String?
377
+ hidden Boolean @default(false)
378
+ createdAt DateTime @default(now())
379
+ updatedAt DateTime @updatedAt
380
+ reportScenario ReportScenario @relation(fields: [reportScenarioId], references: [id], onDelete: Cascade)
381
+ }
382
+
383
+ model TestCaseMetrics {
384
+ id String @id @default(uuid())
385
+ testCaseId String @unique
386
+ isRepeatedlyFailing Boolean @default(false)
387
+ isFlaky Boolean @default(false)
388
+ consecutiveFailures Int @default(0)
389
+ failureRate Float @default(0)
390
+ totalRecentRuns Int @default(0)
391
+ failedRecentRuns Int @default(0)
392
+ lastExecutedAt DateTime?
393
+ lastFailedAt DateTime?
394
+ lastPassedAt DateTime?
395
+ createdAt DateTime @default(now())
396
+ updatedAt DateTime @updatedAt
397
+ testCase TestCase @relation(fields: [testCaseId], references: [id], onDelete: Cascade)
398
+
399
+ @@index([isRepeatedlyFailing])
400
+ @@index([isFlaky])
401
+ }
402
+
403
+ model TestSuiteMetrics {
404
+ id String @id @default(uuid())
405
+ testSuiteId String @unique
406
+ lastExecutedAt DateTime?
407
+ createdAt DateTime @default(now())
408
+ updatedAt DateTime @updatedAt
409
+ testSuite TestSuite @relation(fields: [testSuiteId], references: [id], onDelete: Cascade)
410
+
411
+ @@index([lastExecutedAt])
412
+ }
413
+
414
+ model DashboardMetrics {
415
+ id String @id @default(uuid())
416
+ failedRecentRunsCount Int @default(0)
417
+ repeatedlyFailingTestsCount Int @default(0)
418
+ flakyTestsCount Int @default(0)
419
+ suitesNotExecutedRecentlyCount Int @default(0)
420
+ lastUpdatedAt DateTime @default(now())
421
+ createdAt DateTime @default(now())
422
+ }
423
+
424
+ enum TagType {
425
+ IDENTIFIER
426
+ FILTER
427
+ }
428
+
429
+ enum TestRunStatus {
430
+ QUEUED
431
+ RUNNING
432
+ CANCELLING
433
+ COMPLETED
434
+ CANCELLED
435
+ }
436
+
437
+ enum TestRunTestCaseStatus {
438
+ PENDING
439
+ RUNNING
440
+ COMPLETED
441
+ CANCELLED
442
+ }
443
+
444
+ enum TestRunTestCaseResult {
445
+ PASSED
446
+ FAILED
447
+ UNTESTED
448
+ }
449
+
450
+ enum TestRunResult {
451
+ PENDING
452
+ PASSED
453
+ FAILED
454
+ CANCELLED
455
+ }
456
+
457
+ enum Role {
458
+ ADMIN
459
+ TESTER
460
+ REVIEWER
461
+ }
462
+
463
+ enum ReviewStatus {
464
+ PENDING
465
+ APPROVED
466
+ CHANGES_REQUESTED
467
+ }
468
+
469
+ enum TestCaseStatus {
470
+ PENDING
471
+ IN_PROGRESS
472
+ COMPLETED
473
+ }
474
+
475
+ enum TestCaseResult {
476
+ PASSED
477
+ FAILED
478
+ BLOCKED
479
+ SKIPPED
480
+ RETEST
481
+ UNTESTED
482
+ }
483
+
484
+ enum TemplateStepType {
485
+ ACTION
486
+ ASSERTION
487
+ }
488
+
489
+ enum StepParameterType {
490
+ NUMBER
491
+ STRING
492
+ DATE
493
+ BOOLEAN
494
+ LOCATOR
495
+ }
496
+
497
+ enum StepParameterValueType {
498
+ STRING
499
+ NUMBER
500
+ LOCATOR
501
+ }
502
+
503
+ enum TemplateStepIcon {
504
+ MOUSE
505
+ NAVIGATION
506
+ INPUT
507
+ DOWNLOAD
508
+ API
509
+ STORE
510
+ FORMAT
511
+ DATA
512
+ UPLOAD
513
+ WAIT
514
+ VALIDATION
515
+ DEBUG
516
+ }
517
+
518
+ enum BrowserEngine {
519
+ CHROMIUM
520
+ FIREFOX
521
+ WEBKIT
522
+ }
523
+
524
+ enum TemplateStepGroupType {
525
+ ACTION
526
+ VALIDATION
527
+ }
528
+
529
+ enum EntityType {
530
+ LOCATOR
531
+ }
532
+
533
+ enum ConflictType {
534
+ DUPLICATE_NAME
535
+ DUPLICATE_VALUE
536
+ }
537
+
538
+ enum StepStatus {
539
+ PASSED
540
+ FAILED
541
+ SKIPPED
542
+ PENDING
543
+ UNDEFINED
544
+ }
545
+
546
+ enum StepKeyword {
547
+ GIVEN
548
+ WHEN
549
+ THEN
550
+ AND
551
+ BUT
552
+ BEFORE
553
+ AFTER
554
+ }
@@ -0,0 +1 @@
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env tsx
2
+
3
+ /**
4
+ * Script to synchronize feature files between database and filesystem
5
+ * This performs bidirectional sync - both DB->FS and FS->DB
6
+ * Run this after merging changes or database migrations to ensure sync
7
+ *
8
+ * Usage: npx tsx scripts/regenerate-features.ts [--dry-run]
9
+ */
10
+
11
+ import { performBidirectionalSync, performDryRunSync } from '../src/lib/bidirectional-sync'
12
+ import { join } from 'path'
13
+
14
+ async function main() {
15
+ try {
16
+ const isDryRun = process.argv.includes('--dry-run')
17
+ const featuresBaseDir = join(process.cwd(), 'src', 'tests', 'features')
18
+
19
+ if (isDryRun) {
20
+ console.log('šŸ” Performing dry run of bidirectional sync...')
21
+ console.log('This will show what would be changed without making any modifications.\n')
22
+
23
+ const dryRunResult = await performDryRunSync(featuresBaseDir)
24
+
25
+ console.log('\nšŸ“Š Dry run results:')
26
+ console.log(`šŸ“ Would generate ${dryRunResult.wouldGenerate.length} feature files:`)
27
+ dryRunResult.wouldGenerate.forEach((filePath, index) => {
28
+ const relativePath = filePath.replace(process.cwd(), '.')
29
+ console.log(` ${index + 1}. ${relativePath}`)
30
+ })
31
+
32
+ console.log(`\nšŸ”„ Would update ${dryRunResult.wouldUpdate.length} feature files:`)
33
+ dryRunResult.wouldUpdate.forEach((filePath, index) => {
34
+ const relativePath = filePath.replace(process.cwd(), '.')
35
+ console.log(` ${index + 1}. ${relativePath}`)
36
+ })
37
+
38
+ console.log(`\nāž• Would create ${dryRunResult.wouldCreate.testSuites.length} test suites:`)
39
+ dryRunResult.wouldCreate.testSuites.forEach((item, index) => {
40
+ console.log(` ${index + 1}. ${item}`)
41
+ })
42
+
43
+ console.log(`\nšŸ“ Would create ${dryRunResult.wouldCreate.testCases.length} test cases:`)
44
+ dryRunResult.wouldCreate.testCases.forEach((item, index) => {
45
+ console.log(` ${index + 1}. ${item}`)
46
+ })
47
+
48
+ console.log(`\nšŸ”§ Would create ${dryRunResult.wouldCreate.templateSteps.length} template steps:`)
49
+ dryRunResult.wouldCreate.templateSteps.forEach((item, index) => {
50
+ console.log(` ${index + 1}. ${item}`)
51
+ })
52
+
53
+ console.log(`\nšŸ·ļø Would create ${dryRunResult.wouldCreate.tags.length} tags:`)
54
+ dryRunResult.wouldCreate.tags.forEach((tag, index) => {
55
+ console.log(` ${index + 1}. ${tag}`)
56
+ })
57
+
58
+ console.log('\nšŸ’” To perform the actual sync, run without --dry-run flag')
59
+ } else {
60
+ console.log('šŸ”„ Starting bidirectional sync between database and feature files...')
61
+ console.log('This will sync both directions:')
62
+ console.log(' šŸ“ Feature files → Database (create missing test suites/cases)')
63
+ console.log(' šŸ—„ļø Database → Feature files (generate/update feature files)')
64
+ console.log('')
65
+
66
+ const syncResult = await performBidirectionalSync(featuresBaseDir)
67
+
68
+ console.log('\nāœ… Bidirectional sync completed successfully!')
69
+ console.log(`šŸ“Š Summary:`)
70
+ console.log(` šŸ“ Generated feature files: ${syncResult.generatedFeatureFiles}`)
71
+ console.log(` šŸ”„ Updated feature files: ${syncResult.updatedFeatureFiles}`)
72
+ console.log(` šŸ—„ļø Merged test suites: ${syncResult.mergedTestSuites}`)
73
+ console.log(` šŸ“ Added scenarios: ${syncResult.addedScenarios}`)
74
+ console.log(` šŸ“Š Total processed: ${syncResult.totalProcessed}`)
75
+
76
+ if (syncResult.errors.length > 0) {
77
+ console.log(`\nāš ļø Errors encountered: ${syncResult.errors.length}`)
78
+ syncResult.errors.forEach((error, index) => {
79
+ console.log(` ${index + 1}. ${error}`)
80
+ })
81
+ }
82
+
83
+ console.log('\nšŸ’” Tips:')
84
+ console.log(' - Run with --dry-run to see what would be changed')
85
+ console.log(' - This script is safe to run multiple times')
86
+ console.log(' - Changes are automatically merged, not overwritten')
87
+ }
88
+ } catch (error) {
89
+ console.error('\nāŒ Error during sync:', error)
90
+ process.exit(1)
91
+ }
92
+ }
93
+
94
+ main()
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env tsx
2
+
3
+ import fs from 'fs'
4
+ import path from 'path'
5
+
6
+ const envContent = `# Database configuration for local development
7
+ DATABASE_URL="file:./prisma/dev.db"
8
+ `
9
+
10
+ const envPath = path.join(process.cwd(), '.env')
11
+
12
+ if (!fs.existsSync(envPath)) {
13
+ fs.writeFileSync(envPath, envContent)
14
+ console.log('āœ… Created .env file with SQLite configuration')
15
+ } else {
16
+ console.log('ā„¹ļø .env file already exists, skipping creation')
17
+ }
18
+
19
+ console.log('šŸŽ‰ Environment setup complete!')