@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 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/domain/test-case/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACrB,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,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,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,kBAAkB;IAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,IAAI,EAAE;QACF,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACL;AAED,MAAM,WAAW,qBAAqB;IAClC,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,oBAAoB;IACjC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TestCase Domain - Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domain/test-case/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './service.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/test-plan/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './service.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/test-plan/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Result } from '../../shared/result.js';
2
+ import { PageParams, type Paginated } from '../../shared/pagination.js';
3
+ import type { TestPlan, TestPlanTestCase } from './types.js';
4
+ /**
5
+ * Get a test plan by ID
6
+ * @param id - Test plan ID
7
+ * @returns Test plan details
8
+ */
9
+ export declare const getTestPlan: (id: number) => Promise<Result<TestPlan, Error>>;
10
+ /**
11
+ * Get test cases from a test plan
12
+ * @param testPlanId - Test plan ID
13
+ * @param params - Pagination parameters
14
+ * @returns Paginated list of test cases in the plan
15
+ */
16
+ export declare const getTestPlanTestCases: (testPlanId: number, params?: PageParams) => Promise<Result<Paginated<TestPlanTestCase>, Error>>;
17
+ /**
18
+ * Get test plan execution statistics
19
+ * @param testPlanId - Test plan ID
20
+ * @returns Statistics (total, passed, failed counts)
21
+ */
22
+ export declare const getTestPlanStat: (testPlanId: number) => Promise<Result<{
23
+ total: number;
24
+ passed: number;
25
+ failed: number;
26
+ }, Error>>;
27
+ /**
28
+ * Sync test plan (update test case list from source)
29
+ * @param testPlanId - Test plan ID
30
+ * @returns Updated test plan
31
+ */
32
+ export declare const syncTestPlan: (testPlanId: number) => Promise<Result<TestPlan, Error>>;
33
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/domain/test-plan/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAO,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAuB,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAS7D;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAU,IAAI,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAE7E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC7B,YAAY,MAAM,EAClB,SAAS,UAAU,KACpB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAgBpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GACxB,YAAY,MAAM,KACnB,OAAO,CAAC,MAAM,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,CAAC,CAE1E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAEtF,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { apiGet } from '../../shared/api.js';
2
+ import { map } from '../../shared/result.js';
3
+ import { createPaginated } from '../../shared/pagination.js';
4
+ import { normalizePageParams } from '../../shared/pagination.js';
5
+ /**
6
+ * Get a test plan by ID
7
+ * @param id - Test plan ID
8
+ * @returns Test plan details
9
+ */
10
+ export const getTestPlan = async (id) => {
11
+ return apiGet(`/api/testplan/${id}`);
12
+ };
13
+ /**
14
+ * Get test cases from a test plan
15
+ * @param testPlanId - Test plan ID
16
+ * @param params - Pagination parameters
17
+ * @returns Paginated list of test cases in the plan
18
+ */
19
+ export const getTestPlanTestCases = async (testPlanId, params) => {
20
+ const { page, size, sort } = normalizePageParams(params);
21
+ const response = await apiGet(`/api/testplan/${testPlanId}/tree/leaf`, { page, size, sort: sort ?? 'name,ASC' });
22
+ return map(response, (data) => createPaginated(data.content ?? [], data.number ?? page, data.size ?? size, data.totalElements));
23
+ };
24
+ /**
25
+ * Get test plan execution statistics
26
+ * @param testPlanId - Test plan ID
27
+ * @returns Statistics (total, passed, failed counts)
28
+ */
29
+ export const getTestPlanStat = async (testPlanId) => {
30
+ return apiGet(`/api/testplan/${testPlanId}/stat`);
31
+ };
32
+ /**
33
+ * Sync test plan (update test case list from source)
34
+ * @param testPlanId - Test plan ID
35
+ * @returns Updated test plan
36
+ */
37
+ export const syncTestPlan = async (testPlanId) => {
38
+ return apiGet(`/api/testplan/${testPlanId}/sync`);
39
+ };
40
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/domain/test-plan/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAU,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAc,mBAAmB,EAAkB,MAAM,4BAA4B,CAAC;AAU7F;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,EAAU,EAAoC,EAAE;IAC9E,OAAO,MAAM,CAAW,iBAAiB,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACrC,UAAkB,EAClB,MAAmB,EACgC,EAAE;IACrD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,MAAM,CACzB,iBAAiB,UAAU,YAAY,EACvC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,UAAU,EAAE,CAC3C,CAAC;IAEF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAC1B,eAAe,CACX,IAAI,CAAC,OAAO,IAAI,EAAE,EAClB,IAAI,CAAC,MAAM,IAAI,IAAI,EACnB,IAAI,CAAC,IAAI,IAAI,IAAI,EACjB,IAAI,CAAC,aAAa,CACrB,CACJ,CAAC;AACN,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAChC,UAAkB,EACuD,EAAE;IAC3E,OAAO,MAAM,CAAC,iBAAiB,UAAU,OAAO,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,UAAkB,EAAoC,EAAE;IACvF,OAAO,MAAM,CAAW,iBAAiB,UAAU,OAAO,CAAC,CAAC;AAChE,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * TestPlan Domain - Types
3
+ */
4
+ export interface TestPlan {
5
+ id: number;
6
+ name: string;
7
+ description?: string;
8
+ projectId: number;
9
+ }
10
+ export interface TestPlanTestCase {
11
+ id: number;
12
+ name: string;
13
+ }
14
+ export interface TestPlanLeaf {
15
+ id: number;
16
+ name?: string;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/domain/test-plan/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TestPlan Domain - Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domain/test-plan/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import { parseTestOpsServerArgs } from './args.js';
2
+ import { initApiClient } from './shared/api.js';
3
+ import { startServer } from './server.js';
4
+ const { url, token } = parseTestOpsServerArgs(process.argv);
5
+ initApiClient(url, token);
6
+ startServer().catch((error) => {
7
+ console.error('Failed to start server:', error);
8
+ process.exit(1);
9
+ });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAE1B,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { registerProjectTools } from './project/tools.js';
2
+ export { registerTestPlanTools } from './test-plan/tools.js';
3
+ export { registerTestCaseTools } from './test-case/tools.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { registerProjectTools } from './project/tools.js';
2
+ export { registerTestPlanTools } from './test-plan/tools.js';
3
+ export { registerTestCaseTools } from './test-case/tools.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const registerProjectTools: (server: any) => void;
2
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/presentation/project/tools.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,GAAI,QAAQ,GAAG,SA6E/C,CAAC"}
@@ -0,0 +1,61 @@
1
+ import * as z from 'zod';
2
+ import { isSuccess } from '../../shared/result.js';
3
+ import { findProjects, findProjectByName, getProjectById, } from '../../domain/project/index.js';
4
+ export const registerProjectTools = (server) => {
5
+ server.registerTool('project_list', {
6
+ title: 'List Projects',
7
+ description: 'List all projects with pagination',
8
+ inputSchema: z.object({
9
+ page: z.number().optional().describe('Page number (zero-based)'),
10
+ size: z.number().optional().describe('Page size (max 100)'),
11
+ sort: z.string().optional().describe('Sort (e.g., "name,ASC")'),
12
+ }),
13
+ }, async (args) => {
14
+ const result = await findProjects(args);
15
+ if (!isSuccess(result)) {
16
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
17
+ }
18
+ return {
19
+ content: [{
20
+ type: 'text',
21
+ text: JSON.stringify({
22
+ items: result.value.items,
23
+ page: result.value.page,
24
+ size: result.value.size,
25
+ totalElements: result.value.totalElements,
26
+ hasNext: result.value.hasNext,
27
+ }, null, 2),
28
+ }],
29
+ };
30
+ });
31
+ server.registerTool('project_find_by_name', {
32
+ title: 'Find Project by Name',
33
+ description: 'Find a project by exact or partial name match',
34
+ inputSchema: z.object({
35
+ name: z.string().describe('Project name to search'),
36
+ }),
37
+ }, async (args) => {
38
+ const result = await findProjectByName(args.name);
39
+ if (!isSuccess(result)) {
40
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
41
+ }
42
+ if (!result.value) {
43
+ return { content: [{ type: 'text', text: `Project "${args.name}" not found` }], isError: true };
44
+ }
45
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
46
+ });
47
+ server.registerTool('project_get_by_id', {
48
+ title: 'Get Project by ID',
49
+ description: 'Get a project by its ID',
50
+ inputSchema: z.object({
51
+ id: z.number().describe('Project ID'),
52
+ }),
53
+ }, async (args) => {
54
+ const result = await getProjectById(args.id);
55
+ if (!isSuccess(result)) {
56
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
57
+ }
58
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
59
+ });
60
+ };
61
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/presentation/project/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const registerTestCaseTools: (server: any) => void;
2
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/presentation/test-case/tools.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,qBAAqB,GAAI,QAAQ,GAAG,SA6KhD,CAAC"}
@@ -0,0 +1,139 @@
1
+ import * as z from 'zod';
2
+ import { isSuccess } from '../../shared/result.js';
3
+ import { getTestCase, getTestCaseDetail, getTestCaseScenario, updateScenarioStep, setTestCaseScenario, getTestCaseCustomFields, updateTestCaseCustomFields, searchTestCasesByAQL, } from '../../domain/test-case/index.js';
4
+ export const registerTestCaseTools = (server) => {
5
+ server.registerTool('testcase_get', {
6
+ title: 'Get Test Case',
7
+ description: 'Get a test case by ID',
8
+ inputSchema: z.object({
9
+ id: z.number().describe('Test case ID'),
10
+ }),
11
+ }, async (args) => {
12
+ const result = await getTestCase(args.id);
13
+ if (!isSuccess(result)) {
14
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
15
+ }
16
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
17
+ });
18
+ server.registerTool('testcase_get_detail', {
19
+ title: 'Get Test Case Detail',
20
+ description: 'Get test case with steps and custom fields',
21
+ inputSchema: z.object({
22
+ id: z.number().describe('Test case ID'),
23
+ }),
24
+ }, async (args) => {
25
+ const result = await getTestCaseDetail(args.id);
26
+ if (!isSuccess(result)) {
27
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
28
+ }
29
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
30
+ });
31
+ server.registerTool('testcase_get_scenario', {
32
+ title: 'Get Test Case Scenario',
33
+ description: 'Get scenario (steps and expected results) for a test case',
34
+ inputSchema: z.object({
35
+ id: z.number().describe('Test case ID'),
36
+ }),
37
+ }, async (args) => {
38
+ const result = await getTestCaseScenario(args.id);
39
+ if (!isSuccess(result)) {
40
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
41
+ }
42
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
43
+ });
44
+ server.registerTool('testcase_update_step', {
45
+ title: 'Update Scenario Step',
46
+ description: 'Update a step in a test case scenario',
47
+ inputSchema: z.object({
48
+ testCaseId: z.number().describe('Test case ID'),
49
+ stepId: z.number().describe('Step ID to update'),
50
+ body: z.string().optional().describe('New step action'),
51
+ expectedResult: z.string().optional().describe('New expected result'),
52
+ }),
53
+ }, async (args) => {
54
+ const result = await updateScenarioStep(args.testCaseId, args.stepId, {
55
+ body: args.body,
56
+ expectedResult: args.expectedResult,
57
+ });
58
+ if (!isSuccess(result)) {
59
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
60
+ }
61
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
62
+ });
63
+ server.registerTool('testcase_set_scenario', {
64
+ title: 'Set Test Case Scenario',
65
+ description: 'Replace all steps in a test case scenario',
66
+ inputSchema: z.object({
67
+ id: z.number().describe('Test case ID'),
68
+ steps: z.array(z.object({
69
+ action: z.string().describe('Step action'),
70
+ expectedResult: z.string().optional().describe('Expected result'),
71
+ })).describe('Steps to set'),
72
+ }),
73
+ }, async (args) => {
74
+ const result = await setTestCaseScenario(args.id, args.steps);
75
+ if (!isSuccess(result)) {
76
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
77
+ }
78
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
79
+ });
80
+ server.registerTool('testcase_get_custom_fields', {
81
+ title: 'Get Test Case Custom Fields',
82
+ description: 'Get custom field values for a test case',
83
+ inputSchema: z.object({
84
+ id: z.number().describe('Test case ID'),
85
+ }),
86
+ }, async (args) => {
87
+ const result = await getTestCaseCustomFields(args.id);
88
+ if (!isSuccess(result)) {
89
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
90
+ }
91
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
92
+ });
93
+ server.registerTool('testcase_update_custom_fields', {
94
+ title: 'Update Test Case Custom Fields',
95
+ description: 'Update custom field values for a test case',
96
+ inputSchema: z.object({
97
+ id: z.number().describe('Test case ID'),
98
+ fields: z.array(z.object({
99
+ customFieldId: z.number().describe('Custom field ID'),
100
+ valueIds: z.array(z.number()).describe('Value IDs to set'),
101
+ })).describe('Custom fields to update'),
102
+ }),
103
+ }, async (args) => {
104
+ const result = await updateTestCaseCustomFields(args.id, args.fields);
105
+ if (!isSuccess(result)) {
106
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
107
+ }
108
+ return { content: [{ type: 'text', text: 'Custom fields updated successfully' }] };
109
+ });
110
+ server.registerTool('testcase_search_by_aql', {
111
+ title: 'Search Test Cases by AQL',
112
+ description: 'Search test cases using AQL query',
113
+ inputSchema: z.object({
114
+ projectId: z.number().describe('Project ID'),
115
+ rql: z.string().describe('AQL query'),
116
+ deleted: z.boolean().optional().describe('Include deleted'),
117
+ page: z.number().optional().describe('Page number'),
118
+ size: z.number().optional().describe('Page size'),
119
+ sort: z.string().optional().describe('Sort criteria'),
120
+ }),
121
+ }, async (args) => {
122
+ const result = await searchTestCasesByAQL(args.projectId, args.rql, args);
123
+ if (!isSuccess(result)) {
124
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
125
+ }
126
+ return {
127
+ content: [{
128
+ type: 'text',
129
+ text: JSON.stringify({
130
+ testCases: result.value.testCases,
131
+ total: result.value.total,
132
+ page: result.value.page,
133
+ size: result.value.size,
134
+ }, null, 2),
135
+ }],
136
+ };
137
+ });
138
+ };
139
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/presentation/test-case/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const registerTestPlanTools: (server: any) => void;
2
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/presentation/test-plan/tools.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,qBAAqB,GAAI,QAAQ,GAAG,SAsDhD,CAAC"}
@@ -0,0 +1,46 @@
1
+ import * as z from 'zod';
2
+ import { isSuccess } from '../../shared/result.js';
3
+ import { getTestPlan, getTestPlanTestCases, } from '../../domain/test-plan/index.js';
4
+ export const registerTestPlanTools = (server) => {
5
+ server.registerTool('testplan_get', {
6
+ title: 'Get Test Plan',
7
+ description: 'Get a test plan by ID',
8
+ inputSchema: z.object({
9
+ id: z.number().describe('Test plan ID'),
10
+ }),
11
+ }, async (args) => {
12
+ const result = await getTestPlan(args.id);
13
+ if (!isSuccess(result)) {
14
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
15
+ }
16
+ return { content: [{ type: 'text', text: JSON.stringify(result.value, null, 2) }] };
17
+ });
18
+ server.registerTool('testplan_get_test_cases', {
19
+ title: 'Get Test Plan Test Cases',
20
+ description: 'Get test cases from a test plan with pagination',
21
+ inputSchema: z.object({
22
+ id: z.number().describe('Test plan ID'),
23
+ page: z.number().optional().describe('Page number (zero-based)'),
24
+ size: z.number().optional().describe('Page size (max 100)'),
25
+ sort: z.string().optional().describe('Sort (e.g., "name,ASC")'),
26
+ }),
27
+ }, async (args) => {
28
+ const result = await getTestPlanTestCases(args.id, args);
29
+ if (!isSuccess(result)) {
30
+ return { content: [{ type: 'text', text: `Error: ${result.error.message}` }], isError: true };
31
+ }
32
+ return {
33
+ content: [{
34
+ type: 'text',
35
+ text: JSON.stringify({
36
+ items: result.value.items,
37
+ page: result.value.page,
38
+ size: result.value.size,
39
+ totalElements: result.value.totalElements,
40
+ hasNext: result.value.hasNext,
41
+ }, null, 2),
42
+ }],
43
+ };
44
+ });
45
+ };
46
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/presentation/test-plan/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACH,WAAW,EACX,oBAAoB,GACvB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAW,EAAE,EAAE;IACjD,MAAM,CAAC,YAAY,CACf,cAAc,EACd;QACI,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YAClB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;SAC1C,CAAC;KACL,EACD,KAAK,EAAE,IAAoB,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACxF,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACf,yBAAyB,EACzB;QACI,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,iDAAiD;QAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YAClB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAChE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SAClE,CAAC;KACL,EACD,KAAK,EAAE,IAAiE,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;QAED,OAAO;YACH,OAAO,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;wBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;wBACvB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;wBACvB,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;wBACzC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;qBAChC,EAAE,IAAI,EAAE,CAAC,CAAC;iBACd,CAAC;SACL,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ export declare function createTestOpsServer(): Promise<McpServer>;
3
+ export declare function startServer(): Promise<void>;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,8BAA8B,CAAC;AAQ/E,wBAAsB,mBAAmB,uBA+BxC;AAED,wBAAsB,WAAW,kBAKhC"}
package/dist/server.js ADDED
@@ -0,0 +1,32 @@
1
+ import { McpServer, StdioServerTransport } from '@modelcontextprotocol/server';
2
+ import * as z from 'zod';
3
+ import { registerProjectTools, registerTestPlanTools, registerTestCaseTools, } from './presentation/index.js';
4
+ export async function createTestOpsServer() {
5
+ const server = new McpServer({
6
+ name: 'testops-mcp-server',
7
+ version: '0.1.0'
8
+ }, {
9
+ capabilities: {
10
+ resources: {},
11
+ tools: {}
12
+ }
13
+ });
14
+ registerProjectTools(server);
15
+ registerTestPlanTools(server);
16
+ registerTestCaseTools(server);
17
+ server.registerTool('ping', {
18
+ title: 'Ping',
19
+ description: 'Test tool to verify server connectivity',
20
+ inputSchema: z.object({})
21
+ }, async () => ({
22
+ content: [{ type: 'text', text: 'Pong! Server is running.' }]
23
+ }));
24
+ return server;
25
+ }
26
+ export async function startServer() {
27
+ const server = await createTestOpsServer();
28
+ const transport = new StdioServerTransport();
29
+ await server.connect(transport);
30
+ console.error('TestOps MCP Server running on stdio');
31
+ }
32
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KAC1B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;KAC9D,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * TestOps Client Configuration
3
+ */
4
+ /**
5
+ * Sets the TestOps base URL and API token (from MCP process args).
6
+ */
7
+ export declare function configureTestOpsClient(options: {
8
+ baseUrl: string;
9
+ token: string;
10
+ }): void;
11
+ export declare function requireClientConfig(): {
12
+ baseUrl: string;
13
+ token: string;
14
+ };
15
+ /**
16
+ * Clears cached JWT (useful for re-authentication).
17
+ */
18
+ export declare function clearJwtToken(): void;
19
+ /**
20
+ * Exchanges the API token for a JWT used on subsequent requests.
21
+ */
22
+ export declare function getJwtToken(): Promise<string>;
23
+ /**
24
+ * Simplified HTTP client wrapper around fetch.
25
+ */
26
+ export declare function testopsFetch<T = any>(endpoint: string, options?: {
27
+ method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';
28
+ queryParams?: Record<string, string | number | boolean | undefined>;
29
+ body?: any;
30
+ }): Promise<T>;
31
+ /**
32
+ * GET request helper.
33
+ */
34
+ export declare function testopsGet<T = any>(endpoint: string, queryParams?: Record<string, string | number | boolean | undefined>): Promise<T>;
35
+ /**
36
+ * POST request helper.
37
+ */
38
+ export declare function testopsPost<T = any>(endpoint: string, body?: any, queryParams?: Record<string, string | number | boolean | undefined>): Promise<T>;
39
+ /**
40
+ * PATCH request helper.
41
+ */
42
+ export declare function testopsPatch<T = any>(endpoint: string, body?: any, queryParams?: Record<string, string | number | boolean | undefined>): Promise<T>;
43
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGxF;AAED,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAOxE;AAID;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CA2BnD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,GAAG,EACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACL,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,GAAG,CAAC;CACT,GACP,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACpC,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACpE,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,GAAG,EACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,GAAG,EACV,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACpE,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,GAAG,EACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,GAAG,EACV,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACpE,OAAO,CAAC,CAAC,CAAC,CAEZ"}