@thinkwise/testwise 0.1.97 → 0.2.0-beta.22

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 (202) hide show
  1. package/Testwise.ts +7 -9
  2. package/artifact-builder/ArtifactManager.ts +33 -0
  3. package/artifact-builder/InterfaceGenerator.ts +165 -0
  4. package/artifact-builder/ModelDataBuilder.ts +194 -0
  5. package/artifact-builder/ModelDataRefiner.ts +39 -0
  6. package/artifact-builder/SchemaGenerator.ts +131 -0
  7. package/artifact-builder/ScreenInterfaceRefiner.ts +154 -0
  8. package/artifact-builder/SelectorBuilder.ts +82 -0
  9. package/artifact-builder/SubjectComponentGenerator.ts +186 -0
  10. package/artifact-builder/SubjectGenerator.ts +332 -0
  11. package/artifact-builder/SubjectRegistration.ts +131 -0
  12. package/artifact-builder/helpers/DataRetriever.ts +64 -0
  13. package/artifact-builder/helpers/NamingHandler.ts +182 -0
  14. package/artifact-builder/helpers/Stopwatch.ts +13 -0
  15. package/artifact-builder/helpers/index.ts +3 -0
  16. package/artifact-builder/index.ts +9 -0
  17. package/components/{actionbar/Actionbar.ts → action-bar/ActionBar.ts} +12 -12
  18. package/components/{actionbar/ActionbarObjects.ts → action-bar/ActionBarObjects.ts} +4 -4
  19. package/components/{actionbar → action-bar}/CustomActionBar.ts +2 -2
  20. package/components/index.ts +3 -4
  21. package/components/tab/DetailTabPage.ts +20 -0
  22. package/components/tab/{DetailTabObjects.ts → DetailTabPageObjects.ts} +1 -1
  23. package/components/tab/Tab.ts +31 -5
  24. package/components/tab/TabObjects.ts +15 -3
  25. package/dist/Testwise.js +5 -1
  26. package/dist/Testwise.js.map +1 -1
  27. package/dist/artifact-builder/ArtifactManager.d.ts +8 -0
  28. package/dist/artifact-builder/ArtifactManager.js +27 -0
  29. package/dist/artifact-builder/ArtifactManager.js.map +1 -0
  30. package/dist/artifact-builder/InterfaceGenerator.d.ts +15 -0
  31. package/dist/artifact-builder/InterfaceGenerator.js +122 -0
  32. package/dist/artifact-builder/InterfaceGenerator.js.map +1 -0
  33. package/dist/artifact-builder/ModelDataBuilder.d.ts +2 -0
  34. package/dist/artifact-builder/ModelDataBuilder.js +141 -0
  35. package/dist/artifact-builder/ModelDataBuilder.js.map +1 -0
  36. package/dist/artifact-builder/ModelDataRefiner.d.ts +4 -0
  37. package/dist/artifact-builder/ModelDataRefiner.js +28 -0
  38. package/dist/artifact-builder/ModelDataRefiner.js.map +1 -0
  39. package/dist/artifact-builder/SchemaGenerator.d.ts +12 -0
  40. package/dist/artifact-builder/SchemaGenerator.js +102 -0
  41. package/dist/artifact-builder/SchemaGenerator.js.map +1 -0
  42. package/dist/artifact-builder/ScreenInterfaceRefiner.d.ts +15 -0
  43. package/dist/artifact-builder/ScreenInterfaceRefiner.js +120 -0
  44. package/dist/artifact-builder/ScreenInterfaceRefiner.js.map +1 -0
  45. package/dist/artifact-builder/SelectorBuilder.d.ts +13 -0
  46. package/dist/artifact-builder/SelectorBuilder.js +69 -0
  47. package/dist/artifact-builder/SelectorBuilder.js.map +1 -0
  48. package/dist/artifact-builder/SubjectComponentGenerator.d.ts +23 -0
  49. package/dist/artifact-builder/SubjectComponentGenerator.js +136 -0
  50. package/dist/artifact-builder/SubjectComponentGenerator.js.map +1 -0
  51. package/dist/artifact-builder/SubjectGenerator.d.ts +27 -0
  52. package/dist/artifact-builder/SubjectGenerator.js +235 -0
  53. package/dist/artifact-builder/SubjectGenerator.js.map +1 -0
  54. package/dist/artifact-builder/SubjectRegistration.d.ts +21 -0
  55. package/dist/artifact-builder/SubjectRegistration.js +95 -0
  56. package/dist/artifact-builder/SubjectRegistration.js.map +1 -0
  57. package/dist/artifact-builder/helpers/DataRetriever.d.ts +12 -0
  58. package/dist/artifact-builder/helpers/DataRetriever.js +52 -0
  59. package/dist/artifact-builder/helpers/DataRetriever.js.map +1 -0
  60. package/dist/artifact-builder/helpers/NamingHandler.d.ts +24 -0
  61. package/dist/artifact-builder/helpers/NamingHandler.js +147 -0
  62. package/dist/artifact-builder/helpers/NamingHandler.js.map +1 -0
  63. package/dist/artifact-builder/helpers/Stopwatch.d.ts +5 -0
  64. package/dist/artifact-builder/helpers/Stopwatch.js +13 -0
  65. package/dist/artifact-builder/helpers/Stopwatch.js.map +1 -0
  66. package/dist/artifact-builder/helpers/index.d.ts +3 -0
  67. package/dist/artifact-builder/helpers/index.js +4 -0
  68. package/dist/artifact-builder/helpers/index.js.map +1 -0
  69. package/dist/artifact-builder/index.d.ts +9 -0
  70. package/dist/artifact-builder/index.js +10 -0
  71. package/dist/artifact-builder/index.js.map +1 -0
  72. package/dist/components/{actionbar/Actionbar.d.ts → action-bar/ActionBar.d.ts} +4 -4
  73. package/dist/components/{actionbar/Actionbar.js → action-bar/ActionBar.js} +9 -9
  74. package/dist/components/action-bar/ActionBar.js.map +1 -0
  75. package/dist/components/{actionbar/ActionbarObjects.d.ts → action-bar/ActionBarObjects.d.ts} +2 -2
  76. package/dist/components/{actionbar/ActionbarObjects.js → action-bar/ActionBarObjects.js} +5 -5
  77. package/dist/components/action-bar/ActionBarObjects.js.map +1 -0
  78. package/dist/components/{actionbar → action-bar}/CustomActionBar.d.ts +2 -2
  79. package/dist/components/action-bar/CustomActionBar.js +7 -0
  80. package/dist/components/action-bar/CustomActionBar.js.map +1 -0
  81. package/dist/components/index.d.ts +3 -4
  82. package/dist/components/index.js +3 -4
  83. package/dist/components/index.js.map +1 -1
  84. package/dist/components/tab/DetailTabPage.d.ts +9 -0
  85. package/dist/components/tab/DetailTabPage.js +15 -0
  86. package/dist/components/tab/DetailTabPage.js.map +1 -0
  87. package/dist/components/tab/{DetailTabObjects.d.ts → DetailTabPageObjects.d.ts} +1 -1
  88. package/dist/components/tab/{DetailTabObjects.js → DetailTabPageObjects.js} +2 -2
  89. package/dist/components/tab/DetailTabPageObjects.js.map +1 -0
  90. package/dist/components/tab/Tab.d.ts +8 -3
  91. package/dist/components/tab/Tab.js +25 -4
  92. package/dist/components/tab/Tab.js.map +1 -1
  93. package/dist/components/tab/TabObjects.d.ts +7 -2
  94. package/dist/components/tab/TabObjects.js +9 -2
  95. package/dist/components/tab/TabObjects.js.map +1 -1
  96. package/dist/enums/ElementTypes.d.ts +8 -0
  97. package/dist/enums/ElementTypes.js +10 -0
  98. package/dist/enums/ElementTypes.js.map +1 -0
  99. package/dist/helpers/PathResolver.d.ts +3 -0
  100. package/dist/helpers/PathResolver.js +26 -0
  101. package/dist/helpers/PathResolver.js.map +1 -0
  102. package/dist/helpers/index.d.ts +1 -0
  103. package/dist/helpers/index.js +1 -0
  104. package/dist/helpers/index.js.map +1 -1
  105. package/dist/index.d.ts +1 -0
  106. package/dist/index.js +1 -0
  107. package/dist/index.js.map +1 -1
  108. package/dist/interfaces/IProperty.d.ts +4 -0
  109. package/dist/interfaces/IProperty.js +2 -0
  110. package/dist/interfaces/IProperty.js.map +1 -0
  111. package/dist/interfaces/IRegisteredSubjects.d.ts +5 -0
  112. package/dist/interfaces/IRegisteredSubjects.js +2 -0
  113. package/dist/interfaces/IRegisteredSubjects.js.map +1 -0
  114. package/dist/interfaces/ISubject.d.ts +8 -0
  115. package/dist/interfaces/ISubject.js +2 -0
  116. package/dist/interfaces/ISubject.js.map +1 -0
  117. package/dist/page-extensions/SubjectProvider.d.ts +11 -0
  118. package/dist/page-extensions/SubjectProvider.js +24 -0
  119. package/dist/page-extensions/SubjectProvider.js.map +1 -0
  120. package/dist/page-extensions/SubjectRegistry.d.ts +14 -0
  121. package/dist/page-extensions/SubjectRegistry.js +14 -0
  122. package/dist/page-extensions/SubjectRegistry.js.map +1 -0
  123. package/dist/page-extensions/index.d.ts +3 -0
  124. package/dist/page-extensions/index.js +3 -0
  125. package/dist/page-extensions/index.js.map +1 -1
  126. package/dist/services/ConfigBuilder.d.ts +1 -0
  127. package/dist/services/ConfigBuilder.js +20 -1
  128. package/dist/services/ConfigBuilder.js.map +1 -1
  129. package/dist/test-artifacts/SubjectPageBase.d.ts +5 -0
  130. package/dist/test-artifacts/SubjectPageBase.js +6 -0
  131. package/dist/test-artifacts/SubjectPageBase.js.map +1 -0
  132. package/dist/test-artifacts/index.d.ts +3 -0
  133. package/dist/test-artifacts/index.js +4 -0
  134. package/dist/test-artifacts/index.js.map +1 -0
  135. package/dist/test-artifacts/screens/index.d.ts +1 -0
  136. package/dist/test-artifacts/screens/index.js +2 -0
  137. package/dist/test-artifacts/screens/index.js.map +1 -0
  138. package/dist/test-artifacts/subjects/index.d.ts +1 -0
  139. package/dist/test-artifacts/subjects/index.js +2 -0
  140. package/dist/test-artifacts/subjects/index.js.map +1 -0
  141. package/dist/types/Components.d.ts +7 -0
  142. package/dist/types/Components.js +28 -0
  143. package/dist/types/Components.js.map +1 -0
  144. package/enums/ElementTypes.ts +8 -0
  145. package/helpers/PathResolver.ts +30 -0
  146. package/helpers/index.ts +1 -0
  147. package/index.ts +1 -0
  148. package/interfaces/IProperty.ts +4 -0
  149. package/interfaces/IRegisteredSubjects.ts +5 -0
  150. package/interfaces/ISubject.ts +9 -0
  151. package/package.json +26 -8
  152. package/page-extensions/SubjectProvider.ts +41 -0
  153. package/page-extensions/SubjectRegistry.ts +30 -0
  154. package/page-extensions/index.ts +3 -0
  155. package/promptCredentials.js +124 -124
  156. package/scripts/Testwise.template.json +4 -1
  157. package/scripts/main.js +84 -11
  158. package/scripts/postinstall.js +39 -0
  159. package/scripts/setup.js +37 -34
  160. package/scripts/sync.js +102 -0
  161. package/scripts/tsconfig.template.json +1 -1
  162. package/services/ConfigBuilder.ts +25 -2
  163. package/test-artifacts/SubjectPageBase.ts +9 -0
  164. package/test-artifacts/index.ts +3 -0
  165. package/test-artifacts/screens/index.ts +0 -0
  166. package/test-artifacts/subjects/index.ts +0 -0
  167. package/tsconfig.json +1 -1
  168. package/types/Components.ts +55 -0
  169. package/components/tab/ComponentTab.ts +0 -40
  170. package/components/tab/ComponentTabObjects.ts +0 -17
  171. package/components/tab/DetailTab.ts +0 -20
  172. package/dist/Testwise.json +0 -25
  173. package/dist/bdd.d.ts +0 -6
  174. package/dist/bdd.js +0 -9
  175. package/dist/bdd.js.map +0 -1
  176. package/dist/biome.json +0 -52
  177. package/dist/components/actionbar/Actionbar.js.map +0 -1
  178. package/dist/components/actionbar/ActionbarObjects.js.map +0 -1
  179. package/dist/components/actionbar/CustomActionBar.js +0 -7
  180. package/dist/components/actionbar/CustomActionBar.js.map +0 -1
  181. package/dist/components/tab/ComponentTab.d.ts +0 -12
  182. package/dist/components/tab/ComponentTab.js +0 -31
  183. package/dist/components/tab/ComponentTab.js.map +0 -1
  184. package/dist/components/tab/ComponentTabObjects.d.ts +0 -8
  185. package/dist/components/tab/ComponentTabObjects.js +0 -11
  186. package/dist/components/tab/ComponentTabObjects.js.map +0 -1
  187. package/dist/components/tab/DetailTab.d.ts +0 -9
  188. package/dist/components/tab/DetailTab.js +0 -15
  189. package/dist/components/tab/DetailTab.js.map +0 -1
  190. package/dist/components/tab/DetailTabObjects.js.map +0 -1
  191. package/dist/helpers/TestExtensions.d.ts +0 -8
  192. package/dist/helpers/TestExtensions.js +0 -21
  193. package/dist/helpers/TestExtensions.js.map +0 -1
  194. package/dist/package-lock.json +0 -3852
  195. package/dist/package.json +0 -59
  196. package/dist/scripts/Testwise.template.json +0 -25
  197. package/dist/scripts/tsconfig.template.json +0 -12
  198. package/dist/services/ReportingService.d.ts +0 -8
  199. package/dist/services/ReportingService.js +0 -29
  200. package/dist/services/ReportingService.js.map +0 -1
  201. package/dist/tsconfig.json +0 -20
  202. package/services/ReportingService.ts +0 -37
@@ -0,0 +1,141 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /** biome-ignore-all lint/style/noNonNullAssertion: Because I can */
3
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Because I can */
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ import axios from 'axios';
7
+ import { testwiseConfig } from '../services/ConfigBuilder.js';
8
+ import { DataRetriever } from './helpers/DataRetriever.js';
9
+ const serviceUrl = testwiseConfig().get('environmentSettings.serviceUrl').replace(/\/$/, '');
10
+ const metaEndpoint = testwiseConfig()
11
+ .get('environmentSettings.metaEndpoint')
12
+ .replace(/^\//, '')
13
+ .replace(/\/$/, '');
14
+ const authUser = testwiseConfig().get('environmentSettings.authUser');
15
+ const authUserPassword = testwiseConfig().get('environmentSettings.authUserPassword');
16
+ const axiosInstance = axios.create({
17
+ baseURL: serviceUrl,
18
+ headers: {
19
+ Authorization: `Basic ${Buffer.from(`${authUser}:${authUserPassword}`).toString('base64')}`,
20
+ accept: '*/*'
21
+ }
22
+ });
23
+ const guiApplId = await getGuiApplId();
24
+ export async function buildSubjects() {
25
+ const response = await axiosInstance.get(`/iam/${metaEndpoint}/i_ui_tab?$filter=gui_appl_id%20eq%20${guiApplId}`);
26
+ const rawTabs = response.data?.value || [];
27
+ const subjects = rawTabs
28
+ .flatMap((tab) => {
29
+ const base = {
30
+ subject: tab.tab_id,
31
+ variant: tab.tab_variant_id
32
+ };
33
+ return [
34
+ { ...base, screentype_id: tab.main_screen_type_id, screentype_context: 'main' },
35
+ { ...base, screentype_id: tab.detail_screen_type_id, screentype_context: 'detail' },
36
+ { ...base, screentype_id: tab.zoom_screen_type_id, screentype_context: 'zoom' },
37
+ { ...base, screentype_id: tab.popup_screen_type_id, screentype_context: 'popup' }
38
+ ];
39
+ })
40
+ .filter((item) => item.screentype_id !== 'not_visible_in_gui');
41
+ const colResponse = await axiosInstance.get(`/iam/${metaEndpoint}/i_ui_col?$filter=gui_appl_id%20eq%20${guiApplId}`);
42
+ const allProperties = colResponse.data?.value.map((col) => ({
43
+ subject: col.tab_id,
44
+ variant: col.tab_variant_id,
45
+ col: col.col_id,
46
+ control_type: col.control_id || ''
47
+ }));
48
+ for (const subject of subjects) {
49
+ const matchingProperties = allProperties.filter((prop) => prop.subject === subject.subject && prop.variant === subject.variant);
50
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
51
+ subject.properties = matchingProperties.map(({ subject, variant, ...rest }) => rest);
52
+ }
53
+ const subjectsWithLookupsSet = await setLookupDropdowns(subjects);
54
+ const seedDataDirectory = new DataRetriever().getSeedDataDirectory();
55
+ const seedDataPath = path.join(seedDataDirectory, 'subjects.json');
56
+ await fs.writeFile(seedDataPath, JSON.stringify(subjectsWithLookupsSet, null, 2), 'utf-8');
57
+ console.log(`Seed data written to ${seedDataPath}`);
58
+ }
59
+ async function setLookupDropdowns(subjects) {
60
+ const response = await axiosInstance.get(`/iam/${metaEndpoint}/i_ui_tab_look_up?$filter=gui_appl_id%20eq%20${guiApplId}`);
61
+ const lookupMappings = response.data?.value || [];
62
+ for (const mapping of lookupMappings) {
63
+ const targetSubject = subjects.find((subj) => subj.subject === mapping.tab_id && subj.variant === mapping.tab_variant_id);
64
+ const targetProperty = targetSubject?.properties?.find((prop) => prop.col === mapping.col_id);
65
+ if (targetProperty) {
66
+ targetProperty.control_type = 'LOOKUP_DROPDOWN';
67
+ }
68
+ }
69
+ return subjects;
70
+ }
71
+ export async function buildScreens() {
72
+ const response = await axiosInstance.get(`/iam/${metaEndpoint}/i_ui_screen_component?$filter=gui_appl_id eq ${guiApplId}`);
73
+ const rawComponents = response.data?.value || [];
74
+ const screenMap = new Map();
75
+ for (const item of rawComponents) {
76
+ // eslint-disable-next-line @typescript-eslint/naming-convention
77
+ const { screen_type_id, screen_component_id, screen_component_type_id } = item;
78
+ if (screen_component_id.includes(':'))
79
+ continue;
80
+ if (!screenMap.has(screen_type_id)) {
81
+ screenMap.set(screen_type_id, { ScreenTypeId: screen_type_id, Components: [] });
82
+ }
83
+ screenMap.get(screen_type_id).Components.push({
84
+ ScreenComponentId: screen_component_id,
85
+ ScreenComponentType: screen_component_type_id
86
+ });
87
+ }
88
+ const seedDataDirectory = new DataRetriever().getSeedDataDirectory();
89
+ const outputDir = path.join(seedDataDirectory, 'screen-schemas');
90
+ await fs.mkdir(outputDir, { recursive: true });
91
+ for (const [screenTypeId, screenData] of screenMap.entries()) {
92
+ const usedTypes = new Set();
93
+ const properties = {};
94
+ const required = [];
95
+ for (const comp of screenData.Components) {
96
+ const type = comp.ScreenComponentType;
97
+ properties[comp.ScreenComponentId] = { $ref: `#/definitions/${type}` };
98
+ required.push(comp.ScreenComponentId);
99
+ usedTypes.add(type);
100
+ }
101
+ const schema = {
102
+ title: `I_${screenTypeId}`,
103
+ type: 'object',
104
+ properties,
105
+ required,
106
+ additionalProperties: false,
107
+ definitions: Array.from(usedTypes).reduce((acc, type) => {
108
+ acc[type] = {
109
+ type: 'object',
110
+ properties: { temp: { type: 'string' } },
111
+ required: ['temp'],
112
+ additionalProperties: false
113
+ };
114
+ return acc;
115
+ }, {})
116
+ };
117
+ await fs.writeFile(path.join(outputDir, `${screenTypeId}.json`), JSON.stringify(schema, null, 2));
118
+ }
119
+ console.log('Screen schemas generated successfully.');
120
+ }
121
+ async function getGuiApplId() {
122
+ const guiApplAlias = testwiseConfig().get('environmentSettings.guiApplAlias');
123
+ if (guiApplAlias) {
124
+ const response = await axiosInstance.get(`/iam/${metaEndpoint}/i_ui_gui_appl`);
125
+ const guiAppl = response.data?.value.find((appl) => {
126
+ const currentAlias = appl?.gui_appl_alias?.toString();
127
+ const targetAlias = guiApplAlias?.toString();
128
+ return currentAlias === targetAlias;
129
+ });
130
+ if (guiAppl) {
131
+ return guiAppl.gui_appl_id;
132
+ }
133
+ else {
134
+ throw new Error(`No GUI Application found for GUI Application Alias: ${guiApplAlias}`);
135
+ }
136
+ }
137
+ else {
138
+ throw new Error('GUI Application Alias is not defined in the configuration.');
139
+ }
140
+ }
141
+ //# sourceMappingURL=ModelDataBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelDataBuilder.js","sourceRoot":"","sources":["../../artifact-builder/ModelDataBuilder.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,oEAAoE;AACpE,oEAAoE;AACpE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAU3D,MAAM,UAAU,GAAW,cAAc,EAAE,CAAC,GAAG,CAAS,gCAAgC,CAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9G,MAAM,YAAY,GAAW,cAAc,EAAE;KAC1C,GAAG,CAAS,kCAAkC,CAAE;KAChD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;KAClB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACtB,MAAM,QAAQ,GAAW,cAAc,EAAE,CAAC,GAAG,CAAS,8BAA8B,CAAE,CAAC;AACvF,MAAM,gBAAgB,GAAW,cAAc,EAAE,CAAC,GAAG,CAAS,sCAAsC,CAAE,CAAC;AAEvG,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE;QACP,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC3F,MAAM,EAAE,KAAK;KACd;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAW,MAAM,YAAY,EAAE,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,YAAY,wCAAwC,SAAS,EAAE,CAAC,CAAC;IAElH,MAAM,OAAO,GAAU,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IAElD,MAAM,QAAQ,GAAe,OAAO;SACjC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,OAAO,EAAE,GAAG,CAAC,cAAc;SAC5B,CAAC;QAEF,OAAO;YACL,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,EAAE;YAC/E,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,QAAQ,EAAE;YACnF,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,EAAE;YAC/E,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,OAAO,EAAE;SAClF,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,KAAK,oBAAoB,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,YAAY,wCAAwC,SAAS,EAAE,CAAC,CAAC;IAErH,MAAM,aAAa,GAAsC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;QAClG,OAAO,EAAE,GAAG,CAAC,MAAM;QACnB,OAAO,EAAE,GAAG,CAAC,cAAc;QAC3B,GAAG,EAAE,GAAG,CAAC,MAAM;QACf,YAAY,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;KACnC,CAAC,CAAC,CAAC;IAEJ,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAC/E,CAAC;QAEF,6DAA6D;QAC7D,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,sBAAsB,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAElE,MAAM,iBAAiB,GAAG,IAAI,aAAa,EAAE,CAAC,oBAAoB,EAAE,CAAC;IAErE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAoB;IACpD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CACtC,QAAQ,YAAY,gDAAgD,SAAS,EAAE,CAChF,CAAC;IAEF,MAAM,cAAc,GAAU,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IAEzD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,cAAc,CACrF,CAAC;QAEF,MAAM,cAAc,GAAG,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9F,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,YAAY,GAAG,iBAAiB,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CACtC,QAAQ,YAAY,iDAAiD,SAAS,EAAE,CACjF,CAAC;IAEF,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAe,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,gEAAgE;QAChE,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,GAAG,IAAI,CAAC;QAE/E,IAAI,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAEhD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAC5C,iBAAiB,EAAE,mBAAmB;YACtC,mBAAmB,EAAE,wBAAwB;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,aAAa,EAAE,CAAC,oBAAoB,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,KAAK,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,UAAU,GAAwB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;YACvE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,KAAK,YAAY,EAAE;YAC1B,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ;YACR,oBAAoB,EAAE,KAAK;YAC3B,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;gBACtD,GAAG,CAAC,IAAI,CAAC,GAAG;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;oBACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;oBAClB,oBAAoB,EAAE,KAAK;iBAC5B,CAAC;gBACF,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAAS,CAAC;SACd,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,YAAY,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC,GAAG,CAAS,kCAAkC,CAAC,CAAC;IAEtF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,QAAQ,YAAY,gBAAgB,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;YACtD,MAAM,YAAY,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;YACtD,MAAM,WAAW,GAAG,YAAY,EAAE,QAAQ,EAAE,CAAC;YAE7C,OAAO,YAAY,KAAK,WAAW,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,WAAW,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,uDAAuD,YAAY,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare class ModelDataRefiner {
2
+ private _dataRetriever;
3
+ run(): void;
4
+ }
@@ -0,0 +1,28 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { DataRetriever } from '../index.js';
4
+ export class ModelDataRefiner {
5
+ constructor() {
6
+ this._dataRetriever = new DataRetriever();
7
+ }
8
+ run() {
9
+ const seedDataDir = this._dataRetriever.getSeedDataDirectory();
10
+ const registeredSubjects = this._dataRetriever.getRegisteredSubjects();
11
+ if (!registeredSubjects || registeredSubjects.length === 0) {
12
+ console.info('No registered subjects found.');
13
+ return;
14
+ }
15
+ const subjects = this._dataRetriever.getSubjectsSeedData();
16
+ const subjectsToBuild = subjects.filter((subject) => registeredSubjects.some((registered) => registered.subject === subject.subject &&
17
+ (registered.variant != null ? registered.variant === subject.variant : subject.variant === '') &&
18
+ registered.screen_type === subject.screentype_context));
19
+ const subjectsToBuildPath = path.resolve(seedDataDir, 'subjectsToBuild.json');
20
+ fs.writeFileSync(subjectsToBuildPath, JSON.stringify(subjectsToBuild, null, 2));
21
+ console.log(`Created subjectsToBuild.json with ${subjectsToBuild.length} subjects.`);
22
+ const screensToBuild = Array.from(new Set(subjectsToBuild.map((subject) => subject.screentype_id)));
23
+ const screensToBuildPath = path.resolve(seedDataDir, 'screensToBuild.json');
24
+ fs.writeFileSync(screensToBuildPath, JSON.stringify(screensToBuild, null, 2));
25
+ console.log(`Created screensToBuild.json with ${screensToBuild.length} screens.`);
26
+ }
27
+ }
28
+ //# sourceMappingURL=ModelDataRefiner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelDataRefiner.js","sourceRoot":"","sources":["../../artifact-builder/ModelDataRefiner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,OAAO,gBAAgB;IAA7B;QACU,mBAAc,GAAG,IAAI,aAAa,EAAE,CAAC;IAgC/C,CAAC;IA9BQ,GAAG;QACR,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;QAC/D,MAAM,kBAAkB,GAAiC,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC;QAErG,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;QAE3D,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAClD,kBAAkB,CAAC,IAAI,CACrB,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;YACtC,CAAC,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,EAAE,CAAC;YAC9F,UAAU,CAAC,WAAW,KAAK,OAAO,CAAC,kBAAkB,CACxD,CACF,CAAC;QAEF,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;QAC9E,EAAE,CAAC,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,qCAAqC,eAAe,CAAC,MAAM,YAAY,CAAC,CAAC;QAErF,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAEpG,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAC5E,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,oCAAoC,cAAc,CAAC,MAAM,WAAW,CAAC,CAAC;IACpF,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ISubject } from '../interfaces/ISubject.js';
2
+ export declare class SchemaGenerator {
3
+ private _namingHandler;
4
+ private _dataRetriever;
5
+ constructor();
6
+ generateSchema(): void;
7
+ iSubjectToJson(value: ISubject): string;
8
+ private createSubjectSchema;
9
+ private getComponentsToProcess;
10
+ private getScreenContent;
11
+ private createComponentSchema;
12
+ }
@@ -0,0 +1,102 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { dirname } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { DataRetriever } from '../index.js';
7
+ import { NamingHandler } from './helpers/NamingHandler.js';
8
+ const currentFilename = fileURLToPath(import.meta.url);
9
+ const currentDirname = dirname(currentFilename);
10
+ export class SchemaGenerator {
11
+ constructor() {
12
+ this._namingHandler = new NamingHandler();
13
+ this._dataRetriever = new DataRetriever();
14
+ }
15
+ generateSchema() {
16
+ const schemasDir = path.resolve(currentDirname, '../dist/test-artifacts/schemas');
17
+ if (!fs.existsSync(schemasDir)) {
18
+ fs.mkdirSync(schemasDir, { recursive: true });
19
+ }
20
+ const subjects = this._dataRetriever.getSubjectsToBuild();
21
+ for (const subject of subjects) {
22
+ this.createSubjectSchema(subject);
23
+ }
24
+ }
25
+ iSubjectToJson(value) {
26
+ return JSON.stringify(value);
27
+ }
28
+ // Changes start here
29
+ createSubjectSchema(subject) {
30
+ const screen = { content: this.getScreenContent(subject.screentype_id) };
31
+ const componentsToProcess = this.getComponentsToProcess(screen);
32
+ for (const component of componentsToProcess) {
33
+ switch (component) {
34
+ case 'Form':
35
+ this.createComponentSchema(subject, 'Form');
36
+ break;
37
+ case 'Grid':
38
+ this.createComponentSchema(subject, 'Grid');
39
+ break;
40
+ }
41
+ }
42
+ }
43
+ getComponentsToProcess(screen) {
44
+ const componentsToProcess = [];
45
+ const subjectBasedComponents = ['Form', 'Grid'];
46
+ const importRegex = /import type \{([\s\S]*?)\} from ['"]\.\.\/\.\.\/components\/index\.js['"];?/;
47
+ const importMatches = importRegex.exec(screen.content);
48
+ if (importMatches?.[1]) {
49
+ const importedComponents = importMatches[1].split(',').map((component) => component.trim());
50
+ importedComponents.forEach((component) => {
51
+ if (subjectBasedComponents.includes(component)) {
52
+ componentsToProcess.push(component);
53
+ }
54
+ });
55
+ }
56
+ return componentsToProcess;
57
+ }
58
+ getScreenContent(screenTypeId) {
59
+ const screenFileName = this._namingHandler.formatPascalCaseName(screenTypeId);
60
+ const _filename = fileURLToPath(import.meta.url);
61
+ const _dirname = path.dirname(_filename);
62
+ const screenLocation = path.resolve(_dirname, '..', '..', 'test-artifacts/screens/');
63
+ return fs.readFileSync(path.join(screenLocation, `I${screenFileName}.ts`), 'utf-8');
64
+ }
65
+ createComponentSchema(subject, componentType) {
66
+ const interfaceName = `${subject.subject}_${componentType.toLowerCase()}`;
67
+ const schemasDir = path.join(currentDirname, '..', '..', 'dist/test-artifacts/schemas');
68
+ const fileName = `${this._namingHandler.snakeToPascalCase(interfaceName)}.json`;
69
+ if (fs.existsSync(path.join(schemasDir, fileName))) {
70
+ return;
71
+ }
72
+ // biome-ignore lint/suspicious/noExplicitAny: reason 42
73
+ const componentSchema = {
74
+ title: interfaceName,
75
+ type: 'object',
76
+ properties: {},
77
+ required: [],
78
+ additionalProperties: false,
79
+ definitions: {
80
+ Locator: {
81
+ type: 'object',
82
+ properties: {
83
+ selector: { type: 'string' }
84
+ },
85
+ required: ['selector'],
86
+ additionalProperties: false
87
+ }
88
+ }
89
+ };
90
+ subject.properties.forEach((property) => {
91
+ const componentTypeSuffix = this._namingHandler.getElementSuffixFromControlTypeAndComponentType(property.control_type, componentType);
92
+ const fieldName = `${property.col}_${componentTypeSuffix.toLocaleLowerCase()}`;
93
+ componentSchema.properties[fieldName] = { $ref: '#/definitions/Locator' };
94
+ componentSchema.required.push(fieldName);
95
+ });
96
+ if (!fs.existsSync(schemasDir)) {
97
+ fs.mkdirSync(schemasDir, { recursive: true });
98
+ }
99
+ fs.writeFileSync(path.join(schemasDir, fileName), JSON.stringify(componentSchema, null, 2));
100
+ }
101
+ }
102
+ //# sourceMappingURL=SchemaGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaGenerator.js","sourceRoot":"","sources":["../../artifact-builder/SchemaGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class ScreenInterfaceRefiner {
2
+ private readonly _screensDirectory;
3
+ constructor();
4
+ refine(): void;
5
+ private removeEmptyLines;
6
+ private indexScreenInterface;
7
+ private formatContent;
8
+ private addImportStatements;
9
+ private isActiveScreenComponent;
10
+ private removeUnsupportedComponents;
11
+ private consolidateTabComponents;
12
+ private getPlaceholderInterfaces;
13
+ private findInterfaces;
14
+ private getAllScreenInterfaceFiles;
15
+ }
@@ -0,0 +1,120 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { disabledScreenComponents, screenComponents } from '../types/Components.js';
5
+ export class ScreenInterfaceRefiner {
6
+ constructor() {
7
+ const _filename = fileURLToPath(import.meta.url);
8
+ const _dirname = path.dirname(_filename);
9
+ this._screensDirectory = path.resolve(_dirname, '../../test-artifacts/screens');
10
+ }
11
+ refine() {
12
+ const screenFiles = this.getAllScreenInterfaceFiles();
13
+ screenFiles.forEach((screenFile) => {
14
+ const filePath = path.join(this._screensDirectory, screenFile);
15
+ const screen = { content: fs.readFileSync(filePath, 'utf-8') };
16
+ const interfaces = this.findInterfaces(screen.content);
17
+ this.removeUnsupportedComponents(screen);
18
+ this.consolidateTabComponents(screen);
19
+ this.removeEmptyLines(screen);
20
+ if (interfaces.length > 1) {
21
+ const interfacesToRemove = this.getPlaceholderInterfaces(screen, interfaces);
22
+ this.addImportStatements(screen, interfacesToRemove);
23
+ this.formatContent(screen);
24
+ fs.writeFileSync(filePath, screen.content, 'utf-8');
25
+ }
26
+ this.indexScreenInterface(screenFile);
27
+ });
28
+ }
29
+ removeEmptyLines(screen) {
30
+ screen.content = screen.content.replace(/^\s*[\r\n]/gm, '');
31
+ }
32
+ indexScreenInterface(screenFile) {
33
+ const indexPath = path.resolve(this._screensDirectory, 'index.ts');
34
+ let indexContent = fs.readFileSync(indexPath, 'utf-8');
35
+ const fileJS = screenFile.replace('.ts', '.js');
36
+ const exportLine = `export * from './${fileJS}';\n`;
37
+ if (!indexContent.includes(exportLine)) {
38
+ const lines = indexContent.split('\n');
39
+ let insertPos = 0;
40
+ while (insertPos < lines.length && lines[insertPos].startsWith('export')) {
41
+ insertPos++;
42
+ }
43
+ lines.splice(insertPos, 0, exportLine.trim());
44
+ indexContent = lines.join('\n');
45
+ fs.writeFileSync(indexPath, indexContent, 'utf-8');
46
+ }
47
+ }
48
+ formatContent(screen) {
49
+ screen.content = screen.content.replace(/(\n\s*)+$/g, '\n');
50
+ }
51
+ addImportStatements(screen, interfacesToRemoveList) {
52
+ const importsToAdd = interfacesToRemoveList.filter((interfaceName) => Object.values(screenComponents).includes(interfaceName) &&
53
+ !Object.values(disabledScreenComponents).includes(interfaceName));
54
+ const importStatement = `import type { ${importsToAdd.join(', ')} } from '../../components/index.js';\n\n`;
55
+ screen.content = importStatement + screen.content;
56
+ }
57
+ isActiveScreenComponent(value) {
58
+ if (disabledScreenComponents.includes(value)) {
59
+ return false;
60
+ }
61
+ return screenComponents.includes(value);
62
+ }
63
+ removeUnsupportedComponents(screen) {
64
+ const propertyRegex = /(\s+)(\w+): (\w+);/g;
65
+ screen.content = screen.content.replace(propertyRegex, (match, _p1, _p2, p3) => {
66
+ if (this.isActiveScreenComponent(p3)) {
67
+ return match;
68
+ }
69
+ else {
70
+ return '';
71
+ }
72
+ });
73
+ }
74
+ // This is a short-term solution until we implement a more robust tab consolidation mechanism
75
+ consolidateTabComponents(screen) {
76
+ let hasTab = false;
77
+ let hasDetailTabPage = false;
78
+ screen.content = screen.content.replace(/^[ \t]*([a-zA-Z0-9_]+)[ \t]*:[ \t]*(Tab|DetailTabPage)[ \t]*;[ \t]*$/gim, (_match, _prop, type) => {
79
+ switch (type) {
80
+ case 'Tab':
81
+ hasTab = true;
82
+ break;
83
+ case 'DetailTabPage':
84
+ hasDetailTabPage = true;
85
+ break;
86
+ }
87
+ return '';
88
+ });
89
+ let insert = '';
90
+ if (hasTab)
91
+ insert += ' tab: Tab;\n';
92
+ if (hasDetailTabPage)
93
+ insert += ' detailTab: DetailTabPage;\n';
94
+ if (insert) {
95
+ screen.content = screen.content.replace(/([ \t]*)}/, (_m, ws) => `${insert}${ws}}`);
96
+ }
97
+ }
98
+ getPlaceholderInterfaces(screen, interfaces) {
99
+ const interfacesToRemove = interfaces.slice(1);
100
+ interfacesToRemove.forEach((interfaceName) => {
101
+ const interfaceRegex = new RegExp(`export interface ${interfaceName} \\{[\\s\\S]*?\\}`, 'g');
102
+ screen.content = screen.content.replace(interfaceRegex, '');
103
+ });
104
+ return interfacesToRemove;
105
+ }
106
+ findInterfaces(content) {
107
+ const interfaceRegex = /export interface (\w+) \{[\s\S]*?\}/g;
108
+ const interfaces = [];
109
+ let match = interfaceRegex.exec(content);
110
+ while (match !== null) {
111
+ interfaces.push(match[1]);
112
+ match = interfaceRegex.exec(content);
113
+ }
114
+ return interfaces;
115
+ }
116
+ getAllScreenInterfaceFiles() {
117
+ return fs.readdirSync(this._screensDirectory).filter((f) => f.endsWith('.ts'));
118
+ }
119
+ }
120
+ //# sourceMappingURL=ScreenInterfaceRefiner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenInterfaceRefiner.js","sourceRoot":"","sources":["../../artifact-builder/ScreenInterfaceRefiner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ISubject } from '../interfaces/ISubject.js';
2
+ import type { SubjectComponents } from '../types/Components.js';
3
+ export declare class SelectorBuilder {
4
+ private _namingHandler;
5
+ constructor();
6
+ private determineSelectorSuffix;
7
+ private getDefaultPrefix;
8
+ private getDefaultSuffix;
9
+ getPageLocatorString(property: string, componentName: SubjectComponents): string;
10
+ private getLocatorType;
11
+ getPageContext(subject: ISubject): string;
12
+ }
13
+ export type LocatorType = 'locator' | 'getByTestId' | 'getByRole' | 'getByLabel' | 'getByPlaceholder' | 'getByText';
@@ -0,0 +1,69 @@
1
+ import { KnownElementTypes } from '../enums/ElementTypes.js';
2
+ import { NamingHandler } from './helpers/index.js';
3
+ export class SelectorBuilder {
4
+ constructor() {
5
+ this._namingHandler = new NamingHandler();
6
+ }
7
+ determineSelectorSuffix(property, componentName) {
8
+ let selectorSuffix = null;
9
+ if (componentName === 'Form') {
10
+ if (this._namingHandler.getElementTypeFromElementName(property) === KnownElementTypes.Lookup) {
11
+ selectorSuffix = '__control__input';
12
+ }
13
+ else if (this._namingHandler.getElementTypeFromElementName(property) === KnownElementTypes.Dropdown) {
14
+ selectorSuffix = '__select__input';
15
+ }
16
+ }
17
+ return selectorSuffix;
18
+ }
19
+ getDefaultPrefix(componentName) {
20
+ let prefix = '';
21
+ if (componentName === 'Grid') {
22
+ prefix = '[col-id="';
23
+ }
24
+ else if (componentName === 'Form') {
25
+ prefix = 'form-field__';
26
+ }
27
+ else {
28
+ throw new Error(`Unsupported component type: ${componentName}`);
29
+ }
30
+ return prefix;
31
+ }
32
+ getDefaultSuffix(componentName) {
33
+ let suffix = '';
34
+ if (componentName === 'Grid') {
35
+ suffix = '"]';
36
+ }
37
+ else if (componentName === 'Form') {
38
+ suffix = '__input';
39
+ }
40
+ else {
41
+ throw new Error(`Unsupported component type: ${componentName}`);
42
+ }
43
+ return suffix;
44
+ }
45
+ getPageLocatorString(property, componentName) {
46
+ const elementId = this._namingHandler.getIdFromElementName(property);
47
+ const selectorPrefix = this.getDefaultPrefix(componentName);
48
+ const defaultSuffix = this.getDefaultSuffix(componentName);
49
+ const selectorSuffix = this.determineSelectorSuffix(property, componentName) || defaultSuffix;
50
+ return `page.${this.getLocatorType(componentName)}('${selectorPrefix}${elementId}${selectorSuffix}')`;
51
+ }
52
+ getLocatorType(componentName) {
53
+ if (componentName === 'Form') {
54
+ return 'getByTestId';
55
+ }
56
+ else if (componentName === 'Grid') {
57
+ return 'locator';
58
+ }
59
+ else {
60
+ throw new Error(`Unsupported component type: ${componentName}`);
61
+ }
62
+ }
63
+ getPageContext(subject) {
64
+ const variantSelector = subject.variant ? `[data-tab-variant-id="${subject.variant}"]` : '';
65
+ const screentypeId = subject.screentype_id.replace(/_/g, '-');
66
+ return `[data-testid="screen__${screentypeId}"][data-tab-id="${subject.subject}"]${variantSelector}`;
67
+ }
68
+ }
69
+ //# sourceMappingURL=SelectorBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectorBuilder.js","sourceRoot":"","sources":["../../artifact-builder/SelectorBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare class SubjectComponentGenerator {
2
+ private static readonly SUBJECTS_RELATIVE_PATH;
3
+ private readonly _currentFilename;
4
+ private readonly _currentDirname;
5
+ private readonly _subjectsDirectory;
6
+ private readonly _selectorBuilder;
7
+ private readonly _namingHandler;
8
+ constructor();
9
+ run(): void;
10
+ private getAllSubjectFolders;
11
+ private refineSubjectComponents;
12
+ private getComponentNameFromFile;
13
+ private refine;
14
+ private getSubjectFolderPath;
15
+ private verifyDirectoryExists;
16
+ private getPropertyInitializations;
17
+ private generatePropertyDeclarations;
18
+ private convertStringsToArray;
19
+ private getPropertyNamesFromInterface;
20
+ private setSubjectExtendsComponent;
21
+ private addComponentImports;
22
+ private removeLocatorInterface;
23
+ }