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,72 @@
1
+ /**
2
+ * @name navigation
3
+ * @description Template steps that deals with browser navigation
4
+ * @type ACTION
5
+ */
6
+ import { When } from '@cucumber/cucumber'
7
+ import { CustomWorld } from '../../config/executor/world.js'
8
+ import { getEnvironment } from '../../utils/environment.util.js'
9
+
10
+ // This file is generated automatically. Add template steps to this group to generate content.
11
+
12
+ /**
13
+ * @name navigate to url
14
+ * @description Navigate to the specified URL
15
+ * @icon NAVIGATION
16
+ */
17
+ When('the user navigates to the {string} url', async function (this: CustomWorld, url: string) {
18
+ try {
19
+ await this.page.goto(url, { waitUntil: 'domcontentloaded' })
20
+ } catch (error) {
21
+ throw new Error(`Failed to navigate to the ${url} url: ${error}`)
22
+ }
23
+ })
24
+
25
+ /**
26
+ * @name navigate to environment base url
27
+ * @description Navigate to the base url of previously stored environment configuration
28
+ * @icon NAVIGATION
29
+ */
30
+ When(
31
+ 'the user navigates to the base url of the {string} environment',
32
+ async function (this: CustomWorld, environmentName: string) {
33
+ try {
34
+ const environmentConfig = getEnvironment(environmentName)
35
+ if (!environmentConfig) {
36
+ throw new Error(`Environment ${environmentName} not found`)
37
+ }
38
+ await this.page.goto(environmentConfig.baseUrl, {
39
+ waitUntil: 'domcontentloaded',
40
+ })
41
+ } catch (error) {
42
+ throw new Error(`Failed to navigate to the base url of the ${environmentName} environment: ${error}`)
43
+ }
44
+ },
45
+ )
46
+
47
+ /**
48
+ * @name reload
49
+ * @description Template step for reloading the current page
50
+ * @icon NAVIGATION
51
+ */
52
+ When('the user reloads the page', async function (this: CustomWorld) {
53
+ try {
54
+ await this.page.reload()
55
+ await this.page.waitForLoadState('domcontentloaded')
56
+ } catch (error) {
57
+ throw new Error(`Failed to reload the page: ${error}`)
58
+ }
59
+ })
60
+
61
+ /**
62
+ * @name go back
63
+ * @description Template step for going back to the previous page
64
+ * @icon NAVIGATION
65
+ */
66
+ When('the user goes back to the previous page', async function (this: CustomWorld) {
67
+ try {
68
+ await this.page.goBack({ waitUntil: 'domcontentloaded' })
69
+ } catch (error) {
70
+ throw new Error(`Failed to go back to the previous page: ${error}`)
71
+ }
72
+ })
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @name random data
3
+ * @description Template steps that handles random data generation
4
+ * @type ACTION
5
+ */
6
+ import { When } from '@cucumber/cucumber';
7
+ import { CustomWorld } from '../../config/executor/world.js';
8
+ import { generateRandomData, RandomDataType } from '../../utils/random-data.util.js';
9
+
10
+ // This file is generated automatically. Add template steps to this group to generate content.
11
+
12
+ /**
13
+ * @name generate random first name and save in variable
14
+ * @description Template step for generating a random first name and saving it inside a variable
15
+ * @icon DATA
16
+ */
17
+ When(
18
+ 'the user generates a random first name and stores it inside the variable {string}',
19
+ async function (this: CustomWorld, variableName: string) {
20
+ const data = generateRandomData(RandomDataType.FIRST_NAME);
21
+ try {
22
+ this.setVar(variableName, data);
23
+ } catch (error) {
24
+ throw new Error(`Failed to generate a random first name and store it inside the variable ${variableName}: ${error}`);
25
+ }
26
+ }
27
+ );
28
+
29
+ /**
30
+ * @name generate random last name and save in variable
31
+ * @description Template step for generating a random last name and saving it inside a variable
32
+ * @icon DATA
33
+ */
34
+ When(
35
+ 'the user generates a random last name and stores it inside the variable {string}',
36
+ async function (this: CustomWorld, variableName: string) {
37
+ const data = generateRandomData(RandomDataType.LAST_NAME);
38
+ try {
39
+ this.setVar(variableName, data);
40
+ } catch (error) {
41
+ throw new Error(`Failed to generate a random last name and store it inside the variable ${variableName}: ${error}`);
42
+ }
43
+ }
44
+ );
45
+
46
+ /**
47
+ * @name generate random email and save in variable
48
+ * @description Template step for generating a random email and saving it inside a variable
49
+ * @icon DATA
50
+ */
51
+ When(
52
+ 'the user generates a random email and stores it inside the variable {string}',
53
+ async function (this: CustomWorld, variableName: string) {
54
+ const data = generateRandomData(RandomDataType.EMAIL);
55
+ try {
56
+ this.setVar(variableName, data);
57
+ } catch (error) {
58
+ throw new Error(`Failed to generate a random email and store it inside the variable ${variableName}: ${error}`);
59
+ }
60
+ }
61
+ );
62
+
63
+ /**
64
+ * @name generate random password and save in variable
65
+ * @description Template step for generating a random password and saving it inside a variable
66
+ * @icon DATA
67
+ */
68
+ When(
69
+ 'the user generates a random password and stores it inside the variable {string}',
70
+ async function (this: CustomWorld, variableName: string) {
71
+ const data = generateRandomData(RandomDataType.PASSWORD);
72
+ try {
73
+ this.setVar(variableName, data);
74
+ } catch (error) {
75
+ throw new Error(`Failed to generate a random password and store it inside the variable ${variableName}: ${error}`);
76
+ }
77
+ }
78
+ );
79
+
80
+ /**
81
+ * @name generate random phone and save in variable
82
+ * @description Template step for generating a random phone and saving it inside a variable
83
+ * @icon DATA
84
+ */
85
+ When(
86
+ 'the user generates a random phone and stores it inside the variable {string}',
87
+ async function (this: CustomWorld, variableName: string) {
88
+ const data = generateRandomData(RandomDataType.PHONE);
89
+ try {
90
+ this.setVar(variableName, data);
91
+ } catch (error) {
92
+ throw new Error(`Failed to generate a random phone and store it inside the variable ${variableName}: ${error}`);
93
+ }
94
+ }
95
+ );
96
+
97
+ /**
98
+ * @name generate random address and save in variable
99
+ * @description Template step for generating a random address and saving it inside a variable
100
+ * @icon DATA
101
+ */
102
+ When(
103
+ 'the user generates a random address and stores it inside the variable {string}',
104
+ async function (this: CustomWorld, variableName: string) {
105
+ const data = generateRandomData(RandomDataType.ADDRESS);
106
+ try {
107
+ this.setVar(variableName, data);
108
+ } catch (error) {
109
+ throw new Error(`Failed to generate a random address and store it inside the variable ${variableName}: ${error}`);
110
+ }
111
+ }
112
+ );
113
+
114
+ /**
115
+ * @name generate random unique text and save in variable
116
+ * @description Template step for generating a random unique text and saving it inside a variable
117
+ * @icon DATA
118
+ */
119
+ When(
120
+ 'the user generates a random unique text and stores it inside the variable {string}',
121
+ async function (this: CustomWorld, variableName: string) {
122
+ const data = generateRandomData(RandomDataType.UNIQUE_TEXT);
123
+ try {
124
+ this.setVar(variableName, data);
125
+ } catch (error) {
126
+ throw new Error(`Failed to generate a random unique text and store it inside the variable ${variableName}: ${error}`);
127
+ }
128
+ }
129
+ );
130
+
131
+ /**
132
+ * @name generate random full name and save in variable
133
+ * @description Template step for generating a random full name and saving it inside a variable
134
+ * @icon DATA
135
+ */
136
+ When(
137
+ 'the user generates a random full name and stores it inside the variable {string}',
138
+ async function (this: CustomWorld, variableName: string) {
139
+ const data = generateRandomData(RandomDataType.FULL_NAME);
140
+ try {
141
+ this.setVar(variableName, data);
142
+ } catch (error) {
143
+ throw new Error(`Failed to generate a random full name and store it inside the variable ${variableName}: ${error}`);
144
+ }
145
+ }
146
+ );
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @name store
3
+ * @description Template steps that handle data storage
4
+ * @type ACTION
5
+ */
6
+ import { When } from '@cucumber/cucumber';
7
+ import { CustomWorld } from '../../config/executor/world.js';
8
+ import { SelectorName } from '@/types/locator/locator.type';
9
+ import { resolveLocator } from '../../utils/locator.util.js';
10
+
11
+ // This file is generated automatically. Add template steps to this group to generate content.
12
+
13
+ /**
14
+ * @name store element text
15
+ * @description Template step for storing element text inside a data variable to be referenced in later steps
16
+ * @icon STORE
17
+ */
18
+ When(
19
+ 'the user stores the {string} element text inside the variable {string}',
20
+ async function (
21
+ this: CustomWorld,
22
+ elementName: SelectorName,
23
+ storeVariableName: string
24
+ ) {
25
+ const selector = await resolveLocator(this.page, elementName);
26
+ if (!selector) {
27
+ throw new Error(`Selector ${elementName} not found`);
28
+ }
29
+ try {
30
+ const text = await this.page.locator(selector).textContent();
31
+ this.setVar(storeVariableName, text);
32
+ } catch (error) {
33
+ throw new Error(
34
+ `Failed to store the ${elementName} element text: ${error}`
35
+ );
36
+ }
37
+ }
38
+ );
39
+
40
+ /**
41
+ * @name store text input text
42
+ * @description Template step for storing text input element values inside a variable
43
+ * @icon STORE
44
+ */
45
+ When(
46
+ 'the user stores the {string} text input value inside the variable {string}',
47
+ async function (
48
+ this: CustomWorld,
49
+ fieldName: SelectorName,
50
+ variableName: string
51
+ ) {
52
+ const selector = await resolveLocator(this.page, fieldName);
53
+ if (!selector) {
54
+ throw new Error(`Selector ${fieldName} not found`);
55
+ }
56
+ try {
57
+ const value = await this.page.locator(selector).inputValue();
58
+ this.setVar(variableName, value);
59
+ } catch (error) {
60
+ throw new Error(
61
+ `Failed to store the ${fieldName} text input value: ${error}`
62
+ );
63
+ }
64
+ }
65
+ );
66
+
67
+ /**
68
+ * @name store textarea text
69
+ * @description Template step for storing textarea content inside a variable
70
+ * @icon STORE
71
+ */
72
+ When(
73
+ 'the user stores the {string} textarea input value inside the variable {string}',
74
+ async function (
75
+ this: CustomWorld,
76
+ elementName: SelectorName,
77
+ variableName: string
78
+ ) {
79
+ const selector = await resolveLocator(this.page, elementName);
80
+ if (!selector) {
81
+ throw new Error(`Selector ${elementName} not found`);
82
+ }
83
+ try {
84
+ const text = await this.page.locator(selector).inputValue();
85
+ this.setVar(variableName, text);
86
+ } catch (error) {
87
+ throw new Error(`Failed to store the ${elementName} textarea input value inside the variable ${variableName}: ${error}`);
88
+ }
89
+ }
90
+ );
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @name wait
3
+ * @description Template steps that handles waiting
4
+ * @type ACTION
5
+ */
6
+ import { SelectorName } from '../../../types/locator/locator.type';
7
+ import { When } from '@cucumber/cucumber';
8
+ import { CustomWorld } from '../../config/executor/world.js';
9
+ import { resolveLocator } from '../../utils/locator.util.js';
10
+
11
+ // This file is generated automatically. Add template steps to this group to generate content.
12
+
13
+ /**
14
+ * @name wait for page load
15
+ * @description Template step for waiting till page becomes interactive
16
+ * @icon WAIT
17
+ */
18
+ When(
19
+ 'the user waits for the current page to be loaded',
20
+ async function (this: CustomWorld) {
21
+ try {
22
+ await this.page.waitForLoadState('domcontentloaded');
23
+ } catch (error) {
24
+ throw new Error(
25
+ `Failed to wait for the current page to be loaded: ${error}`
26
+ );
27
+ }
28
+ }
29
+ );
30
+
31
+ /**
32
+ * @name wait for url route
33
+ * @description Template step for waiting for a url route to be loaded
34
+ * @icon WAIT
35
+ */
36
+ When(
37
+ 'the user waits for the route {string} to be loaded',
38
+ async function (this: CustomWorld, routeName: string) {
39
+ try {
40
+ await this.page.waitForURL(routeName, { waitUntil: 'domcontentloaded' });
41
+ } catch (error) {
42
+ throw new Error(
43
+ `Failed to wait for the route ${routeName} to be loaded: ${error}`
44
+ );
45
+ }
46
+ }
47
+ );
48
+
49
+ /**
50
+ * @name wait for element
51
+ * @description Template step for waiting for element to become visible
52
+ * @icon WAIT
53
+ */
54
+ When(
55
+ 'the user waits for the element {string} to become visible',
56
+ async function (this: CustomWorld, elementName: SelectorName) {
57
+ try {
58
+ const selector = await resolveLocator(this.page, elementName);
59
+ if (!selector) {
60
+ throw new Error(`Selector ${elementName} not found`);
61
+ }
62
+ await this.page.waitForSelector(selector, { state: 'visible' });
63
+ } catch (error) {
64
+ throw new Error(
65
+ `Failed to wait for the element ${elementName} to become visible: ${error}`
66
+ );
67
+ }
68
+ }
69
+ );
70
+
71
+ /**
72
+ * @name wait for element to disappear
73
+ * @description Template step for waiting for an element to disappear from viewport
74
+ * @icon WAIT
75
+ */
76
+ When(
77
+ 'the user waits for the {string} element to disappear',
78
+ async function (this: CustomWorld, elementName: SelectorName) {
79
+ try {
80
+ const selector = await resolveLocator(this.page, elementName);
81
+ if (!selector) {
82
+ throw new Error(`Selector ${elementName} not found`);
83
+ }
84
+ await this.page.waitForSelector(selector, { state: 'hidden' });
85
+ } catch (error) {
86
+ throw new Error(
87
+ `Failed to wait for the ${elementName} element to disappear: ${error}`
88
+ );
89
+ }
90
+ }
91
+ );
92
+
93
+ /**
94
+ * @name wait for specific amount of seconds
95
+ * @description Template step for waiting for for an specific amount of seconds before proceeding with next action
96
+ * @icon WAIT
97
+ */
98
+ When(
99
+ 'the user waits for {int} seconds',
100
+ async function (this: CustomWorld, waitTimeInSeconds: number) {
101
+ try {
102
+ await this.page.waitForTimeout(waitTimeInSeconds * 1000);
103
+ } catch (error) {
104
+ throw new Error(`Failed to wait for ${waitTimeInSeconds} seconds: ${error}`);
105
+ }
106
+ }
107
+ );
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @name active state assertion
3
+ * @description Template steps for handling the validation of the active state of an element
4
+ * @type VALIDATION
5
+ */
6
+ import { Then } from '@cucumber/cucumber'
7
+ import { CustomWorld, expect } from '../../config/executor/world.js'
8
+ import { SelectorName } from '@/types/locator/locator.type'
9
+ import { resolveLocator } from '../../utils/locator.util.js'
10
+
11
+ // This file is generated automatically. Add template steps to this group to generate content.
12
+
13
+ /**
14
+ * @name assert element active
15
+ * @description Template step for validating whether an element is active or not
16
+ * @icon VALIDATION
17
+ */
18
+ Then(
19
+ 'the element {string} should have active status {boolean} ',
20
+ async function (this: CustomWorld, elementName: SelectorName, isActive: boolean) {
21
+ try {
22
+ const selector = await resolveLocator(this.page, elementName)
23
+ if (!selector) throw new Error(`Selector ${elementName} not found`)
24
+ const elementActiveStatus = await this.page.locator(selector).isEnabled({ timeout: 10000 })
25
+ if (isActive) {
26
+ void expect(elementActiveStatus, `Expected ${elementName} to be active`).to.be.true
27
+ } else {
28
+ void expect(elementActiveStatus, `Expected ${elementName} NOT to be active`).to.be.false
29
+ }
30
+ } catch (error) {
31
+ throw new Error(`Failed to validate the active status of the element ${elementName}: ${error}`)
32
+ }
33
+ },
34
+ )
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @name navigation assertion
3
+ * @description Template steps that handles navigation validations
4
+ * @type VALIDATION
5
+ */
6
+ import { Then } from '@cucumber/cucumber'
7
+ import { CustomWorld, expect } from '../../config/executor/world.js'
8
+
9
+ // This file is generated automatically. Add template steps to this group to generate content.
10
+
11
+ /**
12
+ * @name assert url route equals
13
+ * @description Template step for validating whether a url route equals the provided value or not
14
+ * @icon VALIDATION
15
+ */
16
+ Then('the url route should be equal to {string}', async function (this: CustomWorld, route: string) {
17
+ try {
18
+ const currentRoute = await this.page.url()
19
+ expect(currentRoute, `Expected the current route to be "${route}"`).to.equal(route)
20
+ } catch (error) {
21
+ throw new Error(`Failed to validate the equality of the current route to the route "${route}": ${error}`)
22
+ }
23
+ })
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @name text assertion
3
+ * @description Template steps for asserting text inside elements
4
+ * @type VALIDATION
5
+ */
6
+ import { Then } from '@cucumber/cucumber';
7
+ import { CustomWorld, expect } from '../../config/executor/world.js';
8
+ import { SelectorName } from '@/types/locator/locator.type';
9
+ import { resolveLocator } from '../../utils/locator.util.js';
10
+
11
+ // This file is generated automatically. Add template steps to this group to generate content.
12
+
13
+ /**
14
+ * @name assert element contains text
15
+ * @description Template step for validating whether an element contains a certain text or not
16
+ * @icon VALIDATION
17
+ */
18
+ Then(
19
+ 'the element {string} should {boolean} contain the text {string}',
20
+ async function (
21
+ this: CustomWorld,
22
+ elementName: SelectorName,
23
+ shouldContain: boolean,
24
+ elementText: string
25
+ ) {
26
+ try {
27
+ const selector = await resolveLocator(this.page, elementName);
28
+ if (!selector) throw new Error(`Selector ${elementName} not found`);
29
+ const elementTextContent = await this.page
30
+ .locator(selector)
31
+ .textContent();
32
+
33
+ if (!elementTextContent)
34
+ throw new Error(
35
+ `Element ${elementName} does not have any text content`
36
+ );
37
+
38
+ if (shouldContain) {
39
+ expect(
40
+ elementTextContent,
41
+ `Expected ${elementName} to contain "${elementText}"`
42
+ ).to.contain(elementText);
43
+ } else {
44
+ expect(
45
+ elementTextContent,
46
+ `Expected ${elementName} NOT to contain "${elementText}"`
47
+ ).to.not.contain(elementText);
48
+ }
49
+ } catch (error) {
50
+ throw new Error(
51
+ `Failed to validate the containment of the text of the element ${elementName}: ${error}`
52
+ );
53
+ }
54
+ }
55
+ );
56
+
57
+ /**
58
+ * @name assert element equals text
59
+ * @description Template step for validating whether an element text equals a provided text or not
60
+ * @icon VALIDATION
61
+ */
62
+ Then(
63
+ 'the element {string} should {boolean} equal the text {string}',
64
+ async function (
65
+ this: CustomWorld,
66
+ elementName: SelectorName,
67
+ shouldEqual: boolean,
68
+ elementText: string
69
+ ) {
70
+ try {
71
+ const selector = await resolveLocator(this.page, elementName);
72
+ if (!selector) throw new Error(`Selector ${elementName} not found`);
73
+ const elementTextContent = await this.page
74
+ .locator(selector)
75
+ .textContent();
76
+ if (!elementTextContent)
77
+ throw new Error(
78
+ `Element ${elementName} does not have any text content`
79
+ );
80
+ if (shouldEqual) {
81
+ expect(
82
+ elementTextContent,
83
+ `Expected ${elementName} to equal "${elementText}"`
84
+ ).to.equal(elementText);
85
+ } else {
86
+ expect(
87
+ elementTextContent,
88
+ `Expected ${elementName} NOT to equal "${elementText}"`
89
+ ).to.not.equal(elementText);
90
+ }
91
+ } catch (error) {
92
+ throw new Error(
93
+ `Failed to validate the equality of the text of the element ${elementName}: ${error}`
94
+ );
95
+ }
96
+ }
97
+ );
98
+
99
+ /**
100
+ * @name assert element contains stored variable text
101
+ * @description Template step to validate whether an element text contains the text inside a stored variable
102
+ * @icon VALIDATION
103
+ */
104
+ Then(
105
+ 'the element {string} should contain the text inside the stored variable {string}',
106
+ async function (
107
+ this: CustomWorld,
108
+ _elementName: SelectorName,
109
+ _variableName: string
110
+ ) {}
111
+ );
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @name visibility assertion
3
+ * @description Template steps that handles the assertion of element visibility states
4
+ * @type VALIDATION
5
+ */
6
+ import { Then } from '@cucumber/cucumber'
7
+ import { CustomWorld, expect } from '../../config/executor/world.js'
8
+ import { SelectorName } from '@/types/locator/locator.type'
9
+ import { resolveLocator } from '../../utils/locator.util.js'
10
+
11
+ // This file is generated automatically. Add template steps to this group to generate content.
12
+
13
+ /**
14
+ * @name assert element visible
15
+ * @description Template step for validating whether an element should be visible or not
16
+ * @icon VALIDATION
17
+ */
18
+ Then(
19
+ 'the visibility status of the {string} element should be {boolean}',
20
+ async function (this: CustomWorld, elementName: SelectorName, isVisible: boolean) {
21
+ try {
22
+ const selector = await resolveLocator(this.page, elementName)
23
+ if (!selector) throw new Error(`Selector ${elementName} not found`)
24
+ const elementVisibilityStatus = await this.page.locator(selector).isVisible({ timeout: 10000 })
25
+ expect(elementVisibilityStatus).to.equal(isVisible)
26
+ } catch (error) {
27
+ throw new Error(`Failed to validate the visibility of the element ${elementName}: ${error}`)
28
+ }
29
+ },
30
+ )
@@ -0,0 +1,12 @@
1
+ import { defineParameterType } from '@cucumber/cucumber'
2
+
3
+ /**
4
+ * Register custom parameter types used in step definitions.
5
+ * Cucumber only has built-in types for {string}, {int}, {float}, {word} —
6
+ * {boolean} must be defined here so steps like "should be true" work.
7
+ */
8
+ defineParameterType({
9
+ name: 'boolean',
10
+ regexp: /true|false/,
11
+ transformer: (s: string) => s === 'true',
12
+ })