@thinkwise/testwise 0.2.67 → 0.2.103
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.
- package/Testwise.ts +35 -0
- package/artifact-builder/ArtifactManager.ts +25 -2
- package/artifact-builder/ComponentClassModelBuilder.ts +148 -0
- package/artifact-builder/InterfaceGenerator.ts +31 -33
- package/artifact-builder/ModelDataBuilder.ts +18 -20
- package/artifact-builder/ModelDataRefiner.ts +23 -3
- package/artifact-builder/SchemaGenerator.ts +45 -35
- package/artifact-builder/ScreenInterfaceRefiner.ts +25 -10
- package/artifact-builder/SelectorBuilder.ts +30 -24
- package/artifact-builder/SubjectClassModelBuilder.ts +209 -0
- package/artifact-builder/SubjectComponentGenerator.ts +67 -246
- package/artifact-builder/SubjectGenerator.ts +117 -230
- package/artifact-builder/SubjectRegistration.ts +41 -32
- package/artifact-builder/TsFileModel.ts +94 -0
- package/artifact-builder/TsFileSerializer.ts +247 -0
- package/artifact-builder/helpers/DataRetriever.ts +64 -27
- package/artifact-builder/helpers/NamingHandler.ts +23 -78
- package/artifact-builder/helpers/PipelinePaths.ts +123 -0
- package/artifact-builder/helpers/Stopwatch.ts +10 -0
- package/artifact-builder/helpers/index.ts +1 -0
- package/artifact-builder/index.ts +4 -0
- package/components/BaseComponentObjects.ts +17 -0
- package/components/action-bar/ActionBar.ts +35 -47
- package/components/action-bar/ActionBarObjects.ts +2 -0
- package/components/action-bar/CustomActionBar.ts +6 -0
- package/components/cardlist/Cardlist.ts +6 -0
- package/components/chart/Chart.ts +6 -0
- package/components/combined-filter/CombinedFilter.ts +9 -0
- package/components/cube-view-bar/CubeViewBar.ts +6 -0
- package/components/export/ExportComponent.ts +12 -0
- package/components/filter/ExcelStyleFilterPopup.ts +35 -2
- package/components/filter/FilterForm.ts +10 -0
- package/components/filter/FilterPopup.ts +30 -9
- package/components/filter/FilterPopupObjects.ts +10 -3
- package/components/filter/FindForm.ts +7 -0
- package/components/filter/ManagePrefilterPopup.ts +11 -0
- package/components/form/Form.ts +16 -0
- package/components/grid/Grid.ts +18 -1
- package/components/maps/Maps.ts +6 -0
- package/components/menu/ListBarMenuComponent.ts +10 -0
- package/components/pivot-grid/PivotGrid.ts +6 -0
- package/components/pivot-grid/PivotGridFieldList.ts +7 -0
- package/components/pop-up/AllRowsPopUp.ts +12 -0
- package/components/pop-up/PopUpComponent.ts +11 -0
- package/components/prefilter-list/PrefilterList.ts +9 -0
- package/components/preview/Preview.ts +6 -0
- package/components/report-bar/ReportBar.ts +6 -0
- package/components/report-tiles/ReportTiles.ts +6 -0
- package/components/scheduler/Scheduler.ts +6 -0
- package/components/snackbar/SnackBar.ts +12 -0
- package/components/splitter/Splitter.ts +6 -0
- package/components/tab/BaseTab.ts +5 -0
- package/components/tab/DetailTabPage.ts +11 -0
- package/components/tab/Tab.ts +10 -0
- package/components/task/TaskBar.ts +13 -3
- package/components/task/TaskTiles.ts +12 -3
- package/components/topbar/TopBar.ts +10 -0
- package/components/tree-view/TreeView.ts +9 -0
- package/controls/DateControl.ts +40 -1
- package/controls/FormComboBox.ts +30 -0
- package/controls/GridColumnControl.ts +34 -3
- package/controls/InputFieldControl.ts +49 -0
- package/controls/LookupDropdown.ts +29 -0
- package/dist/Testwise.js +35 -0
- package/dist/Testwise.js.map +1 -1
- package/dist/artifact-builder/ArtifactManager.d.ts +18 -1
- package/dist/artifact-builder/ArtifactManager.js +24 -2
- package/dist/artifact-builder/ArtifactManager.js.map +1 -1
- package/dist/artifact-builder/ComponentClassModelBuilder.d.ts +22 -0
- package/dist/artifact-builder/ComponentClassModelBuilder.js +115 -0
- package/dist/artifact-builder/ComponentClassModelBuilder.js.map +1 -0
- package/dist/artifact-builder/InterfaceGenerator.d.ts +15 -6
- package/dist/artifact-builder/InterfaceGenerator.js +27 -26
- package/dist/artifact-builder/InterfaceGenerator.js.map +1 -1
- package/dist/artifact-builder/ModelDataBuilder.d.ts +7 -0
- package/dist/artifact-builder/ModelDataBuilder.js +13 -5
- package/dist/artifact-builder/ModelDataBuilder.js.map +1 -1
- package/dist/artifact-builder/ModelDataRefiner.d.ts +18 -1
- package/dist/artifact-builder/ModelDataRefiner.js +18 -3
- package/dist/artifact-builder/ModelDataRefiner.js.map +1 -1
- package/dist/artifact-builder/SchemaGenerator.d.ts +21 -5
- package/dist/artifact-builder/SchemaGenerator.js +38 -26
- package/dist/artifact-builder/SchemaGenerator.js.map +1 -1
- package/dist/artifact-builder/ScreenInterfaceRefiner.d.ts +18 -1
- package/dist/artifact-builder/ScreenInterfaceRefiner.js +23 -9
- package/dist/artifact-builder/ScreenInterfaceRefiner.js.map +1 -1
- package/dist/artifact-builder/SelectorBuilder.d.ts +18 -5
- package/dist/artifact-builder/SelectorBuilder.js +29 -14
- package/dist/artifact-builder/SelectorBuilder.js.map +1 -1
- package/dist/artifact-builder/SubjectClassModelBuilder.d.ts +38 -0
- package/dist/artifact-builder/SubjectClassModelBuilder.js +158 -0
- package/dist/artifact-builder/SubjectClassModelBuilder.js.map +1 -0
- package/dist/artifact-builder/SubjectComponentGenerator.d.ts +25 -14
- package/dist/artifact-builder/SubjectComponentGenerator.js +65 -189
- package/dist/artifact-builder/SubjectComponentGenerator.js.map +1 -1
- package/dist/artifact-builder/SubjectGenerator.d.ts +32 -13
- package/dist/artifact-builder/SubjectGenerator.js +81 -165
- package/dist/artifact-builder/SubjectGenerator.js.map +1 -1
- package/dist/artifact-builder/SubjectRegistration.d.ts +22 -8
- package/dist/artifact-builder/SubjectRegistration.js +29 -14
- package/dist/artifact-builder/SubjectRegistration.js.map +1 -1
- package/dist/artifact-builder/TsFileModel.d.ts +86 -0
- package/dist/artifact-builder/TsFileModel.js +2 -0
- package/dist/artifact-builder/TsFileModel.js.map +1 -0
- package/dist/artifact-builder/TsFileSerializer.d.ts +19 -0
- package/dist/artifact-builder/TsFileSerializer.js +225 -0
- package/dist/artifact-builder/TsFileSerializer.js.map +1 -0
- package/dist/artifact-builder/helpers/DataRetriever.d.ts +22 -3
- package/dist/artifact-builder/helpers/DataRetriever.js +56 -26
- package/dist/artifact-builder/helpers/DataRetriever.js.map +1 -1
- package/dist/artifact-builder/helpers/NamingHandler.d.ts +18 -6
- package/dist/artifact-builder/helpers/NamingHandler.js +20 -61
- package/dist/artifact-builder/helpers/NamingHandler.js.map +1 -1
- package/dist/artifact-builder/helpers/PipelinePaths.d.ts +52 -0
- package/dist/artifact-builder/helpers/PipelinePaths.js +99 -0
- package/dist/artifact-builder/helpers/PipelinePaths.js.map +1 -0
- package/dist/artifact-builder/helpers/Stopwatch.d.ts +10 -0
- package/dist/artifact-builder/helpers/Stopwatch.js +10 -0
- package/dist/artifact-builder/helpers/Stopwatch.js.map +1 -1
- package/dist/artifact-builder/helpers/index.d.ts +1 -0
- package/dist/artifact-builder/helpers/index.js +1 -0
- package/dist/artifact-builder/helpers/index.js.map +1 -1
- package/dist/artifact-builder/index.d.ts +4 -0
- package/dist/artifact-builder/index.js +4 -0
- package/dist/artifact-builder/index.js.map +1 -1
- package/dist/components/BaseComponentObjects.d.ts +17 -0
- package/dist/components/BaseComponentObjects.js +17 -0
- package/dist/components/BaseComponentObjects.js.map +1 -1
- package/dist/components/action-bar/ActionBar.d.ts +21 -24
- package/dist/components/action-bar/ActionBar.js +31 -24
- package/dist/components/action-bar/ActionBar.js.map +1 -1
- package/dist/components/action-bar/ActionBarObjects.d.ts +1 -0
- package/dist/components/action-bar/ActionBarObjects.js +1 -0
- package/dist/components/action-bar/ActionBarObjects.js.map +1 -1
- package/dist/components/action-bar/CustomActionBar.d.ts +6 -0
- package/dist/components/action-bar/CustomActionBar.js +6 -0
- package/dist/components/action-bar/CustomActionBar.js.map +1 -1
- package/dist/components/cardlist/Cardlist.d.ts +6 -0
- package/dist/components/cardlist/Cardlist.js +6 -0
- package/dist/components/cardlist/Cardlist.js.map +1 -1
- package/dist/components/chart/Chart.d.ts +6 -0
- package/dist/components/chart/Chart.js +6 -0
- package/dist/components/chart/Chart.js.map +1 -1
- package/dist/components/combined-filter/CombinedFilter.d.ts +9 -0
- package/dist/components/combined-filter/CombinedFilter.js +9 -0
- package/dist/components/combined-filter/CombinedFilter.js.map +1 -1
- package/dist/components/cube-view-bar/CubeViewBar.d.ts +6 -0
- package/dist/components/cube-view-bar/CubeViewBar.js +6 -0
- package/dist/components/cube-view-bar/CubeViewBar.js.map +1 -1
- package/dist/components/export/ExportComponent.d.ts +12 -0
- package/dist/components/export/ExportComponent.js +12 -0
- package/dist/components/export/ExportComponent.js.map +1 -1
- package/dist/components/filter/ExcelStyleFilterPopup.d.ts +17 -4
- package/dist/components/filter/ExcelStyleFilterPopup.js +35 -23
- package/dist/components/filter/ExcelStyleFilterPopup.js.map +1 -1
- package/dist/components/filter/ExcelStyleFilterPopupObjects.d.ts +1 -1
- package/dist/components/filter/ExcelStyleFilterPopupObjects.js +2 -2
- package/dist/components/filter/ExcelStyleFilterPopupObjects.js.map +1 -1
- package/dist/components/filter/FilterForm.d.ts +10 -0
- package/dist/components/filter/FilterForm.js +10 -0
- package/dist/components/filter/FilterForm.js.map +1 -1
- package/dist/components/filter/FilterPopup.d.ts +22 -4
- package/dist/components/filter/FilterPopup.js +17 -9
- package/dist/components/filter/FilterPopup.js.map +1 -1
- package/dist/components/filter/FilterPopupObjects.d.ts +5 -2
- package/dist/components/filter/FilterPopupObjects.js +5 -2
- package/dist/components/filter/FilterPopupObjects.js.map +1 -1
- package/dist/components/filter/FindForm.d.ts +7 -0
- package/dist/components/filter/FindForm.js +7 -0
- package/dist/components/filter/FindForm.js.map +1 -1
- package/dist/components/filter/ManagePrefilterPopup.d.ts +11 -0
- package/dist/components/filter/ManagePrefilterPopup.js +11 -0
- package/dist/components/filter/ManagePrefilterPopup.js.map +1 -1
- package/dist/components/form/Form.d.ts +16 -0
- package/dist/components/form/Form.js +16 -0
- package/dist/components/form/Form.js.map +1 -1
- package/dist/components/grid/Grid.d.ts +17 -0
- package/dist/components/grid/Grid.js +18 -1
- package/dist/components/grid/Grid.js.map +1 -1
- package/dist/components/maps/Maps.d.ts +6 -0
- package/dist/components/maps/Maps.js +6 -0
- package/dist/components/maps/Maps.js.map +1 -1
- package/dist/components/menu/ListBarMenuComponent.d.ts +10 -0
- package/dist/components/menu/ListBarMenuComponent.js +10 -0
- package/dist/components/menu/ListBarMenuComponent.js.map +1 -1
- package/dist/components/pivot-grid/PivotGrid.d.ts +6 -0
- package/dist/components/pivot-grid/PivotGrid.js +6 -0
- package/dist/components/pivot-grid/PivotGrid.js.map +1 -1
- package/dist/components/pivot-grid/PivotGridFieldList.d.ts +7 -0
- package/dist/components/pivot-grid/PivotGridFieldList.js +7 -0
- package/dist/components/pivot-grid/PivotGridFieldList.js.map +1 -1
- package/dist/components/pop-up/AllRowsPopUp.d.ts +12 -0
- package/dist/components/pop-up/AllRowsPopUp.js +12 -0
- package/dist/components/pop-up/AllRowsPopUp.js.map +1 -1
- package/dist/components/pop-up/PopUpComponent.d.ts +11 -0
- package/dist/components/pop-up/PopUpComponent.js +11 -0
- package/dist/components/pop-up/PopUpComponent.js.map +1 -1
- package/dist/components/prefilter-list/PrefilterList.d.ts +9 -0
- package/dist/components/prefilter-list/PrefilterList.js +9 -0
- package/dist/components/prefilter-list/PrefilterList.js.map +1 -1
- package/dist/components/preview/Preview.d.ts +6 -0
- package/dist/components/preview/Preview.js +6 -0
- package/dist/components/preview/Preview.js.map +1 -1
- package/dist/components/report-bar/ReportBar.d.ts +6 -0
- package/dist/components/report-bar/ReportBar.js +6 -0
- package/dist/components/report-bar/ReportBar.js.map +1 -1
- package/dist/components/report-tiles/ReportTiles.d.ts +6 -0
- package/dist/components/report-tiles/ReportTiles.js +6 -0
- package/dist/components/report-tiles/ReportTiles.js.map +1 -1
- package/dist/components/scheduler/Scheduler.d.ts +6 -0
- package/dist/components/scheduler/Scheduler.js +6 -0
- package/dist/components/scheduler/Scheduler.js.map +1 -1
- package/dist/components/snackbar/SnackBar.d.ts +12 -0
- package/dist/components/snackbar/SnackBar.js +12 -0
- package/dist/components/snackbar/SnackBar.js.map +1 -1
- package/dist/components/splitter/Splitter.d.ts +6 -0
- package/dist/components/splitter/Splitter.js +6 -0
- package/dist/components/splitter/Splitter.js.map +1 -1
- package/dist/components/tab/BaseTab.d.ts +5 -0
- package/dist/components/tab/BaseTab.js +5 -0
- package/dist/components/tab/BaseTab.js.map +1 -1
- package/dist/components/tab/DetailTabPage.d.ts +11 -0
- package/dist/components/tab/DetailTabPage.js +11 -0
- package/dist/components/tab/DetailTabPage.js.map +1 -1
- package/dist/components/tab/Tab.d.ts +10 -0
- package/dist/components/tab/Tab.js +10 -0
- package/dist/components/tab/Tab.js.map +1 -1
- package/dist/components/task/TaskBar.d.ts +12 -2
- package/dist/components/task/TaskBar.js +13 -3
- package/dist/components/task/TaskBar.js.map +1 -1
- package/dist/components/task/TaskTiles.d.ts +11 -2
- package/dist/components/task/TaskTiles.js +12 -3
- package/dist/components/task/TaskTiles.js.map +1 -1
- package/dist/components/topbar/TopBar.d.ts +10 -0
- package/dist/components/topbar/TopBar.js +10 -0
- package/dist/components/topbar/TopBar.js.map +1 -1
- package/dist/components/tree-view/TreeView.d.ts +9 -0
- package/dist/components/tree-view/TreeView.js +9 -0
- package/dist/components/tree-view/TreeView.js.map +1 -1
- package/dist/controls/DateControl.d.ts +39 -0
- package/dist/controls/DateControl.js +18 -1
- package/dist/controls/DateControl.js.map +1 -1
- package/dist/controls/FormComboBox.d.ts +30 -0
- package/dist/controls/FormComboBox.js +8 -0
- package/dist/controls/FormComboBox.js.map +1 -1
- package/dist/controls/GridColumnControl.d.ts +30 -0
- package/dist/controls/GridColumnControl.js +12 -3
- package/dist/controls/GridColumnControl.js.map +1 -1
- package/dist/controls/InputFieldControl.d.ts +49 -0
- package/dist/controls/InputFieldControl.js +30 -0
- package/dist/controls/InputFieldControl.js.map +1 -1
- package/dist/controls/LookupDropdown.d.ts +29 -0
- package/dist/controls/LookupDropdown.js +8 -0
- package/dist/controls/LookupDropdown.js.map +1 -1
- package/dist/enums/ElementTypes.d.ts +18 -0
- package/dist/enums/ElementTypes.js +18 -0
- package/dist/enums/ElementTypes.js.map +1 -1
- package/dist/enums/ExportFormat.d.ts +8 -0
- package/dist/enums/ExportFormat.js +8 -0
- package/dist/enums/ExportFormat.js.map +1 -1
- package/dist/enums/LogLevel.d.ts +17 -0
- package/dist/enums/LogLevel.js +17 -1
- package/dist/enums/LogLevel.js.map +1 -1
- package/dist/enums/index.d.ts +1 -0
- package/dist/enums/index.js +1 -0
- package/dist/enums/index.js.map +1 -1
- package/dist/helpers/ConfigChecker.d.ts +13 -0
- package/dist/helpers/ConfigChecker.js +13 -0
- package/dist/helpers/ConfigChecker.js.map +1 -1
- package/dist/helpers/Ensure.d.ts +13 -0
- package/dist/helpers/Ensure.js +13 -0
- package/dist/helpers/Ensure.js.map +1 -1
- package/dist/helpers/FlightTracker.d.ts +13 -3
- package/dist/helpers/FlightTracker.js +103 -17
- package/dist/helpers/FlightTracker.js.map +1 -1
- package/dist/helpers/GlobalWaitEventHandler.d.ts +13 -0
- package/dist/helpers/GlobalWaitEventHandler.js +13 -0
- package/dist/helpers/GlobalWaitEventHandler.js.map +1 -1
- package/dist/helpers/LoginHelper.d.ts +35 -1
- package/dist/helpers/LoginHelper.js +46 -11
- package/dist/helpers/LoginHelper.js.map +1 -1
- package/dist/helpers/PathResolver.d.ts +22 -0
- package/dist/helpers/PathResolver.js +22 -0
- package/dist/helpers/PathResolver.js.map +1 -1
- package/dist/helpers/Poll.d.ts +13 -1
- package/dist/helpers/Poll.js +12 -0
- package/dist/helpers/Poll.js.map +1 -1
- package/dist/helpers/RegexHelper.d.ts +15 -0
- package/dist/helpers/RegexHelper.js +15 -3
- package/dist/helpers/RegexHelper.js.map +1 -1
- package/dist/helpers/SubjectNavigator.d.ts +26 -0
- package/dist/helpers/SubjectNavigator.js +51 -0
- package/dist/helpers/SubjectNavigator.js.map +1 -0
- package/dist/helpers/UserSimulationHelper.d.ts +14 -0
- package/dist/helpers/UserSimulationHelper.js +14 -0
- package/dist/helpers/UserSimulationHelper.js.map +1 -1
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +1 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/index.d.ts +6 -20
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/IComponentObjects.d.ts +12 -0
- package/dist/interfaces/IComponentSchemaMeta.d.ts +15 -0
- package/dist/interfaces/IComponentSchemaMeta.js +2 -0
- package/dist/interfaces/IComponentSchemaMeta.js.map +1 -0
- package/dist/interfaces/IProperty.d.ts +13 -0
- package/dist/interfaces/IRegisteredSubjects.d.ts +12 -0
- package/dist/interfaces/ISeedSubjectDraft.d.ts +16 -0
- package/dist/interfaces/ISeedSubjectDraft.js +2 -0
- package/dist/interfaces/ISeedSubjectDraft.js.map +1 -0
- package/dist/interfaces/ISubject.d.ts +13 -0
- package/dist/interfaces/ISubjectDetail.d.ts +11 -0
- package/dist/interfaces/ISubjectDetail.js +2 -0
- package/dist/interfaces/ISubjectDetail.js.map +1 -0
- package/dist/mcp/ArtifactResolver.d.ts +152 -0
- package/dist/mcp/ArtifactResolver.js +232 -0
- package/dist/mcp/ArtifactResolver.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/page-extensions/GlobalComponents.d.ts +30 -0
- package/dist/page-extensions/GlobalComponents.js +30 -0
- package/dist/page-extensions/GlobalComponents.js.map +1 -1
- package/dist/page-extensions/GoToDeepLink.d.ts +9 -0
- package/dist/page-extensions/GoToDeepLink.js +9 -0
- package/dist/page-extensions/GoToDeepLink.js.map +1 -1
- package/dist/page-extensions/LoginFeatures.d.ts +8 -0
- package/dist/page-extensions/LoginFeatures.js +8 -0
- package/dist/page-extensions/LoginFeatures.js.map +1 -1
- package/dist/page-extensions/SubjectRegistry.d.ts +31 -0
- package/dist/page-extensions/SubjectRegistry.js +31 -0
- package/dist/page-extensions/SubjectRegistry.js.map +1 -1
- package/dist/page-extensions/UserSimulation.d.ts +21 -0
- package/dist/page-extensions/UserSimulation.js +21 -0
- package/dist/page-extensions/UserSimulation.js.map +1 -1
- package/dist/page-extensions/WaitEventHandler.d.ts +20 -0
- package/dist/page-extensions/WaitEventHandler.js +20 -0
- package/dist/page-extensions/WaitEventHandler.js.map +1 -1
- package/dist/page-overrides/ClickOverride.d.ts +23 -2
- package/dist/page-overrides/ClickOverride.js +34 -50
- package/dist/page-overrides/ClickOverride.js.map +1 -1
- package/dist/page-overrides/FillOverride.d.ts +23 -0
- package/dist/page-overrides/FillOverride.js +56 -61
- package/dist/page-overrides/FillOverride.js.map +1 -1
- package/dist/services/ConfigBuilder.d.ts +24 -0
- package/dist/services/ConfigBuilder.js +24 -0
- package/dist/services/ConfigBuilder.js.map +1 -1
- package/dist/services/IndiciumApi.service.d.ts +26 -0
- package/dist/services/IndiciumApi.service.js +40 -5
- package/dist/services/IndiciumApi.service.js.map +1 -1
- package/dist/services/Logger.d.ts +13 -0
- package/dist/services/Logger.js +39 -0
- package/dist/services/Logger.js.map +1 -1
- package/dist/types/Components.d.ts +18 -1
- package/dist/types/Components.js +0 -1
- package/dist/types/Components.js.map +1 -1
- package/dist/types/LocatorType.d.ts +5 -0
- package/dist/types/LocatorType.js +2 -0
- package/dist/types/LocatorType.js.map +1 -0
- package/dist/types/PollTypes.d.ts +8 -0
- package/dist/types/Test.d.ts +18 -0
- package/dist/types/Universal.d.ts +12 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/enums/ElementTypes.ts +18 -0
- package/enums/ExportFormat.ts +8 -0
- package/enums/LogLevel.ts +17 -1
- package/enums/index.ts +1 -0
- package/helpers/ConfigChecker.ts +13 -0
- package/helpers/Ensure.ts +13 -0
- package/helpers/FlightTracker.ts +109 -20
- package/helpers/GlobalWaitEventHandler.ts +13 -0
- package/helpers/LoginHelper.ts +49 -12
- package/helpers/PathResolver.ts +22 -0
- package/helpers/Poll.ts +13 -1
- package/helpers/RegexHelper.ts +15 -3
- package/helpers/SubjectNavigator.ts +57 -0
- package/helpers/UserSimulationHelper.ts +14 -0
- package/helpers/index.ts +1 -0
- package/index.ts +1 -0
- package/interfaces/IComponentObjects.ts +12 -0
- package/interfaces/IComponentSchemaMeta.ts +17 -0
- package/interfaces/IProperty.ts +13 -0
- package/interfaces/IRegisteredSubjects.ts +12 -0
- package/interfaces/ISeedSubjectDraft.ts +17 -0
- package/interfaces/ISubject.ts +13 -0
- package/interfaces/ISubjectDetail.ts +12 -0
- package/mcp/ArtifactResolver.ts +296 -0
- package/mcp/index.ts +2 -0
- package/package.json +20 -8
- package/page-extensions/GlobalComponents.ts +30 -0
- package/page-extensions/GoToDeepLink.ts +9 -0
- package/page-extensions/LoginFeatures.ts +8 -0
- package/page-extensions/SubjectRegistry.ts +32 -0
- package/page-extensions/UserSimulation.ts +21 -0
- package/page-extensions/WaitEventHandler.ts +20 -0
- package/page-overrides/ClickOverride.ts +36 -55
- package/page-overrides/FillOverride.ts +59 -73
- package/promptCredentials.js +1 -1
- package/scripts/Testwise.template.json +1 -1
- package/scripts/diagram.js +2267 -0
- package/scripts/main.js +84 -63
- package/scripts/postinstall.js +55 -42
- package/scripts/setup.js +91 -37
- package/scripts/sync.js +767 -748
- package/services/ConfigBuilder.ts +24 -0
- package/services/IndiciumApi.service.ts +44 -6
- package/services/Logger.ts +40 -0
- package/templates/copilot-instructions.md +130 -0
- package/templates/mcp.json +9 -0
- package/templates/testwise-test-expert.agent.md +453 -0
- package/tests/tsconfig.json +12 -0
- package/tsconfig.json +6 -2
- package/types/Components.ts +17 -2
- package/types/LocatorType.ts +5 -0
- package/types/PollTypes.ts +8 -0
- package/types/Test.ts +18 -0
- package/types/Universal.ts +12 -0
- package/types/index.ts +2 -0
- package/dist/interfaces/IStoredTestResults.d.ts +0 -5
- package/dist/interfaces/IStoredTestResults.js +0 -2
- package/dist/interfaces/IStoredTestResults.js.map +0 -1
- package/dist/templates/test-artifacts/SubjectPageBase.d.ts +0 -5
- package/dist/templates/test-artifacts/SubjectPageBase.js +0 -6
- package/dist/templates/test-artifacts/SubjectPageBase.js.map +0 -1
- package/dist/templates/test-artifacts/screens/index.d.ts +0 -1
- package/dist/templates/test-artifacts/screens/index.js +0 -2
- package/dist/templates/test-artifacts/screens/index.js.map +0 -1
- package/dist/templates/test-artifacts/subjects/index.d.ts +0 -1
- package/dist/templates/test-artifacts/subjects/index.js +0 -2
- package/dist/templates/test-artifacts/subjects/index.js.map +0 -1
- package/interfaces/IStoredTestResults.ts +0 -6
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
2
|
import { SchedulerObjects } from './SchedulerObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise scheduler component that renders time-based data as a
|
|
6
|
+
* calendar / appointment view.
|
|
7
|
+
*
|
|
8
|
+
* In generated subject classes this is exposed as a typed `scheduler` property.
|
|
9
|
+
*/
|
|
4
10
|
export class Scheduler {
|
|
5
11
|
treeViewObjects: SchedulerObjects;
|
|
6
12
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import type { Locator, Page } from '@playwright/test';
|
|
2
2
|
import { SnackBarObjects } from './SnackBarObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise snackbar / toast notification bar shown at the bottom
|
|
6
|
+
* of the screen after saves, errors, and background operations.
|
|
7
|
+
*
|
|
8
|
+
* Access via `page.components.snackBar` — no need to construct this yourself.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* await employee.actionBar.save();
|
|
12
|
+
* const msg = await page.components.snackBar.getSnackbarText();
|
|
13
|
+
* // or check visibility:
|
|
14
|
+
* await expect(page.components.snackBar.getSnackbar()).toBeVisible();
|
|
15
|
+
*/
|
|
4
16
|
export class SnackBarComponent {
|
|
5
17
|
private _objects: SnackBarObjects;
|
|
6
18
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
2
|
import { SplitterObjects } from './SplitterObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise splitter component that divides the screen into
|
|
6
|
+
* resizable panels (e.g. master/detail split, filter panel divider).
|
|
7
|
+
*
|
|
8
|
+
* In generated subject classes this is exposed as a typed `splitter` property.
|
|
9
|
+
*/
|
|
4
10
|
export class Splitter {
|
|
5
11
|
splitterObjects: SplitterObjects;
|
|
6
12
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
2
|
import { BaseTabObjects } from './BaseTabObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Shared base class for `Tab` and `DetailTabPage` containing the common
|
|
6
|
+
* tab-strip interaction methods (open by label, open by index, get active tab).
|
|
7
|
+
* Do not use this directly — use `Tab` or `DetailTabPage` in tests.
|
|
8
|
+
*/
|
|
4
9
|
export class BaseTab {
|
|
5
10
|
protected _objects: BaseTabObjects;
|
|
6
11
|
|
|
@@ -2,6 +2,17 @@ import type { Locator } from '@playwright/test';
|
|
|
2
2
|
import { BaseTab } from './BaseTab.js';
|
|
3
3
|
import { DetailTabPageObjects } from './DetailTabPageObjects.js';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Wraps a Thinkwise detail-tab page — a full sub-screen that loads inside a
|
|
7
|
+
* tab panel, typically showing related data for the selected master record.
|
|
8
|
+
*
|
|
9
|
+
* In generated subject classes this is exposed as a typed `detailTabPage`
|
|
10
|
+
* property. Switch to a detail tab first, then interact with its content.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* await subject.tab.openDetailTabByLabel('Addresses');
|
|
14
|
+
* await subject.detailTabPage.context.waitFor({ state: 'visible' });
|
|
15
|
+
*/
|
|
5
16
|
export class DetailTabPage extends BaseTab {
|
|
6
17
|
protected _objects: DetailTabPageObjects;
|
|
7
18
|
|
package/components/tab/Tab.ts
CHANGED
|
@@ -2,6 +2,16 @@ import type { Locator } from '@playwright/test';
|
|
|
2
2
|
import { BaseTab } from './BaseTab.js';
|
|
3
3
|
import { TabObjects } from './TabObjects.js';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Wraps a Thinkwise tab-strip component used to switch between related screens
|
|
7
|
+
* (e.g. detail tabs, sub-screens within a subject).
|
|
8
|
+
*
|
|
9
|
+
* In generated subject classes this is exposed as a typed `tab` property.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* // Navigate to the "Addresses" detail tab:
|
|
13
|
+
* await subject.tab.openDetailTabByLabel('Addresses');
|
|
14
|
+
*/
|
|
5
15
|
export class Tab extends BaseTab {
|
|
6
16
|
protected _objects: TabObjects;
|
|
7
17
|
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
2
|
import { TaskBarObjects } from './TaskBarObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise task-bar component that shows process/workflow task
|
|
6
|
+
* buttons in a horizontal bar at the bottom or top of a subject screen.
|
|
7
|
+
*
|
|
8
|
+
* In generated subject classes this is exposed as a typed `taskBar` property.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* await subject.taskBar.getTaskById('approve').click();
|
|
12
|
+
* const label = await subject.taskBar.getTaskByLabel('Approve').textContent();
|
|
13
|
+
*/
|
|
4
14
|
export class TaskBar {
|
|
5
15
|
private _taskBarObjects: TaskBarObjects;
|
|
6
16
|
|
|
7
17
|
/**
|
|
8
|
-
* @param
|
|
18
|
+
* @param context the taskbar container element (same idea as Grid's context)
|
|
9
19
|
*/
|
|
10
|
-
constructor(
|
|
11
|
-
this._taskBarObjects = new TaskBarObjects(
|
|
20
|
+
constructor(context: Locator) {
|
|
21
|
+
this._taskBarObjects = new TaskBarObjects(context.page(), context);
|
|
12
22
|
}
|
|
13
23
|
|
|
14
24
|
/** returns all task buttons */
|
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
2
|
import { TaskTilesObjects } from './TaskTilesObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise task-tiles component that displays tasks as clickable
|
|
6
|
+
* tile buttons on a dashboard or process-flow screen.
|
|
7
|
+
*
|
|
8
|
+
* In generated subject classes this is exposed as a typed `taskTiles` property.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* await subject.taskTiles.getTileByLabel('Approve').click();
|
|
12
|
+
*/
|
|
4
13
|
export class TaskTiles {
|
|
5
14
|
private _taskTilesObjects: TaskTilesObjects;
|
|
6
15
|
|
|
7
16
|
/**
|
|
8
|
-
* @param
|
|
17
|
+
* @param context the taskTiles container element
|
|
9
18
|
*/
|
|
10
|
-
constructor(
|
|
11
|
-
this._taskTilesObjects = new TaskTilesObjects(
|
|
19
|
+
constructor(context: Locator) {
|
|
20
|
+
this._taskTilesObjects = new TaskTilesObjects(context.page(), context);
|
|
12
21
|
}
|
|
13
22
|
|
|
14
23
|
/** returns all task tile buttons */
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { Locator, Page } from '@playwright/test';
|
|
2
2
|
import { TopBarObjects } from './TopBarObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise application top bar that shows the page title,
|
|
6
|
+
* breadcrumb trail, and the user/application menu.
|
|
7
|
+
*
|
|
8
|
+
* Access via `page.components.topBar` — no need to construct this yourself.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const title = await page.components.topBar.getTopBarTitle().textContent();
|
|
12
|
+
* const breadcrumb = await page.components.topBar.getTopBarBreadcrumb().textContent();
|
|
13
|
+
*/
|
|
4
14
|
export class TopBarComponent {
|
|
5
15
|
private _objects: TopBarObjects;
|
|
6
16
|
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import type { Locator } from '@playwright/test';
|
|
2
2
|
import { TreeViewObjects } from './TreeViewObjects.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Wraps the Thinkwise tree-view navigation component used to display
|
|
6
|
+
* hierarchical data structures (e.g. organisational trees, folder structures).
|
|
7
|
+
*
|
|
8
|
+
* In generated subject classes this is exposed as a typed `treeView` property.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* await subject.treeView.context.getByText('Europe').click();
|
|
12
|
+
*/
|
|
4
13
|
export class TreeView {
|
|
5
14
|
treeViewObjects: TreeViewObjects;
|
|
6
15
|
|
package/controls/DateControl.ts
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
import type { Locator } from '@playwright/test';
|
|
4
4
|
import { DateControlObjects } from './DateControlObjects.js';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Typed proxy for a date-picker field (`control_type: "date_picker"`) 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 `IDateControl` for each date
|
|
12
|
+
* field on the form:
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* // Fill accepts any common date format — numbers are extracted and entered
|
|
16
|
+
* // sequentially so the date picker can apply its own formatting:
|
|
17
|
+
* await subject.form.hireDateField.fill('15-03-2025');
|
|
18
|
+
* await subject.form.hireDateField.fill('03/15/2025');
|
|
19
|
+
* await subject.form.hireDateField.fill('20250315'); // also works
|
|
20
|
+
*
|
|
21
|
+
* const raw = await subject.form.hireDateField.inputValue();
|
|
22
|
+
* await subject.form.hireDateField.clear();
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* The returned value is a **Proxy** — it works as both a Playwright `Locator`
|
|
26
|
+
* and a typed date control.
|
|
27
|
+
*/
|
|
6
28
|
export type IDateControl = Locator & IDateControlCore;
|
|
7
29
|
|
|
8
30
|
export type IDateControlCore = {
|
|
@@ -29,23 +51,40 @@ export class DateControl implements IDateControlCore {
|
|
|
29
51
|
public async fill(value: string): Promise<void> {
|
|
30
52
|
const numbersOnlyValue = value.replace(/\D/g, '');
|
|
31
53
|
|
|
32
|
-
await this._objects.fieldInput().
|
|
54
|
+
await this._objects.fieldInput().click();
|
|
33
55
|
await this._objects.fieldInput().pressSequentially(numbersOnlyValue);
|
|
34
56
|
}
|
|
35
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Clears the date input by filling it with an empty string.
|
|
60
|
+
*/
|
|
36
61
|
public async clear(): Promise<void> {
|
|
37
62
|
await this._objects.fieldInput().fill('');
|
|
38
63
|
}
|
|
39
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Returns the current raw string value from the underlying date input element.
|
|
67
|
+
*/
|
|
40
68
|
public async inputValue(): Promise<string> {
|
|
41
69
|
return await this._objects.fieldInput().inputValue();
|
|
42
70
|
}
|
|
43
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Returns the Playwright `Locator` for the underlying `<input>` element of the date field.
|
|
74
|
+
*/
|
|
44
75
|
public inputElement(): Locator {
|
|
45
76
|
return this._objects.fieldInput();
|
|
46
77
|
}
|
|
47
78
|
}
|
|
48
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Creates an `IDateControl` proxy that merges `DateControl` interaction methods with
|
|
82
|
+
* the underlying Playwright `Locator` for the `form-field__<id>` test ID.
|
|
83
|
+
* Use the returned value as both a typed date control and a regular Playwright locator.
|
|
84
|
+
* @param context - The parent locator to scope the control within.
|
|
85
|
+
* @param id - The field identifier used to locate `[data-testid="form-field__<id>"]`.
|
|
86
|
+
* @returns A proxy combining `IDateControlCore` methods and `Locator` capabilities.
|
|
87
|
+
*/
|
|
49
88
|
export function createDateControl(context: Locator, id: string): IDateControl {
|
|
50
89
|
const inputFieldControl = new DateControl(context, id);
|
|
51
90
|
const locator = context.getByTestId(`form-field__${id}`);
|
package/controls/FormComboBox.ts
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
import type { Locator } from '@playwright/test';
|
|
4
4
|
import { FormComboBoxObjects } from './FormComboBoxObjects.js';
|
|
5
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
|
+
*/
|
|
6
28
|
export type IFormComboBox = Locator & IFormComboBoxCore;
|
|
7
29
|
|
|
8
30
|
export type IFormComboBoxCore = {
|
|
@@ -40,6 +62,14 @@ class FormComboBox implements IFormComboBoxCore {
|
|
|
40
62
|
}
|
|
41
63
|
}
|
|
42
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
|
+
*/
|
|
43
73
|
export function createFormComboBox(context: Locator, id: string): IFormComboBox {
|
|
44
74
|
const comboBox = new FormComboBox(context, id);
|
|
45
75
|
const locator = context.getByTestId(`form-field__${id}`);
|
|
@@ -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
|
|
46
|
+
this._id = id;
|
|
25
47
|
this._objects = new GridColumnControlObjects(gridContext, this._id);
|
|
26
48
|
this._grid = new Grid(gridContext);
|
|
27
49
|
}
|
|
@@ -48,9 +70,18 @@ class GridColumnControl implements IGridColumnControlCore {
|
|
|
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
|
|
53
|
-
const
|
|
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) {
|
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
import type { Locator } from '@playwright/test';
|
|
4
4
|
import { InputFieldControlObjects } from './InputFieldControlObjects.js';
|
|
5
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
|
+
*/
|
|
6
25
|
export type IInputFieldControl = Locator & ICoreInputFieldControl;
|
|
7
26
|
|
|
8
27
|
export type ICoreInputFieldControl = {
|
|
@@ -22,31 +41,53 @@ export class InputFieldControl implements ICoreInputFieldControl {
|
|
|
22
41
|
this._objects = new InputFieldControlObjects(context, id);
|
|
23
42
|
}
|
|
24
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Waits for the field's validation message element to become visible, then returns its text.
|
|
46
|
+
*/
|
|
25
47
|
public async getValidationMessage(): Promise<string> {
|
|
26
48
|
await this._objects.validationMessage().waitFor({ state: 'visible' });
|
|
27
49
|
return await this._objects.validationMessage().innerText();
|
|
28
50
|
}
|
|
29
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Fills the input element with the given value.
|
|
54
|
+
* @param value - The string to enter into the field.
|
|
55
|
+
*/
|
|
30
56
|
public async fill(value: string): Promise<void> {
|
|
31
57
|
await this._objects.fieldInput().fill(value);
|
|
32
58
|
}
|
|
33
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Clicks the underlying input element.
|
|
62
|
+
*/
|
|
34
63
|
public async click(): Promise<void> {
|
|
35
64
|
await this._objects.fieldInput().click();
|
|
36
65
|
}
|
|
37
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Clears the input field by filling it with an empty string.
|
|
69
|
+
*/
|
|
38
70
|
public async clear(): Promise<void> {
|
|
39
71
|
await this._objects.fieldInput().fill('');
|
|
40
72
|
}
|
|
41
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Returns the current string value from the underlying input element.
|
|
76
|
+
*/
|
|
42
77
|
public async inputValue(): Promise<string> {
|
|
43
78
|
return await this._objects.fieldInput().inputValue();
|
|
44
79
|
}
|
|
45
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Returns the Playwright `Locator` for the underlying `<input>` element of the field.
|
|
83
|
+
*/
|
|
46
84
|
public inputElement(): Locator {
|
|
47
85
|
return this._objects.fieldInput();
|
|
48
86
|
}
|
|
49
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Returns the trimmed, whitespace-normalised text content of the field's label element.
|
|
90
|
+
*/
|
|
50
91
|
public async getLabelText(): Promise<string> {
|
|
51
92
|
let returnText = (await this._objects.fieldLabel().textContent()) || '';
|
|
52
93
|
|
|
@@ -56,6 +97,14 @@ export class InputFieldControl implements ICoreInputFieldControl {
|
|
|
56
97
|
}
|
|
57
98
|
}
|
|
58
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
|
+
*/
|
|
59
108
|
export function createInputFieldControl(context: Locator, id: string): IInputFieldControl {
|
|
60
109
|
const inputFieldControl = new InputFieldControl(context, id);
|
|
61
110
|
const locator = context.getByTestId(`form-field__${id}`);
|
|
@@ -4,6 +4,27 @@ import type { Locator } from '@playwright/test';
|
|
|
4
4
|
import { escapeRegex } from '../helpers/RegexHelper.js';
|
|
5
5
|
import { LookupDropdownObjects } from './LookupDropdownObjects.js';
|
|
6
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
|
+
*/
|
|
7
28
|
export type ILookupDropdown = Locator & ILookupDropdownCore;
|
|
8
29
|
|
|
9
30
|
export type ILookupDropdownCore = {
|
|
@@ -83,6 +104,14 @@ class LookupDropdown implements ILookupDropdownCore {
|
|
|
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);
|
|
88
117
|
const customProps = new Set(Object.getOwnPropertyNames(LookupDropdown.prototype).filter((p) => p !== 'constructor'));
|
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
|
}
|
package/dist/Testwise.js.map
CHANGED
|
@@ -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;
|
|
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
|
+
}
|