@thinkwise/testwise 0.2.62 → 0.2.99

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 (458) hide show
  1. package/Testwise.ts +35 -0
  2. package/artifact-builder/ArtifactManager.ts +25 -2
  3. package/artifact-builder/ComponentClassModelBuilder.ts +148 -0
  4. package/artifact-builder/InterfaceGenerator.ts +31 -33
  5. package/artifact-builder/ModelDataBuilder.ts +18 -20
  6. package/artifact-builder/ModelDataRefiner.ts +23 -3
  7. package/artifact-builder/SchemaGenerator.ts +45 -35
  8. package/artifact-builder/ScreenInterfaceRefiner.ts +25 -10
  9. package/artifact-builder/SelectorBuilder.ts +30 -24
  10. package/artifact-builder/SubjectClassModelBuilder.ts +209 -0
  11. package/artifact-builder/SubjectComponentGenerator.ts +67 -246
  12. package/artifact-builder/SubjectGenerator.ts +117 -230
  13. package/artifact-builder/SubjectRegistration.ts +41 -32
  14. package/artifact-builder/TsFileModel.ts +94 -0
  15. package/artifact-builder/TsFileSerializer.ts +247 -0
  16. package/artifact-builder/helpers/DataRetriever.ts +64 -27
  17. package/artifact-builder/helpers/NamingHandler.ts +23 -78
  18. package/artifact-builder/helpers/PipelinePaths.ts +123 -0
  19. package/artifact-builder/helpers/Stopwatch.ts +10 -0
  20. package/artifact-builder/helpers/index.ts +1 -0
  21. package/artifact-builder/index.ts +4 -0
  22. package/components/BaseComponentObjects.ts +17 -0
  23. package/components/action-bar/ActionBar.ts +35 -47
  24. package/components/action-bar/ActionBarObjects.ts +2 -0
  25. package/components/action-bar/CustomActionBar.ts +6 -0
  26. package/components/cardlist/Cardlist.ts +6 -0
  27. package/components/chart/Chart.ts +6 -0
  28. package/components/combined-filter/CombinedFilter.ts +9 -0
  29. package/components/cube-view-bar/CubeViewBar.ts +6 -0
  30. package/components/export/ExportComponent.ts +12 -0
  31. package/components/filter/ExcelStyleFilterPopup.ts +83 -10
  32. package/components/filter/ExcelStyleFilterPopupObjects.ts +29 -3
  33. package/components/filter/FilterForm.ts +10 -0
  34. package/components/filter/FilterPopup.ts +30 -9
  35. package/components/filter/FilterPopupObjects.ts +10 -3
  36. package/components/filter/FindForm.ts +7 -0
  37. package/components/filter/ManagePrefilterPopup.ts +11 -0
  38. package/components/form/Form.ts +16 -0
  39. package/components/grid/Grid.ts +50 -14
  40. package/components/grid/GridObjects.ts +0 -15
  41. package/components/maps/Maps.ts +6 -0
  42. package/components/menu/ListBarMenuComponent.ts +10 -0
  43. package/components/pivot-grid/PivotGrid.ts +6 -0
  44. package/components/pivot-grid/PivotGridFieldList.ts +7 -0
  45. package/components/pop-up/AllRowsPopUp.ts +12 -0
  46. package/components/pop-up/PopUpComponent.ts +11 -0
  47. package/components/prefilter-list/PrefilterList.ts +9 -0
  48. package/components/preview/Preview.ts +6 -0
  49. package/components/report-bar/ReportBar.ts +6 -0
  50. package/components/report-tiles/ReportTiles.ts +6 -0
  51. package/components/scheduler/Scheduler.ts +6 -0
  52. package/components/snackbar/SnackBar.ts +12 -0
  53. package/components/splitter/Splitter.ts +6 -0
  54. package/components/tab/BaseTab.ts +5 -0
  55. package/components/tab/DetailTabPage.ts +11 -0
  56. package/components/tab/Tab.ts +10 -0
  57. package/components/task/TaskBar.ts +13 -3
  58. package/components/task/TaskTiles.ts +12 -3
  59. package/components/topbar/TopBar.ts +10 -0
  60. package/components/tree-view/TreeView.ts +9 -0
  61. package/controls/DateControl.ts +47 -9
  62. package/controls/DateControlObjects.ts +15 -0
  63. package/controls/FormComboBox.ts +43 -26
  64. package/controls/FormComboBoxObjects.ts +27 -0
  65. package/controls/GridColumnControl.ts +35 -4
  66. package/controls/GridColumnControlObjects.ts +1 -1
  67. package/controls/InputFieldControl.ts +61 -15
  68. package/controls/InputFieldControlObjects.ts +19 -0
  69. package/controls/LookupDropdown.ts +59 -31
  70. package/controls/LookupDropdownObjects.ts +19 -0
  71. package/dist/Testwise.js +35 -0
  72. package/dist/Testwise.js.map +1 -1
  73. package/dist/artifact-builder/ArtifactManager.d.ts +18 -1
  74. package/dist/artifact-builder/ArtifactManager.js +24 -2
  75. package/dist/artifact-builder/ArtifactManager.js.map +1 -1
  76. package/dist/artifact-builder/ComponentClassModelBuilder.d.ts +22 -0
  77. package/dist/artifact-builder/ComponentClassModelBuilder.js +115 -0
  78. package/dist/artifact-builder/ComponentClassModelBuilder.js.map +1 -0
  79. package/dist/artifact-builder/InterfaceGenerator.d.ts +15 -6
  80. package/dist/artifact-builder/InterfaceGenerator.js +27 -26
  81. package/dist/artifact-builder/InterfaceGenerator.js.map +1 -1
  82. package/dist/artifact-builder/ModelDataBuilder.d.ts +7 -0
  83. package/dist/artifact-builder/ModelDataBuilder.js +13 -5
  84. package/dist/artifact-builder/ModelDataBuilder.js.map +1 -1
  85. package/dist/artifact-builder/ModelDataRefiner.d.ts +18 -1
  86. package/dist/artifact-builder/ModelDataRefiner.js +18 -3
  87. package/dist/artifact-builder/ModelDataRefiner.js.map +1 -1
  88. package/dist/artifact-builder/SchemaGenerator.d.ts +21 -5
  89. package/dist/artifact-builder/SchemaGenerator.js +38 -26
  90. package/dist/artifact-builder/SchemaGenerator.js.map +1 -1
  91. package/dist/artifact-builder/ScreenInterfaceRefiner.d.ts +18 -1
  92. package/dist/artifact-builder/ScreenInterfaceRefiner.js +23 -9
  93. package/dist/artifact-builder/ScreenInterfaceRefiner.js.map +1 -1
  94. package/dist/artifact-builder/SelectorBuilder.d.ts +18 -5
  95. package/dist/artifact-builder/SelectorBuilder.js +29 -14
  96. package/dist/artifact-builder/SelectorBuilder.js.map +1 -1
  97. package/dist/artifact-builder/SubjectClassModelBuilder.d.ts +38 -0
  98. package/dist/artifact-builder/SubjectClassModelBuilder.js +158 -0
  99. package/dist/artifact-builder/SubjectClassModelBuilder.js.map +1 -0
  100. package/dist/artifact-builder/SubjectComponentGenerator.d.ts +25 -14
  101. package/dist/artifact-builder/SubjectComponentGenerator.js +65 -189
  102. package/dist/artifact-builder/SubjectComponentGenerator.js.map +1 -1
  103. package/dist/artifact-builder/SubjectGenerator.d.ts +32 -13
  104. package/dist/artifact-builder/SubjectGenerator.js +81 -165
  105. package/dist/artifact-builder/SubjectGenerator.js.map +1 -1
  106. package/dist/artifact-builder/SubjectRegistration.d.ts +22 -8
  107. package/dist/artifact-builder/SubjectRegistration.js +29 -14
  108. package/dist/artifact-builder/SubjectRegistration.js.map +1 -1
  109. package/dist/artifact-builder/TsFileModel.d.ts +86 -0
  110. package/dist/artifact-builder/TsFileModel.js +2 -0
  111. package/dist/artifact-builder/TsFileModel.js.map +1 -0
  112. package/dist/artifact-builder/TsFileSerializer.d.ts +19 -0
  113. package/dist/artifact-builder/TsFileSerializer.js +225 -0
  114. package/dist/artifact-builder/TsFileSerializer.js.map +1 -0
  115. package/dist/artifact-builder/helpers/DataRetriever.d.ts +22 -3
  116. package/dist/artifact-builder/helpers/DataRetriever.js +56 -26
  117. package/dist/artifact-builder/helpers/DataRetriever.js.map +1 -1
  118. package/dist/artifact-builder/helpers/NamingHandler.d.ts +18 -6
  119. package/dist/artifact-builder/helpers/NamingHandler.js +20 -61
  120. package/dist/artifact-builder/helpers/NamingHandler.js.map +1 -1
  121. package/dist/artifact-builder/helpers/PipelinePaths.d.ts +52 -0
  122. package/dist/artifact-builder/helpers/PipelinePaths.js +99 -0
  123. package/dist/artifact-builder/helpers/PipelinePaths.js.map +1 -0
  124. package/dist/artifact-builder/helpers/Stopwatch.d.ts +10 -0
  125. package/dist/artifact-builder/helpers/Stopwatch.js +10 -0
  126. package/dist/artifact-builder/helpers/Stopwatch.js.map +1 -1
  127. package/dist/artifact-builder/helpers/index.d.ts +1 -0
  128. package/dist/artifact-builder/helpers/index.js +1 -0
  129. package/dist/artifact-builder/helpers/index.js.map +1 -1
  130. package/dist/artifact-builder/index.d.ts +4 -0
  131. package/dist/artifact-builder/index.js +4 -0
  132. package/dist/artifact-builder/index.js.map +1 -1
  133. package/dist/components/BaseComponentObjects.d.ts +17 -0
  134. package/dist/components/BaseComponentObjects.js +17 -0
  135. package/dist/components/BaseComponentObjects.js.map +1 -1
  136. package/dist/components/action-bar/ActionBar.d.ts +21 -24
  137. package/dist/components/action-bar/ActionBar.js +31 -24
  138. package/dist/components/action-bar/ActionBar.js.map +1 -1
  139. package/dist/components/action-bar/ActionBarObjects.d.ts +1 -0
  140. package/dist/components/action-bar/ActionBarObjects.js +1 -0
  141. package/dist/components/action-bar/ActionBarObjects.js.map +1 -1
  142. package/dist/components/action-bar/CustomActionBar.d.ts +6 -0
  143. package/dist/components/action-bar/CustomActionBar.js +6 -0
  144. package/dist/components/action-bar/CustomActionBar.js.map +1 -1
  145. package/dist/components/cardlist/Cardlist.d.ts +6 -0
  146. package/dist/components/cardlist/Cardlist.js +6 -0
  147. package/dist/components/cardlist/Cardlist.js.map +1 -1
  148. package/dist/components/chart/Chart.d.ts +6 -0
  149. package/dist/components/chart/Chart.js +6 -0
  150. package/dist/components/chart/Chart.js.map +1 -1
  151. package/dist/components/combined-filter/CombinedFilter.d.ts +9 -0
  152. package/dist/components/combined-filter/CombinedFilter.js +9 -0
  153. package/dist/components/combined-filter/CombinedFilter.js.map +1 -1
  154. package/dist/components/cube-view-bar/CubeViewBar.d.ts +6 -0
  155. package/dist/components/cube-view-bar/CubeViewBar.js +6 -0
  156. package/dist/components/cube-view-bar/CubeViewBar.js.map +1 -1
  157. package/dist/components/export/ExportComponent.d.ts +12 -0
  158. package/dist/components/export/ExportComponent.js +12 -0
  159. package/dist/components/export/ExportComponent.js.map +1 -1
  160. package/dist/components/filter/ExcelStyleFilterPopup.d.ts +25 -2
  161. package/dist/components/filter/ExcelStyleFilterPopup.js +60 -6
  162. package/dist/components/filter/ExcelStyleFilterPopup.js.map +1 -1
  163. package/dist/components/filter/ExcelStyleFilterPopupObjects.d.ts +8 -1
  164. package/dist/components/filter/ExcelStyleFilterPopupObjects.js +15 -2
  165. package/dist/components/filter/ExcelStyleFilterPopupObjects.js.map +1 -1
  166. package/dist/components/filter/FilterForm.d.ts +10 -0
  167. package/dist/components/filter/FilterForm.js +10 -0
  168. package/dist/components/filter/FilterForm.js.map +1 -1
  169. package/dist/components/filter/FilterPopup.d.ts +22 -4
  170. package/dist/components/filter/FilterPopup.js +17 -9
  171. package/dist/components/filter/FilterPopup.js.map +1 -1
  172. package/dist/components/filter/FilterPopupObjects.d.ts +5 -2
  173. package/dist/components/filter/FilterPopupObjects.js +5 -2
  174. package/dist/components/filter/FilterPopupObjects.js.map +1 -1
  175. package/dist/components/filter/FindForm.d.ts +7 -0
  176. package/dist/components/filter/FindForm.js +7 -0
  177. package/dist/components/filter/FindForm.js.map +1 -1
  178. package/dist/components/filter/ManagePrefilterPopup.d.ts +11 -0
  179. package/dist/components/filter/ManagePrefilterPopup.js +11 -0
  180. package/dist/components/filter/ManagePrefilterPopup.js.map +1 -1
  181. package/dist/components/form/Form.d.ts +16 -0
  182. package/dist/components/form/Form.js +16 -0
  183. package/dist/components/form/Form.js.map +1 -1
  184. package/dist/components/grid/Grid.d.ts +20 -1
  185. package/dist/components/grid/Grid.js +35 -25
  186. package/dist/components/grid/Grid.js.map +1 -1
  187. package/dist/components/grid/GridObjects.d.ts +0 -4
  188. package/dist/components/grid/GridObjects.js +0 -6
  189. package/dist/components/grid/GridObjects.js.map +1 -1
  190. package/dist/components/maps/Maps.d.ts +6 -0
  191. package/dist/components/maps/Maps.js +6 -0
  192. package/dist/components/maps/Maps.js.map +1 -1
  193. package/dist/components/menu/ListBarMenuComponent.d.ts +10 -0
  194. package/dist/components/menu/ListBarMenuComponent.js +10 -0
  195. package/dist/components/menu/ListBarMenuComponent.js.map +1 -1
  196. package/dist/components/pivot-grid/PivotGrid.d.ts +6 -0
  197. package/dist/components/pivot-grid/PivotGrid.js +6 -0
  198. package/dist/components/pivot-grid/PivotGrid.js.map +1 -1
  199. package/dist/components/pivot-grid/PivotGridFieldList.d.ts +7 -0
  200. package/dist/components/pivot-grid/PivotGridFieldList.js +7 -0
  201. package/dist/components/pivot-grid/PivotGridFieldList.js.map +1 -1
  202. package/dist/components/pop-up/AllRowsPopUp.d.ts +12 -0
  203. package/dist/components/pop-up/AllRowsPopUp.js +12 -0
  204. package/dist/components/pop-up/AllRowsPopUp.js.map +1 -1
  205. package/dist/components/pop-up/PopUpComponent.d.ts +11 -0
  206. package/dist/components/pop-up/PopUpComponent.js +11 -0
  207. package/dist/components/pop-up/PopUpComponent.js.map +1 -1
  208. package/dist/components/prefilter-list/PrefilterList.d.ts +9 -0
  209. package/dist/components/prefilter-list/PrefilterList.js +9 -0
  210. package/dist/components/prefilter-list/PrefilterList.js.map +1 -1
  211. package/dist/components/preview/Preview.d.ts +6 -0
  212. package/dist/components/preview/Preview.js +6 -0
  213. package/dist/components/preview/Preview.js.map +1 -1
  214. package/dist/components/report-bar/ReportBar.d.ts +6 -0
  215. package/dist/components/report-bar/ReportBar.js +6 -0
  216. package/dist/components/report-bar/ReportBar.js.map +1 -1
  217. package/dist/components/report-tiles/ReportTiles.d.ts +6 -0
  218. package/dist/components/report-tiles/ReportTiles.js +6 -0
  219. package/dist/components/report-tiles/ReportTiles.js.map +1 -1
  220. package/dist/components/scheduler/Scheduler.d.ts +6 -0
  221. package/dist/components/scheduler/Scheduler.js +6 -0
  222. package/dist/components/scheduler/Scheduler.js.map +1 -1
  223. package/dist/components/snackbar/SnackBar.d.ts +12 -0
  224. package/dist/components/snackbar/SnackBar.js +12 -0
  225. package/dist/components/snackbar/SnackBar.js.map +1 -1
  226. package/dist/components/splitter/Splitter.d.ts +6 -0
  227. package/dist/components/splitter/Splitter.js +6 -0
  228. package/dist/components/splitter/Splitter.js.map +1 -1
  229. package/dist/components/tab/BaseTab.d.ts +5 -0
  230. package/dist/components/tab/BaseTab.js +5 -0
  231. package/dist/components/tab/BaseTab.js.map +1 -1
  232. package/dist/components/tab/DetailTabPage.d.ts +11 -0
  233. package/dist/components/tab/DetailTabPage.js +11 -0
  234. package/dist/components/tab/DetailTabPage.js.map +1 -1
  235. package/dist/components/tab/Tab.d.ts +10 -0
  236. package/dist/components/tab/Tab.js +10 -0
  237. package/dist/components/tab/Tab.js.map +1 -1
  238. package/dist/components/task/TaskBar.d.ts +12 -2
  239. package/dist/components/task/TaskBar.js +13 -3
  240. package/dist/components/task/TaskBar.js.map +1 -1
  241. package/dist/components/task/TaskTiles.d.ts +11 -2
  242. package/dist/components/task/TaskTiles.js +12 -3
  243. package/dist/components/task/TaskTiles.js.map +1 -1
  244. package/dist/components/topbar/TopBar.d.ts +10 -0
  245. package/dist/components/topbar/TopBar.js +10 -0
  246. package/dist/components/topbar/TopBar.js.map +1 -1
  247. package/dist/components/tree-view/TreeView.d.ts +9 -0
  248. package/dist/components/tree-view/TreeView.js +9 -0
  249. package/dist/components/tree-view/TreeView.js.map +1 -1
  250. package/dist/controls/DateControl.d.ts +40 -2
  251. package/dist/controls/DateControl.js +24 -7
  252. package/dist/controls/DateControl.js.map +1 -1
  253. package/dist/controls/DateControlObjects.d.ts +8 -1
  254. package/dist/controls/DateControlObjects.js +8 -1
  255. package/dist/controls/DateControlObjects.js.map +1 -1
  256. package/dist/controls/FormComboBox.d.ts +30 -0
  257. package/dist/controls/FormComboBox.js +19 -16
  258. package/dist/controls/FormComboBox.js.map +1 -1
  259. package/dist/controls/FormComboBoxObjects.d.ts +12 -1
  260. package/dist/controls/FormComboBoxObjects.js +15 -1
  261. package/dist/controls/FormComboBoxObjects.js.map +1 -1
  262. package/dist/controls/GridColumnControl.d.ts +30 -0
  263. package/dist/controls/GridColumnControl.js +13 -4
  264. package/dist/controls/GridColumnControl.js.map +1 -1
  265. package/dist/controls/GridColumnControlObjects.js +1 -1
  266. package/dist/controls/GridColumnControlObjects.js.map +1 -1
  267. package/dist/controls/InputFieldControl.d.ts +50 -3
  268. package/dist/controls/InputFieldControl.js +40 -11
  269. package/dist/controls/InputFieldControl.js.map +1 -1
  270. package/dist/controls/InputFieldControlObjects.d.ts +10 -1
  271. package/dist/controls/InputFieldControlObjects.js +10 -1
  272. package/dist/controls/InputFieldControlObjects.js.map +1 -1
  273. package/dist/controls/LookupDropdown.d.ts +29 -0
  274. package/dist/controls/LookupDropdown.js +36 -25
  275. package/dist/controls/LookupDropdown.js.map +1 -1
  276. package/dist/controls/LookupDropdownObjects.d.ts +10 -0
  277. package/dist/controls/LookupDropdownObjects.js +11 -0
  278. package/dist/controls/LookupDropdownObjects.js.map +1 -0
  279. package/dist/enums/ElementTypes.d.ts +18 -0
  280. package/dist/enums/ElementTypes.js +18 -0
  281. package/dist/enums/ElementTypes.js.map +1 -1
  282. package/dist/enums/ExportFormat.d.ts +8 -0
  283. package/dist/enums/ExportFormat.js +8 -0
  284. package/dist/enums/ExportFormat.js.map +1 -1
  285. package/dist/enums/LogLevel.d.ts +17 -0
  286. package/dist/enums/LogLevel.js +17 -1
  287. package/dist/enums/LogLevel.js.map +1 -1
  288. package/dist/enums/index.d.ts +1 -0
  289. package/dist/enums/index.js +1 -0
  290. package/dist/enums/index.js.map +1 -1
  291. package/dist/helpers/ConfigChecker.d.ts +13 -0
  292. package/dist/helpers/ConfigChecker.js +13 -0
  293. package/dist/helpers/ConfigChecker.js.map +1 -1
  294. package/dist/helpers/Ensure.d.ts +13 -0
  295. package/dist/helpers/Ensure.js +13 -0
  296. package/dist/helpers/Ensure.js.map +1 -1
  297. package/dist/helpers/FlightTracker.d.ts +13 -3
  298. package/dist/helpers/FlightTracker.js +103 -17
  299. package/dist/helpers/FlightTracker.js.map +1 -1
  300. package/dist/helpers/GlobalWaitEventHandler.d.ts +13 -0
  301. package/dist/helpers/GlobalWaitEventHandler.js +13 -0
  302. package/dist/helpers/GlobalWaitEventHandler.js.map +1 -1
  303. package/dist/helpers/LoginHelper.d.ts +35 -1
  304. package/dist/helpers/LoginHelper.js +46 -11
  305. package/dist/helpers/LoginHelper.js.map +1 -1
  306. package/dist/helpers/PathResolver.d.ts +22 -0
  307. package/dist/helpers/PathResolver.js +22 -0
  308. package/dist/helpers/PathResolver.js.map +1 -1
  309. package/dist/helpers/Poll.d.ts +13 -1
  310. package/dist/helpers/Poll.js +12 -0
  311. package/dist/helpers/Poll.js.map +1 -1
  312. package/dist/helpers/RegexHelper.d.ts +15 -0
  313. package/dist/helpers/RegexHelper.js +15 -3
  314. package/dist/helpers/RegexHelper.js.map +1 -1
  315. package/dist/helpers/SubjectNavigator.d.ts +26 -0
  316. package/dist/helpers/SubjectNavigator.js +51 -0
  317. package/dist/helpers/SubjectNavigator.js.map +1 -0
  318. package/dist/helpers/UserSimulationHelper.d.ts +14 -0
  319. package/dist/helpers/UserSimulationHelper.js +14 -0
  320. package/dist/helpers/UserSimulationHelper.js.map +1 -1
  321. package/dist/helpers/index.d.ts +1 -0
  322. package/dist/helpers/index.js +1 -0
  323. package/dist/helpers/index.js.map +1 -1
  324. package/dist/index.d.ts +6 -20
  325. package/dist/index.js +1 -0
  326. package/dist/index.js.map +1 -1
  327. package/dist/interfaces/IComponentObjects.d.ts +12 -0
  328. package/dist/interfaces/IComponentSchemaMeta.d.ts +15 -0
  329. package/dist/interfaces/IComponentSchemaMeta.js +2 -0
  330. package/dist/interfaces/IComponentSchemaMeta.js.map +1 -0
  331. package/dist/interfaces/IProperty.d.ts +13 -0
  332. package/dist/interfaces/IRegisteredSubjects.d.ts +12 -0
  333. package/dist/interfaces/ISeedSubjectDraft.d.ts +16 -0
  334. package/dist/interfaces/ISeedSubjectDraft.js +2 -0
  335. package/dist/interfaces/ISeedSubjectDraft.js.map +1 -0
  336. package/dist/interfaces/ISubject.d.ts +13 -0
  337. package/dist/interfaces/ISubjectDetail.d.ts +11 -0
  338. package/dist/interfaces/ISubjectDetail.js +2 -0
  339. package/dist/interfaces/ISubjectDetail.js.map +1 -0
  340. package/dist/mcp/ArtifactResolver.d.ts +152 -0
  341. package/dist/mcp/ArtifactResolver.js +232 -0
  342. package/dist/mcp/ArtifactResolver.js.map +1 -0
  343. package/dist/mcp/index.d.ts +2 -0
  344. package/dist/mcp/index.js +2 -0
  345. package/dist/mcp/index.js.map +1 -0
  346. package/dist/page-extensions/GlobalComponents.d.ts +30 -0
  347. package/dist/page-extensions/GlobalComponents.js +30 -0
  348. package/dist/page-extensions/GlobalComponents.js.map +1 -1
  349. package/dist/page-extensions/GoToDeepLink.d.ts +9 -0
  350. package/dist/page-extensions/GoToDeepLink.js +9 -0
  351. package/dist/page-extensions/GoToDeepLink.js.map +1 -1
  352. package/dist/page-extensions/LoginFeatures.d.ts +8 -0
  353. package/dist/page-extensions/LoginFeatures.js +8 -0
  354. package/dist/page-extensions/LoginFeatures.js.map +1 -1
  355. package/dist/page-extensions/SubjectRegistry.d.ts +31 -0
  356. package/dist/page-extensions/SubjectRegistry.js +31 -0
  357. package/dist/page-extensions/SubjectRegistry.js.map +1 -1
  358. package/dist/page-extensions/UserSimulation.d.ts +21 -0
  359. package/dist/page-extensions/UserSimulation.js +21 -0
  360. package/dist/page-extensions/UserSimulation.js.map +1 -1
  361. package/dist/page-extensions/WaitEventHandler.d.ts +20 -0
  362. package/dist/page-extensions/WaitEventHandler.js +20 -0
  363. package/dist/page-extensions/WaitEventHandler.js.map +1 -1
  364. package/dist/page-overrides/ClickOverride.d.ts +23 -2
  365. package/dist/page-overrides/ClickOverride.js +34 -50
  366. package/dist/page-overrides/ClickOverride.js.map +1 -1
  367. package/dist/page-overrides/FillOverride.d.ts +23 -0
  368. package/dist/page-overrides/FillOverride.js +46 -66
  369. package/dist/page-overrides/FillOverride.js.map +1 -1
  370. package/dist/services/ConfigBuilder.d.ts +24 -0
  371. package/dist/services/ConfigBuilder.js +24 -0
  372. package/dist/services/ConfigBuilder.js.map +1 -1
  373. package/dist/services/IndiciumApi.service.d.ts +26 -0
  374. package/dist/services/IndiciumApi.service.js +40 -5
  375. package/dist/services/IndiciumApi.service.js.map +1 -1
  376. package/dist/services/Logger.d.ts +13 -0
  377. package/dist/services/Logger.js +39 -0
  378. package/dist/services/Logger.js.map +1 -1
  379. package/dist/types/Components.d.ts +18 -1
  380. package/dist/types/Components.js +0 -1
  381. package/dist/types/Components.js.map +1 -1
  382. package/dist/types/LocatorType.d.ts +5 -0
  383. package/dist/types/LocatorType.js +2 -0
  384. package/dist/types/LocatorType.js.map +1 -0
  385. package/dist/types/PollTypes.d.ts +8 -0
  386. package/dist/types/Test.d.ts +18 -0
  387. package/dist/types/Universal.d.ts +12 -0
  388. package/dist/types/index.d.ts +2 -0
  389. package/dist/types/index.js +2 -0
  390. package/dist/types/index.js.map +1 -1
  391. package/enums/ElementTypes.ts +18 -0
  392. package/enums/ExportFormat.ts +8 -0
  393. package/enums/LogLevel.ts +17 -1
  394. package/enums/index.ts +1 -0
  395. package/helpers/ConfigChecker.ts +13 -0
  396. package/helpers/Ensure.ts +13 -0
  397. package/helpers/FlightTracker.ts +109 -20
  398. package/helpers/GlobalWaitEventHandler.ts +13 -0
  399. package/helpers/LoginHelper.ts +49 -12
  400. package/helpers/PathResolver.ts +22 -0
  401. package/helpers/Poll.ts +13 -1
  402. package/helpers/RegexHelper.ts +15 -3
  403. package/helpers/SubjectNavigator.ts +57 -0
  404. package/helpers/UserSimulationHelper.ts +14 -0
  405. package/helpers/index.ts +1 -0
  406. package/index.ts +1 -0
  407. package/interfaces/IComponentObjects.ts +12 -0
  408. package/interfaces/IComponentSchemaMeta.ts +17 -0
  409. package/interfaces/IProperty.ts +13 -0
  410. package/interfaces/IRegisteredSubjects.ts +12 -0
  411. package/interfaces/ISeedSubjectDraft.ts +17 -0
  412. package/interfaces/ISubject.ts +13 -0
  413. package/interfaces/ISubjectDetail.ts +12 -0
  414. package/mcp/ArtifactResolver.ts +296 -0
  415. package/mcp/index.ts +2 -0
  416. package/package.json +20 -8
  417. package/page-extensions/GlobalComponents.ts +30 -0
  418. package/page-extensions/GoToDeepLink.ts +9 -0
  419. package/page-extensions/LoginFeatures.ts +8 -0
  420. package/page-extensions/SubjectRegistry.ts +32 -0
  421. package/page-extensions/UserSimulation.ts +21 -0
  422. package/page-extensions/WaitEventHandler.ts +20 -0
  423. package/page-overrides/ClickOverride.ts +36 -55
  424. package/page-overrides/FillOverride.ts +59 -73
  425. package/promptCredentials.js +1 -1
  426. package/scripts/Testwise.template.json +1 -1
  427. package/scripts/diagram.js +2267 -0
  428. package/scripts/main.js +84 -63
  429. package/scripts/postinstall.js +55 -42
  430. package/scripts/setup.js +91 -37
  431. package/scripts/sync.js +767 -748
  432. package/services/ConfigBuilder.ts +24 -0
  433. package/services/IndiciumApi.service.ts +44 -6
  434. package/services/Logger.ts +40 -0
  435. package/templates/copilot-instructions.md +130 -0
  436. package/templates/mcp.json +9 -0
  437. package/templates/testwise-test-expert.agent.md +453 -0
  438. package/tests/tsconfig.json +12 -0
  439. package/tsconfig.json +6 -2
  440. package/types/Components.ts +17 -2
  441. package/types/LocatorType.ts +5 -0
  442. package/types/PollTypes.ts +8 -0
  443. package/types/Test.ts +18 -0
  444. package/types/Universal.ts +12 -0
  445. package/types/index.ts +2 -0
  446. package/dist/interfaces/IStoredTestResults.d.ts +0 -5
  447. package/dist/interfaces/IStoredTestResults.js +0 -2
  448. package/dist/interfaces/IStoredTestResults.js.map +0 -1
  449. package/dist/templates/test-artifacts/SubjectPageBase.d.ts +0 -5
  450. package/dist/templates/test-artifacts/SubjectPageBase.js +0 -6
  451. package/dist/templates/test-artifacts/SubjectPageBase.js.map +0 -1
  452. package/dist/templates/test-artifacts/screens/index.d.ts +0 -1
  453. package/dist/templates/test-artifacts/screens/index.js +0 -2
  454. package/dist/templates/test-artifacts/screens/index.js.map +0 -1
  455. package/dist/templates/test-artifacts/subjects/index.d.ts +0 -1
  456. package/dist/templates/test-artifacts/subjects/index.js +0 -2
  457. package/dist/templates/test-artifacts/subjects/index.js.map +0 -1
  458. package/interfaces/IStoredTestResults.ts +0 -6
@@ -1,7 +1,30 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* biome-ignore-all lint/suspicious/noExplicitAny: Reason42 */
3
3
  import type { Locator } from '@playwright/test';
4
-
4
+ import { FormComboBoxObjects } from './FormComboBoxObjects.js';
5
+
6
+ /**
7
+ * Typed proxy for a combo-box field (`control_type: "combo_box"`) on a
8
+ * Thinkwise form screen.
9
+ *
10
+ * **How to use:** You never construct this directly. Generated subject
11
+ * component classes expose properties of type `IFormComboBox` for each
12
+ * combo-box on the form:
13
+ *
14
+ * ```ts
15
+ * // Select an option by typing a prefix and picking from auto-complete:
16
+ * await subject.form.statusCombo.lookupSelect('Act');
17
+ *
18
+ * // Click to open the full list and select:
19
+ * await subject.form.statusCombo.selectOption('Active');
20
+ *
21
+ * // Clear the current selection:
22
+ * await subject.form.statusCombo.clearByClick();
23
+ * ```
24
+ *
25
+ * The returned value is a **Proxy** that acts as both a Playwright `Locator`
26
+ * and a typed combo-box control.
27
+ */
5
28
  export type IFormComboBox = Locator & IFormComboBoxCore;
6
29
 
7
30
  export type IFormComboBoxCore = {
@@ -12,47 +35,41 @@ export type IFormComboBoxCore = {
12
35
  };
13
36
 
14
37
  class FormComboBox implements IFormComboBoxCore {
15
- private _formFieldLocator: Locator;
16
- private _autoCompleteMenu: Locator;
17
- private _id: string;
38
+ private _objects: FormComboBoxObjects;
18
39
 
19
40
  constructor(context: Locator, id: string) {
20
- this._id = id;
21
- this._formFieldLocator = context.getByTestId(`form-field__${id}`);
22
- this._autoCompleteMenu = context.getByTestId(`form-field__${id}__select__options-list`);
41
+ this._objects = new FormComboBoxObjects(context, id);
23
42
  }
24
43
 
25
44
  async selectOption(optionText: string): Promise<void> {
26
- await this._formFieldLocator.locator('input').click();
27
-
28
- await this._autoCompleteMenu.waitFor({ state: 'visible' });
29
-
30
- const optionTextLowercase = optionText.toLowerCase();
31
-
32
- await this._autoCompleteMenu.getByTestId(`form-field__${this._id}__select__${optionTextLowercase}__text`).click();
45
+ await this._objects.fieldInput().click();
46
+ await this._objects.autoCompleteMenu().waitFor({ state: 'visible' });
47
+ await this._objects.option(optionText).click();
33
48
  }
34
49
 
35
50
  async getValidationMessage(): Promise<string> {
36
- await this._formFieldLocator.locator('.TooltipContainer p').waitFor({ state: 'visible' });
37
- return await this._formFieldLocator.locator('.TooltipContainer p').innerText();
51
+ await this._objects.validationMessage().waitFor({ state: 'visible' });
52
+ return await this._objects.validationMessage().innerText();
38
53
  }
39
54
  async clearByClick(): Promise<void> {
40
- await this._formFieldLocator.locator('Button[aria-label="Clear"]').click();
55
+ await this._objects.clearButton().click();
41
56
  }
42
57
 
43
58
  async lookupSelect(optionToSelect: string): Promise<void> {
44
- await this._formFieldLocator.locator('input').fill(optionToSelect);
45
-
46
- await this._autoCompleteMenu.waitFor({ state: 'visible' });
47
-
48
- const optionToSelectLowercase = optionToSelect.toLowerCase();
49
-
50
- await this._autoCompleteMenu
51
- .getByTestId(`form-field__${this._id}__select__${optionToSelectLowercase}__text`)
52
- .click();
59
+ await this._objects.fieldInput().fill(optionToSelect);
60
+ await this._objects.autoCompleteMenu().waitFor({ state: 'visible' });
61
+ await this._objects.option(optionToSelect).click();
53
62
  }
54
63
  }
55
64
 
65
+ /**
66
+ * Creates an `IFormComboBox` proxy that merges `FormComboBox` interaction methods with
67
+ * the underlying Playwright `Locator` for the `form-field__<id>` test ID.
68
+ * Use the returned value as both a typed combo-box control and a regular Playwright locator.
69
+ * @param context - The parent locator to scope the control within.
70
+ * @param id - The field identifier used to locate `[data-testid="form-field__<id>"]`.
71
+ * @returns A proxy combining `IFormComboBoxCore` methods and `Locator` capabilities.
72
+ */
56
73
  export function createFormComboBox(context: Locator, id: string): IFormComboBox {
57
74
  const comboBox = new FormComboBox(context, id);
58
75
  const locator = context.getByTestId(`form-field__${id}`);
@@ -0,0 +1,27 @@
1
+ import type { Locator } from '@playwright/test';
2
+
3
+ export class FormComboBoxObjects {
4
+ private _context: Locator;
5
+ private _id: string;
6
+
7
+ constructor(context: Locator, id: string) {
8
+ this._context = context;
9
+ this._id = id;
10
+ }
11
+
12
+ public field = (): Locator => this._context.getByTestId(`form-field__${this._id}`);
13
+
14
+ public autoCompleteMenu = (): Locator =>
15
+ this._context.page().getByTestId(`form-field__${this._id}__select__options-list`);
16
+
17
+ public option = (optionText: string): Locator => {
18
+ const optionTextLowercase = optionText.toLowerCase();
19
+ return this.autoCompleteMenu().getByTestId(`form-field__${this._id}__select__${optionTextLowercase}__text`);
20
+ };
21
+
22
+ public clearButton = (): Locator => this.field().locator('Button[aria-label="Clear"]');
23
+
24
+ public validationMessage = (): Locator => this.field().locator('.TooltipContainer p');
25
+
26
+ public fieldInput = (): Locator => this.field().locator('input');
27
+ }
@@ -5,6 +5,28 @@ import { Grid } from '../components/grid/Grid.js';
5
5
  import { escapeRegex } from '../index.js';
6
6
  import { GridColumnControlObjects } from './GridColumnControlObjects.js';
7
7
 
8
+ /**
9
+ * Typed proxy for a single column in a Thinkwise `Grid` component.
10
+ *
11
+ * **How to use:** You never construct this directly. Generated subject
12
+ * component classes expose properties of type `IGridColumnControl` for each
13
+ * column in a grid:
14
+ *
15
+ * ```ts
16
+ * // Get all visible cell values in the column:
17
+ * const names = await subject.grid.employeeNameColumn.getCellValues();
18
+ *
19
+ * // Find a specific cell by its exact text:
20
+ * const cell = subject.grid.employeeNameColumn.getCellByExactValue('Jane Doe');
21
+ * await cell.click();
22
+ *
23
+ * // Filter the grid using the Excel-style filter popup:
24
+ * await subject.grid.statusColumn.filterByColumnValueExcelStyle('Active');
25
+ * ```
26
+ *
27
+ * The returned value is a **Proxy** — it works as both a Playwright `Locator`
28
+ * (pointing at the column header) and a typed column control.
29
+ */
8
30
  export type IGridColumnControl = Locator & IGridColumnControlCore;
9
31
 
10
32
  export type IGridColumnControlCore = {
@@ -21,7 +43,7 @@ class GridColumnControl implements IGridColumnControlCore {
21
43
  private _objects: GridColumnControlObjects;
22
44
 
23
45
  constructor(gridContext: Locator, id: string) {
24
- this._id = id.replace(/-/g, '_');
46
+ this._id = id;
25
47
  this._objects = new GridColumnControlObjects(gridContext, this._id);
26
48
  this._grid = new Grid(gridContext);
27
49
  }
@@ -44,13 +66,22 @@ class GridColumnControl implements IGridColumnControlCore {
44
66
  }
45
67
 
46
68
  public async filterByColumnValueExcelStyle(value: string, deselectAll?: boolean): Promise<void> {
47
- await this._grid.filterByColumnValueExcelStyle(this._id, value, deselectAll);
69
+ await this._grid.filterByColumnValueExcelStyle(this._objects.columnHeader(), value, deselectAll);
48
70
  }
49
71
  }
50
72
 
73
+ /**
74
+ * Creates an `IGridColumnControl` proxy for a specific grid column.
75
+ * Normalises the column `id` (replacing `-` with `_`), then returns a proxy that merges
76
+ * `GridColumnControl` interaction methods with the `[col-id="<id>"]` locator.
77
+ * @param gridContext - The parent `Locator` representing the grid element.
78
+ * @param id - The column identifier (hyphens are automatically converted to underscores).
79
+ * @returns A proxy combining `IGridColumnControlCore` methods and `Locator` capabilities.
80
+ */
51
81
  export function createGridColumnControl(gridContext: Locator, id: string): IGridColumnControl {
52
- const columnControl = new GridColumnControl(gridContext, id);
53
- const locator = gridContext.locator(`[col-id="${id}"]`);
82
+ const processedId = id.replace(/-/g, '_');
83
+ const columnControl = new GridColumnControl(gridContext, processedId);
84
+ const locator = gridContext.locator(`[col-id="${processedId}"]`);
54
85
 
55
86
  return new Proxy(columnControl, {
56
87
  get(target, prop, receiver) {
@@ -11,7 +11,7 @@ export class GridColumnControlObjects extends BaseComponentObjects {
11
11
 
12
12
  public column = () => this.context.locator(`[col-id="${this._id}"]`);
13
13
 
14
- public columnHeader = () => this.column().getByRole('columnheader');
14
+ public columnHeader = () => this.context.locator(`[col-id="${this._id}"][role="columnheader"]`);
15
15
 
16
16
  public cellByValue = (value: RegExp) =>
17
17
  this.column().locator('[role="button"]', {
@@ -1,7 +1,27 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /** biome-ignore-all lint/suspicious/noExplicitAny: reason42 */
3
3
  import type { Locator } from '@playwright/test';
4
-
4
+ import { InputFieldControlObjects } from './InputFieldControlObjects.js';
5
+
6
+ /**
7
+ * Typed proxy for a plain text input field (`control_type: "field"`) on a
8
+ * Thinkwise form screen.
9
+ *
10
+ * **How to use:** You never construct this directly. The generated subject
11
+ * component class exposes properties of type `IInputFieldControl` — one per
12
+ * field on the form. Use those properties in your test:
13
+ *
14
+ * ```ts
15
+ * // Generated subject exposes:
16
+ * // employeeName: IInputFieldControl;
17
+ * await subject.form.employeeName.fill('Jane Doe');
18
+ * const val = await subject.form.employeeName.inputValue();
19
+ * ```
20
+ *
21
+ * The returned value is a **Proxy** — it acts as both a Playwright `Locator`
22
+ * (so you can call `.waitFor()`, `.isVisible()`, etc.) and as a typed control
23
+ * with named interaction methods.
24
+ */
5
25
  export type IInputFieldControl = Locator & ICoreInputFieldControl;
6
26
 
7
27
  export type ICoreInputFieldControl = {
@@ -15,43 +35,61 @@ export type ICoreInputFieldControl = {
15
35
  };
16
36
 
17
37
  export class InputFieldControl implements ICoreInputFieldControl {
18
- private _formFieldLocator: Locator;
19
- private _inputLocator: Locator;
20
- private _id: string;
38
+ private _objects: InputFieldControlObjects;
21
39
 
22
40
  constructor(context: Locator, id: string) {
23
- this._id = id;
24
- this._formFieldLocator = context.getByTestId(`form-field__${id}`);
25
- this._inputLocator = this._formFieldLocator.locator('input');
41
+ this._objects = new InputFieldControlObjects(context, id);
26
42
  }
27
43
 
44
+ /**
45
+ * Waits for the field's validation message element to become visible, then returns its text.
46
+ */
28
47
  public async getValidationMessage(): Promise<string> {
29
- await this._formFieldLocator.locator('.TooltipContainer p').waitFor({ state: 'visible' });
30
- return await this._formFieldLocator.locator('.TooltipContainer p').innerText();
48
+ await this._objects.validationMessage().waitFor({ state: 'visible' });
49
+ return await this._objects.validationMessage().innerText();
31
50
  }
32
51
 
52
+ /**
53
+ * Fills the input element with the given value.
54
+ * @param value - The string to enter into the field.
55
+ */
33
56
  public async fill(value: string): Promise<void> {
34
- await this._inputLocator.fill(value);
57
+ await this._objects.fieldInput().fill(value);
35
58
  }
36
59
 
60
+ /**
61
+ * Clicks the underlying input element.
62
+ */
37
63
  public async click(): Promise<void> {
38
- await this._inputLocator.click();
64
+ await this._objects.fieldInput().click();
39
65
  }
40
66
 
67
+ /**
68
+ * Clears the input field by filling it with an empty string.
69
+ */
41
70
  public async clear(): Promise<void> {
42
- await this._inputLocator.fill('');
71
+ await this._objects.fieldInput().fill('');
43
72
  }
44
73
 
74
+ /**
75
+ * Returns the current string value from the underlying input element.
76
+ */
45
77
  public async inputValue(): Promise<string> {
46
- return await this._inputLocator.inputValue();
78
+ return await this._objects.fieldInput().inputValue();
47
79
  }
48
80
 
81
+ /**
82
+ * Returns the Playwright `Locator` for the underlying `<input>` element of the field.
83
+ */
49
84
  public inputElement(): Locator {
50
- return this._inputLocator;
85
+ return this._objects.fieldInput();
51
86
  }
52
87
 
88
+ /**
89
+ * Returns the trimmed, whitespace-normalised text content of the field's label element.
90
+ */
53
91
  public async getLabelText(): Promise<string> {
54
- let returnText = (await this._formFieldLocator.getByTestId(`form-field__${this._id}__label`).textContent()) || '';
92
+ let returnText = (await this._objects.fieldLabel().textContent()) || '';
55
93
 
56
94
  returnText = returnText.replace(/\s+/g, ' ').trim();
57
95
 
@@ -59,6 +97,14 @@ export class InputFieldControl implements ICoreInputFieldControl {
59
97
  }
60
98
  }
61
99
 
100
+ /**
101
+ * Creates an `IInputFieldControl` proxy that merges `InputFieldControl` interaction methods
102
+ * with the underlying Playwright `Locator` for the `form-field__<id>` test ID.
103
+ * Use the returned value as both a typed input control and a regular Playwright locator.
104
+ * @param context - The parent locator to scope the control within.
105
+ * @param id - The field identifier used to locate `[data-testid="form-field__<id>"]`.
106
+ * @returns A proxy combining `ICoreInputFieldControl` methods and `Locator` capabilities.
107
+ */
62
108
  export function createInputFieldControl(context: Locator, id: string): IInputFieldControl {
63
109
  const inputFieldControl = new InputFieldControl(context, id);
64
110
  const locator = context.getByTestId(`form-field__${id}`);
@@ -0,0 +1,19 @@
1
+ import type { Locator } from '@playwright/test';
2
+
3
+ export class InputFieldControlObjects {
4
+ private _context: Locator;
5
+ private _id: string;
6
+
7
+ constructor(context: Locator, id: string) {
8
+ this._context = context;
9
+ this._id = id;
10
+ }
11
+
12
+ public formField = (): Locator => this._context.getByTestId(`form-field__${this._id}`);
13
+
14
+ public fieldInput = (): Locator => this.formField().locator('input');
15
+
16
+ public fieldLabel = (): Locator => this.formField().getByTestId(`form-field__${this._id}__label`);
17
+
18
+ public validationMessage = (): Locator => this.formField().locator('.TooltipContainer p');
19
+ }
@@ -2,7 +2,29 @@
2
2
  /** biome-ignore-all lint/suspicious/noExplicitAny: needed flexibility */
3
3
  import type { Locator } from '@playwright/test';
4
4
  import { escapeRegex } from '../helpers/RegexHelper.js';
5
-
5
+ import { LookupDropdownObjects } from './LookupDropdownObjects.js';
6
+
7
+ /**
8
+ * Typed proxy for a lookup or dropdown field (`control_type: "lookup"` or
9
+ * `"dropdown"`) on a Thinkwise form screen.
10
+ *
11
+ * **How to use:** You never construct this directly. The generated subject
12
+ * component class exposes properties of type `ILookupDropdown` for each
13
+ * lookup/dropdown on the form:
14
+ *
15
+ * ```ts
16
+ * // Two interaction styles:
17
+ *
18
+ * // 1. Type + pick from the auto-complete list:
19
+ * await subject.form.countryLookup.lookupSelect('Netherlands');
20
+ *
21
+ * // 2. Click to open the dropdown then pick:
22
+ * await subject.form.statusDropdown.selectOption('Active');
23
+ * ```
24
+ *
25
+ * The returned value is a **Proxy** — it works as both a Playwright `Locator`
26
+ * and a typed control with named helper methods.
27
+ */
6
28
  export type ILookupDropdown = Locator & ILookupDropdownCore;
7
29
 
8
30
  export type ILookupDropdownCore = {
@@ -16,18 +38,14 @@ export type ILookupDropdownCore = {
16
38
  };
17
39
 
18
40
  class LookupDropdown implements ILookupDropdownCore {
19
- private _id: string;
20
- private _formFieldLocator: Locator;
21
- private _inputLocator: Locator;
41
+ private _objects: LookupDropdownObjects;
22
42
 
23
43
  constructor(context: Locator, id: string) {
24
- this._id = id;
25
- this._formFieldLocator = context.getByTestId(`form-field__${this._id}`);
26
- this._inputLocator = this._formFieldLocator.locator('input');
44
+ this._objects = new LookupDropdownObjects(context, id);
27
45
  }
28
46
 
29
47
  public async getLabelText(): Promise<string> {
30
- let returnText = (await this._formFieldLocator.getByTestId(`form-field__${this._id}__label`).textContent()) || '';
48
+ let returnText = (await this._objects.label().textContent()) || '';
31
49
 
32
50
  returnText = returnText.replace(/\s+/g, ' ').trim();
33
51
 
@@ -35,69 +53,79 @@ class LookupDropdown implements ILookupDropdownCore {
35
53
  }
36
54
 
37
55
  public async lookupSelect(optionToSelect: string): Promise<void> {
38
- await this._inputLocator.fill(optionToSelect);
56
+ await this._objects.input().fill(optionToSelect);
39
57
  await this.select(optionToSelect);
40
58
  }
41
59
 
42
60
  public async inputValue(): Promise<string> {
43
- return await this._inputLocator.inputValue();
61
+ return await this._objects.input().inputValue();
44
62
  }
45
63
 
46
64
  public async clear(): Promise<void> {
47
- await this._inputLocator.fill('');
65
+ await this._objects.input().fill('');
48
66
  }
49
67
 
50
68
  public async selectOption(optionText: string): Promise<void> {
51
- await this._inputLocator.click();
69
+ await this._objects.input().click();
52
70
  await this.select(optionText);
53
71
  }
54
72
 
55
73
  public async getValidationMessage(): Promise<string> {
56
- await this._formFieldLocator.locator('.TooltipContainer p').waitFor({ state: 'visible' });
57
- return await this._formFieldLocator.locator('.TooltipContainer p').innerText();
74
+ await this._objects.validationMessage().waitFor({ state: 'visible' });
75
+ return await this._objects.validationMessage().innerText();
58
76
  }
59
77
 
60
78
  public async fill(value: string): Promise<void> {
61
79
  await Promise.all([
62
- this._formFieldLocator
80
+ this._objects
81
+ .input()
63
82
  .page()
64
83
  .waitForResponse((response) => response.url().includes('/list_') && response.request().method() === 'GET'),
65
- this._inputLocator.click()
84
+ this._objects.input().click()
66
85
  ]);
67
86
 
68
87
  await Promise.all([
69
- this._formFieldLocator
88
+ this._objects
89
+ .input()
70
90
  .page()
71
91
  .waitForResponse((response) => response.url().includes('/list_') && response.request().method() === 'GET'),
72
- this._inputLocator.fill(value)
92
+ this._objects.input().fill(value)
73
93
  ]);
74
94
  }
75
95
 
76
96
  private async select(optionToSelect: string) {
77
97
  const optionsToSelectRegex = new RegExp(`^${escapeRegex(optionToSelect)}$`, 'i');
78
98
 
79
- await this._formFieldLocator.page().getByTestId('autocomplete__menu').getByText(optionsToSelectRegex).click();
80
- await this._formFieldLocator
99
+ await this._objects.input().page().getByTestId('autocomplete__menu').getByText(optionsToSelectRegex).click();
100
+ await this._objects
101
+ .input()
81
102
  .page()
82
- .waitForFunction((el) => document.activeElement === el, await this._inputLocator.elementHandle());
103
+ .waitForFunction((el) => document.activeElement === el, await this._objects.input().elementHandle());
83
104
  }
84
105
  }
85
106
 
107
+ /**
108
+ * Creates an `ILookupDropdown` proxy that intercepts named `LookupDropdown` methods from
109
+ * the class prototype and falls back to the base `Locator` for everything else, effectively
110
+ * merging the typed dropdown interface with standard Playwright locator capabilities.
111
+ * @param context - The parent locator to scope the control within.
112
+ * @param id - The field identifier used to build the scoped locator.
113
+ * @returns A proxy combining `ILookupDropdownCore` methods and `Locator` capabilities.
114
+ */
86
115
  export function createLookupDropdown(context: Locator, id: string): ILookupDropdown {
87
116
  const dropdown = new LookupDropdown(context, id);
117
+ const customProps = new Set(Object.getOwnPropertyNames(LookupDropdown.prototype).filter((p) => p !== 'constructor'));
88
118
 
89
- return new Proxy(dropdown, {
119
+ return new Proxy(context, {
90
120
  get(target, prop, receiver) {
91
- if (prop in target) {
92
- return Reflect.get(target, prop, receiver);
93
- }
94
-
95
- const value = (dropdown as any)[prop];
96
-
97
- if (typeof value === 'function') {
98
- return value.bind(dropdown);
121
+ if (customProps.has(prop as string)) {
122
+ const value = (dropdown as any)[prop];
123
+ if (typeof value === 'function') {
124
+ return value.bind(dropdown);
125
+ }
126
+ return value;
99
127
  }
100
- return value;
128
+ return Reflect.get(target, prop, receiver);
101
129
  }
102
130
  }) as unknown as ILookupDropdown;
103
131
  }
@@ -0,0 +1,19 @@
1
+ import type { Locator } from '@playwright/test';
2
+
3
+ export class LookupDropdownObjects {
4
+ private _id: string;
5
+ private _context: Locator;
6
+
7
+ constructor(context: Locator, id: string) {
8
+ this._context = context;
9
+ this._id = id;
10
+ }
11
+
12
+ public formField = (): Locator => this._context.getByTestId(`form-field__${this._id}`);
13
+
14
+ public label = (): Locator => this.formField().getByTestId(`form-field__${this._id}__label`);
15
+
16
+ public input = (): Locator => this.formField().locator('input');
17
+
18
+ public validationMessage = (): Locator => this.formField().locator('.TooltipContainer p');
19
+ }
package/dist/Testwise.js CHANGED
@@ -6,6 +6,41 @@ import { WaitEventHandler } from './page-extensions/WaitEventHandler.js';
6
6
  import { ClickOverride } from './page-overrides/ClickOverride.js';
7
7
  import { FillOverride } from './page-overrides/FillOverride.js';
8
8
  export * from '@playwright/test';
9
+ /**
10
+ * The main entry point for the Testwise library.
11
+ *
12
+ * **What to import:** Consumer projects import `test` (and optionally
13
+ * `bddTest`) from `@thinkwise/testwise` instead of from `@playwright/test`.
14
+ * This gives you a fully-extended fixture with all Testwise capabilities
15
+ * already wired up:
16
+ *
17
+ * ```ts
18
+ * import { test, expect } from '@thinkwise/testwise';
19
+ *
20
+ * test('create employee', async ({ page }) => {
21
+ * await page.logIn();
22
+ * const emp = await page.subject.EmployeeEditable1Main.goTo();
23
+ * await emp.form.firstNameField.fill('Jane');
24
+ * await emp.actionBar.save();
25
+ * await expect(page.components.snackBar.message).toBeVisible();
26
+ * });
27
+ * ```
28
+ *
29
+ * **What `test` adds on top of Playwright base:**
30
+ *
31
+ * | Layer | What it adds |
32
+ * |---|---|
33
+ * | `ClickOverride` / `FillOverride` | Patches `page.click` and `page.fill` to wait for XHR idle after each action |
34
+ * | `Components` | `page.components` — global Thinkwise UI component instances |
35
+ * | `GoToDeepLink` | `page.goToDeepLink(path)` — deep-link navigation |
36
+ * | `LoginFeatures` | `page.logIn()` / `page.logOut()` etc. |
37
+ * | `UserSimulation` | `page.simulate.*` — keyboard/mouse helpers |
38
+ * | `WaitEventHandler` | `page.waitEvent(url)` — waits for specific response URLs |
39
+ * | `SubjectRegistry` | `page.subject.*` — access to all generated subject classes |
40
+ *
41
+ * Use `bddTest` instead of `test` when combining Testwise with `playwright-bdd`
42
+ * step definitions.
43
+ */
9
44
  function combineExtensions(baseTest, ...extensions) {
10
45
  return extensions.reduce((test, Extension) => new Extension(test).test, baseTest);
11
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Testwise.js","sourceRoot":"","sources":["../Testwise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAGhE,cAAc,kBAAkB,CAAC;AAEjC,SAAS,iBAAiB,CAAC,QAAc,EAAE,GAAG,UAAkD;IAC9F,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,mBAAmB;IACnB,aAAa;IACb,YAAY;IAEZ,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAS,iBAAiB,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAS,iBAAiB,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"Testwise.js","sourceRoot":"","sources":["../Testwise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAGhE,cAAc,kBAAkB,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,SAAS,iBAAiB,CAAC,QAAc,EAAE,GAAG,UAAkD;IAC9F,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,mBAAmB;IACnB,aAAa;IACb,YAAY;IAEZ,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAS,iBAAiB,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAS,iBAAiB,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC"}
@@ -1,7 +1,24 @@
1
+ import { PipelinePaths } from './helpers/PipelinePaths.js';
2
+ /**
3
+ * Manages backup and restore of the `test-artifacts/` directory to protect
4
+ * against failed or partial pipeline runs.
5
+ *
6
+ * **What it does:**
7
+ * - Before the pipeline writes any new files it calls `performBackup()` to
8
+ * copy the existing `test-artifacts/` folder into a sibling
9
+ * `@thinkwise/backups/test-artifacts/` package that survives `node_modules`
10
+ * reinstalls.
11
+ * - If the pipeline fails, the caller invokes `restoreBackup()` to reinstate
12
+ * the last known-good artifacts so the consumer project's tests remain
13
+ * runnable while the issue is investigated.
14
+ *
15
+ * **When it is called:** Automatically by `sync.js` at the start and on
16
+ * failure of every `testwise sync` run. You do not need to call it manually.
17
+ */
1
18
  export declare class ArtifactManager {
2
19
  private _backupPath;
3
20
  private _artifactPath;
4
- constructor();
21
+ constructor(paths?: PipelinePaths);
5
22
  performBackup(): void;
6
23
  backupExists(): boolean;
7
24
  restoreBackup(): void;
@@ -1,12 +1,34 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+ import { PipelinePaths } from './helpers/PipelinePaths.js';
5
+ /**
6
+ * Manages backup and restore of the `test-artifacts/` directory to protect
7
+ * against failed or partial pipeline runs.
8
+ *
9
+ * **What it does:**
10
+ * - Before the pipeline writes any new files it calls `performBackup()` to
11
+ * copy the existing `test-artifacts/` folder into a sibling
12
+ * `@thinkwise/backups/test-artifacts/` package that survives `node_modules`
13
+ * reinstalls.
14
+ * - If the pipeline fails, the caller invokes `restoreBackup()` to reinstate
15
+ * the last known-good artifacts so the consumer project's tests remain
16
+ * runnable while the issue is investigated.
17
+ *
18
+ * **When it is called:** Automatically by `sync.js` at the start and on
19
+ * failure of every `testwise sync` run. You do not need to call it manually.
20
+ */
4
21
  export class ArtifactManager {
5
- constructor() {
22
+ constructor(paths) {
23
+ const p = paths ?? new PipelinePaths();
24
+ this._artifactPath = p.testArtifacts;
25
+ // The backup is stored in the sibling @thinkwise/backups package so it
26
+ // survives reinstalls of this package. Three levels up from
27
+ // dist/artifact-builder/ lands at node_modules/@thinkwise/ (the org scope
28
+ // folder), and from there we descend into the backups package.
6
29
  const _filename = fileURLToPath(import.meta.url);
7
30
  const _dirname = path.dirname(_filename);
8
31
  this._backupPath = path.resolve(_dirname, '..', '..', '..', 'backups', 'test-artifacts');
9
- this._artifactPath = path.resolve(_dirname, '..', '..', 'test-artifacts');
10
32
  }
11
33
  performBackup() {
12
34
  if (fs.existsSync(this._artifactPath)) {
@@ -1 +1 @@
1
- {"version":3,"file":"ArtifactManager.js","sourceRoot":"","sources":["../../artifact-builder/ArtifactManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,OAAO,eAAe;IAI1B;QACE,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACzF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC5E,CAAC;IAED,aAAa;QACX,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,YAAY;QACV,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,aAAa;QACX,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"ArtifactManager.js","sourceRoot":"","sources":["../../artifact-builder/ArtifactManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,eAAe;IAI1B,YAAY,KAAqB;QAC/B,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,aAAa,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;QAErC,uEAAuE;QACvE,4DAA4D;QAC5D,0EAA0E;QAC1E,+DAA+D;QAC/D,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC3F,CAAC;IAED,aAAa;QACX,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,YAAY;QACV,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,aAAa;QACX,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { IComponentSchemaMeta } from '../interfaces/IComponentSchemaMeta.js';
2
+ import type { SubjectComponents } from '../types/Components.js';
3
+ import type { NamingHandler } from './helpers/NamingHandler.js';
4
+ import type { SelectorBuilder } from './SelectorBuilder.js';
5
+ import type { ComponentAssignmentModel, ComponentClassModel, ComponentGetterModel, ComponentPropertyModel } from './TsFileModel.js';
6
+ /**
7
+ * **Pipeline sub-step** — Builds a pure in-memory model (`ComponentClassModel`)
8
+ * for the typed component class appended to a generated screen interface file
9
+ * (e.g. `EmployeeForm`, `EmployeeGrid`). Contains no file I/O — fully unit-testable.
10
+ */
11
+ export declare class ComponentClassModelBuilder {
12
+ private readonly _namingHandler;
13
+ private readonly _selectorBuilder;
14
+ constructor(namingHandler: NamingHandler, selectorBuilder: SelectorBuilder);
15
+ build(interfaceName: string, componentType: SubjectComponents, propertyLines: string[], meta: IComponentSchemaMeta): ComponentClassModel;
16
+ buildGetters(propertyLines: string[], meta: IComponentSchemaMeta): ComponentGetterModel[];
17
+ buildProperties(propertyLines: string[], meta: IComponentSchemaMeta): ComponentPropertyModel[];
18
+ buildAssignments(propertyLines: string[], meta: IComponentSchemaMeta): ComponentAssignmentModel[];
19
+ private resolvePropertyType;
20
+ private getElementTypeFromPropertyName;
21
+ private getColIdFromPropertyName;
22
+ }