@syn7xx/testops-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +177 -0
  2. package/dist/args.d.ts +10 -0
  3. package/dist/args.d.ts.map +1 -0
  4. package/dist/args.js +26 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/domain/index.d.ts +4 -0
  7. package/dist/domain/index.d.ts.map +1 -0
  8. package/dist/domain/index.js +4 -0
  9. package/dist/domain/index.js.map +1 -0
  10. package/dist/domain/project/index.d.ts +3 -0
  11. package/dist/domain/project/index.d.ts.map +1 -0
  12. package/dist/domain/project/index.js +3 -0
  13. package/dist/domain/project/index.js.map +1 -0
  14. package/dist/domain/project/service.d.ts +23 -0
  15. package/dist/domain/project/service.d.ts.map +1 -0
  16. package/dist/domain/project/service.js +51 -0
  17. package/dist/domain/project/service.js.map +1 -0
  18. package/dist/domain/project/types.d.ts +12 -0
  19. package/dist/domain/project/types.d.ts.map +1 -0
  20. package/dist/domain/project/types.js +5 -0
  21. package/dist/domain/project/types.js.map +1 -0
  22. package/dist/domain/test-case/index.d.ts +3 -0
  23. package/dist/domain/test-case/index.d.ts.map +1 -0
  24. package/dist/domain/test-case/index.js +3 -0
  25. package/dist/domain/test-case/index.js.map +1 -0
  26. package/dist/domain/test-case/service.d.ts +69 -0
  27. package/dist/domain/test-case/service.d.ts.map +1 -0
  28. package/dist/domain/test-case/service.js +141 -0
  29. package/dist/domain/test-case/service.js.map +1 -0
  30. package/dist/domain/test-case/types.d.ts +51 -0
  31. package/dist/domain/test-case/types.d.ts.map +1 -0
  32. package/dist/domain/test-case/types.js +5 -0
  33. package/dist/domain/test-case/types.js.map +1 -0
  34. package/dist/domain/test-plan/index.d.ts +3 -0
  35. package/dist/domain/test-plan/index.d.ts.map +1 -0
  36. package/dist/domain/test-plan/index.js +3 -0
  37. package/dist/domain/test-plan/index.js.map +1 -0
  38. package/dist/domain/test-plan/service.d.ts +33 -0
  39. package/dist/domain/test-plan/service.d.ts.map +1 -0
  40. package/dist/domain/test-plan/service.js +40 -0
  41. package/dist/domain/test-plan/service.js.map +1 -0
  42. package/dist/domain/test-plan/types.d.ts +18 -0
  43. package/dist/domain/test-plan/types.d.ts.map +1 -0
  44. package/dist/domain/test-plan/types.js +5 -0
  45. package/dist/domain/test-plan/types.js.map +1 -0
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +10 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/presentation/index.d.ts +4 -0
  51. package/dist/presentation/index.d.ts.map +1 -0
  52. package/dist/presentation/index.js +4 -0
  53. package/dist/presentation/index.js.map +1 -0
  54. package/dist/presentation/project/tools.d.ts +2 -0
  55. package/dist/presentation/project/tools.d.ts.map +1 -0
  56. package/dist/presentation/project/tools.js +61 -0
  57. package/dist/presentation/project/tools.js.map +1 -0
  58. package/dist/presentation/test-case/tools.d.ts +2 -0
  59. package/dist/presentation/test-case/tools.d.ts.map +1 -0
  60. package/dist/presentation/test-case/tools.js +139 -0
  61. package/dist/presentation/test-case/tools.js.map +1 -0
  62. package/dist/presentation/test-plan/tools.d.ts +2 -0
  63. package/dist/presentation/test-plan/tools.d.ts.map +1 -0
  64. package/dist/presentation/test-plan/tools.js +46 -0
  65. package/dist/presentation/test-plan/tools.js.map +1 -0
  66. package/dist/server.d.ts +4 -0
  67. package/dist/server.d.ts.map +1 -0
  68. package/dist/server.js +32 -0
  69. package/dist/server.js.map +1 -0
  70. package/dist/services/config.d.ts +43 -0
  71. package/dist/services/config.d.ts.map +1 -0
  72. package/dist/services/config.js +99 -0
  73. package/dist/services/config.js.map +1 -0
  74. package/dist/services/index.d.ts +8 -0
  75. package/dist/services/index.d.ts.map +1 -0
  76. package/dist/services/index.js +8 -0
  77. package/dist/services/index.js.map +1 -0
  78. package/dist/services/project.d.ts +17 -0
  79. package/dist/services/project.d.ts.map +1 -0
  80. package/dist/services/project.js +27 -0
  81. package/dist/services/project.js.map +1 -0
  82. package/dist/services/test-case.d.ts +59 -0
  83. package/dist/services/test-case.d.ts.map +1 -0
  84. package/dist/services/test-case.js +138 -0
  85. package/dist/services/test-case.js.map +1 -0
  86. package/dist/services/test-plan.d.ts +20 -0
  87. package/dist/services/test-plan.d.ts.map +1 -0
  88. package/dist/services/test-plan.js +18 -0
  89. package/dist/services/test-plan.js.map +1 -0
  90. package/dist/services/testops-client.d.ts +96 -0
  91. package/dist/services/testops-client.d.ts.map +1 -0
  92. package/dist/services/testops-client.js +392 -0
  93. package/dist/services/testops-client.js.map +1 -0
  94. package/dist/services/testops-types.d.ts +62 -0
  95. package/dist/services/testops-types.d.ts.map +1 -0
  96. package/dist/services/testops-types.js +3 -0
  97. package/dist/services/testops-types.js.map +1 -0
  98. package/dist/shared/api.d.ts +39 -0
  99. package/dist/shared/api.d.ts.map +1 -0
  100. package/dist/shared/api.js +94 -0
  101. package/dist/shared/api.js.map +1 -0
  102. package/dist/shared/index.d.ts +4 -0
  103. package/dist/shared/index.d.ts.map +1 -0
  104. package/dist/shared/index.js +4 -0
  105. package/dist/shared/index.js.map +1 -0
  106. package/dist/shared/pagination.d.ts +37 -0
  107. package/dist/shared/pagination.d.ts.map +1 -0
  108. package/dist/shared/pagination.js +40 -0
  109. package/dist/shared/pagination.js.map +1 -0
  110. package/dist/shared/result.d.ts +39 -0
  111. package/dist/shared/result.d.ts.map +1 -0
  112. package/dist/shared/result.js +34 -0
  113. package/dist/shared/result.js.map +1 -0
  114. package/dist/tools/index.d.ts +8 -0
  115. package/dist/tools/index.d.ts.map +1 -0
  116. package/dist/tools/index.js +8 -0
  117. package/dist/tools/index.js.map +1 -0
  118. package/dist/tools/project.d.ts +5 -0
  119. package/dist/tools/project.d.ts.map +1 -0
  120. package/dist/tools/project.js +62 -0
  121. package/dist/tools/project.js.map +1 -0
  122. package/dist/tools/test-case.d.ts +5 -0
  123. package/dist/tools/test-case.d.ts.map +1 -0
  124. package/dist/tools/test-case.js +185 -0
  125. package/dist/tools/test-case.js.map +1 -0
  126. package/dist/tools/test-plan.d.ts +5 -0
  127. package/dist/tools/test-plan.d.ts.map +1 -0
  128. package/dist/tools/test-plan.js +57 -0
  129. package/dist/tools/test-plan.js.map +1 -0
  130. package/dist/tools/testops.d.ts +6 -0
  131. package/dist/tools/testops.d.ts.map +1 -0
  132. package/dist/tools/testops.js +302 -0
  133. package/dist/tools/testops.js.map +1 -0
  134. package/package.json +50 -0
@@ -0,0 +1,392 @@
1
+ let baseUrl = '';
2
+ let apiToken = '';
3
+ /**
4
+ * Sets the TestOps base URL and API token (from MCP process args).
5
+ */
6
+ export function configureTestOpsClient(options) {
7
+ baseUrl = options.baseUrl.replace(/\/+$/, '');
8
+ apiToken = options.token;
9
+ }
10
+ function requireClientConfig() {
11
+ if (!baseUrl || !apiToken) {
12
+ throw new Error('TestOps client is not configured: pass --url and --token when starting the server');
13
+ }
14
+ return { baseUrl, token: apiToken };
15
+ }
16
+ /**
17
+ * Exchanges the API token for a JWT used on subsequent requests.
18
+ */
19
+ export async function getJwtToken() {
20
+ const { baseUrl: root, token: userToken } = requireClientConfig();
21
+ const response = await fetch(`${root}/api/uaa/oauth/token`, {
22
+ method: 'POST',
23
+ headers: {
24
+ Accept: 'application/json',
25
+ 'Content-Type': 'application/x-www-form-urlencoded',
26
+ },
27
+ body: new URLSearchParams({
28
+ grant_type: 'apitoken',
29
+ scope: 'openid',
30
+ token: userToken,
31
+ }),
32
+ });
33
+ if (!response.ok) {
34
+ throw new Error(`Failed to obtain JWT: ${response.status} ${response.statusText}`);
35
+ }
36
+ const data = await response.json();
37
+ return data.access_token;
38
+ }
39
+ /**
40
+ * Lists projects visible to the authenticated user.
41
+ */
42
+ export async function getTestOpsProjects() {
43
+ const { baseUrl: root } = requireClientConfig();
44
+ const jwtToken = await getJwtToken();
45
+ const response = await fetch(`${root}/api/project?size=1000`, {
46
+ method: 'GET',
47
+ headers: {
48
+ Accept: 'application/json',
49
+ Authorization: `Bearer ${jwtToken}`,
50
+ },
51
+ });
52
+ if (!response.ok) {
53
+ throw new Error(`Failed to list projects: ${response.status} ${response.statusText}`);
54
+ }
55
+ const data = await response.json();
56
+ return data.content || [];
57
+ }
58
+ /**
59
+ * Finds a project by exact name, then by substring match.
60
+ */
61
+ export async function getTestOpsProjectByName(projectName) {
62
+ const allProjects = await getTestOpsProjects();
63
+ const exactMatch = allProjects.find((project) => project.name.toLowerCase() === projectName.toLowerCase());
64
+ if (exactMatch) {
65
+ return exactMatch;
66
+ }
67
+ const partialMatch = allProjects.find((project) => project.name.toLowerCase().includes(projectName.toLowerCase()));
68
+ return partialMatch || null;
69
+ }
70
+ /**
71
+ * Fetches a test plan by ID.
72
+ */
73
+ export async function getTestOpsTestPlan(testPlanId) {
74
+ const { baseUrl: root } = requireClientConfig();
75
+ const jwtToken = await getJwtToken();
76
+ const response = await fetch(`${root}/api/testplan/${testPlanId}`, {
77
+ method: 'GET',
78
+ headers: {
79
+ Accept: 'application/json',
80
+ Authorization: `Bearer ${jwtToken}`,
81
+ },
82
+ });
83
+ if (!response.ok) {
84
+ throw new Error(`Failed to fetch test plan: ${response.status} ${response.statusText}`);
85
+ }
86
+ const data = await response.json();
87
+ return data;
88
+ }
89
+ /**
90
+ * Returns leaf nodes of the test plan tree (typically test case references).
91
+ */
92
+ export async function getTestOpsTestPlanLeaves(testPlanId) {
93
+ const { baseUrl: root } = requireClientConfig();
94
+ const jwtToken = await getJwtToken();
95
+ const response = await fetch(`${root}/api/testplan/${testPlanId}/tree/leaf?page=0&size=1000&sort=name%2CASC`, {
96
+ method: 'GET',
97
+ headers: {
98
+ Accept: 'application/json',
99
+ Authorization: `Bearer ${jwtToken}`,
100
+ },
101
+ });
102
+ if (!response.ok) {
103
+ throw new Error(`Failed to fetch test plan leaves: ${response.status} ${response.statusText}`);
104
+ }
105
+ const data = await response.json();
106
+ return data.content || [];
107
+ }
108
+ /**
109
+ * Loads scenario step bodies for a test case.
110
+ */
111
+ async function getTestOpsTestCaseSteps(testCaseId) {
112
+ const { baseUrl: root } = requireClientConfig();
113
+ const jwtToken = await getJwtToken();
114
+ const response = await fetch(`${root}/api/testcase/${testCaseId}/step`, {
115
+ method: 'GET',
116
+ headers: {
117
+ Accept: 'application/json',
118
+ Authorization: `Bearer ${jwtToken}`,
119
+ },
120
+ });
121
+ if (!response.ok) {
122
+ throw new Error(`Failed to fetch steps for test case ${testCaseId}: ${response.status} ${response.statusText}`);
123
+ }
124
+ const data = await response.json();
125
+ if (data?.scenarioSteps && data.root?.children) {
126
+ const steps = [];
127
+ for (const stepId of data.root.children) {
128
+ const step = data.scenarioSteps[stepId];
129
+ if (step?.body) {
130
+ steps.push({ body: step.body });
131
+ const { expectedResultId } = step;
132
+ if (expectedResultId && data.scenarioSteps[expectedResultId]) {
133
+ const expectedNode = data.scenarioSteps[expectedResultId];
134
+ const expectedChildren = Array.isArray(expectedNode.children)
135
+ ? expectedNode.children
136
+ : [];
137
+ for (const childId of expectedChildren) {
138
+ const child = data.scenarioSteps[childId];
139
+ if (child?.body) {
140
+ steps.push({ body: child.body });
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+ return steps;
147
+ }
148
+ return [];
149
+ }
150
+ /**
151
+ * Loads custom field values for a test case.
152
+ */
153
+ async function getTestOpsCustomFields(testCaseId) {
154
+ const { baseUrl: root } = requireClientConfig();
155
+ const jwtToken = await getJwtToken();
156
+ const response = await fetch(`${root}/api/testcase/${testCaseId}/cfv`, {
157
+ method: 'GET',
158
+ headers: {
159
+ Accept: 'application/json',
160
+ Authorization: `Bearer ${jwtToken}`,
161
+ },
162
+ });
163
+ if (!response.ok) {
164
+ throw new Error(`Failed to fetch custom fields for test case ${testCaseId}: ${response.status} ${response.statusText}`);
165
+ }
166
+ const data = await response.json();
167
+ return Array.isArray(data) ? data : [];
168
+ }
169
+ /**
170
+ * Returns test case metadata plus flattened steps and custom fields when available.
171
+ */
172
+ export async function getTestOpsTestCaseDetail(testCaseId) {
173
+ const { baseUrl: root } = requireClientConfig();
174
+ const jwtToken = await getJwtToken();
175
+ const response = await fetch(`${root}/api/testcase/${testCaseId}`, {
176
+ method: 'GET',
177
+ headers: {
178
+ Accept: 'application/json',
179
+ Authorization: `Bearer ${jwtToken}`,
180
+ },
181
+ });
182
+ if (!response.ok) {
183
+ throw new Error(`Failed to fetch test case ${testCaseId}: ${response.status} ${response.statusText}`);
184
+ }
185
+ const detail = await response.json();
186
+ try {
187
+ const [steps, customFields] = await Promise.all([
188
+ getTestOpsTestCaseSteps(testCaseId),
189
+ getTestOpsCustomFields(testCaseId),
190
+ ]);
191
+ const stepsArray = steps.map(({ body }) => body);
192
+ const customFieldsObject = customFields.reduce((acc, field) => {
193
+ acc[field.customField.name] = field.name;
194
+ return acc;
195
+ }, {});
196
+ return {
197
+ id: detail.id,
198
+ name: detail.name?.trim() || '',
199
+ steps: stepsArray,
200
+ customFields: customFieldsObject,
201
+ tags: (detail.tags || []).map((t) => t.name),
202
+ owner: detail.createdBy || '',
203
+ };
204
+ }
205
+ catch (error) {
206
+ console.warn(`Could not load extra fields for test case ${testCaseId}: ${error}`);
207
+ }
208
+ return {
209
+ id: detail.id,
210
+ name: detail.name?.trim() || '',
211
+ steps: [],
212
+ customFields: {},
213
+ tags: (detail.tags || []).map((t) => t.name),
214
+ owner: detail.createdBy || '',
215
+ };
216
+ }
217
+ /**
218
+ * Fetches scenario (steps + expected results) for a test case.
219
+ */
220
+ export async function getTestOpsTestCaseScenario(testCaseId) {
221
+ const { baseUrl: root } = requireClientConfig();
222
+ const jwtToken = await getJwtToken();
223
+ const response = await fetch(`${root}/api/testcase/${testCaseId}/step`, {
224
+ method: 'GET',
225
+ headers: {
226
+ Accept: 'application/json',
227
+ Authorization: `Bearer ${jwtToken}`,
228
+ },
229
+ });
230
+ if (!response.ok) {
231
+ throw new Error(`Failed to fetch scenario for test case ${testCaseId}: ${response.status} ${response.statusText}`);
232
+ }
233
+ const data = await response.json();
234
+ return data;
235
+ }
236
+ /**
237
+ * Updates a step (including expected result) for a test case.
238
+ */
239
+ export async function patchTestOpsScenarioStep(testCaseId, stepId, stepData) {
240
+ const { baseUrl: root } = requireClientConfig();
241
+ const jwtToken = await getJwtToken();
242
+ const patchData = {};
243
+ if (stepData.body !== undefined) {
244
+ patchData.body = stepData.body;
245
+ }
246
+ if (stepData.expectedResult !== undefined) {
247
+ patchData.expectedResult = stepData.expectedResult;
248
+ }
249
+ const response = await fetch(`${root}/api/testcase/step/${stepId}?withExpectedResult=true`, {
250
+ method: 'PATCH',
251
+ headers: {
252
+ Accept: 'application/json',
253
+ 'Content-Type': 'application/json',
254
+ Authorization: `Bearer ${jwtToken}`,
255
+ },
256
+ body: JSON.stringify(patchData),
257
+ });
258
+ if (!response.ok) {
259
+ throw new Error(`Failed to patch step ${stepId} for test case ${testCaseId}: ${response.status} ${response.statusText}`);
260
+ }
261
+ const data = await response.json();
262
+ return data;
263
+ }
264
+ /**
265
+ * Sets the entire scenario (all steps) for a test case.
266
+ */
267
+ export async function setTestOpsTestCaseScenario(testCaseId, steps) {
268
+ const { baseUrl: root } = requireClientConfig();
269
+ const jwtToken = await getJwtToken();
270
+ const scenarioData = {
271
+ steps: steps.map((step) => ({
272
+ action: step.action,
273
+ expectedResult: step.expectedResult || '',
274
+ })),
275
+ };
276
+ const response = await fetch(`${root}/api/testcase/${testCaseId}/scenario`, {
277
+ method: 'POST',
278
+ headers: {
279
+ Accept: 'application/json',
280
+ 'Content-Type': 'application/json',
281
+ Authorization: `Bearer ${jwtToken}`,
282
+ },
283
+ body: JSON.stringify(scenarioData),
284
+ });
285
+ if (!response.ok) {
286
+ throw new Error(`Failed to set scenario for test case ${testCaseId}: ${response.status} ${response.statusText}`);
287
+ }
288
+ const data = await response.json();
289
+ return data;
290
+ }
291
+ /**
292
+ * Fetches custom field values for a test case.
293
+ */
294
+ export async function getTestOpsTestCaseCustomFields(testCaseId) {
295
+ const { baseUrl: root } = requireClientConfig();
296
+ const jwtToken = await getJwtToken();
297
+ const response = await fetch(`${root}/api/testcase/${testCaseId}/cfv`, {
298
+ method: 'GET',
299
+ headers: {
300
+ Accept: 'application/json',
301
+ Authorization: `Bearer ${jwtToken}`,
302
+ },
303
+ });
304
+ if (!response.ok) {
305
+ throw new Error(`Failed to fetch custom fields for test case ${testCaseId}: ${response.status} ${response.statusText}`);
306
+ }
307
+ const data = await response.json();
308
+ return data;
309
+ }
310
+ /**
311
+ * Updates custom field values for a test case.
312
+ */
313
+ export async function updateTestOpsTestCaseCustomFields(testCaseId, customFields) {
314
+ const { baseUrl: root } = requireClientConfig();
315
+ const jwtToken = await getJwtToken();
316
+ const response = await fetch(`${root}/api/testcase/${testCaseId}/cfv`, {
317
+ method: 'PATCH',
318
+ headers: {
319
+ 'Content-Type': 'application/json',
320
+ Authorization: `Bearer ${jwtToken}`,
321
+ },
322
+ body: JSON.stringify(customFields),
323
+ });
324
+ if (!response.ok) {
325
+ throw new Error(`Failed to update custom fields for test case ${testCaseId}: ${response.status} ${response.statusText}`);
326
+ }
327
+ }
328
+ /**
329
+ * Fetches test case IDs from a test plan.
330
+ */
331
+ export async function getTestOpsTestPlanTestCases(testPlanId, options) {
332
+ const { baseUrl: root } = requireClientConfig();
333
+ const jwtToken = await getJwtToken();
334
+ const params = new URLSearchParams();
335
+ params.set('page', String(options?.page ?? 0));
336
+ params.set('size', String(options?.size ?? 10));
337
+ if (options?.sort) {
338
+ params.set('sort', options.sort);
339
+ }
340
+ const response = await fetch(`${root}/api/testplan/${testPlanId}/tree/leaf?${params}`, {
341
+ method: 'GET',
342
+ headers: {
343
+ Accept: 'application/json',
344
+ Authorization: `Bearer ${jwtToken}`,
345
+ },
346
+ });
347
+ if (!response.ok) {
348
+ throw new Error(`Failed to fetch test cases from test plan ${testPlanId}: ${response.status} ${response.statusText}`);
349
+ }
350
+ const data = (await response.json());
351
+ return data.content || [];
352
+ }
353
+ /**
354
+ * Searches test cases using AQL (Advanced Query Language).
355
+ */
356
+ export async function searchTestCasesByAQL(projectId, rql, options) {
357
+ const { baseUrl: root } = requireClientConfig();
358
+ const jwtToken = await getJwtToken();
359
+ const params = new URLSearchParams();
360
+ params.set('projectId', String(projectId));
361
+ params.set('rql', rql);
362
+ if (options?.deleted !== undefined) {
363
+ params.set('deleted', String(options.deleted));
364
+ }
365
+ if (options?.page !== undefined) {
366
+ params.set('page', String(options.page));
367
+ }
368
+ if (options?.size !== undefined) {
369
+ params.set('size', String(options.size));
370
+ }
371
+ if (options?.sort) {
372
+ params.set('sort', options.sort);
373
+ }
374
+ const response = await fetch(`${root}/api/testcase/__search?${params}`, {
375
+ method: 'GET',
376
+ headers: {
377
+ Accept: 'application/json',
378
+ Authorization: `Bearer ${jwtToken}`,
379
+ },
380
+ });
381
+ if (!response.ok) {
382
+ throw new Error(`Failed to search test cases: ${response.status} ${response.statusText}`);
383
+ }
384
+ const data = (await response.json());
385
+ return {
386
+ testCases: data.content || [],
387
+ total: data.totalElements || 0,
388
+ page: data.number || 0,
389
+ size: data.size || 0,
390
+ };
391
+ }
392
+ //# sourceMappingURL=testops-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testops-client.js","sourceRoot":"","sources":["../../src/services/testops-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export interface TestOpsProject {
2
+ id: number;
3
+ name: string;
4
+ }
5
+ export interface TestOpsTestPlan {
6
+ id: number;
7
+ name: string;
8
+ description?: string;
9
+ projectId: number;
10
+ }
11
+ export interface TestOpsTestPlanLeaf {
12
+ id: number;
13
+ }
14
+ export interface TestOpsTestCaseStep {
15
+ body: string;
16
+ }
17
+ export interface TestOpsCustomField {
18
+ id: number;
19
+ name: string;
20
+ customField: {
21
+ name: string;
22
+ };
23
+ }
24
+ export interface TestOpsTestCase {
25
+ id: number;
26
+ name: string;
27
+ description?: string;
28
+ createdBy?: string;
29
+ tags?: Array<{
30
+ name: string;
31
+ }>;
32
+ }
33
+ export interface TestOpsScenarioStep {
34
+ id: number;
35
+ body?: string;
36
+ children?: number[];
37
+ expectedResultId?: number;
38
+ }
39
+ export interface TestOpsNormalizedScenario {
40
+ scenarioSteps: Record<number, TestOpsScenarioStep>;
41
+ root: {
42
+ children: number[];
43
+ };
44
+ }
45
+ export interface TestOpsCustomFieldWithValues {
46
+ customField: {
47
+ id: number;
48
+ name: string;
49
+ };
50
+ values: Array<{
51
+ id: number;
52
+ name: string;
53
+ }>;
54
+ }
55
+ export interface TestOpsPageResponse<T> {
56
+ content: T[];
57
+ totalElements?: number;
58
+ totalPages?: number;
59
+ number?: number;
60
+ size?: number;
61
+ }
62
+ //# sourceMappingURL=testops-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testops-types.d.ts","sourceRoot":"","sources":["../../src/services/testops-types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACnD,IAAI,EAAE;QACF,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACL;AAED,MAAM,WAAW,4BAA4B;IACzC,WAAW,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,MAAM,EAAE,KAAK,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACN;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IAClC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,3 @@
1
+ /* eslint-disable max-lines */
2
+ export {};
3
+ //# sourceMappingURL=testops-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testops-types.js","sourceRoot":"","sources":["../../src/services/testops-types.ts"],"names":[],"mappings":"AAAA,8BAA8B"}
@@ -0,0 +1,39 @@
1
+ import type { Result } from './result.js';
2
+ /** HTTP methods supported by the API client */
3
+ export type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE';
4
+ /** Request configuration for API calls */
5
+ export interface RequestConfig {
6
+ method: HttpMethod;
7
+ queryParams?: Record<string, string | number | boolean | undefined>;
8
+ body?: unknown;
9
+ headers?: Record<string, string>;
10
+ }
11
+ /**
12
+ * Initialize the API client with TestOps credentials
13
+ * @param url - TestOps instance URL
14
+ * @param token - API token for authentication
15
+ */
16
+ export declare const initApiClient: (url: string, token: string) => void;
17
+ /** Clear cached JWT token (useful for re-authentication) */
18
+ export declare const clearJwtCache: () => void;
19
+ /**
20
+ * Get JWT token for API requests (with caching)
21
+ * @returns Cached or freshly obtained JWT token
22
+ */
23
+ export declare const getJwt: () => Promise<string>;
24
+ /**
25
+ * Base HTTP client with automatic JWT auth
26
+ * @param endpoint - API endpoint path
27
+ * @param config - Request configuration
28
+ * @returns Result containing response data or error
29
+ */
30
+ export declare const apiFetch: <T = unknown>(endpoint: string, config: RequestConfig) => Promise<Result<T, Error>>;
31
+ /** GET request helper */
32
+ export declare const apiGet: <T = unknown>(endpoint: string, queryParams?: RequestConfig["queryParams"]) => Promise<Result<T, Error>>;
33
+ /** POST request helper */
34
+ export declare const apiPost: <T = unknown>(endpoint: string, body?: unknown, queryParams?: RequestConfig["queryParams"]) => Promise<Result<T, Error>>;
35
+ /** PATCH request helper */
36
+ export declare const apiPatch: <T = unknown>(endpoint: string, body?: unknown, queryParams?: RequestConfig["queryParams"]) => Promise<Result<T, Error>>;
37
+ /** DELETE request helper */
38
+ export declare const apiDelete: <T = unknown>(endpoint: string, queryParams?: RequestConfig["queryParams"]) => Promise<Result<T, Error>>;
39
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/shared/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,+CAA+C;AAC/C,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7D,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAKD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,IAG1D,CAAC;AAWF,4DAA4D;AAC5D,eAAO,MAAM,aAAa,QAAO,IAEhC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,MAAM,CA2B7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,GAAG,OAAO,EACtC,UAAU,MAAM,EAChB,QAAQ,aAAa,KACtB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CA+B1B,CAAC;AAEF,yBAAyB;AACzB,eAAO,MAAM,MAAM,GAAI,CAAC,GAAG,OAAO,EAC9B,UAAU,MAAM,EAChB,cAAc,aAAa,CAAC,aAAa,CAAC,KAC3C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAA0D,CAAC;AAEtF,0BAA0B;AAC1B,eAAO,MAAM,OAAO,GAAI,CAAC,GAAG,OAAO,EAC/B,UAAU,MAAM,EAChB,OAAO,OAAO,EACd,cAAc,aAAa,CAAC,aAAa,CAAC,KAC3C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAiE,CAAC;AAE7F,2BAA2B;AAC3B,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAChC,UAAU,MAAM,EAChB,OAAO,OAAO,EACd,cAAc,aAAa,CAAC,aAAa,CAAC,KAC3C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAkE,CAAC;AAE9F,4BAA4B;AAC5B,eAAO,MAAM,SAAS,GAAI,CAAC,GAAG,OAAO,EACjC,UAAU,MAAM,EAChB,cAAc,aAAa,CAAC,aAAa,CAAC,KAC3C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAA6D,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { tryCatch } from './result.js';
2
+ let baseUrl = '';
3
+ let authToken = '';
4
+ /**
5
+ * Initialize the API client with TestOps credentials
6
+ * @param url - TestOps instance URL
7
+ * @param token - API token for authentication
8
+ */
9
+ export const initApiClient = (url, token) => {
10
+ baseUrl = url.replace(/\/+$/, '');
11
+ authToken = token;
12
+ };
13
+ const getConfig = () => {
14
+ if (!baseUrl || !authToken) {
15
+ throw new Error('API client not initialized. Call initApiClient() first.');
16
+ }
17
+ return { baseUrl, authToken };
18
+ };
19
+ let jwtToken = null;
20
+ /** Clear cached JWT token (useful for re-authentication) */
21
+ export const clearJwtCache = () => {
22
+ jwtToken = null;
23
+ };
24
+ /**
25
+ * Get JWT token for API requests (with caching)
26
+ * @returns Cached or freshly obtained JWT token
27
+ */
28
+ export const getJwt = async () => {
29
+ if (jwtToken) {
30
+ return jwtToken;
31
+ }
32
+ const { baseUrl: root, authToken: token } = getConfig();
33
+ const response = await fetch(`${root}/api/uaa/oauth/token`, {
34
+ method: 'POST',
35
+ headers: {
36
+ Accept: 'application/json',
37
+ 'Content-Type': 'application/x-www-form-urlencoded',
38
+ },
39
+ body: new URLSearchParams({
40
+ grant_type: 'apitoken',
41
+ scope: 'openid',
42
+ token,
43
+ }),
44
+ });
45
+ if (!response.ok) {
46
+ throw new Error(`Auth failed: ${response.status} ${response.statusText}`);
47
+ }
48
+ const data = await response.json();
49
+ jwtToken = data.access_token;
50
+ return jwtToken;
51
+ };
52
+ /**
53
+ * Base HTTP client with automatic JWT auth
54
+ * @param endpoint - API endpoint path
55
+ * @param config - Request configuration
56
+ * @returns Result containing response data or error
57
+ */
58
+ export const apiFetch = async (endpoint, config) => {
59
+ return tryCatch(async () => {
60
+ const { baseUrl: root } = getConfig();
61
+ const token = await getJwt();
62
+ const url = new URL(`${root}${endpoint}`);
63
+ if (config.queryParams) {
64
+ Object.entries(config.queryParams).forEach(([key, value]) => {
65
+ if (value !== undefined) {
66
+ url.searchParams.set(key, String(value));
67
+ }
68
+ });
69
+ }
70
+ const response = await fetch(url.toString(), {
71
+ method: config.method,
72
+ headers: {
73
+ Accept: 'application/json',
74
+ 'Content-Type': 'application/json',
75
+ Authorization: `Bearer ${token}`,
76
+ ...config.headers,
77
+ },
78
+ body: config.body ? JSON.stringify(config.body) : undefined,
79
+ });
80
+ if (!response.ok) {
81
+ throw new Error(`${config.method} ${endpoint} failed: ${response.status}`);
82
+ }
83
+ return response.json();
84
+ });
85
+ };
86
+ /** GET request helper */
87
+ export const apiGet = (endpoint, queryParams) => apiFetch(endpoint, { method: 'GET', queryParams });
88
+ /** POST request helper */
89
+ export const apiPost = (endpoint, body, queryParams) => apiFetch(endpoint, { method: 'POST', body, queryParams });
90
+ /** PATCH request helper */
91
+ export const apiPatch = (endpoint, body, queryParams) => apiFetch(endpoint, { method: 'PATCH', body, queryParams });
92
+ /** DELETE request helper */
93
+ export const apiDelete = (endpoint, queryParams) => apiFetch(endpoint, { method: 'DELETE', queryParams });
94
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/shared/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './result.js';
2
+ export * from './pagination.js';
3
+ export * from './api.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './result.js';
2
+ export * from './pagination.js';
3
+ export * from './api.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC"}