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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/README.md +17 -17
  2. package/dist/cli.e2e.test.d.ts +2 -2
  3. package/dist/cli.e2e.test.js +74 -72
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/config.test.d.ts +2 -2
  7. package/dist/config.test.js +64 -64
  8. package/dist/copy-template.test.d.ts +2 -2
  9. package/dist/copy-template.test.js +70 -70
  10. package/dist/download-repo.test.d.ts +2 -2
  11. package/dist/download-repo.test.js +15 -13
  12. package/dist/install.test.d.ts +2 -2
  13. package/dist/install.test.js +115 -114
  14. package/dist/prepare-template-utils.d.ts.map +1 -1
  15. package/dist/prepare-template-utils.js.map +1 -1
  16. package/dist/prompts.d.ts.map +1 -1
  17. package/dist/prompts.js +2 -2
  18. package/dist/prompts.js.map +1 -1
  19. package/dist/prompts.test.d.ts +2 -2
  20. package/dist/prompts.test.js +54 -54
  21. package/dist/sync-templates-utils.d.ts.map +1 -1
  22. package/dist/sync-templates-utils.js +1 -5
  23. package/dist/sync-templates-utils.js.map +1 -1
  24. package/package.json +1 -1
  25. package/templates/blank/.editorconfig +11 -0
  26. package/templates/blank/.gitattributes +21 -0
  27. package/templates/blank/.gitconfig.appraise +14 -0
  28. package/templates/blank/.prettierrc +13 -0
  29. package/templates/blank/.vscode/settings.json +2 -0
  30. package/templates/blank/README.md +12 -12
  31. package/templates/blank/components.json +24 -24
  32. package/templates/blank/cucumber.mjs +16 -16
  33. package/templates/blank/e2e/README.md +56 -0
  34. package/templates/blank/e2e/apply-migrations.mjs +76 -0
  35. package/templates/blank/e2e/appraise-smoke.spec.ts +78 -0
  36. package/templates/blank/e2e/authoring.spec.ts +53 -0
  37. package/templates/blank/e2e/crud-configuration.spec.ts +138 -0
  38. package/templates/blank/e2e/crud-tests.spec.ts +76 -0
  39. package/templates/blank/e2e/helpers/forms.ts +186 -0
  40. package/templates/blank/e2e/helpers/navigation.ts +27 -0
  41. package/templates/blank/e2e/helpers/table.ts +45 -0
  42. package/templates/blank/e2e/helpers/test-data.ts +549 -0
  43. package/templates/blank/e2e/helpers/ui.ts +41 -0
  44. package/templates/blank/e2e/navigation.spec.ts +101 -0
  45. package/templates/blank/e2e/runs-and-reports.spec.ts +82 -0
  46. package/templates/blank/e2e/settings-sync.spec.ts +39 -0
  47. package/templates/blank/e2e/start-server.mjs +61 -0
  48. package/templates/blank/eslint.config.mjs +4 -4
  49. package/templates/blank/gitignore +0 -3
  50. package/templates/blank/next-env.d.ts +1 -1
  51. package/templates/blank/package-lock.json +58 -102
  52. package/templates/blank/package.json +10 -9
  53. package/templates/blank/packages/cucumber-runtime/package.json +13 -13
  54. package/templates/blank/packages/cucumber-runtime/src/cache.util.ts +93 -93
  55. package/templates/blank/packages/cucumber-runtime/src/cli.ts +77 -68
  56. package/templates/blank/packages/cucumber-runtime/src/environment.util.ts +21 -21
  57. package/templates/blank/packages/cucumber-runtime/src/executor.ts +32 -32
  58. package/templates/blank/packages/cucumber-runtime/src/index.ts +17 -17
  59. package/templates/blank/packages/cucumber-runtime/src/locator.util.ts +234 -234
  60. package/templates/blank/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  61. package/templates/blank/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  62. package/templates/blank/packages/cucumber-runtime/src/types.ts +13 -13
  63. package/templates/blank/packages/cucumber-runtime/src/world.ts +44 -44
  64. package/templates/blank/packages/cucumber-runtime/tsconfig.json +11 -11
  65. package/templates/blank/packages/locator-picker-companion/dist/cli.js +1 -1
  66. package/templates/blank/packages/locator-picker-companion/dist/index.d.ts +3 -3
  67. package/templates/blank/packages/locator-picker-companion/dist/index.js +3 -3
  68. package/templates/blank/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  69. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  70. package/templates/blank/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  71. package/templates/blank/packages/locator-picker-companion/src/cli.ts +1 -7
  72. package/templates/blank/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  73. package/templates/blank/packages/locator-picker-companion/src/launcher.ts +1 -3
  74. package/templates/blank/packages/locator-picker-companion/src/session-file.ts +4 -15
  75. package/templates/blank/packages/locator-picker-companion/src/types.ts +1 -8
  76. package/templates/blank/playwright.config.ts +46 -0
  77. package/templates/blank/postcss.config.mjs +8 -8
  78. package/templates/blank/prisma/dev.db +0 -0
  79. package/templates/blank/scripts/configure-git-line-endings.mjs +91 -0
  80. package/templates/blank/scripts/install-template-step.ts +5 -1
  81. package/templates/blank/scripts/lib/step-matcher.test.ts +3 -3
  82. package/templates/blank/scripts/lib/step-matcher.ts +5 -1
  83. package/templates/blank/scripts/lib/template-step-installer.test.ts +4 -2
  84. package/templates/blank/scripts/lib/template-step-installer.ts +16 -4
  85. package/templates/blank/scripts/lib/template-step-registry.test.ts +1 -1
  86. package/templates/blank/scripts/lib/template-step-registry.ts +4 -1
  87. package/templates/blank/scripts/run-fallow-commit.mjs +4 -6
  88. package/templates/blank/scripts/sync-all.ts +7 -6
  89. package/templates/blank/scripts/sync-appraise-base-template.ts +84 -77
  90. package/templates/blank/scripts/sync-environments.ts +47 -44
  91. package/templates/blank/scripts/sync-locator-groups.ts +67 -76
  92. package/templates/blank/scripts/sync-locators.ts +50 -53
  93. package/templates/blank/scripts/sync-modules.ts +42 -42
  94. package/templates/blank/scripts/sync-tags.ts +51 -51
  95. package/templates/blank/scripts/sync-template-step-groups.ts +34 -32
  96. package/templates/blank/scripts/sync-template-steps.ts +97 -97
  97. package/templates/blank/scripts/sync-test-cases.ts +65 -74
  98. package/templates/blank/scripts/sync-test-suites.ts +85 -80
  99. package/templates/blank/src/actions/server-action-boundary.test.ts +1 -7
  100. package/templates/blank/src/actions/settings/sync-actions.ts +3 -1
  101. package/templates/blank/src/actions/tags/tag-actions.ts +1 -7
  102. package/templates/blank/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  103. package/templates/blank/src/app/(base)/environments/create/page.tsx +28 -28
  104. package/templates/blank/src/app/(base)/environments/environment-form.tsx +3 -2
  105. package/templates/blank/src/app/(base)/environments/environment-helpers.ts +4 -1
  106. package/templates/blank/src/app/(base)/layout.tsx +10 -10
  107. package/templates/blank/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  108. package/templates/blank/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  109. package/templates/blank/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  110. package/templates/blank/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  111. package/templates/blank/src/app/(base)/locator-groups/page.tsx +9 -19
  112. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  113. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  114. package/templates/blank/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  115. package/templates/blank/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  116. package/templates/blank/src/app/(base)/locators/locator-file-sync.ts +1 -5
  117. package/templates/blank/src/app/(base)/locators/locator-helpers.ts +2 -12
  118. package/templates/blank/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  119. package/templates/blank/src/app/(base)/modules/module-form.tsx +3 -1
  120. package/templates/blank/src/app/(base)/reports/overview-chart.tsx +49 -49
  121. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  122. package/templates/blank/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  123. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  124. package/templates/blank/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  125. package/templates/blank/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  126. package/templates/blank/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  127. package/templates/blank/src/app/(base)/tags/tag-form.test.tsx +2 -10
  128. package/templates/blank/src/app/(base)/tags/tag-form.tsx +5 -3
  129. package/templates/blank/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  130. package/templates/blank/src/app/(base)/tags/tag-table.tsx +29 -29
  131. package/templates/blank/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  132. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  133. package/templates/blank/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  134. package/templates/blank/src/app/(base)/template-steps/paramChip.tsx +6 -10
  135. package/templates/blank/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  136. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  137. package/templates/blank/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  138. package/templates/blank/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  139. package/templates/blank/src/app/(base)/template-steps/template-step-types.ts +1 -5
  140. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  141. package/templates/blank/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  142. package/templates/blank/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  143. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  144. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  145. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  146. package/templates/blank/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  147. package/templates/blank/src/app/(base)/test-cases/create/page.tsx +1 -5
  148. package/templates/blank/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  149. package/templates/blank/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  150. package/templates/blank/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  151. package/templates/blank/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  152. package/templates/blank/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  153. package/templates/blank/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  154. package/templates/blank/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  155. package/templates/blank/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  156. package/templates/blank/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  157. package/templates/blank/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  158. package/templates/blank/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  159. package/templates/blank/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  160. package/templates/blank/src/assets/icons/empty-tube.tsx +23 -23
  161. package/templates/blank/src/assets/icons/tube-plus.tsx +29 -29
  162. package/templates/blank/src/components/data-visualization/info-card.tsx +56 -70
  163. package/templates/blank/src/components/data-visualization/info-grid.tsx +22 -22
  164. package/templates/blank/src/components/diagram/add-node-prompt-node.tsx +1 -1
  165. package/templates/blank/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  166. package/templates/blank/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  167. package/templates/blank/src/components/diagram/dynamic-parameters.tsx +0 -1
  168. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  169. package/templates/blank/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  170. package/templates/blank/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  171. package/templates/blank/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  172. package/templates/blank/src/components/diagram/flow-diagram-node-search.tsx +65 -65
  173. package/templates/blank/src/components/diagram/flow-diagram-toolbar.tsx +1 -3
  174. package/templates/blank/src/components/diagram/flow-diagram-view.tsx +1 -7
  175. package/templates/blank/src/components/diagram/flow-node-data-helpers.ts +1 -1
  176. package/templates/blank/src/components/diagram/node-form-fields-content.tsx +9 -2
  177. package/templates/blank/src/components/diagram/node-form-helpers.test.ts +3 -1
  178. package/templates/blank/src/components/diagram/node-form-helpers.ts +1 -4
  179. package/templates/blank/src/components/diagram/node-form-template-step-selection.ts +1 -4
  180. package/templates/blank/src/components/diagram/node-form.test.tsx +25 -0
  181. package/templates/blank/src/components/diagram/node-form.tsx +2 -12
  182. package/templates/blank/src/components/diagram/options-header-node.test.tsx +4 -1
  183. package/templates/blank/src/components/diagram/options-header-node.tsx +140 -130
  184. package/templates/blank/src/components/diagram/use-flow-diagram.ts +1 -2
  185. package/templates/blank/src/components/form/error-message.tsx +7 -7
  186. package/templates/blank/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  187. package/templates/blank/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  188. package/templates/blank/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  189. package/templates/blank/src/components/navigation/entity-search-command.tsx +3 -9
  190. package/templates/blank/src/components/navigation/nav-link.tsx +60 -60
  191. package/templates/blank/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  192. package/templates/blank/src/components/test-case/test-case-form-helpers.ts +1 -5
  193. package/templates/blank/src/components/test-case/test-case-picker-helpers.ts +8 -7
  194. package/templates/blank/src/components/test-case/test-case-picker.tsx +2 -6
  195. package/templates/blank/src/components/test-run/log-viewer.test.tsx +25 -0
  196. package/templates/blank/src/components/test-run/log-viewer.tsx +2 -2
  197. package/templates/blank/src/components/test-run/test-run-details-guards.ts +10 -1
  198. package/templates/blank/src/components/test-run/test-run-details.test.tsx +9 -19
  199. package/templates/blank/src/components/test-run/use-log-viewer.ts +2 -8
  200. package/templates/blank/src/components/test-run/use-test-run-header.ts +1 -4
  201. package/templates/blank/src/components/test-suite/test-suite-picker.tsx +1 -1
  202. package/templates/blank/src/components/theme/theme-provider.tsx +7 -1
  203. package/templates/blank/src/components/typography/page-header-subtitle.tsx +7 -7
  204. package/templates/blank/src/components/typography/page-header.tsx +7 -7
  205. package/templates/blank/src/components/ui/chart.tsx +2 -8
  206. package/templates/blank/src/components/ui/command.tsx +2 -5
  207. package/templates/blank/src/components/ui/data-table-column-header.tsx +3 -3
  208. package/templates/blank/src/components/ui/data-table.test.tsx +1 -8
  209. package/templates/blank/src/components/ui/dialog.tsx +1 -4
  210. package/templates/blank/src/components/ui/select.tsx +2 -2
  211. package/templates/blank/src/components/ui/separator.tsx +5 -1
  212. package/templates/blank/src/components/ui/skeleton.tsx +7 -7
  213. package/templates/blank/src/components/ui/table.tsx +1 -1
  214. package/templates/blank/src/components/ui/toaster.tsx +26 -26
  215. package/templates/blank/src/components/ui/tooltip.tsx +1 -1
  216. package/templates/blank/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  217. package/templates/blank/src/lib/locator-group-file-utils.ts +5 -1
  218. package/templates/blank/src/lib/locator-picker/session-manager.ts +1 -2
  219. package/templates/blank/src/lib/metrics/metric-calculator.test.ts +105 -6
  220. package/templates/blank/src/lib/metrics/metric-calculator.ts +39 -40
  221. package/templates/blank/src/lib/sync/sync-executor.ts +1 -4
  222. package/templates/blank/src/lib/sync/sync-pending-counts.test.ts +201 -7
  223. package/templates/blank/src/lib/sync/sync-pending-counts.ts +81 -13
  224. package/templates/blank/src/lib/template-automation-paths.ts +1 -1
  225. package/templates/blank/src/lib/template-sync-utils.d.ts +14 -7
  226. package/templates/blank/src/lib/test-case-utils.ts +6 -6
  227. package/templates/blank/src/lib/test-run/log-formatter.ts +82 -83
  228. package/templates/blank/src/lib/test-run/report-parser.ts +352 -352
  229. package/templates/blank/src/lib/transformers/gherkin-converter.ts +42 -42
  230. package/templates/blank/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  231. package/templates/blank/src/lib/utils/node-param-validation.ts +81 -81
  232. package/templates/blank/src/lib/utils/template-step-file-generator.ts +5 -3
  233. package/templates/blank/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  234. package/templates/blank/src/services/dashboard/dashboard-service.test.ts +28 -1
  235. package/templates/blank/src/services/dashboard/dashboard-service.ts +2 -0
  236. package/templates/blank/src/services/locator/locator-service.test.ts +1 -3
  237. package/templates/blank/src/services/locator/locator-service.ts +3 -1
  238. package/templates/blank/src/services/locator/locator-sync-utils.test.ts +1 -4
  239. package/templates/blank/src/services/module/module-service.ts +1 -4
  240. package/templates/blank/src/services/report/report-service.test.ts +70 -6
  241. package/templates/blank/src/services/report/report-service.ts +52 -9
  242. package/templates/blank/src/services/shared/errors.ts +2 -4
  243. package/templates/blank/src/services/template-step/template-step-service.ts +3 -1
  244. package/templates/blank/src/services/template-step-group/template-step-group-service.ts +3 -1
  245. package/templates/blank/src/services/test-case/test-case-service.ts +0 -5
  246. package/templates/blank/src/services/test-run/test-run-service.test.ts +3 -6
  247. package/templates/blank/src/services/test-run/test-run-service.ts +12 -7
  248. package/templates/blank/src/services/test-suite/test-suite-service.test.ts +1 -5
  249. package/templates/blank/src/services/test-suite/test-suite-service.ts +2 -4
  250. package/templates/blank/src/types/form/actionHandler.ts +1 -5
  251. package/templates/blank/tsconfig.json +8 -8
  252. package/templates/default/packages/locator-picker-companion/dist/cli.d.ts +1 -1
  253. package/templates/default/packages/locator-picker-companion/dist/cli.js +313 -279
  254. package/templates/default/packages/locator-picker-companion/dist/index.d.ts +3 -3
  255. package/templates/default/packages/locator-picker-companion/dist/index.js +3 -3
  256. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.d.ts +1 -1
  257. package/templates/default/packages/locator-picker-companion/dist/injected-picker-script.js +526 -481
  258. package/templates/default/packages/locator-picker-companion/dist/launcher.d.ts +13 -10
  259. package/templates/default/packages/locator-picker-companion/dist/launcher.js +47 -48
  260. package/templates/default/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  261. package/templates/default/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  262. package/templates/default/packages/locator-picker-companion/dist/session-file.d.ts +30 -22
  263. package/templates/default/packages/locator-picker-companion/dist/session-file.js +116 -104
  264. package/templates/default/packages/locator-picker-companion/dist/types.d.ts +25 -25
  265. package/templates/default/packages/locator-picker-companion/dist/types.js +1 -1
  266. package/templates/starter/.editorconfig +11 -0
  267. package/templates/starter/.gitattributes +21 -0
  268. package/templates/starter/.gitconfig.appraise +14 -0
  269. package/templates/starter/.prettierrc +13 -0
  270. package/templates/starter/.vscode/settings.json +2 -0
  271. package/templates/starter/README.md +12 -12
  272. package/templates/starter/automation/steps/actions/click.step.ts +56 -58
  273. package/templates/starter/automation/steps/actions/hover.step.ts +25 -27
  274. package/templates/starter/automation/steps/actions/input.step.ts +85 -108
  275. package/templates/starter/automation/steps/actions/navigation.step.ts +67 -70
  276. package/templates/starter/automation/steps/actions/random_data.step.ts +149 -143
  277. package/templates/starter/automation/steps/actions/store.step.ts +69 -1
  278. package/templates/starter/automation/steps/actions/wait.step.ts +84 -1
  279. package/templates/starter/automation/steps/validations/active_state_assertion.step.ts +28 -30
  280. package/templates/starter/automation/steps/validations/navigation_assertion.step.ts +20 -22
  281. package/templates/starter/automation/steps/validations/text_assertion.step.ts +67 -107
  282. package/templates/starter/automation/steps/validations/visibility_assertion.step.ts +24 -26
  283. package/templates/starter/components.json +24 -24
  284. package/templates/starter/cucumber.mjs +16 -16
  285. package/templates/starter/e2e/README.md +56 -0
  286. package/templates/starter/e2e/apply-migrations.mjs +76 -0
  287. package/templates/starter/e2e/appraise-smoke.spec.ts +78 -0
  288. package/templates/starter/e2e/authoring.spec.ts +53 -0
  289. package/templates/starter/e2e/crud-configuration.spec.ts +138 -0
  290. package/templates/starter/e2e/crud-tests.spec.ts +76 -0
  291. package/templates/starter/e2e/helpers/forms.ts +186 -0
  292. package/templates/starter/e2e/helpers/navigation.ts +27 -0
  293. package/templates/starter/e2e/helpers/table.ts +45 -0
  294. package/templates/starter/e2e/helpers/test-data.ts +549 -0
  295. package/templates/starter/e2e/helpers/ui.ts +41 -0
  296. package/templates/starter/e2e/navigation.spec.ts +101 -0
  297. package/templates/starter/e2e/runs-and-reports.spec.ts +82 -0
  298. package/templates/starter/e2e/settings-sync.spec.ts +39 -0
  299. package/templates/starter/e2e/start-server.mjs +61 -0
  300. package/templates/starter/eslint.config.mjs +4 -4
  301. package/templates/starter/gitignore +0 -3
  302. package/templates/starter/next-env.d.ts +1 -1
  303. package/templates/starter/package-lock.json +58 -102
  304. package/templates/starter/package.json +10 -9
  305. package/templates/starter/packages/cucumber-runtime/package.json +13 -13
  306. package/templates/starter/packages/cucumber-runtime/src/cache.util.ts +93 -93
  307. package/templates/starter/packages/cucumber-runtime/src/cli.ts +77 -68
  308. package/templates/starter/packages/cucumber-runtime/src/environment.util.ts +21 -21
  309. package/templates/starter/packages/cucumber-runtime/src/executor.ts +32 -32
  310. package/templates/starter/packages/cucumber-runtime/src/index.ts +17 -17
  311. package/templates/starter/packages/cucumber-runtime/src/locator.util.ts +234 -234
  312. package/templates/starter/packages/cucumber-runtime/src/parameter-types.ts +7 -7
  313. package/templates/starter/packages/cucumber-runtime/src/random-data.util.ts +35 -35
  314. package/templates/starter/packages/cucumber-runtime/src/types.ts +13 -13
  315. package/templates/starter/packages/cucumber-runtime/src/world.ts +44 -44
  316. package/templates/starter/packages/cucumber-runtime/tsconfig.json +11 -11
  317. package/templates/starter/packages/locator-picker-companion/dist/cli.js +1 -1
  318. package/templates/starter/packages/locator-picker-companion/dist/index.d.ts +3 -3
  319. package/templates/starter/packages/locator-picker-companion/dist/index.js +3 -3
  320. package/templates/starter/packages/locator-picker-companion/dist/injected-picker-script.js +13 -3
  321. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.d.ts +6 -3
  322. package/templates/starter/packages/locator-picker-companion/dist/selector-generator.js +233 -229
  323. package/templates/starter/packages/locator-picker-companion/src/cli.ts +1 -7
  324. package/templates/starter/packages/locator-picker-companion/src/injected-picker-script.ts +26 -5
  325. package/templates/starter/packages/locator-picker-companion/src/launcher.ts +1 -3
  326. package/templates/starter/packages/locator-picker-companion/src/session-file.ts +4 -15
  327. package/templates/starter/packages/locator-picker-companion/src/types.ts +1 -8
  328. package/templates/starter/playwright.config.ts +46 -0
  329. package/templates/starter/postcss.config.mjs +8 -8
  330. package/templates/starter/prisma/dev.db +0 -0
  331. package/templates/starter/scripts/configure-git-line-endings.mjs +91 -0
  332. package/templates/starter/scripts/install-template-step.ts +5 -1
  333. package/templates/starter/scripts/lib/step-matcher.test.ts +3 -3
  334. package/templates/starter/scripts/lib/step-matcher.ts +5 -1
  335. package/templates/starter/scripts/lib/template-step-installer.test.ts +4 -2
  336. package/templates/starter/scripts/lib/template-step-installer.ts +16 -4
  337. package/templates/starter/scripts/lib/template-step-registry.test.ts +1 -1
  338. package/templates/starter/scripts/lib/template-step-registry.ts +4 -1
  339. package/templates/starter/scripts/run-fallow-commit.mjs +4 -6
  340. package/templates/starter/scripts/sync-all.ts +7 -6
  341. package/templates/starter/scripts/sync-appraise-base-template.ts +84 -77
  342. package/templates/starter/scripts/sync-environments.ts +47 -44
  343. package/templates/starter/scripts/sync-locator-groups.ts +67 -76
  344. package/templates/starter/scripts/sync-locators.ts +50 -53
  345. package/templates/starter/scripts/sync-modules.ts +42 -42
  346. package/templates/starter/scripts/sync-tags.ts +51 -51
  347. package/templates/starter/scripts/sync-template-step-groups.ts +34 -32
  348. package/templates/starter/scripts/sync-template-steps.ts +97 -97
  349. package/templates/starter/scripts/sync-test-cases.ts +65 -74
  350. package/templates/starter/scripts/sync-test-suites.ts +85 -80
  351. package/templates/starter/src/actions/server-action-boundary.test.ts +1 -7
  352. package/templates/starter/src/actions/settings/sync-actions.ts +3 -1
  353. package/templates/starter/src/actions/tags/tag-actions.ts +1 -7
  354. package/templates/starter/src/actions/template-test-case/template-test-case-actions.ts +3 -1
  355. package/templates/starter/src/app/(base)/environments/create/page.tsx +28 -28
  356. package/templates/starter/src/app/(base)/environments/environment-form.tsx +3 -2
  357. package/templates/starter/src/app/(base)/environments/environment-helpers.ts +4 -1
  358. package/templates/starter/src/app/(base)/layout.tsx +10 -10
  359. package/templates/starter/src/app/(base)/locator-groups/locator-group-form.tsx +5 -3
  360. package/templates/starter/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
  361. package/templates/starter/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
  362. package/templates/starter/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
  363. package/templates/starter/src/app/(base)/locator-groups/page.tsx +9 -19
  364. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-helpers.test.ts +3 -6
  365. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-response.ts +22 -5
  366. package/templates/starter/src/app/(base)/locators/create/create-locator-workspace-state.ts +5 -1
  367. package/templates/starter/src/app/(base)/locators/create/use-locator-workspace.ts +7 -2
  368. package/templates/starter/src/app/(base)/locators/locator-file-sync.ts +1 -5
  369. package/templates/starter/src/app/(base)/locators/locator-helpers.ts +2 -12
  370. package/templates/starter/src/app/(base)/locators/locator-table-columns.tsx +59 -60
  371. package/templates/starter/src/app/(base)/modules/module-form.tsx +3 -1
  372. package/templates/starter/src/app/(base)/reports/overview-chart.tsx +49 -49
  373. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +114 -115
  374. package/templates/starter/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
  375. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +80 -79
  376. package/templates/starter/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +29 -27
  377. package/templates/starter/src/app/(base)/settings/settings-sync-panel-helpers.test.tsx +4 -6
  378. package/templates/starter/src/app/(base)/settings/settings-sync-panel.tsx +22 -23
  379. package/templates/starter/src/app/(base)/tags/tag-form.test.tsx +2 -10
  380. package/templates/starter/src/app/(base)/tags/tag-form.tsx +5 -3
  381. package/templates/starter/src/app/(base)/tags/tag-table-columns.tsx +63 -63
  382. package/templates/starter/src/app/(base)/tags/tag-table.tsx +29 -29
  383. package/templates/starter/src/app/(base)/template-step-groups/create/page.tsx +28 -28
  384. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-form.tsx +3 -1
  385. package/templates/starter/src/app/(base)/template-step-groups/template-step-group-helpers.ts +4 -1
  386. package/templates/starter/src/app/(base)/template-steps/paramChip.tsx +6 -10
  387. package/templates/starter/src/app/(base)/template-steps/template-step-form-helpers.ts +4 -2
  388. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.test.ts +19 -1
  389. package/templates/starter/src/app/(base)/template-steps/template-step-helpers.ts +1 -5
  390. package/templates/starter/src/app/(base)/template-steps/template-step-row-guards.ts +1 -5
  391. package/templates/starter/src/app/(base)/template-steps/template-step-types.ts +1 -5
  392. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.test.ts +4 -1
  393. package/templates/starter/src/app/(base)/template-test-cases/create-template-test-case-page-data.ts +1 -2
  394. package/templates/starter/src/app/(base)/template-test-cases/modify/[id]/page.tsx +1 -0
  395. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-flow.test.tsx +0 -1
  396. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-form.tsx +3 -1
  397. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
  398. package/templates/starter/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
  399. package/templates/starter/src/app/(base)/test-cases/create/page.tsx +1 -5
  400. package/templates/starter/src/app/(base)/test-cases/create-from-template/create-from-template-selection-helpers.ts +1 -4
  401. package/templates/starter/src/app/(base)/test-cases/create-from-template/page.test.tsx +2 -2
  402. package/templates/starter/src/app/(base)/test-cases/inline-tag-creation-dialog.tsx +1 -7
  403. package/templates/starter/src/app/(base)/test-cases/inline-test-suite-creation-dialog.tsx +1 -7
  404. package/templates/starter/src/app/(base)/test-cases/modify/[id]/page.tsx +1 -5
  405. package/templates/starter/src/app/(base)/test-cases/test-case-form.tsx +63 -78
  406. package/templates/starter/src/app/(base)/test-cases/test-case-route-helpers.test.ts +2 -7
  407. package/templates/starter/src/app/(base)/test-suites/editable-test-suite-helpers.ts +1 -6
  408. package/templates/starter/src/app/(base)/test-suites/test-suite-form.test.tsx +2 -10
  409. package/templates/starter/src/app/(dashboard-components)/data-card-grid.tsx +10 -10
  410. package/templates/starter/src/app/api/test-runs/[runId]/download/route.ts +1 -4
  411. package/templates/starter/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.test.ts +18 -9
  412. package/templates/starter/src/assets/icons/empty-tube.tsx +23 -23
  413. package/templates/starter/src/assets/icons/tube-plus.tsx +29 -29
  414. package/templates/starter/src/components/data-visualization/info-card.tsx +56 -70
  415. package/templates/starter/src/components/data-visualization/info-grid.tsx +22 -22
  416. package/templates/starter/src/components/diagram/add-node-prompt-node.tsx +1 -1
  417. package/templates/starter/src/components/diagram/dynamic-parameters-helpers.ts +4 -3
  418. package/templates/starter/src/components/diagram/dynamic-parameters.test.tsx +4 -1
  419. package/templates/starter/src/components/diagram/dynamic-parameters.tsx +0 -1
  420. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.test.tsx +26 -0
  421. package/templates/starter/src/components/diagram/flow-diagram-block-dialog.tsx +3 -1
  422. package/templates/starter/src/components/diagram/flow-diagram-connection-guards.ts +24 -6
  423. package/templates/starter/src/components/diagram/flow-diagram-helpers.test.ts +27 -0
  424. package/templates/starter/src/components/diagram/flow-diagram-node-search.tsx +65 -65
  425. package/templates/starter/src/components/diagram/flow-diagram-toolbar.tsx +1 -3
  426. package/templates/starter/src/components/diagram/flow-diagram-view.tsx +1 -7
  427. package/templates/starter/src/components/diagram/flow-node-data-helpers.ts +1 -1
  428. package/templates/starter/src/components/diagram/node-form-fields-content.tsx +9 -2
  429. package/templates/starter/src/components/diagram/node-form-helpers.test.ts +3 -1
  430. package/templates/starter/src/components/diagram/node-form-helpers.ts +1 -4
  431. package/templates/starter/src/components/diagram/node-form-template-step-selection.ts +1 -4
  432. package/templates/starter/src/components/diagram/node-form.test.tsx +25 -0
  433. package/templates/starter/src/components/diagram/node-form.tsx +2 -12
  434. package/templates/starter/src/components/diagram/options-header-node.test.tsx +4 -1
  435. package/templates/starter/src/components/diagram/options-header-node.tsx +140 -130
  436. package/templates/starter/src/components/diagram/use-flow-diagram.ts +1 -2
  437. package/templates/starter/src/components/form/error-message.tsx +7 -7
  438. package/templates/starter/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
  439. package/templates/starter/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
  440. package/templates/starter/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
  441. package/templates/starter/src/components/navigation/entity-search-command.tsx +3 -9
  442. package/templates/starter/src/components/navigation/nav-link.tsx +60 -60
  443. package/templates/starter/src/components/test-case/test-case-form-helpers.test.ts +1 -5
  444. package/templates/starter/src/components/test-case/test-case-form-helpers.ts +1 -5
  445. package/templates/starter/src/components/test-case/test-case-picker-helpers.ts +8 -7
  446. package/templates/starter/src/components/test-case/test-case-picker.tsx +2 -6
  447. package/templates/starter/src/components/test-run/log-viewer.test.tsx +25 -0
  448. package/templates/starter/src/components/test-run/log-viewer.tsx +2 -2
  449. package/templates/starter/src/components/test-run/test-run-details-guards.ts +10 -1
  450. package/templates/starter/src/components/test-run/test-run-details.test.tsx +9 -19
  451. package/templates/starter/src/components/test-run/use-log-viewer.ts +2 -8
  452. package/templates/starter/src/components/test-run/use-test-run-header.ts +1 -4
  453. package/templates/starter/src/components/test-suite/test-suite-picker.tsx +1 -1
  454. package/templates/starter/src/components/theme/theme-provider.tsx +7 -1
  455. package/templates/starter/src/components/typography/page-header-subtitle.tsx +7 -7
  456. package/templates/starter/src/components/typography/page-header.tsx +7 -7
  457. package/templates/starter/src/components/ui/chart.tsx +2 -8
  458. package/templates/starter/src/components/ui/command.tsx +2 -5
  459. package/templates/starter/src/components/ui/data-table-column-header.tsx +3 -3
  460. package/templates/starter/src/components/ui/data-table.test.tsx +1 -8
  461. package/templates/starter/src/components/ui/dialog.tsx +1 -4
  462. package/templates/starter/src/components/ui/select.tsx +2 -2
  463. package/templates/starter/src/components/ui/separator.tsx +5 -1
  464. package/templates/starter/src/components/ui/skeleton.tsx +7 -7
  465. package/templates/starter/src/components/ui/table.tsx +1 -1
  466. package/templates/starter/src/components/ui/toaster.tsx +26 -26
  467. package/templates/starter/src/components/ui/tooltip.tsx +1 -1
  468. package/templates/starter/src/constants/form-opts/locator-group-form-opts.ts +1 -1
  469. package/templates/starter/src/lib/locator-group-file-utils.ts +5 -1
  470. package/templates/starter/src/lib/locator-picker/session-manager.ts +1 -2
  471. package/templates/starter/src/lib/metrics/metric-calculator.test.ts +105 -6
  472. package/templates/starter/src/lib/metrics/metric-calculator.ts +39 -40
  473. package/templates/starter/src/lib/sync/sync-executor.ts +1 -4
  474. package/templates/starter/src/lib/sync/sync-pending-counts.test.ts +201 -7
  475. package/templates/starter/src/lib/sync/sync-pending-counts.ts +81 -13
  476. package/templates/starter/src/lib/template-automation-paths.ts +1 -1
  477. package/templates/starter/src/lib/template-sync-utils.d.ts +14 -7
  478. package/templates/starter/src/lib/test-case-utils.ts +6 -6
  479. package/templates/starter/src/lib/test-run/log-formatter.ts +82 -83
  480. package/templates/starter/src/lib/test-run/report-parser.ts +352 -352
  481. package/templates/starter/src/lib/transformers/gherkin-converter.ts +42 -42
  482. package/templates/starter/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
  483. package/templates/starter/src/lib/utils/node-param-validation.ts +81 -81
  484. package/templates/starter/src/lib/utils/template-step-file-generator.ts +5 -3
  485. package/templates/starter/src/lib/utils/template-step-file-manager-intelligent.ts +11 -1
  486. package/templates/starter/src/services/dashboard/dashboard-service.test.ts +28 -1
  487. package/templates/starter/src/services/dashboard/dashboard-service.ts +2 -0
  488. package/templates/starter/src/services/locator/locator-service.test.ts +1 -3
  489. package/templates/starter/src/services/locator/locator-service.ts +3 -1
  490. package/templates/starter/src/services/locator/locator-sync-utils.test.ts +1 -4
  491. package/templates/starter/src/services/module/module-service.ts +1 -4
  492. package/templates/starter/src/services/report/report-service.test.ts +70 -6
  493. package/templates/starter/src/services/report/report-service.ts +52 -9
  494. package/templates/starter/src/services/shared/errors.ts +2 -4
  495. package/templates/starter/src/services/template-step/template-step-service.ts +3 -1
  496. package/templates/starter/src/services/template-step-group/template-step-group-service.ts +3 -1
  497. package/templates/starter/src/services/test-case/test-case-service.ts +0 -5
  498. package/templates/starter/src/services/test-run/test-run-service.test.ts +3 -6
  499. package/templates/starter/src/services/test-run/test-run-service.ts +12 -7
  500. package/templates/starter/src/services/test-suite/test-suite-service.test.ts +1 -5
  501. package/templates/starter/src/services/test-suite/test-suite-service.ts +2 -4
  502. package/templates/starter/src/types/form/actionHandler.ts +1 -5
  503. package/templates/starter/tsconfig.json +8 -8
@@ -1,22 +1,30 @@
1
- import type { CompanionSessionFile } from './types.js';
2
- export declare function getLocatorPickerRootDir(repoRoot?: string): string;
3
- export declare function getLocatorPickerSessionsDir(repoRoot?: string): string;
4
- export declare function getLocatorPickerProfilesDir(repoRoot?: string): string;
5
- export declare function getLocatorPickerLogsDir(repoRoot?: string): string;
6
- export declare function getLocatorPickerProfileDir(sessionId: string, repoRoot?: string): string;
7
- export declare function getLocatorPickerRuntimeDir(repoRoot?: string): string;
8
- export declare function getLocatorPickerRuntimeHomeDir(repoRoot?: string): string;
9
- export declare function getLocatorPickerRuntimeEnv(repoRoot?: string, baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
10
- export declare function getLocatorPickerSessionFilePath(sessionId: string, repoRoot?: string): string;
11
- export declare function getLocatorPickerCrashLogPath(sessionId: string, repoRoot?: string): string;
12
- export declare function removeLocatorPickerProfileDir(sessionId: string, repoRoot?: string): Promise<void>;
13
- export declare function removeLocatorPickerSessionFile(sessionId: string, repoRoot?: string): Promise<void>;
14
- export declare function clearLocatorPickerCrashLogs(repoRoot?: string): Promise<void>;
15
- export declare function createLocatorPickerCrashLog(logFilePath: string): Promise<void>;
16
- export declare function appendLocatorPickerCrashLog(logFilePath: string, message: string): Promise<void>;
17
- export declare function ensureLocatorPickerDirectories(repoRoot?: string): Promise<void>;
18
- export declare function readLocatorPickerSessionFile(sessionFilePath: string): Promise<CompanionSessionFile | null>;
19
- export declare function writeLocatorPickerSessionFile(sessionFilePath: string, session: Omit<CompanionSessionFile, 'updatedAt'> & {
20
- updatedAt?: string;
21
- }): Promise<CompanionSessionFile>;
22
- export declare function patchLocatorPickerSessionFile(sessionFilePath: string, patch: Partial<CompanionSessionFile> | ((current: CompanionSessionFile) => Partial<CompanionSessionFile> | CompanionSessionFile)): Promise<CompanionSessionFile | null>;
1
+ import type { CompanionSessionFile } from './types.js'
2
+ export declare function getLocatorPickerRootDir(repoRoot?: string): string
3
+ export declare function getLocatorPickerSessionsDir(repoRoot?: string): string
4
+ export declare function getLocatorPickerProfilesDir(repoRoot?: string): string
5
+ export declare function getLocatorPickerLogsDir(repoRoot?: string): string
6
+ export declare function getLocatorPickerProfileDir(sessionId: string, repoRoot?: string): string
7
+ export declare function getLocatorPickerRuntimeDir(repoRoot?: string): string
8
+ export declare function getLocatorPickerRuntimeHomeDir(repoRoot?: string): string
9
+ export declare function getLocatorPickerRuntimeEnv(repoRoot?: string, baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv
10
+ export declare function getLocatorPickerSessionFilePath(sessionId: string, repoRoot?: string): string
11
+ export declare function getLocatorPickerCrashLogPath(sessionId: string, repoRoot?: string): string
12
+ export declare function removeLocatorPickerProfileDir(sessionId: string, repoRoot?: string): Promise<void>
13
+ export declare function removeLocatorPickerSessionFile(sessionId: string, repoRoot?: string): Promise<void>
14
+ export declare function clearLocatorPickerCrashLogs(repoRoot?: string): Promise<void>
15
+ export declare function createLocatorPickerCrashLog(logFilePath: string): Promise<void>
16
+ export declare function appendLocatorPickerCrashLog(logFilePath: string, message: string): Promise<void>
17
+ export declare function ensureLocatorPickerDirectories(repoRoot?: string): Promise<void>
18
+ export declare function readLocatorPickerSessionFile(sessionFilePath: string): Promise<CompanionSessionFile | null>
19
+ export declare function writeLocatorPickerSessionFile(
20
+ sessionFilePath: string,
21
+ session: Omit<CompanionSessionFile, 'updatedAt'> & {
22
+ updatedAt?: string
23
+ },
24
+ ): Promise<CompanionSessionFile>
25
+ export declare function patchLocatorPickerSessionFile(
26
+ sessionFilePath: string,
27
+ patch:
28
+ | Partial<CompanionSessionFile>
29
+ | ((current: CompanionSessionFile) => Partial<CompanionSessionFile> | CompanionSessionFile),
30
+ ): Promise<CompanionSessionFile | null>
@@ -1,150 +1,162 @@
1
- import { randomUUID } from 'crypto';
2
- import { access, appendFile, mkdir, readFile, rename, rm, unlink, writeFile } from 'fs/promises';
3
- import path from 'path';
4
- const sessionFileOperationQueue = new Map();
1
+ import { randomUUID } from 'crypto'
2
+ import { access, appendFile, mkdir, readFile, rename, rm, unlink, writeFile } from 'fs/promises'
3
+ import path from 'path'
4
+ const sessionFileOperationQueue = new Map()
5
5
  function withTimestamp(session) {
6
- var _a;
7
- return Object.assign(Object.assign({}, session), { updatedAt: (_a = session.updatedAt) !== null && _a !== void 0 ? _a : new Date().toISOString() });
6
+ var _a
7
+ return Object.assign(Object.assign({}, session), {
8
+ updatedAt: (_a = session.updatedAt) !== null && _a !== void 0 ? _a : new Date().toISOString(),
9
+ })
8
10
  }
9
11
  export function getLocatorPickerRootDir(repoRoot = process.cwd()) {
10
- return path.join(repoRoot, '.tmp', 'locator-picker');
12
+ return path.join(repoRoot, '.tmp', 'locator-picker')
11
13
  }
12
14
  export function getLocatorPickerSessionsDir(repoRoot = process.cwd()) {
13
- return path.join(getLocatorPickerRootDir(repoRoot), 'sessions');
15
+ return path.join(getLocatorPickerRootDir(repoRoot), 'sessions')
14
16
  }
15
17
  export function getLocatorPickerProfilesDir(repoRoot = process.cwd()) {
16
- return path.join(getLocatorPickerRootDir(repoRoot), 'profiles');
18
+ return path.join(getLocatorPickerRootDir(repoRoot), 'profiles')
17
19
  }
18
20
  export function getLocatorPickerLogsDir(repoRoot = process.cwd()) {
19
- return path.join(getLocatorPickerRootDir(repoRoot), 'logs');
21
+ return path.join(getLocatorPickerRootDir(repoRoot), 'logs')
20
22
  }
21
23
  export function getLocatorPickerProfileDir(sessionId, repoRoot = process.cwd()) {
22
- return path.join(getLocatorPickerProfilesDir(repoRoot), sessionId);
24
+ return path.join(getLocatorPickerProfilesDir(repoRoot), sessionId)
23
25
  }
24
26
  export function getLocatorPickerRuntimeDir(repoRoot = process.cwd()) {
25
- return path.join(getLocatorPickerRootDir(repoRoot), 'runtime');
27
+ return path.join(getLocatorPickerRootDir(repoRoot), 'runtime')
26
28
  }
27
29
  export function getLocatorPickerRuntimeHomeDir(repoRoot = process.cwd()) {
28
- return path.join(getLocatorPickerRuntimeDir(repoRoot), 'home');
30
+ return path.join(getLocatorPickerRuntimeDir(repoRoot), 'home')
29
31
  }
30
32
  export function getLocatorPickerRuntimeEnv(repoRoot = process.cwd(), baseEnv = process.env) {
31
- const runtimeDir = getLocatorPickerRuntimeDir(repoRoot);
32
- const runtimeHomeDir = getLocatorPickerRuntimeHomeDir(repoRoot);
33
- const tempDir = path.join(runtimeDir, 'tmp');
34
- const configDir = path.join(runtimeDir, 'config');
35
- const cacheDir = path.join(runtimeDir, 'cache');
36
- const appDataDir = path.join(runtimeDir, 'appdata');
37
- const localAppDataDir = path.join(runtimeDir, 'localappdata');
38
- return Object.assign(Object.assign({}, baseEnv), { HOME: runtimeHomeDir, USERPROFILE: runtimeHomeDir, APPDATA: appDataDir, LOCALAPPDATA: localAppDataDir, XDG_CONFIG_HOME: configDir, XDG_CACHE_HOME: cacheDir, TMPDIR: tempDir, TMP: tempDir, TEMP: tempDir });
33
+ const runtimeDir = getLocatorPickerRuntimeDir(repoRoot)
34
+ const runtimeHomeDir = getLocatorPickerRuntimeHomeDir(repoRoot)
35
+ const tempDir = path.join(runtimeDir, 'tmp')
36
+ const configDir = path.join(runtimeDir, 'config')
37
+ const cacheDir = path.join(runtimeDir, 'cache')
38
+ const appDataDir = path.join(runtimeDir, 'appdata')
39
+ const localAppDataDir = path.join(runtimeDir, 'localappdata')
40
+ return Object.assign(Object.assign({}, baseEnv), {
41
+ HOME: runtimeHomeDir,
42
+ USERPROFILE: runtimeHomeDir,
43
+ APPDATA: appDataDir,
44
+ LOCALAPPDATA: localAppDataDir,
45
+ XDG_CONFIG_HOME: configDir,
46
+ XDG_CACHE_HOME: cacheDir,
47
+ TMPDIR: tempDir,
48
+ TMP: tempDir,
49
+ TEMP: tempDir,
50
+ })
39
51
  }
40
52
  export function getLocatorPickerSessionFilePath(sessionId, repoRoot = process.cwd()) {
41
- return path.join(getLocatorPickerSessionsDir(repoRoot), `${sessionId}.json`);
53
+ return path.join(getLocatorPickerSessionsDir(repoRoot), `${sessionId}.json`)
42
54
  }
43
55
  export function getLocatorPickerCrashLogPath(sessionId, repoRoot = process.cwd()) {
44
- return path.join(getLocatorPickerLogsDir(repoRoot), `${sessionId}.log`);
56
+ return path.join(getLocatorPickerLogsDir(repoRoot), `${sessionId}.log`)
45
57
  }
46
58
  export async function removeLocatorPickerProfileDir(sessionId, repoRoot = process.cwd()) {
47
- await rm(getLocatorPickerProfileDir(sessionId, repoRoot), {
48
- force: true,
49
- recursive: true,
50
- }).catch(() => undefined);
59
+ await rm(getLocatorPickerProfileDir(sessionId, repoRoot), {
60
+ force: true,
61
+ recursive: true,
62
+ }).catch(() => undefined)
51
63
  }
52
64
  export async function removeLocatorPickerSessionFile(sessionId, repoRoot = process.cwd()) {
53
- await unlink(getLocatorPickerSessionFilePath(sessionId, repoRoot)).catch(() => undefined);
65
+ await unlink(getLocatorPickerSessionFilePath(sessionId, repoRoot)).catch(() => undefined)
54
66
  }
55
67
  export async function clearLocatorPickerCrashLogs(repoRoot = process.cwd()) {
56
- await rm(getLocatorPickerLogsDir(repoRoot), {
57
- force: true,
58
- recursive: true,
59
- }).catch(() => console.error('Failed to clear locator picker crash logs.'));
60
- await mkdir(getLocatorPickerLogsDir(repoRoot), { recursive: true });
68
+ await rm(getLocatorPickerLogsDir(repoRoot), {
69
+ force: true,
70
+ recursive: true,
71
+ }).catch(() => console.error('Failed to clear locator picker crash logs.'))
72
+ await mkdir(getLocatorPickerLogsDir(repoRoot), { recursive: true })
61
73
  }
62
74
  export async function createLocatorPickerCrashLog(logFilePath) {
63
- await mkdir(path.dirname(logFilePath), { recursive: true });
64
- await writeFile(logFilePath, '', 'utf8');
75
+ await mkdir(path.dirname(logFilePath), { recursive: true })
76
+ await writeFile(logFilePath, '', 'utf8')
65
77
  }
66
78
  export async function appendLocatorPickerCrashLog(logFilePath, message) {
67
- try {
68
- await access(logFilePath);
69
- }
70
- catch (_a) {
71
- return;
72
- }
73
- await appendFile(logFilePath, `[${new Date().toISOString()}] ${message}\n`, 'utf8');
79
+ try {
80
+ await access(logFilePath)
81
+ } catch (_a) {
82
+ return
83
+ }
84
+ await appendFile(logFilePath, `[${new Date().toISOString()}] ${message}\n`, 'utf8')
74
85
  }
75
86
  export async function ensureLocatorPickerDirectories(repoRoot = process.cwd()) {
76
- const runtimeDir = getLocatorPickerRuntimeDir(repoRoot);
77
- const runtimeHomeDir = getLocatorPickerRuntimeHomeDir(repoRoot);
78
- const tempDir = path.join(runtimeDir, 'tmp');
79
- const configDir = path.join(runtimeDir, 'config');
80
- const cacheDir = path.join(runtimeDir, 'cache');
81
- const appDataDir = path.join(runtimeDir, 'appdata');
82
- const localAppDataDir = path.join(runtimeDir, 'localappdata');
83
- await mkdir(getLocatorPickerSessionsDir(repoRoot), { recursive: true });
84
- await mkdir(getLocatorPickerProfilesDir(repoRoot), { recursive: true });
85
- await mkdir(getLocatorPickerLogsDir(repoRoot), { recursive: true });
86
- await mkdir(runtimeHomeDir, { recursive: true });
87
- await mkdir(tempDir, { recursive: true });
88
- await mkdir(configDir, { recursive: true });
89
- await mkdir(cacheDir, { recursive: true });
90
- await mkdir(appDataDir, { recursive: true });
91
- await mkdir(localAppDataDir, { recursive: true });
87
+ const runtimeDir = getLocatorPickerRuntimeDir(repoRoot)
88
+ const runtimeHomeDir = getLocatorPickerRuntimeHomeDir(repoRoot)
89
+ const tempDir = path.join(runtimeDir, 'tmp')
90
+ const configDir = path.join(runtimeDir, 'config')
91
+ const cacheDir = path.join(runtimeDir, 'cache')
92
+ const appDataDir = path.join(runtimeDir, 'appdata')
93
+ const localAppDataDir = path.join(runtimeDir, 'localappdata')
94
+ await mkdir(getLocatorPickerSessionsDir(repoRoot), { recursive: true })
95
+ await mkdir(getLocatorPickerProfilesDir(repoRoot), { recursive: true })
96
+ await mkdir(getLocatorPickerLogsDir(repoRoot), { recursive: true })
97
+ await mkdir(runtimeHomeDir, { recursive: true })
98
+ await mkdir(tempDir, { recursive: true })
99
+ await mkdir(configDir, { recursive: true })
100
+ await mkdir(cacheDir, { recursive: true })
101
+ await mkdir(appDataDir, { recursive: true })
102
+ await mkdir(localAppDataDir, { recursive: true })
92
103
  }
93
104
  export async function readLocatorPickerSessionFile(sessionFilePath) {
94
- try {
95
- const raw = await readFile(sessionFilePath, 'utf8');
96
- return JSON.parse(raw);
97
- }
98
- catch (_a) {
99
- return null;
100
- }
105
+ try {
106
+ const raw = await readFile(sessionFilePath, 'utf8')
107
+ return JSON.parse(raw)
108
+ } catch (_a) {
109
+ return null
110
+ }
101
111
  }
102
112
  async function enqueueSessionFileOperation(sessionFilePath, operation) {
103
- var _a;
104
- const previousOperation = (_a = sessionFileOperationQueue.get(sessionFilePath)) !== null && _a !== void 0 ? _a : Promise.resolve();
105
- const nextOperation = previousOperation.catch(() => undefined).then(operation);
106
- sessionFileOperationQueue.set(sessionFilePath, nextOperation);
107
- try {
108
- return await nextOperation;
109
- }
110
- finally {
111
- if (sessionFileOperationQueue.get(sessionFilePath) === nextOperation) {
112
- sessionFileOperationQueue.delete(sessionFilePath);
113
- }
113
+ var _a
114
+ const previousOperation =
115
+ (_a = sessionFileOperationQueue.get(sessionFilePath)) !== null && _a !== void 0 ? _a : Promise.resolve()
116
+ const nextOperation = previousOperation.catch(() => undefined).then(operation)
117
+ sessionFileOperationQueue.set(sessionFilePath, nextOperation)
118
+ try {
119
+ return await nextOperation
120
+ } finally {
121
+ if (sessionFileOperationQueue.get(sessionFilePath) === nextOperation) {
122
+ sessionFileOperationQueue.delete(sessionFilePath)
114
123
  }
124
+ }
115
125
  }
116
126
  async function writeLocatorPickerSessionFileImmediate(sessionFilePath, session) {
117
- await mkdir(path.dirname(sessionFilePath), { recursive: true });
118
- const normalized = withTimestamp(session);
119
- const serialized = `${JSON.stringify(normalized, null, 2)}\n`;
120
- const tempFilePath = `${sessionFilePath}.${process.pid}.${randomUUID()}.tmp`;
121
- try {
122
- await writeFile(tempFilePath, serialized, 'utf8');
123
- await rename(tempFilePath, sessionFilePath);
124
- }
125
- catch (error) {
126
- await unlink(tempFilePath).catch(() => undefined);
127
- const code = error instanceof Error && 'code' in error ? String(error.code) : '';
128
- if (process.platform === 'win32' || code === 'EPERM' || code === 'EACCES' || code === 'ENOENT') {
129
- await writeFile(sessionFilePath, serialized, 'utf8');
130
- }
131
- else {
132
- throw error;
133
- }
127
+ await mkdir(path.dirname(sessionFilePath), { recursive: true })
128
+ const normalized = withTimestamp(session)
129
+ const serialized = `${JSON.stringify(normalized, null, 2)}\n`
130
+ const tempFilePath = `${sessionFilePath}.${process.pid}.${randomUUID()}.tmp`
131
+ try {
132
+ await writeFile(tempFilePath, serialized, 'utf8')
133
+ await rename(tempFilePath, sessionFilePath)
134
+ } catch (error) {
135
+ await unlink(tempFilePath).catch(() => undefined)
136
+ const code = error instanceof Error && 'code' in error ? String(error.code) : ''
137
+ if (process.platform === 'win32' || code === 'EPERM' || code === 'EACCES' || code === 'ENOENT') {
138
+ await writeFile(sessionFilePath, serialized, 'utf8')
139
+ } else {
140
+ throw error
134
141
  }
135
- return normalized;
142
+ }
143
+ return normalized
136
144
  }
137
145
  export async function writeLocatorPickerSessionFile(sessionFilePath, session) {
138
- return enqueueSessionFileOperation(sessionFilePath, () => writeLocatorPickerSessionFileImmediate(sessionFilePath, session));
146
+ return enqueueSessionFileOperation(sessionFilePath, () =>
147
+ writeLocatorPickerSessionFileImmediate(sessionFilePath, session),
148
+ )
139
149
  }
140
150
  export async function patchLocatorPickerSessionFile(sessionFilePath, patch) {
141
- return enqueueSessionFileOperation(sessionFilePath, async () => {
142
- const current = await readLocatorPickerSessionFile(sessionFilePath);
143
- if (!current) {
144
- return null;
145
- }
146
- const nextPatch = typeof patch === 'function' ? patch(current) : patch;
147
- const nextSession = Object.assign(Object.assign(Object.assign({}, current), nextPatch), { updatedAt: new Date().toISOString() });
148
- return writeLocatorPickerSessionFileImmediate(sessionFilePath, nextSession);
149
- });
151
+ return enqueueSessionFileOperation(sessionFilePath, async () => {
152
+ const current = await readLocatorPickerSessionFile(sessionFilePath)
153
+ if (!current) {
154
+ return null
155
+ }
156
+ const nextPatch = typeof patch === 'function' ? patch(current) : patch
157
+ const nextSession = Object.assign(Object.assign(Object.assign({}, current), nextPatch), {
158
+ updatedAt: new Date().toISOString(),
159
+ })
160
+ return writeLocatorPickerSessionFileImmediate(sessionFilePath, nextSession)
161
+ })
150
162
  }
@@ -1,31 +1,31 @@
1
- export type CompanionSessionStatus = 'starting' | 'ready' | 'picked' | 'saving' | 'closed' | 'error';
2
- export type CompanionPickedLocatorStrategy = 'test-id' | 'role' | 'label' | 'placeholder' | 'id' | 'css' | 'xpath';
1
+ export type CompanionSessionStatus = 'starting' | 'ready' | 'picked' | 'saving' | 'closed' | 'error'
2
+ export type CompanionPickedLocatorStrategy = 'test-id' | 'role' | 'label' | 'placeholder' | 'id' | 'css' | 'xpath'
3
3
  export interface CompanionLaunchSource {
4
- environmentId?: string;
5
- environmentName?: string;
6
- url: string;
4
+ environmentId?: string
5
+ environmentName?: string
6
+ url: string
7
7
  }
8
8
  export interface CompanionPickedLocatorPayload {
9
- selector: string;
10
- currentUrl: string;
11
- pathname: string;
12
- pageTitle: string;
13
- tagName: string;
14
- text?: string;
15
- accessibleName?: string;
16
- strategy?: CompanionPickedLocatorStrategy;
9
+ selector: string
10
+ currentUrl: string
11
+ pathname: string
12
+ pageTitle: string
13
+ tagName: string
14
+ text?: string
15
+ accessibleName?: string
16
+ strategy?: CompanionPickedLocatorStrategy
17
17
  }
18
18
  export interface CompanionSessionFile {
19
- sessionId: string;
20
- status: CompanionSessionStatus;
21
- launchSource: CompanionLaunchSource;
22
- currentUrl: string;
23
- currentPathname: string;
24
- pageTitle: string;
25
- companionPid: number | null;
26
- crashLogPath?: string;
27
- pickedLocator?: CompanionPickedLocatorPayload;
28
- error?: string;
29
- startedAt: string;
30
- updatedAt: string;
19
+ sessionId: string
20
+ status: CompanionSessionStatus
21
+ launchSource: CompanionLaunchSource
22
+ currentUrl: string
23
+ currentPathname: string
24
+ pageTitle: string
25
+ companionPid: number | null
26
+ crashLogPath?: string
27
+ pickedLocator?: CompanionPickedLocatorPayload
28
+ error?: string
29
+ startedAt: string
30
+ updatedAt: string
31
31
  }
@@ -1 +1 @@
1
- export {};
1
+ export {}
@@ -0,0 +1,11 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = space
8
+ indent_size = 2
9
+
10
+ [*.md]
11
+ trim_trailing_whitespace = false
@@ -0,0 +1,21 @@
1
+ # Line endings: LF in Git (matches .editorconfig, .prettierrc endOfLine=lf).
2
+ # Run `npm run setup:git` on Windows so local core.autocrlf does not fight this file.
3
+
4
+ * text=auto eol=lf
5
+
6
+ *.{ts,tsx,js,mjs,cjs,jsx,json,md,mdx,yml,yaml,css,scss,html,prisma,sql,feature} text eol=lf
7
+
8
+ *.bat text eol=crlf
9
+ *.cmd text eol=crlf
10
+ *.ps1 text eol=crlf
11
+
12
+ *.ico binary
13
+ *.png binary
14
+ *.jpg binary
15
+ *.jpeg binary
16
+ *.gif binary
17
+ *.pdf binary
18
+ *.woff binary
19
+ *.woff2 binary
20
+ *.ttf binary
21
+ *.eot binary
@@ -0,0 +1,14 @@
1
+ # AppraiseJS repository Git defaults (LF). Applied via:
2
+ # npm run setup:git
3
+ # which runs: git config --local include.path ../.gitconfig.appraise
4
+ #
5
+ # Keeps index and working-tree diffs aligned with .gitattributes (eol=lf) on Windows.
6
+
7
+ [core]
8
+ autocrlf = false
9
+ eol = lf
10
+ safecrlf = warn
11
+
12
+ [diff]
13
+ # Ignore CRLF-only noise when comparing index to working tree (safety net).
14
+ ignoreCrAtEol = true
@@ -0,0 +1,13 @@
1
+ {
2
+ "semi": false,
3
+ "singleQuote": true,
4
+ "trailingComma": "all",
5
+ "arrowParens": "avoid",
6
+ "printWidth": 120,
7
+ "tabWidth": 2,
8
+ "useTabs": false,
9
+ "bracketSpacing": true,
10
+ "bracketSameLine": false,
11
+ "endOfLine": "lf",
12
+ "plugins": ["prettier-plugin-tailwindcss"]
13
+ }
@@ -1,4 +1,6 @@
1
1
  {
2
+ "files.eol": "\n",
3
+ "git.autocrlf": false,
2
4
  "cucumber.features": ["automation/features/**/*.feature"],
3
5
  "cucumber.glue": ["automation/steps/**/*.ts"],
4
6
  "prisma.pinToPrisma6": true,
@@ -32,18 +32,18 @@ npm run start
32
32
 
33
33
  ## Scripts
34
34
 
35
- | Script | Description |
36
- | --- | --- |
37
- | `npm run setup` | Install deps, create `.env`, and build the cucumber runtime plus the local production app |
38
- | `npm run build:local` | Build the cucumber runtime and the local production app |
39
- | `npm run start` | Start the local production server |
40
- | `npm run dev` | Start the Next.js development server |
41
- | `npm run install-playwright -- <browser...>` | Install selected Playwright browsers |
42
- | `npm run setup:db` | Recreate the local SQLite database from migrations and rerun `sync-all` |
43
- | `npm run setup:full` | Reinstall dependencies, rebuild the DB, rerun `sync-all`, and rebuild the production app |
44
- | `npm run sync-all` | Sync all starter entities from the bundled automation workspace into the database |
45
- | `npm run appraisejs:sync` | Alias for `sync-all` |
46
- | `npm run appraisejs:install-step -- --payload-file <path>` | Internal script used by `npx appraisejs@latest add step ...` |
35
+ | Script | Description |
36
+ | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
37
+ | `npm run setup` | Install deps, create `.env`, and build the cucumber runtime plus the local production app |
38
+ | `npm run build:local` | Build the cucumber runtime and the local production app |
39
+ | `npm run start` | Start the local production server |
40
+ | `npm run dev` | Start the Next.js development server |
41
+ | `npm run install-playwright -- <browser...>` | Install selected Playwright browsers |
42
+ | `npm run setup:db` | Recreate the local SQLite database from migrations and rerun `sync-all` |
43
+ | `npm run setup:full` | Reinstall dependencies, rebuild the DB, rerun `sync-all`, and rebuild the production app |
44
+ | `npm run sync-all` | Sync all starter entities from the bundled automation workspace into the database |
45
+ | `npm run appraisejs:sync` | Alias for `sync-all` |
46
+ | `npm run appraisejs:install-step -- --payload-file <path>` | Internal script used by `npx appraisejs@latest add step ...` |
47
47
 
48
48
  ## Configuration
49
49
 
@@ -1,59 +1,57 @@
1
1
  import { When, Then, CustomWorld, expect, SelectorName, resolveLocator, getEnvironment, generateRandomData, RandomDataType } from '../../../packages/cucumber-runtime/src/index.js'
2
- /**
3
- * @name click
4
- * @description Template step for handling element click
5
- * @type ACTION
6
- */
7
-
8
- // This file is generated automatically. Add template steps to this group to generate content.
9
-
10
- /**
11
- * @name click
12
- * @description Template step for clicking on an element
13
- * @icon MOUSE
14
- */
15
- When('the user clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
16
- const selector = await resolveLocator(this.page, elementName)
17
- if (!selector) {
18
- throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
19
- }
20
- try {
21
- await this.page.locator(selector).click()
22
- } catch (error) {
23
- throw new Error(`Failed to click on the ${elementName} element: ${error}`)
24
- }
25
- })
26
-
27
- /**
28
- * @name double click
29
- * @description Template step for double clicking on an element
30
- * @icon MOUSE
31
- */
32
- When('the user double clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
33
- const selector = await resolveLocator(this.page, elementName)
34
- if (!selector) {
35
- throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
36
- }
37
- try {
38
- await this.page.locator(selector).dblclick()
39
- } catch (error) {
40
- throw new Error(`Failed to double click on the ${elementName} element: ${error}`)
41
- }
42
- })
43
-
44
- /**
45
- * @name right click
46
- * @description Template step for right clicking on an element
47
- * @icon MOUSE
48
- */
49
- When('the user right clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
50
- const selector = await resolveLocator(this.page, elementName)
51
- if (!selector) {
52
- throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
53
- }
54
- try {
55
- await this.page.locator(selector).click({ button: 'right' })
56
- } catch (error) {
57
- throw new Error(`Failed to right click on the ${elementName} element: ${error}`)
58
- }
59
- })
2
+ /**
3
+ * @name click
4
+ * @description Template step for handling element click
5
+ * @type ACTION
6
+ */
7
+
8
+ /**
9
+ * @name click
10
+ * @description Template step for clicking on an element
11
+ * @icon MOUSE
12
+ */
13
+ When('the user clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
14
+ const selector = await resolveLocator(this.page, elementName)
15
+ if (!selector) {
16
+ throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
17
+ }
18
+ try {
19
+ await this.page.locator(selector).click()
20
+ } catch (error) {
21
+ throw new Error(`Failed to click on the ${elementName} element: ${error}`)
22
+ }
23
+ })
24
+
25
+ /**
26
+ * @name double click
27
+ * @description Template step for double clicking on an element
28
+ * @icon MOUSE
29
+ */
30
+ When('the user double clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
31
+ const selector = await resolveLocator(this.page, elementName)
32
+ if (!selector) {
33
+ throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
34
+ }
35
+ try {
36
+ await this.page.locator(selector).dblclick()
37
+ } catch (error) {
38
+ throw new Error(`Failed to double click on the ${elementName} element: ${error}`)
39
+ }
40
+ })
41
+
42
+ /**
43
+ * @name right click
44
+ * @description Template step for right clicking on an element
45
+ * @icon MOUSE
46
+ */
47
+ When('the user right clicks on the {string} element', async function (this: CustomWorld, elementName: SelectorName) {
48
+ const selector = await resolveLocator(this.page, elementName)
49
+ if (!selector) {
50
+ throw new Error(`Selector ${elementName} not found. Current url: ${this.page.url()}`)
51
+ }
52
+ try {
53
+ await this.page.locator(selector).click({ button: 'right' })
54
+ } catch (error) {
55
+ throw new Error(`Failed to right click on the ${elementName} element: ${error}`)
56
+ }
57
+ })