@keboola/api-client 1.0.1 → 3.0.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 (213) hide show
  1. package/dist/ai/index.cjs +5 -201
  2. package/dist/ai/index.cjs.map +1 -1
  3. package/dist/ai/index.js +2 -201
  4. package/dist/ai/index.js.map +1 -1
  5. package/dist/assets/index.cjs +5 -180
  6. package/dist/assets/index.cjs.map +1 -1
  7. package/dist/assets/index.js +2 -180
  8. package/dist/assets/index.js.map +1 -1
  9. package/dist/chat/index.cjs +6 -422
  10. package/dist/chat/index.cjs.map +1 -1
  11. package/dist/chat/index.js +3 -422
  12. package/dist/chat/index.js.map +1 -1
  13. package/dist/chat/suggestions.cjs +70 -152
  14. package/dist/chat/suggestions.cjs.map +1 -1
  15. package/dist/chat/suggestions.js +1 -138
  16. package/dist/chat/suggestions.js.map +1 -1
  17. package/dist/chunk-3B7L6MCG.js +189 -0
  18. package/dist/chunk-3B7L6MCG.js.map +1 -0
  19. package/dist/chunk-3T54WH4X.cjs +42 -0
  20. package/dist/chunk-3T54WH4X.cjs.map +1 -0
  21. package/dist/chunk-3Y6NK7TC.js +34 -0
  22. package/dist/chunk-3Y6NK7TC.js.map +1 -0
  23. package/dist/chunk-4RC5E3SL.js +140 -0
  24. package/dist/chunk-4RC5E3SL.js.map +1 -0
  25. package/dist/chunk-633QJMHH.cjs +73 -0
  26. package/dist/chunk-633QJMHH.cjs.map +1 -0
  27. package/dist/chunk-6RQDX6JY.cjs +132 -0
  28. package/dist/chunk-6RQDX6JY.cjs.map +1 -0
  29. package/dist/chunk-76AHKXLC.cjs +29 -0
  30. package/dist/chunk-76AHKXLC.cjs.map +1 -0
  31. package/dist/chunk-7FY6COWG.js +71 -0
  32. package/dist/chunk-7FY6COWG.js.map +1 -0
  33. package/dist/chunk-7J2R6XHB.js +3 -0
  34. package/dist/chunk-7J2R6XHB.js.map +1 -0
  35. package/dist/chunk-BGLICNTG.cjs +33 -0
  36. package/dist/chunk-BGLICNTG.cjs.map +1 -0
  37. package/dist/chunk-BR3SBEFE.cjs +182 -0
  38. package/dist/chunk-BR3SBEFE.cjs.map +1 -0
  39. package/dist/chunk-CVV4HROS.cjs +37 -0
  40. package/dist/chunk-CVV4HROS.cjs.map +1 -0
  41. package/dist/chunk-DCTDH77P.cjs +277 -0
  42. package/dist/chunk-DCTDH77P.cjs.map +1 -0
  43. package/dist/chunk-EBCZUGUX.js +35 -0
  44. package/dist/chunk-EBCZUGUX.js.map +1 -0
  45. package/dist/chunk-EY5LALX2.cjs +26 -0
  46. package/dist/chunk-EY5LALX2.cjs.map +1 -0
  47. package/dist/chunk-FBQHHAL5.js +40 -0
  48. package/dist/chunk-FBQHHAL5.js.map +1 -0
  49. package/dist/chunk-GF4XZK5N.cjs +43 -0
  50. package/dist/chunk-GF4XZK5N.cjs.map +1 -0
  51. package/dist/chunk-GNPQB3MT.js +27 -0
  52. package/dist/chunk-GNPQB3MT.js.map +1 -0
  53. package/dist/chunk-GO6SOMGL.js +181 -0
  54. package/dist/chunk-GO6SOMGL.js.map +1 -0
  55. package/dist/chunk-HCNNMUTR.cjs +36 -0
  56. package/dist/chunk-HCNNMUTR.cjs.map +1 -0
  57. package/dist/chunk-HPVTVQBJ.cjs +238 -0
  58. package/dist/chunk-HPVTVQBJ.cjs.map +1 -0
  59. package/dist/chunk-HYUGRMCY.cjs +247 -0
  60. package/dist/chunk-HYUGRMCY.cjs.map +1 -0
  61. package/dist/chunk-IJMQCOBC.js +34 -0
  62. package/dist/chunk-IJMQCOBC.js.map +1 -0
  63. package/dist/chunk-IY3VNVXD.cjs +183 -0
  64. package/dist/chunk-IY3VNVXD.cjs.map +1 -0
  65. package/dist/chunk-JKFIB6SQ.cjs +685 -0
  66. package/dist/chunk-JKFIB6SQ.cjs.map +1 -0
  67. package/dist/chunk-JLNOESHX.cjs +47 -0
  68. package/dist/chunk-JLNOESHX.cjs.map +1 -0
  69. package/dist/chunk-JURD5MC3.js +178 -0
  70. package/dist/chunk-JURD5MC3.js.map +1 -0
  71. package/dist/chunk-LV3ZWNDC.js +75 -0
  72. package/dist/chunk-LV3ZWNDC.js.map +1 -0
  73. package/dist/chunk-LZ6A6J2E.cjs +77 -0
  74. package/dist/chunk-LZ6A6J2E.cjs.map +1 -0
  75. package/dist/chunk-OKVYLO6C.js +108 -0
  76. package/dist/chunk-OKVYLO6C.js.map +1 -0
  77. package/dist/chunk-PD3LJYS2.js +218 -0
  78. package/dist/chunk-PD3LJYS2.js.map +1 -0
  79. package/dist/chunk-PV4HIVW2.js +130 -0
  80. package/dist/chunk-PV4HIVW2.js.map +1 -0
  81. package/dist/chunk-R7PD3BRA.js +261 -0
  82. package/dist/chunk-R7PD3BRA.js.map +1 -0
  83. package/dist/chunk-SAEG42HW.js +64 -0
  84. package/dist/chunk-SAEG42HW.js.map +1 -0
  85. package/dist/chunk-TIIRBQUA.cjs +110 -0
  86. package/dist/chunk-TIIRBQUA.cjs.map +1 -0
  87. package/dist/chunk-TNJWOHPM.js +948 -0
  88. package/dist/chunk-TNJWOHPM.js.map +1 -0
  89. package/dist/chunk-TXFQ4YIK.js +31 -0
  90. package/dist/chunk-TXFQ4YIK.js.map +1 -0
  91. package/dist/chunk-U5SE6W5M.cjs +158 -0
  92. package/dist/chunk-U5SE6W5M.cjs.map +1 -0
  93. package/dist/chunk-UABYNGBZ.js +39 -0
  94. package/dist/chunk-UABYNGBZ.js.map +1 -0
  95. package/dist/chunk-UXF53ZOV.js +220 -0
  96. package/dist/chunk-UXF53ZOV.js.map +1 -0
  97. package/dist/chunk-VAOCYA6B.js +20 -0
  98. package/dist/chunk-VAOCYA6B.js.map +1 -0
  99. package/dist/chunk-VS5PM7KL.js +45 -0
  100. package/dist/chunk-VS5PM7KL.js.map +1 -0
  101. package/dist/chunk-WQ7EZWBF.js +24 -0
  102. package/dist/chunk-WQ7EZWBF.js.map +1 -0
  103. package/dist/chunk-XFC52BJV.cjs +952 -0
  104. package/dist/chunk-XFC52BJV.cjs.map +1 -0
  105. package/dist/chunk-XPDEQND7.cjs +4 -0
  106. package/dist/chunk-XPDEQND7.cjs.map +1 -0
  107. package/dist/chunk-XUDMML5C.cjs +211 -0
  108. package/dist/chunk-XUDMML5C.cjs.map +1 -0
  109. package/dist/chunk-YPCD7M2N.cjs +22 -0
  110. package/dist/chunk-YPCD7M2N.cjs.map +1 -0
  111. package/dist/chunk-YUEYMIMI.cjs +67 -0
  112. package/dist/chunk-YUEYMIMI.cjs.map +1 -0
  113. package/dist/chunk-YXCVNX2Q.cjs +36 -0
  114. package/dist/chunk-YXCVNX2Q.cjs.map +1 -0
  115. package/dist/chunk-ZEMKE6DI.js +681 -0
  116. package/dist/chunk-ZEMKE6DI.js.map +1 -0
  117. package/dist/dataScience/index.cjs +8 -412
  118. package/dist/dataScience/index.cjs.map +1 -1
  119. package/dist/dataScience/index.js +2 -391
  120. package/dist/dataScience/index.js.map +1 -1
  121. package/dist/domain/permissions/index.cjs +131 -2
  122. package/dist/domain/permissions/index.cjs.map +1 -1
  123. package/dist/domain/permissions/index.d.cts +108 -2
  124. package/dist/domain/permissions/index.d.ts +108 -2
  125. package/dist/domain/permissions/index.js +106 -3
  126. package/dist/domain/permissions/index.js.map +1 -1
  127. package/dist/editor/index.cjs +5 -264
  128. package/dist/editor/index.cjs.map +1 -1
  129. package/dist/editor/index.js +2 -264
  130. package/dist/editor/index.js.map +1 -1
  131. package/dist/encryption/index.cjs +5 -190
  132. package/dist/encryption/index.cjs.map +1 -1
  133. package/dist/encryption/index.js +2 -190
  134. package/dist/encryption/index.js.map +1 -1
  135. package/dist/import/index.cjs +5 -196
  136. package/dist/import/index.cjs.map +1 -1
  137. package/dist/import/index.js +2 -196
  138. package/dist/import/index.js.map +1 -1
  139. package/dist/index.cjs +334 -3752
  140. package/dist/index.cjs.map +1 -1
  141. package/dist/index.d.cts +1814 -104
  142. package/dist/index.d.ts +1814 -104
  143. package/dist/index.js +176 -3627
  144. package/dist/index.js.map +1 -1
  145. package/dist/management/index.cjs +10 -881
  146. package/dist/management/index.cjs.map +1 -1
  147. package/dist/management/index.js +3 -880
  148. package/dist/management/index.js.map +1 -1
  149. package/dist/metastore/index.cjs +5 -337
  150. package/dist/metastore/index.cjs.map +1 -1
  151. package/dist/metastore/index.js +2 -337
  152. package/dist/metastore/index.js.map +1 -1
  153. package/dist/oauth/index.cjs +5 -226
  154. package/dist/oauth/index.cjs.map +1 -1
  155. package/dist/oauth/index.js +2 -226
  156. package/dist/oauth/index.js.map +1 -1
  157. package/dist/project-Bzslbq4u.d.ts +16 -0
  158. package/dist/project-CYhB6rYN.d.cts +16 -0
  159. package/dist/queryService/index.cjs +5 -248
  160. package/dist/queryService/index.cjs.map +1 -1
  161. package/dist/queryService/index.js +2 -248
  162. package/dist/queryService/index.js.map +1 -1
  163. package/dist/queue/index.cjs +5 -190
  164. package/dist/queue/index.cjs.map +1 -1
  165. package/dist/queue/index.js +2 -190
  166. package/dist/queue/index.js.map +1 -1
  167. package/dist/sdk/configurations/index.d.cts +2 -12
  168. package/dist/sdk/configurations/index.d.ts +2 -12
  169. package/dist/sdk/storage/index.cjs +49 -267
  170. package/dist/sdk/storage/index.cjs.map +1 -1
  171. package/dist/sdk/storage/index.d.cts +2 -2
  172. package/dist/sdk/storage/index.d.ts +2 -2
  173. package/dist/sdk/storage/index.js +1 -259
  174. package/dist/sdk/storage/index.js.map +1 -1
  175. package/dist/sdk/tag/index.cjs +6 -203
  176. package/dist/sdk/tag/index.cjs.map +1 -1
  177. package/dist/sdk/tag/index.js +2 -206
  178. package/dist/sdk/tag/index.js.map +1 -1
  179. package/dist/status/index.cjs +6 -176
  180. package/dist/status/index.cjs.map +1 -1
  181. package/dist/status/index.js +3 -176
  182. package/dist/status/index.js.map +1 -1
  183. package/dist/status/types.cjs +2 -0
  184. package/dist/status/types.js +1 -1
  185. package/dist/storage/index.cjs +9 -1110
  186. package/dist/storage/index.cjs.map +1 -1
  187. package/dist/storage/index.d.cts +1 -1
  188. package/dist/storage/index.d.ts +1 -1
  189. package/dist/storage/index.js +3 -1110
  190. package/dist/storage/index.js.map +1 -1
  191. package/dist/storage/types.d.cts +39 -2
  192. package/dist/storage/types.d.ts +39 -2
  193. package/dist/{storageClient-DrYOs4Xm.d.ts → storageClient-BgvUM7gy.d.ts} +4 -1
  194. package/dist/{storageClient-DSLTM3Cr.d.cts → storageClient-CDX-GvNV.d.cts} +4 -1
  195. package/dist/{storageSdk-BBqAo0Vx.d.cts → storageSdk-IOIdwqy-.d.cts} +1 -1
  196. package/dist/{storageSdk-ZVmKQQSl.d.ts → storageSdk-qGaWB1dy.d.ts} +1 -1
  197. package/dist/syncActions/index.cjs +5 -364
  198. package/dist/syncActions/index.cjs.map +1 -1
  199. package/dist/syncActions/index.js +2 -345
  200. package/dist/syncActions/index.js.map +1 -1
  201. package/dist/telemetry/index.cjs +5 -187
  202. package/dist/telemetry/index.cjs.map +1 -1
  203. package/dist/telemetry/index.js +2 -187
  204. package/dist/telemetry/index.js.map +1 -1
  205. package/dist/vault/index.cjs +5 -219
  206. package/dist/vault/index.cjs.map +1 -1
  207. package/dist/vault/index.js +2 -219
  208. package/dist/vault/index.js.map +1 -1
  209. package/dist/verify/index.cjs +5 -184
  210. package/dist/verify/index.cjs.map +1 -1
  211. package/dist/verify/index.js +2 -184
  212. package/dist/verify/index.js.map +1 -1
  213. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,39 +1,36 @@
1
- import qs from 'qs';
2
- import * as z5 from 'zod';
1
+ import { createProject } from './chunk-UABYNGBZ.js';
2
+ import { generateUUID, createTagSdk } from './chunk-JURD5MC3.js';
3
+ export { generateUUID, keboolaUID } from './chunk-JURD5MC3.js';
4
+ import { delay, createStorageSdk } from './chunk-R7PD3BRA.js';
5
+ export { PollException, createStorageSdk, delay, poll } from './chunk-R7PD3BRA.js';
6
+ import { createTelemetryClient } from './chunk-TXFQ4YIK.js';
7
+ import { createVaultClient } from './chunk-SAEG42HW.js';
8
+ export { UserError } from './chunk-SAEG42HW.js';
9
+ import { createManagementClient } from './chunk-ZEMKE6DI.js';
10
+ export { ManagementClientAuthError, isManagementClientAuthError } from './chunk-ZEMKE6DI.js';
11
+ import { createVerifyClient } from './chunk-GNPQB3MT.js';
12
+ import { createMetastoreClient } from './chunk-GO6SOMGL.js';
13
+ import { createOauthClient } from './chunk-7FY6COWG.js';
14
+ import { createQueryServiceClient } from './chunk-LV3ZWNDC.js';
15
+ import { createQueueClient } from './chunk-3Y6NK7TC.js';
16
+ import { createStatusClient } from './chunk-VAOCYA6B.js';
17
+ import './chunk-7J2R6XHB.js';
18
+ import { createStorageTokenMiddleware, createStorageClient } from './chunk-TNJWOHPM.js';
19
+ export { series } from './chunk-TNJWOHPM.js';
20
+ export { concurrent } from './chunk-EBCZUGUX.js';
21
+ import { createSyncActionsClient } from './chunk-3B7L6MCG.js';
22
+ import { createAiClient } from './chunk-VS5PM7KL.js';
23
+ import { createAssetsClient } from './chunk-WQ7EZWBF.js';
24
+ import { createChatClient } from './chunk-PV4HIVW2.js';
25
+ import { suggestionsApiResponseSchema } from './chunk-4RC5E3SL.js';
26
+ import { createDataScienceClient } from './chunk-UXF53ZOV.js';
27
+ export { parseLogLines } from './chunk-UXF53ZOV.js';
28
+ import { createEditorClient } from './chunk-OKVYLO6C.js';
29
+ import { createEncryptionClient } from './chunk-IJMQCOBC.js';
30
+ import { createImportClient } from './chunk-FBQHHAL5.js';
31
+ import { KeboolaHttpHeader, HttpStatus, ApiError, createCallbackMiddleware, normalizeBaseUrl, createOpenapiFetchClient, createGenericFetchClient } from './chunk-PD3LJYS2.js';
32
+ export { ApiError, HttpContentType, HttpHeader, KeboolaHttpHeader, createGenericFetchClient, isAbortError, isApiError, isFetchClientError, normalizeBaseUrl } from './chunk-PD3LJYS2.js';
3
33
  import { z } from 'zod';
4
- import dayjs from 'dayjs';
5
- import utc from 'dayjs/plugin/utc';
6
-
7
- // src/errors/UserError.ts
8
- var UserError = class extends Error {
9
- constructor(message2) {
10
- super(message2);
11
- }
12
- };
13
-
14
- // src/errors/ApiError.ts
15
- var ApiError = class extends Error {
16
- response;
17
- request;
18
- data;
19
- constructor({ response, request, data }) {
20
- super(response.statusText);
21
- this.response = response;
22
- this.request = request;
23
- this.data = data;
24
- }
25
- };
26
-
27
- // src/errors/ManagementClientAuthError.ts
28
- var ManagementClientAuthError = class extends ApiError {
29
- title;
30
- message;
31
- constructor(title, message2, res) {
32
- super(res);
33
- this.title = title;
34
- this.message = message2;
35
- }
36
- };
37
34
 
38
35
  // src/errors/ServiceUnavailableError.ts
39
36
  var ServiceUnavailableError = class _ServiceUnavailableError extends Error {
@@ -45,399 +42,6 @@ var ServiceUnavailableError = class _ServiceUnavailableError extends Error {
45
42
  Object.setPrototypeOf(this, _ServiceUnavailableError.prototype);
46
43
  }
47
44
  };
48
-
49
- // src/constants.ts
50
- var KeboolaHttpHeader = {
51
- STORAGE_API_TOKEN: "X-StorageApi-Token",
52
- MANAGEMENT_API_TOKEN: "X-Kbc-Manageapitoken",
53
- STORAGE_API_URL: "x-storageapi-url"
54
- };
55
- var HttpStatus = {
56
- NO_CONTENT: 204,
57
- BAD_REQUEST: 400,
58
- UNPROCESSABLE_ENTITY: 422,
59
- INTERNAL_SERVER_ERROR: 500,
60
- BAD_GATEWAY: 502,
61
- SERVICE_UNAVAILABLE: 503,
62
- GATEWAY_TIMEOUT: 504
63
- };
64
- var ENCRYPTED_VALUE_PREFIX = "KBC::";
65
-
66
- // src/fetchClient/createFetchClient/utils.ts
67
- var HttpHeader = {
68
- CONTENT_TYPE: "content-type",
69
- CONTENT_DISPOSITION: "content-disposition"
70
- };
71
- var HttpContentType = {
72
- JSON: "application/json",
73
- TEXT_PLAIN: "text/plain",
74
- FORM_DATA: "multipart/form-data",
75
- TEXT_HTML: "text/html"
76
- };
77
- var defaultValidateStatus = ({ response }) => response.status >= 200 && response.status <= 299;
78
- function removeUndefined(obj) {
79
- const objCopy = { ...obj };
80
- for (const [key, value] of Object.entries(objCopy)) {
81
- if (value == null) delete objCopy[key];
82
- }
83
- return objCopy;
84
- }
85
- var parseData = async (response) => {
86
- if (response.status === HttpStatus.NO_CONTENT) return null;
87
- const contentType = response.headers.get(HttpHeader.CONTENT_TYPE);
88
- if (contentType && contentType == HttpContentType.JSON) {
89
- return response.json();
90
- }
91
- const text = await response.text();
92
- try {
93
- return JSON.parse(text);
94
- } catch {
95
- return text;
96
- }
97
- };
98
- var cleanHeadersInit = (headersInit) => {
99
- if (Array.isArray(headersInit)) return headersInit;
100
- if (headersInit instanceof Headers) return headersInit;
101
- if (headersInit == null) return headersInit;
102
- return removeUndefined(headersInit);
103
- };
104
- var createHeaders = (headersInitA, headersInitB) => {
105
- const headersA = new Headers(cleanHeadersInit(headersInitA));
106
- const headersB = new Headers(cleanHeadersInit(headersInitB));
107
- headersB.forEach((value, key) => {
108
- headersA.set(key, value);
109
- });
110
- return headersA;
111
- };
112
- var createPath = (path, pathParam = {}) => path.replace(/\{([^}]+)}/g, (_, key) => {
113
- if (!(key in pathParam))
114
- throw new Error(`Path parameter "${key}" is missing in the path "${path}"`);
115
- return encodeURIComponent(pathParam[key]);
116
- });
117
- var createSearch = (query, options = {}) => {
118
- return qs.stringify(query, {
119
- encodeValuesOnly: true,
120
- skipNulls: true,
121
- ...options
122
- });
123
- };
124
- var createBody = (body, headers) => {
125
- if (body == null) return null;
126
- if (body instanceof FormData) return body;
127
- if (typeof body === "string") return body;
128
- const stringifyBody = JSON.stringify(body);
129
- const stringBody = stringifyBody === "{}" ? null : stringifyBody;
130
- if (stringBody) headers.set(HttpHeader.CONTENT_TYPE, HttpContentType.JSON);
131
- return stringBody;
132
- };
133
- var parseContentDispositionHeader = (contentDisposition) => {
134
- const type = (() => {
135
- const typeMatch = contentDisposition?.match(/^\s*(inline|attachment)\s*;/i);
136
- return typeMatch?.[1]?.toLowerCase() ?? "unknown";
137
- })();
138
- const filename = (() => {
139
- const filenameMatch = contentDisposition?.match(/filename="([^"]+)"/i);
140
- if (filenameMatch) return filenameMatch[1];
141
- const encodedFilenameMatch = contentDisposition?.match(/filename\*=(?:UTF-8'')?([^;]+)/i);
142
- if (encodedFilenameMatch?.[1]) return decodeURIComponent(encodedFilenameMatch[1]);
143
- const unquotedFilenameMatch = contentDisposition?.match(/filename=([^;]+)/i);
144
- return unquotedFilenameMatch?.[1] ?? null;
145
- })();
146
- return { type, filename };
147
- };
148
- var createFetchRequest = ({
149
- url,
150
- method,
151
- params,
152
- options = {},
153
- defaultOptions
154
- }) => {
155
- const {
156
- baseUrl,
157
- validateStatus: defValidateStatus = defaultValidateStatus,
158
- headers: defaultHeaders,
159
- ...restDefaultOptions
160
- } = defaultOptions;
161
- const { validateStatus, queryArrayFormat, headers: endpointHeaders, ...restOptions } = options;
162
- const headers = createHeaders(defaultHeaders, endpointHeaders);
163
- const path = createPath(url, params.path);
164
- const search = createSearch(params.query ?? {}, { arrayFormat: queryArrayFormat });
165
- const body = createBody(params.body, headers);
166
- const urlInstance = new URL(baseUrl + path);
167
- urlInstance.search = search;
168
- const request = new Request(urlInstance, {
169
- ...restDefaultOptions,
170
- ...restOptions,
171
- headers,
172
- method: method.toUpperCase(),
173
- body
174
- });
175
- return { request, validateStatus: validateStatus ?? defValidateStatus };
176
- };
177
-
178
- // src/fetchClient/createFetchClient/createFetchClient.ts
179
- var isApiError = (error) => error instanceof ApiError;
180
- var isAbortError = (error) => error instanceof DOMException && error.name === "AbortError";
181
- var isFetchClientError = (error) => error instanceof TypeError || error instanceof SyntaxError || isApiError(error);
182
- var createCoreFetch = (fetchFn) => async ({ request, validateStatus }) => {
183
- const response = await fetchFn(request);
184
- const data = await parseData(response);
185
- const apiResponse = {
186
- request,
187
- response,
188
- data
189
- };
190
- const boolOrError = validateStatus(apiResponse);
191
- if (isApiError(boolOrError)) throw boolOrError;
192
- if (!boolOrError) throw new ApiError(apiResponse);
193
- return apiResponse;
194
- };
195
- var createFetchClient = ({
196
- middlewares = [],
197
- ...defaultOptions
198
- }) => {
199
- const coreFetch = createCoreFetch(defaultOptions.fetchFn ?? fetch);
200
- const fetchWithMiddlewares = middlewares.reduceRight(
201
- (next, middleware) => middleware(next),
202
- coreFetch
203
- );
204
- const createFetchMethod = (method) => async (url, params, options = {}) => {
205
- const request = createFetchRequest({
206
- url,
207
- method,
208
- params,
209
- defaultOptions,
210
- options
211
- });
212
- const methodMiddlewares = options?.middlewares ?? [];
213
- return methodMiddlewares.reduceRight(
214
- (next, middleware) => middleware(next),
215
- fetchWithMiddlewares
216
- )(request);
217
- };
218
- return {
219
- get: createFetchMethod("get"),
220
- post: createFetchMethod("post"),
221
- put: createFetchMethod("put"),
222
- patch: createFetchMethod("patch"),
223
- delete: createFetchMethod("delete")
224
- };
225
- };
226
-
227
- // src/fetchClient/createFetchClient/middlewares.ts
228
- var createCallbackMiddleware = ({ onError, onSettled, onSuccess } = {}) => (next) => async (request) => {
229
- let response;
230
- try {
231
- response = await next(request);
232
- onSuccess?.();
233
- } catch (error) {
234
- onError?.(error);
235
- throw error;
236
- } finally {
237
- onSettled?.();
238
- }
239
- return response;
240
- };
241
-
242
- // src/fetchClient/createGenericFetchClient.ts
243
- var createGenericFetchClient = (defaultOptions) => createFetchClient(defaultOptions);
244
-
245
- // src/fetchClient/createOpenapiFetchClient.ts
246
- var createOpenapiFetchClient = (defaultOptions) => createFetchClient(defaultOptions);
247
-
248
- // src/clients/ai/aiClient.ts
249
- var createAiClient = ({ baseUrl, middlewares }) => {
250
- const client = createOpenapiFetchClient({
251
- baseUrl,
252
- middlewares
253
- });
254
- const describeConfigurationVersion = async (body) => {
255
- const { data } = await client.post("/describe/configuration-version", { body });
256
- return data;
257
- };
258
- const describeConfigurationMerge = async (body) => {
259
- const { data } = await client.post("/describe/configuration-merge", { body });
260
- return data;
261
- };
262
- const explainError = async (body) => {
263
- const { data } = await client.post("/explain", { body });
264
- return data;
265
- };
266
- const describeConfiguration = async (body) => {
267
- const { data } = await client.post("/describe/configuration", { body });
268
- return data;
269
- };
270
- const suggestComponent = async (body) => {
271
- const { data } = await client.post("/suggest/component", { body });
272
- return data;
273
- };
274
- const feedback = async (body) => {
275
- const { data } = await client.post("/feedback", { body });
276
- return data;
277
- };
278
- return {
279
- describeConfigurationVersion,
280
- describeConfigurationMerge,
281
- explainError,
282
- describeConfiguration,
283
- suggestComponent,
284
- feedback
285
- };
286
- };
287
-
288
- // src/clients/assets/assetsClient.ts
289
- var createAssetsClient = ({ baseUrl, middlewares }) => {
290
- const client = createGenericFetchClient({
291
- baseUrl,
292
- middlewares
293
- });
294
- const getPublishedChangelogPosts = async (signal) => {
295
- const { data } = await client.get(
296
- "/platform-changelog/published-posts.json",
297
- {},
298
- { signal }
299
- );
300
- return data;
301
- };
302
- return {
303
- getPublishedChangelogPosts
304
- };
305
- };
306
- var SUGGESTION_CATEGORIES = ["error", "maintenance", "documentation"];
307
- var suggestionCategorySchema = z.enum(SUGGESTION_CATEGORIES);
308
- var suggestionSchema = z.object({
309
- label: z.preprocess((v) => typeof v === "string" ? v.slice(0, 80) : v, z.string().max(80)),
310
- prompt: z.string(),
311
- priority: z.number().int().min(1).max(3),
312
- category: suggestionCategorySchema,
313
- reasoning: z.string()
314
- });
315
- z.object({
316
- suggestions: z.array(suggestionSchema).max(4)
317
- });
318
- var suggestionWithIdSchema = suggestionSchema.extend({
319
- id: z.string()
320
- });
321
- var suggestionsApiResponseSchema = z.object({
322
- suggestions: z.array(suggestionWithIdSchema).max(4),
323
- suggestionSessionId: z.string()
324
- });
325
- var recentFailedJobSchema = z.object({
326
- id: z.string(),
327
- status: z.enum(["error", "warning"]),
328
- component: z.string(),
329
- configId: z.string(),
330
- configName: z.string().optional(),
331
- createdTime: z.string(),
332
- durationSeconds: z.number().int().nonnegative().optional(),
333
- errorMessage: z.string().max(200).optional()
334
- });
335
- var deprecatedComponentSchema = z.object({
336
- id: z.string(),
337
- name: z.string(),
338
- type: z.string(),
339
- expiredOn: z.string(),
340
- configCount: z.number().int().nonnegative()
341
- });
342
- var userRecentEditSchema = z.object({
343
- component: z.string(),
344
- configId: z.string(),
345
- configName: z.string(),
346
- lastEdited: z.string()
347
- });
348
- var dashboardContextDataSchema = z.object({
349
- recentFailedJobs: z.array(recentFailedJobSchema).max(5),
350
- deprecatedComponents: z.array(deprecatedComponentSchema).max(5),
351
- userRecentEdits: z.array(userRecentEditSchema).max(5),
352
- currentUserEmail: z.string().email()
353
- });
354
- var JOB_STATUSES = [
355
- "created",
356
- "waiting",
357
- "processing",
358
- "success",
359
- "error",
360
- "terminating",
361
- "terminated",
362
- "cancelled",
363
- "warning"
364
- ];
365
- var jobDetailContextDataSchema = z.object({
366
- job: z.object({
367
- id: z.string(),
368
- status: z.enum(JOB_STATUSES),
369
- component: z.string(),
370
- configId: z.string().optional(),
371
- configName: z.string().optional(),
372
- createdTime: z.string(),
373
- startTime: z.string().optional(),
374
- endTime: z.string().optional(),
375
- durationSeconds: z.number().int().nonnegative().optional(),
376
- errorMessage: z.string().max(500).optional(),
377
- errorType: z.enum(["user", "application"]).optional(),
378
- backendSize: z.string().optional()
379
- }),
380
- component: z.object({
381
- id: z.string(),
382
- name: z.string(),
383
- type: z.string()
384
- }).optional(),
385
- runtimeHistory: z.object({
386
- averageDurationSeconds: z.number().nonnegative().optional(),
387
- minDurationSeconds: z.number().nonnegative().optional(),
388
- maxDurationSeconds: z.number().nonnegative().optional(),
389
- recentJobsCount: z.number().int().nonnegative(),
390
- isSlowerThanAverage: z.boolean().optional(),
391
- isFasterThanAverage: z.boolean().optional(),
392
- percentageDifference: z.number().optional()
393
- }).optional(),
394
- currentUserEmail: z.string().email()
395
- });
396
- var configurationDetailContextDataSchema = z.object({
397
- configuration: z.object({
398
- id: z.string(),
399
- name: z.string(),
400
- description: z.string().max(500).optional(),
401
- component: z.string(),
402
- hasRows: z.boolean(),
403
- rowCount: z.number().int().nonnegative().optional(),
404
- lastChangeDescription: z.string().max(200).optional()
405
- }),
406
- component: z.object({
407
- id: z.string(),
408
- name: z.string(),
409
- type: z.string()
410
- }).optional(),
411
- latestJobs: z.array(
412
- z.object({
413
- id: z.string(),
414
- status: z.enum(JOB_STATUSES),
415
- durationSeconds: z.number().int().nonnegative().optional(),
416
- errorMessage: z.string().max(200).optional(),
417
- createdTime: z.string()
418
- })
419
- ).max(5).optional(),
420
- currentUserEmail: z.string().email()
421
- });
422
- var dashboardSuggestionsRequestSchema = z.object({
423
- context: z.literal("dashboard"),
424
- data: dashboardContextDataSchema
425
- });
426
- var jobDetailSuggestionsRequestSchema = z.object({
427
- context: z.literal("job-detail"),
428
- data: jobDetailContextDataSchema
429
- });
430
- var configurationDetailSuggestionsRequestSchema = z.object({
431
- context: z.literal("configuration-detail"),
432
- data: configurationDetailContextDataSchema
433
- });
434
- z.discriminatedUnion("context", [
435
- dashboardSuggestionsRequestSchema,
436
- jobDetailSuggestionsRequestSchema,
437
- configurationDetailSuggestionsRequestSchema
438
- ]);
439
-
440
- // src/clients/chat/chatClient.ts
441
45
  var agentSettingsSchema = z.object({
442
46
  projectId: z.string(),
443
47
  customInstructions: z.string().nullable(),
@@ -461,43 +65,71 @@ var toolInfoSchema = z.object({
461
65
  var toolsListResponseSchema = z.object({
462
66
  tools: z.array(toolInfoSchema)
463
67
  });
464
- var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
465
- const client = createOpenapiFetchClient({
466
- baseUrl,
467
- headers: new Headers({
468
- [KeboolaHttpHeader.STORAGE_API_URL]: storageApiUrl
469
- }),
470
- middlewares
471
- });
68
+ var sandboxFileEntrySchema = z.object({
69
+ name: z.string(),
70
+ path: z.string(),
71
+ type: z.enum(["file", "dir"]),
72
+ size: z.number().int().nonnegative().optional()
73
+ });
74
+ var sandboxFileListingSchema = z.object({
75
+ entries: z.array(sandboxFileEntrySchema)
76
+ });
77
+ var sandboxFileContentSchema = z.object({
78
+ content: z.string(),
79
+ encoding: z.enum(["utf-8", "binary"]),
80
+ truncated: z.boolean(),
81
+ size: z.number().int().nonnegative()
82
+ });
83
+ var sandboxGitBranchSchema = z.object({
84
+ branch: z.string().nullable()
85
+ });
86
+ var createKaiAgentClient = ({ baseUrl, middlewares }) => {
87
+ const clientOptions = { baseUrl: normalizeBaseUrl(baseUrl), middlewares };
88
+ const client = createOpenapiFetchClient(clientOptions);
89
+ const genericClient = createGenericFetchClient(clientOptions);
472
90
  const getHistory = async (params) => {
473
- const { data } = await client.get("/history", { query: params });
91
+ const { data } = await client.get("/api/history", { query: params });
474
92
  return data;
475
93
  };
476
94
  const getChat = async (chatId, signal) => {
477
- const { data } = await client.get("/chat/{id}", { path: { id: chatId } }, { signal });
95
+ const { data } = await client.get("/api/chat/{id}", { path: { id: chatId } }, { signal });
478
96
  return data;
479
97
  };
480
98
  const deleteChat = async (chatId) => {
481
- const { data } = await client.delete("/chat", { query: { id: chatId } });
99
+ const { data } = await client.delete("/api/chat", { query: { id: chatId } });
482
100
  return data;
483
101
  };
102
+ const createChat = async (request) => {
103
+ const { response } = await client.post("/api/chat", { body: request });
104
+ return response;
105
+ };
484
106
  const getVotes = async (chatId) => {
485
- const { data } = await client.get("/vote", { query: { chatId } });
107
+ const { data } = await client.get("/api/vote", { query: { chatId } });
486
108
  return data;
487
109
  };
488
110
  const submitVote = async (params) => {
489
- await client.patch("/vote", { body: params });
490
- };
491
- const createChat = async (request) => {
492
- const { response } = await client.post("/chat", { body: request });
493
- return response;
111
+ await client.patch("/api/vote", { body: params });
494
112
  };
495
113
  const getUsage = async (signal) => {
496
- const { data } = await client.get("/usage", {}, { signal });
114
+ const { data } = await client.get("/api/usage", {}, { signal });
115
+ return data;
116
+ };
117
+ const approveToolCall = async (chatId, body) => {
118
+ await client.post("/api/chat/{id}/approval", { path: { id: chatId }, body });
119
+ };
120
+ const submitToolOutput = async (chatId, body) => {
121
+ await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
122
+ };
123
+ const stopChat = async (chatId) => {
124
+ const { data } = await client.post("/api/chat/{id}/stop", { path: { id: chatId } });
497
125
  return data;
498
126
  };
499
127
  const getSuggestions = async (request, signal) => {
500
- const { data } = await client.post("/suggestions", { body: request }, { signal });
128
+ const { data } = await genericClient.post(
129
+ "/api/suggestions",
130
+ { body: request },
131
+ { signal }
132
+ );
501
133
  const result = suggestionsApiResponseSchema.safeParse(data);
502
134
  if (!result.success) {
503
135
  throw new Error("Invalid suggestions response format");
@@ -505,7 +137,7 @@ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
505
137
  return result.data;
506
138
  };
507
139
  const getAgentSettings = async (signal) => {
508
- const { data } = await client.get("/settings", {}, { signal });
140
+ const { data } = await genericClient.get("/api/settings", {}, { signal });
509
141
  const result = agentSettingsSchema.safeParse(data);
510
142
  if (!result.success) {
511
143
  throw new Error("Invalid agent settings response format");
@@ -513,7 +145,11 @@ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
513
145
  return result.data;
514
146
  };
515
147
  const updateAgentSettings = async (request, signal) => {
516
- const { data } = await client.patch("/settings", { body: request }, { signal });
148
+ const { data } = await genericClient.patch(
149
+ "/api/settings",
150
+ { body: request },
151
+ { signal }
152
+ );
517
153
  const result = agentSettingsSchema.safeParse(data);
518
154
  if (!result.success) {
519
155
  throw new Error("Invalid agent settings response format");
@@ -521,7 +157,11 @@ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
521
157
  return result.data;
522
158
  };
523
159
  const getUserAgentSettings = async (signal) => {
524
- const { data } = await client.get("/settings/user", {}, { signal });
160
+ const { data } = await genericClient.get(
161
+ "/api/settings/user",
162
+ {},
163
+ { signal }
164
+ );
525
165
  const result = userAgentSettingsSchema.safeParse(data);
526
166
  if (!result.success) {
527
167
  throw new Error("Invalid user agent settings response format");
@@ -529,7 +169,11 @@ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
529
169
  return result.data;
530
170
  };
531
171
  const updateUserAgentSettings = async (request, signal) => {
532
- const { data } = await client.patch("/settings/user", { body: request }, { signal });
172
+ const { data } = await genericClient.patch(
173
+ "/api/settings/user",
174
+ { body: request },
175
+ { signal }
176
+ );
533
177
  const result = userAgentSettingsSchema.safeParse(data);
534
178
  if (!result.success) {
535
179
  throw new Error("Invalid user agent settings response format");
@@ -537,13 +181,54 @@ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
537
181
  return result.data;
538
182
  };
539
183
  const getToolsList = async (signal) => {
540
- const { data } = await client.get("/settings/tools", {}, { signal });
184
+ const { data } = await genericClient.get(
185
+ "/api/settings/tools",
186
+ {},
187
+ { signal }
188
+ );
541
189
  const result = toolsListResponseSchema.safeParse(data);
542
190
  if (!result.success) {
543
191
  throw new Error("Invalid tools list response format");
544
192
  }
545
193
  return result.data;
546
194
  };
195
+ const listSandboxFiles = async (chatId, path, signal) => {
196
+ const { data } = await genericClient.get(
197
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/files`,
198
+ { query: path ? { path } : void 0 },
199
+ { signal }
200
+ );
201
+ const result = sandboxFileListingSchema.safeParse(data);
202
+ if (!result.success) {
203
+ throw new Error("Invalid sandbox files response format");
204
+ }
205
+ return result.data;
206
+ };
207
+ const readSandboxFile = async (chatId, path, signal) => {
208
+ const { data } = await genericClient.get(
209
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/file`,
210
+ { query: { path } },
211
+ { signal }
212
+ );
213
+ const result = sandboxFileContentSchema.safeParse(data);
214
+ if (!result.success) {
215
+ throw new Error("Invalid sandbox file response format");
216
+ }
217
+ return result.data;
218
+ };
219
+ const getSandboxGitBranch = async (chatId, signal) => {
220
+ const { data } = await genericClient.get(
221
+ `/api/chat/${encodeURIComponent(chatId)}/sandbox/git-branch`,
222
+ {},
223
+ { signal }
224
+ );
225
+ const result = sandboxGitBranchSchema.safeParse(data);
226
+ if (!result.success) {
227
+ throw new Error("Invalid sandbox git-branch response format");
228
+ }
229
+ return result.data;
230
+ };
231
+ const chatStreamUrl = clientOptions.baseUrl + "/api/chat";
547
232
  return {
548
233
  getHistory,
549
234
  getChat,
@@ -552,2988 +237,54 @@ var createChatClient = ({ baseUrl, middlewares, storageApiUrl }) => {
552
237
  getVotes,
553
238
  submitVote,
554
239
  getUsage,
240
+ approveToolCall,
241
+ submitToolOutput,
242
+ stopChat,
555
243
  getSuggestions,
556
244
  getAgentSettings,
557
245
  updateAgentSettings,
558
246
  getUserAgentSettings,
559
247
  updateUserAgentSettings,
560
- getToolsList
561
- };
562
- };
563
- var TailError = z5.object({
564
- context: z5.object({
565
- code: z5.string()
566
- })
567
- });
568
- dayjs.extend(utc);
569
- var ISO_TIMESTAMP_REGEX = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z/;
570
- var LEADING_ISO_TIMESTAMP_REGEX = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z)\s?/;
571
- var tryParseJsonl = (line) => {
572
- if (!line.startsWith("{")) return null;
573
- let parsed;
574
- try {
575
- parsed = JSON.parse(line);
576
- } catch {
577
- return null;
578
- }
579
- if (typeof parsed !== "object" || parsed === null) return null;
580
- const record = parsed;
581
- const { timestamp, message: message2 } = record;
582
- if (typeof timestamp !== "string" || typeof message2 !== "string") return null;
583
- return {
584
- timestamp,
585
- message: message2
248
+ getToolsList,
249
+ listSandboxFiles,
250
+ readSandboxFile,
251
+ getSandboxGitBranch,
252
+ chatStreamUrl
586
253
  };
587
254
  };
588
- var parsePlainTextLine = (line) => {
589
- const match = line.match(LEADING_ISO_TIMESTAMP_REGEX);
590
- if (match) {
591
- return { timestamp: match[1], message: line.slice(match[0].length) };
255
+
256
+ // src/utils/assert.ts
257
+ function assert(value, message) {
258
+ if (value == null) {
259
+ throw new Error(message);
592
260
  }
593
- return { timestamp: null, message: line };
261
+ }
262
+
263
+ // src/domain/stack.ts
264
+ var SERVICE_URL_OVERRIDES = {
265
+ // The service URL for the Kai Assistant is incomplete; we need to add the `/api` suffix to get the full URL for the API.
266
+ // I assume the service is versioned.
267
+ "kai-assistant": (url) => `${url}/api`
594
268
  };
595
- var parseLogLine = (line) => tryParseJsonl(line) ?? parsePlainTextLine(line);
596
- var toLogEntryFromObject = (raw) => {
597
- if (typeof raw.message !== "string") return null;
598
- return {
599
- timestamp: typeof raw.timestamp === "string" ? raw.timestamp : null,
600
- message: raw.message
269
+ var createStack = ({ stackInfo, clientServiceUrls }) => {
270
+ const { services, components, features, ...infoRest } = stackInfo;
271
+ const serviceMap = new Map(
272
+ services.map((service) => {
273
+ const devOverride = clientServiceUrls?.[service.id]?.(service.url);
274
+ const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
275
+ const url = devOverride ?? prodOverride ?? service.url;
276
+ return [service.id, url];
277
+ })
278
+ );
279
+ const componentMap = new Map(components.map((component) => [component.id, component]));
280
+ const featureSet = new Set(features);
281
+ const hasFeature = (...feature) => {
282
+ if (feature.length === 0) return false;
283
+ return feature.every((x) => featureSet.has(x));
601
284
  };
602
- };
603
- var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
604
- var parseLogLines = (raw) => {
605
- if (raw === null || raw === void 0 || raw === "") return [];
606
- if (Array.isArray(raw)) {
607
- return raw.flatMap((item) => {
608
- if (typeof item === "string") return item === "" ? [] : [parseLogLine(item)];
609
- if (isPlainObject(item)) {
610
- const entry = toLogEntryFromObject(item);
611
- return entry ? [entry] : [];
612
- }
613
- return [];
614
- });
615
- }
616
- if (isPlainObject(raw)) {
617
- const entry = toLogEntryFromObject(raw);
618
- return entry ? [entry] : [];
619
- }
620
- if (typeof raw !== "string") return [];
621
- const lines = raw.split("\n");
622
- const entries = [];
623
- for (const line of lines) {
624
- if (line === "") continue;
625
- entries.push(parseLogLine(line));
626
- }
627
- return entries;
628
- };
629
- var parseLastLogTimestamp = (logs) => {
630
- const entries = parseLogLines(logs);
631
- for (let i = entries.length - 1; i >= 0; i--) {
632
- const entry = entries[i];
633
- if (!entry) continue;
634
- if (entry.timestamp) return entry.timestamp;
635
- const match = entry.message.match(ISO_TIMESTAMP_REGEX);
636
- if (match) return match[0];
637
- }
638
- return null;
639
- };
640
- var calculateNextLogTimestamp = (timestamp) => {
641
- if (timestamp === null) return null;
642
- return dayjs(timestamp).utc().add(1, "second").utc().format();
643
- };
644
- var prepareAppRun = (appRun) => {
645
- return {
646
- ...appRun,
647
- state: appRun.state ?? (appRun.stoppedAt ? "finished" : "running")
648
- // fallback state for historic non migrated runs
649
- };
650
- };
651
-
652
- // src/clients/dataScience/dataScienceClient.ts
653
- var createDataScienceClient = ({ baseUrl, middlewares }) => {
654
- const client = createOpenapiFetchClient({
655
- baseUrl,
656
- middlewares
657
- });
658
- const getAppRuns = async (appId, query, signal) => {
659
- const { data } = await client.get("/apps/{appId}/runs", { path: { appId }, query }, { signal });
660
- return data.map(prepareAppRun);
661
- };
662
- const getAppRun = async (appId, runId, signal) => {
663
- const { data } = await client.get(
664
- "/apps/{appId}/runs/{runId}",
665
- { path: { appId, runId } },
666
- { signal }
667
- );
668
- return prepareAppRun(data);
669
- };
670
- const getAppLogsDownload = async (id, signal) => {
671
- const { data, response } = await client.get(
672
- "/apps/{appId}/logs/download",
673
- { path: { appId: id } },
674
- { signal }
675
- );
676
- const contentDisposition = parseContentDispositionHeader(
677
- response.headers.get(HttpHeader.CONTENT_DISPOSITION)
678
- );
679
- return {
680
- logs: data,
681
- fileName: contentDisposition?.filename ?? "logs.txt"
682
- };
683
- };
684
- const getAppLogsTail = async (id, { query, signal } = {}) => {
685
- try {
686
- const { data } = await client.get(
687
- "/apps/{appId}/logs/tail",
688
- {
689
- query,
690
- path: {
691
- appId: id
692
- }
693
- },
694
- {
695
- signal
696
- }
697
- );
698
- const logs = data === "" ? null : data;
699
- const lastLogTimestamp = parseLastLogTimestamp(logs);
700
- const nextLogTimestamp = calculateNextLogTimestamp(lastLogTimestamp);
701
- return {
702
- entries: parseLogLines(logs),
703
- nextLogTimestamp
704
- };
705
- } catch (error) {
706
- if (isApiError(error) && error.response.status === HttpStatus.BAD_REQUEST && TailError.safeParse(error.data).data?.context?.code === "apps.appNotRunning") {
707
- return { entries: [], nextLogTimestamp: null };
708
- }
709
- throw error;
710
- }
711
- };
712
- const getApps = async (query, signal) => {
713
- const { data } = await client.get("/apps", { query }, { signal });
714
- return data;
715
- };
716
- const getApp = async (appId, signal) => {
717
- const { data } = await client.get("/apps/{appId}", { path: { appId } }, { signal });
718
- return data;
719
- };
720
- const createApp = async (body, signal) => {
721
- const { data } = await client.post("/apps", { body }, { signal });
722
- return data;
723
- };
724
- const patchApp = async (appId, body, signal) => {
725
- const { data } = await client.patch(
726
- "/apps/{appId}",
727
- {
728
- path: { appId },
729
- body
730
- },
731
- { signal }
732
- );
733
- return data;
734
- };
735
- const deleteApp = async (appId, signal) => {
736
- return client.delete("/apps/{appId}", { path: { appId } }, { signal });
737
- };
738
- const getAppPassword = async (appId, signal) => {
739
- const { data } = await client.get("/apps/{appId}/password", { path: { appId } }, { signal });
740
- return data;
741
- };
742
- const resetAppPassword = async (appId, signal) => {
743
- const { data } = await client.post(
744
- "/apps/{appId}/reset-password",
745
- { path: { appId } },
746
- { signal }
747
- );
748
- return data;
749
- };
750
- const getRuntimes = async (signal) => {
751
- const { data } = await client.get("/runtimes", {}, { signal });
752
- return data;
753
- };
754
- const getSandbox = async (appId, signal) => {
755
- const { data } = await client.get("/sandboxes/{appId}", { path: { appId } }, { signal });
756
- return data;
757
- };
758
- return {
759
- getAppRuns,
760
- getAppRun,
761
- getAppLogsDownload,
762
- getAppLogsTail,
763
- getApps,
764
- getApp,
765
- createApp,
766
- patchApp,
767
- deleteApp,
768
- getAppPassword,
769
- resetAppPassword,
770
- getRuntimes,
771
- getSandbox
772
- };
773
- };
774
-
775
- // src/clients/editor/editorClient.ts
776
- var createEditorClient = ({ baseUrl, middlewares }) => {
777
- const client = createOpenapiFetchClient({
778
- baseUrl,
779
- middlewares
780
- });
781
- const createSession = async (body) => {
782
- const { data } = await client.post("/sql/sessions", {
783
- body
784
- });
785
- return data;
786
- };
787
- const getSession = async ({ id }, signal) => {
788
- const { data } = await client.get(`/sql/sessions/{id}`, { path: { id } }, { signal });
789
- return data;
790
- };
791
- const getSessions = async (query, signal) => {
792
- const { data } = await client.get(`/sql/sessions`, { query }, { signal });
793
- return data;
794
- };
795
- const getSessionSchema = async ({
796
- id,
797
- onlyWorkspaceSchema = "1",
798
- loadTables = "1"
799
- }, signal) => {
800
- const { data } = await client.get(
801
- `/sql/sessions/{id}/schema`,
802
- {
803
- path: { id },
804
- query: { onlyWorkspaceSchema, loadTables }
805
- },
806
- { signal }
807
- );
808
- return data;
809
- };
810
- const createQueryJob = async ({ id }, body) => {
811
- const { data } = await client.post(`/sql/sessions/{id}/run-query`, {
812
- path: { id },
813
- body
814
- });
815
- return data;
816
- };
817
- const tablePreview = async ({ id }, body) => {
818
- const { data } = await client.post(`/sql/sessions/{id}/table-preview`, {
819
- path: { id },
820
- body
821
- });
822
- return data;
823
- };
824
- const tableDefinition = async ({ id, ...query }, signal) => {
825
- const { data } = await client.get(
826
- `/sql/sessions/{id}/table-ddl`,
827
- { path: { id }, query },
828
- { signal }
829
- );
830
- return data;
831
- };
832
- const load = async ({ id }, body) => {
833
- const { data } = await client.post(`/sql/sessions/{id}/load`, {
834
- path: { id },
835
- body
836
- });
837
- return data;
838
- };
839
- const unload = async ({ id }, body) => {
840
- const { data } = await client.post(`/sql/sessions/{id}/unload`, {
841
- path: { id },
842
- // BE error: The body is optional; however, without it, the request will fail with the message "Request content type must be application/json."
843
- // This is expected, as our client cannot correctly determine the content type without the body.
844
- // This issue should be addressed to indicate that the body is required in their Swagger schema.
845
- body: body ?? { tableId: null }
846
- });
847
- return data;
848
- };
849
- const resetWorkspacePassword = async (id) => {
850
- const { data } = await client.post(`/sql/sessions/{id}/reset-password`, {
851
- path: { id }
852
- });
853
- return data;
854
- };
855
- const getSessionCredentials = async (id, signal) => {
856
- const { data } = await client.get(
857
- `/sql/sessions/{id}/credentials`,
858
- { path: { id } },
859
- { signal }
860
- );
861
- return data;
862
- };
863
- return {
864
- createSession,
865
- getSession,
866
- getSessions,
867
- getSessionSchema,
868
- createQueryJob,
869
- tablePreview,
870
- tableDefinition,
871
- load,
872
- unload,
873
- resetWorkspacePassword,
874
- getSessionCredentials
875
- };
876
- };
877
-
878
- // src/clients/encryption/encryptionClient.ts
879
- var createEncryptionClient = ({ baseUrl, middlewares }) => {
880
- const client = createGenericFetchClient({
881
- baseUrl,
882
- middlewares
883
- });
884
- const _encrypt = async (data, signal) => {
885
- const response = await client.post(
886
- "/encrypt",
887
- {
888
- query: {
889
- projectId: data.projectId,
890
- branchType: data.branchType,
891
- componentId: data.componentId
892
- },
893
- body: data.data
894
- },
895
- { signal }
896
- );
897
- return response.data;
898
- };
899
- const encrypt = (data, signal) => _encrypt(data, signal);
900
- const encryptSecrets = (data, signal) => _encrypt(data, signal);
901
- return {
902
- encryptSecrets,
903
- encrypt
904
- };
905
- };
906
-
907
- // src/clients/import/importClient.ts
908
- var createImportClient = ({ baseUrl, middlewares }) => {
909
- const client = createGenericFetchClient({
910
- baseUrl,
911
- middlewares
912
- });
913
- const uploadFile = async (file, params = {}, signal) => {
914
- const formData = new FormData();
915
- formData.append("data", file);
916
- if (params.isPermanent) {
917
- formData.append("isPermanent", "1");
918
- }
919
- if (params.notify) {
920
- formData.append("notify", "1");
921
- }
922
- if (params.branchId) {
923
- formData.append("branchId", params.branchId);
924
- }
925
- if (params.tags) {
926
- for (const tag of params.tags) {
927
- formData.append("tags[]", tag);
928
- }
929
- }
930
- const { data } = await client.post(
931
- "/upload-file",
932
- { body: formData },
933
- { signal }
934
- );
935
- return data;
936
- };
937
- return {
938
- uploadFile
939
- };
940
- };
941
- var agentSettingsSchema2 = z.object({
942
- projectId: z.string(),
943
- customInstructions: z.string().nullable(),
944
- createdAt: z.string(),
945
- updatedAt: z.string()
946
- });
947
- var toolPermissionValueSchema2 = z.enum(["always_allow", "always_ask", "blocked"]);
948
- var userAgentSettingsSchema2 = z.object({
949
- projectId: z.string(),
950
- userId: z.string(),
951
- customInstructions: z.string().nullable(),
952
- toolPermissions: z.record(z.string(), toolPermissionValueSchema2).nullable(),
953
- createdAt: z.string(),
954
- updatedAt: z.string()
955
- });
956
- var toolInfoSchema2 = z.object({
957
- name: z.string(),
958
- description: z.string(),
959
- readOnly: z.boolean()
960
- });
961
- var toolsListResponseSchema2 = z.object({
962
- tools: z.array(toolInfoSchema2)
963
- });
964
- var sandboxFileEntrySchema = z.object({
965
- name: z.string(),
966
- path: z.string(),
967
- type: z.enum(["file", "dir"]),
968
- size: z.number().int().nonnegative().optional()
969
- });
970
- var sandboxFileListingSchema = z.object({
971
- entries: z.array(sandboxFileEntrySchema)
972
- });
973
- var sandboxFileContentSchema = z.object({
974
- content: z.string(),
975
- encoding: z.enum(["utf-8", "binary"]),
976
- truncated: z.boolean(),
977
- size: z.number().int().nonnegative()
978
- });
979
- var sandboxGitBranchSchema = z.object({
980
- branch: z.string().nullable()
981
- });
982
- var createKaiAgentClient = ({ baseUrl, middlewares }) => {
983
- const clientOptions = { baseUrl, middlewares };
984
- const client = createOpenapiFetchClient(clientOptions);
985
- const genericClient = createGenericFetchClient(clientOptions);
986
- const getHistory = async (params) => {
987
- const { data } = await client.get("/api/history", { query: params });
988
- return data;
989
- };
990
- const getChat = async (chatId, signal) => {
991
- const { data } = await client.get("/api/chat/{id}", { path: { id: chatId } }, { signal });
992
- return data;
993
- };
994
- const deleteChat = async (chatId) => {
995
- const { data } = await client.delete("/api/chat", { query: { id: chatId } });
996
- return data;
997
- };
998
- const createChat = async (request) => {
999
- const { response } = await client.post("/api/chat", { body: request });
1000
- return response;
1001
- };
1002
- const getVotes = async (chatId) => {
1003
- const { data } = await client.get("/api/vote", { query: { chatId } });
1004
- return data;
1005
- };
1006
- const submitVote = async (params) => {
1007
- await client.patch("/api/vote", { body: params });
1008
- };
1009
- const getUsage = async (signal) => {
1010
- const { data } = await client.get("/api/usage", {}, { signal });
1011
- return data;
1012
- };
1013
- const approveToolCall = async (chatId, body) => {
1014
- await client.post("/api/chat/{id}/approval", { path: { id: chatId }, body });
1015
- };
1016
- const submitToolOutput = async (chatId, body) => {
1017
- await client.post("/api/chat/{id}/ui-tool-result", { path: { id: chatId }, body });
1018
- };
1019
- const stopChat = async (chatId) => {
1020
- const { data } = await client.post("/api/chat/{id}/stop", { path: { id: chatId } });
1021
- return data;
1022
- };
1023
- const getSuggestions = async (request, signal) => {
1024
- const { data } = await genericClient.post(
1025
- "/api/suggestions",
1026
- { body: request },
1027
- { signal }
1028
- );
1029
- const result = suggestionsApiResponseSchema.safeParse(data);
1030
- if (!result.success) {
1031
- throw new Error("Invalid suggestions response format");
1032
- }
1033
- return result.data;
1034
- };
1035
- const getAgentSettings = async (signal) => {
1036
- const { data } = await genericClient.get("/api/settings", {}, { signal });
1037
- const result = agentSettingsSchema2.safeParse(data);
1038
- if (!result.success) {
1039
- throw new Error("Invalid agent settings response format");
1040
- }
1041
- return result.data;
1042
- };
1043
- const updateAgentSettings = async (request, signal) => {
1044
- const { data } = await genericClient.patch(
1045
- "/api/settings",
1046
- { body: request },
1047
- { signal }
1048
- );
1049
- const result = agentSettingsSchema2.safeParse(data);
1050
- if (!result.success) {
1051
- throw new Error("Invalid agent settings response format");
1052
- }
1053
- return result.data;
1054
- };
1055
- const getUserAgentSettings = async (signal) => {
1056
- const { data } = await genericClient.get(
1057
- "/api/settings/user",
1058
- {},
1059
- { signal }
1060
- );
1061
- const result = userAgentSettingsSchema2.safeParse(data);
1062
- if (!result.success) {
1063
- throw new Error("Invalid user agent settings response format");
1064
- }
1065
- return result.data;
1066
- };
1067
- const updateUserAgentSettings = async (request, signal) => {
1068
- const { data } = await genericClient.patch(
1069
- "/api/settings/user",
1070
- { body: request },
1071
- { signal }
1072
- );
1073
- const result = userAgentSettingsSchema2.safeParse(data);
1074
- if (!result.success) {
1075
- throw new Error("Invalid user agent settings response format");
1076
- }
1077
- return result.data;
1078
- };
1079
- const getToolsList = async (signal) => {
1080
- const { data } = await genericClient.get(
1081
- "/api/settings/tools",
1082
- {},
1083
- { signal }
1084
- );
1085
- const result = toolsListResponseSchema2.safeParse(data);
1086
- if (!result.success) {
1087
- throw new Error("Invalid tools list response format");
1088
- }
1089
- return result.data;
1090
- };
1091
- const listSandboxFiles = async (chatId, path, signal) => {
1092
- const { data } = await genericClient.get(
1093
- `/api/chat/${encodeURIComponent(chatId)}/sandbox/files`,
1094
- { query: path ? { path } : void 0 },
1095
- { signal }
1096
- );
1097
- const result = sandboxFileListingSchema.safeParse(data);
1098
- if (!result.success) {
1099
- throw new Error("Invalid sandbox files response format");
1100
- }
1101
- return result.data;
1102
- };
1103
- const readSandboxFile = async (chatId, path, signal) => {
1104
- const { data } = await genericClient.get(
1105
- `/api/chat/${encodeURIComponent(chatId)}/sandbox/file`,
1106
- { query: { path } },
1107
- { signal }
1108
- );
1109
- const result = sandboxFileContentSchema.safeParse(data);
1110
- if (!result.success) {
1111
- throw new Error("Invalid sandbox file response format");
1112
- }
1113
- return result.data;
1114
- };
1115
- const getSandboxGitBranch = async (chatId, signal) => {
1116
- const { data } = await genericClient.get(
1117
- `/api/chat/${encodeURIComponent(chatId)}/sandbox/git-branch`,
1118
- {},
1119
- { signal }
1120
- );
1121
- const result = sandboxGitBranchSchema.safeParse(data);
1122
- if (!result.success) {
1123
- throw new Error("Invalid sandbox git-branch response format");
1124
- }
1125
- return result.data;
1126
- };
1127
- const chatStreamUrl = baseUrl + "/api/chat";
1128
- return {
1129
- getHistory,
1130
- getChat,
1131
- deleteChat,
1132
- createChat,
1133
- getVotes,
1134
- submitVote,
1135
- getUsage,
1136
- approveToolCall,
1137
- submitToolOutput,
1138
- stopChat,
1139
- getSuggestions,
1140
- getAgentSettings,
1141
- updateAgentSettings,
1142
- getUserAgentSettings,
1143
- updateUserAgentSettings,
1144
- getToolsList,
1145
- listSandboxFiles,
1146
- readSandboxFile,
1147
- getSandboxGitBranch,
1148
- chatStreamUrl
1149
- };
1150
- };
1151
-
1152
- // src/clients/verify/createVerifyClient.ts
1153
- var createVerifyClient = () => {
1154
- const storageApiToken = async (host, token, signal) => {
1155
- const { data } = await createGenericFetchClient({
1156
- baseUrl: `${host}/v2/storage`,
1157
- headers: new Headers({ [KeboolaHttpHeader.STORAGE_API_TOKEN]: token })
1158
- }).get("/tokens/verify", {}, { signal });
1159
- return data;
1160
- };
1161
- const managementApiToken = async (host, token, signal) => {
1162
- const { data } = await createGenericFetchClient({
1163
- baseUrl: host,
1164
- headers: new Headers({ [KeboolaHttpHeader.MANAGEMENT_API_TOKEN]: token })
1165
- }).get("/manage/tokens/verify", {}, { signal });
1166
- return data;
1167
- };
1168
- return {
1169
- storageApiToken,
1170
- managementApiToken
1171
- };
1172
- };
1173
-
1174
- // src/clients/management/authMiddleware.ts
1175
- var TOKEN_CACHE_TTL_MS = 6e4;
1176
- var isManagementClientAuthError = (error) => error instanceof ManagementClientAuthError;
1177
- var createAuth = (baseUrl) => {
1178
- const fetchClient = createGenericFetchClient({ baseUrl });
1179
- const createCurrentUserSessionToken = async (accessToken) => {
1180
- const headers = new Headers({ [KeboolaHttpHeader.MANAGEMENT_API_TOKEN]: accessToken });
1181
- const { data } = await fetchClient.post(
1182
- "/manage/current-user/session-token",
1183
- {},
1184
- { headers }
1185
- );
1186
- return data.token;
1187
- };
1188
- const createAdminAccountSessionToken = async () => {
1189
- const { data } = await fetchClient.post(
1190
- "/admin/account/session-token",
1191
- {},
1192
- {
1193
- // transform valid response, to invalid and throw custom error
1194
- validateStatus: (apiResponse) => {
1195
- const { response } = apiResponse;
1196
- const isTextContent = response.headers.get(HttpHeader.CONTENT_TYPE)?.includes(HttpContentType.TEXT_HTML);
1197
- if (isTextContent)
1198
- return new ManagementClientAuthError(
1199
- "Your session expired",
1200
- "You will be logged out automatically.",
1201
- apiResponse
1202
- );
1203
- return defaultValidateStatus(apiResponse);
1204
- }
1205
- }
1206
- );
1207
- return data.token;
1208
- };
1209
- return {
1210
- createCurrentUserSessionToken,
1211
- createAdminAccountSessionToken
1212
- };
1213
- };
1214
- var createAuthMiddleware = ({
1215
- accessToken,
1216
- baseUrl
1217
- }) => {
1218
- const auth = createAuth(baseUrl);
1219
- const verify = createVerifyClient();
1220
- let token = accessToken;
1221
- let tokenValidUntil = 0;
1222
- let inflightAuth = null;
1223
- const isDevelopment = process.env.NODE_ENV === "development";
1224
- const ensureValidToken = async () => {
1225
- if (token && Date.now() < tokenValidUntil) return token;
1226
- if (token) {
1227
- const tokenInfo = await verify.managementApiToken(baseUrl, token);
1228
- const isTokenValid = !tokenInfo.isDisabled && !tokenInfo.isExpired;
1229
- if (isTokenValid) {
1230
- tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1231
- return token;
1232
- }
1233
- token = isDevelopment ? await auth.createCurrentUserSessionToken(token) : await auth.createAdminAccountSessionToken();
1234
- tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1235
- return token;
1236
- }
1237
- token = await auth.createAdminAccountSessionToken();
1238
- tokenValidUntil = Date.now() + TOKEN_CACHE_TTL_MS;
1239
- return token;
1240
- };
1241
- return (next) => async (request) => {
1242
- if (!inflightAuth) {
1243
- inflightAuth = ensureValidToken().finally(() => {
1244
- inflightAuth = null;
1245
- });
1246
- }
1247
- const validToken = await inflightAuth;
1248
- request.request.headers.set(KeboolaHttpHeader.MANAGEMENT_API_TOKEN, validToken);
1249
- return next(request);
1250
- };
1251
- };
1252
-
1253
- // src/clients/management/currentUser/currentUser.ts
1254
- var createCurrentUser = (client) => {
1255
- const getMaintainerInvitations = async (signal) => {
1256
- const { data } = await client.get(
1257
- "/manage/current-user/maintainers-invitations",
1258
- {},
1259
- { signal }
1260
- );
1261
- return data;
1262
- };
1263
- const getMaintainerInvitation = async (id, signal) => {
1264
- const { data } = await client.get(
1265
- "/manage/current-user/maintainers-invitations/{id}",
1266
- { path: { id } },
1267
- { signal }
1268
- );
1269
- return data;
1270
- };
1271
- const acceptMaintainerInvitation = async (id) => {
1272
- await client.put("/manage/current-user/maintainers-invitations/{id}", { path: { id } });
1273
- };
1274
- const rejectMaintainerInvitation = async (id) => {
1275
- await client.delete("/manage/current-user/maintainers-invitations/{id}", { path: { id } });
1276
- };
1277
- const getOrganizationInvitations = async (signal) => {
1278
- const { data } = await client.get(
1279
- "/manage/current-user/organizations-invitations",
1280
- {},
1281
- { signal }
1282
- );
1283
- return data;
1284
- };
1285
- const getOrganizationInvitation = async (id, signal) => {
1286
- const { data } = await client.get(
1287
- "/manage/current-user/organizations-invitations/{id}",
1288
- { path: { id } },
1289
- { signal }
1290
- );
1291
- return data;
1292
- };
1293
- const acceptOrganizationInvitation = async (id) => {
1294
- await client.put("/manage/current-user/organizations-invitations/{id}", { path: { id } });
1295
- };
1296
- const rejectOrganizationInvitation = async (id) => {
1297
- await client.delete("/manage/current-user/organizations-invitations/{id}", { path: { id } });
1298
- };
1299
- const getProjectInvitations = async (signal) => {
1300
- const { data } = await client.get("/manage/current-user/projects-invitations", {}, { signal });
1301
- return data;
1302
- };
1303
- const getProjectInvitation = async (id, signal) => {
1304
- const { data } = await client.get(
1305
- "/manage/current-user/projects-invitations/{id}",
1306
- { path: { id } },
1307
- { signal }
1308
- );
1309
- return data;
1310
- };
1311
- const acceptProjectInvitation = async (id) => {
1312
- await client.put("/manage/current-user/projects-invitations/{id}", { path: { id } });
1313
- };
1314
- const rejectProjectInvitation = async (id) => {
1315
- await client.delete("/manage/current-user/projects-invitations/{id}", { path: { id } });
1316
- };
1317
- const getProjectJoinRequests = async (signal) => {
1318
- const { data } = await client.get(
1319
- "/manage/current-user/projects-join-requests",
1320
- {},
1321
- { signal }
1322
- );
1323
- return data;
1324
- };
1325
- const deleteProjectJoinRequest = async (id) => {
1326
- await client.delete("/manage/current-user/projects-join-requests/{id}", { path: { id } });
1327
- };
1328
- return {
1329
- getMaintainerInvitations,
1330
- getMaintainerInvitation,
1331
- acceptMaintainerInvitation,
1332
- rejectMaintainerInvitation,
1333
- getOrganizationInvitations,
1334
- getOrganizationInvitation,
1335
- acceptOrganizationInvitation,
1336
- rejectOrganizationInvitation,
1337
- getProjectInvitations,
1338
- getProjectInvitation,
1339
- acceptProjectInvitation,
1340
- rejectProjectInvitation,
1341
- getProjectJoinRequests,
1342
- deleteProjectJoinRequest
1343
- };
1344
- };
1345
-
1346
- // src/clients/management/features/features.ts
1347
- var createFeatures = (client) => {
1348
- const getAllFeatures = async (query, signal) => {
1349
- const { data } = await client.get(
1350
- "/features",
1351
- { query },
1352
- { signal }
1353
- );
1354
- return data;
1355
- };
1356
- return {
1357
- getAllFeatures
1358
- };
1359
- };
1360
-
1361
- // src/clients/management/maintainers/maintainers.ts
1362
- var createMaintainers = (client) => {
1363
- const getMaintainers = async (signal) => {
1364
- const { data } = await client.get("/manage/maintainers", {}, { signal });
1365
- return data;
1366
- };
1367
- const getMaintainer = async (maintainerId, signal) => {
1368
- const { data } = await client.get(
1369
- "/manage/maintainers/{id}",
1370
- { path: { id: maintainerId } },
1371
- { signal }
1372
- );
1373
- return data;
1374
- };
1375
- const createMaintainer = async (body) => {
1376
- const { data } = await client.post("/manage/maintainers", { body });
1377
- return data;
1378
- };
1379
- const updateMaintainer = async ({
1380
- maintainerId,
1381
- ...body
1382
- }) => {
1383
- const { data } = await client.patch("/manage/maintainers/{id}", {
1384
- path: { id: maintainerId },
1385
- body
1386
- });
1387
- return data;
1388
- };
1389
- const deleteMaintainer = async (maintainerId) => {
1390
- await client.delete("/manage/maintainers/{id}", { path: { id: maintainerId } });
1391
- };
1392
- const getMaintainerUsers = async (maintainerId, signal) => {
1393
- const { data } = await client.get(
1394
- "/manage/maintainers/{id}/users",
1395
- { path: { id: maintainerId } },
1396
- { signal }
1397
- );
1398
- return data;
1399
- };
1400
- const addMaintainerUser = async ({
1401
- maintainerId,
1402
- ...body
1403
- }) => {
1404
- const { data } = await client.post("/manage/maintainers/{id}/users", {
1405
- path: { id: maintainerId },
1406
- body
1407
- });
1408
- return data;
1409
- };
1410
- const removeMaintainerUser = async ({
1411
- maintainerId,
1412
- adminId
1413
- }) => {
1414
- await client.delete("/manage/maintainers/{id}/users/{adminId}", {
1415
- path: { id: maintainerId, adminId }
1416
- });
1417
- };
1418
- const getMaintainerInvitations = async (maintainerId, signal) => {
1419
- const { data } = await client.get(
1420
- "/manage/maintainers/{id}/invitations",
1421
- { path: { id: maintainerId } },
1422
- { signal }
1423
- );
1424
- return data;
1425
- };
1426
- const getMaintainerInvitation = async ({ maintainerId, invitationId }, signal) => {
1427
- const { data } = await client.get(
1428
- "/manage/maintainers/{id}/invitations/{invitationId}",
1429
- { path: { id: maintainerId, invitationId } },
1430
- { signal }
1431
- );
1432
- return data;
1433
- };
1434
- const createMaintainerInvitation = async ({
1435
- maintainerId,
1436
- ...body
1437
- }) => {
1438
- const { data } = await client.post("/manage/maintainers/{id}/invitations", {
1439
- path: { id: maintainerId },
1440
- body
1441
- });
1442
- return data;
1443
- };
1444
- const deleteMaintainerInvitation = async ({
1445
- maintainerId,
1446
- invitationId
1447
- }) => {
1448
- await client.delete("/manage/maintainers/{id}/invitations/{invitationId}", {
1449
- path: { id: maintainerId, invitationId }
1450
- });
1451
- };
1452
- const createMaintainerOrganization = async ({
1453
- maintainerId,
1454
- ...body
1455
- }) => {
1456
- const { data } = await client.post("/manage/maintainers/{id}/organizations", {
1457
- path: { id: maintainerId },
1458
- body
1459
- });
1460
- return data;
1461
- };
1462
- const getMaintainerMetadata = async (maintainerId, signal) => {
1463
- const { data } = await client.get(
1464
- "/manage/maintainers/{id}/metadata",
1465
- { path: { id: maintainerId } },
1466
- { signal }
1467
- );
1468
- return data;
1469
- };
1470
- const setMaintainerMetadata = async ({
1471
- maintainerId,
1472
- ...body
1473
- }) => {
1474
- const { data } = await client.post("/manage/maintainers/{id}/metadata", {
1475
- path: { id: maintainerId },
1476
- body
1477
- });
1478
- return data;
1479
- };
1480
- const deleteMaintainerMetadata = async ({
1481
- maintainerId,
1482
- metadataId
1483
- }) => {
1484
- await client.delete("/manage/maintainers/{id}/metadata/{metadataId}", {
1485
- path: { id: maintainerId, metadataId }
1486
- });
1487
- };
1488
- return {
1489
- getMaintainers,
1490
- getMaintainer,
1491
- createMaintainer,
1492
- updateMaintainer,
1493
- deleteMaintainer,
1494
- getMaintainerUsers,
1495
- addMaintainerUser,
1496
- removeMaintainerUser,
1497
- getMaintainerInvitations,
1498
- getMaintainerInvitation,
1499
- createMaintainerInvitation,
1500
- deleteMaintainerInvitation,
1501
- createMaintainerOrganization,
1502
- getMaintainerMetadata,
1503
- setMaintainerMetadata,
1504
- deleteMaintainerMetadata
1505
- };
1506
- };
1507
-
1508
- // src/clients/management/organizations/organizations.ts
1509
- var createOrganizations = (client) => {
1510
- const getOrganizations = async (signal) => {
1511
- const { data } = await client.get("/manage/organizations", {}, { signal });
1512
- return data;
1513
- };
1514
- const getOrganization = async (organizationId, signal) => {
1515
- const { data } = await client.get(
1516
- "/manage/organizations/{id}",
1517
- { path: { id: organizationId } },
1518
- { signal }
1519
- );
1520
- return data;
1521
- };
1522
- const updateOrganization = async ({
1523
- organizationId,
1524
- ...body
1525
- }) => {
1526
- const { data } = await client.patch("/manage/organizations/{id}", {
1527
- path: { id: organizationId },
1528
- body
1529
- });
1530
- return data;
1531
- };
1532
- const deleteOrganization = async (organizationId) => {
1533
- await client.delete("/manage/organizations/{id}", { path: { id: organizationId } });
1534
- };
1535
- const forceMfa = async (organizationId) => {
1536
- const { data } = await client.patch("/manage/organizations/{id}/force-mfa", {
1537
- path: { id: organizationId }
1538
- });
1539
- return data;
1540
- };
1541
- const joinOrganization = async (organizationId) => {
1542
- await client.post("/manage/organizations/{id}/join-organization", {
1543
- path: { id: organizationId }
1544
- });
1545
- };
1546
- const getOrganizationUsers = async (organizationId, signal) => {
1547
- const { data } = await client.get(
1548
- "/manage/organizations/{id}/users",
1549
- { path: { id: organizationId } },
1550
- { signal }
1551
- );
1552
- return data;
1553
- };
1554
- const addOrganizationUser = async ({
1555
- organizationId,
1556
- ...body
1557
- }) => {
1558
- const { data } = await client.post("/manage/organizations/{id}/users", {
1559
- path: { id: organizationId },
1560
- body
1561
- });
1562
- return data;
1563
- };
1564
- const removeOrganizationUser = async ({
1565
- organizationId,
1566
- userId
1567
- }) => {
1568
- await client.delete("/manage/organizations/{id}/users/{userId}", {
1569
- path: { id: organizationId, userId }
1570
- });
1571
- };
1572
- const getOrganizationProjectsUsers = async (organizationId, signal) => {
1573
- const { data } = await client.get(
1574
- "/manage/organizations/{id}/projects-users",
1575
- { path: { id: organizationId } },
1576
- { signal }
1577
- );
1578
- return data;
1579
- };
1580
- const getOrganizationInvitations = async (organizationId, signal) => {
1581
- const { data } = await client.get(
1582
- "/manage/organizations/{id}/invitations",
1583
- { path: { id: organizationId } },
1584
- { signal }
1585
- );
1586
- return data;
1587
- };
1588
- const getOrganizationInvitation = async ({ organizationId, invitationId }, signal) => {
1589
- const { data } = await client.get(
1590
- "/manage/organizations/{id}/invitations/{invitationId}",
1591
- { path: { id: organizationId, invitationId } },
1592
- { signal }
1593
- );
1594
- return data;
1595
- };
1596
- const createOrganizationInvitation = async ({
1597
- organizationId,
1598
- ...body
1599
- }) => {
1600
- const { data } = await client.post("/manage/organizations/{id}/invitations", {
1601
- path: { id: organizationId },
1602
- body
1603
- });
1604
- return data;
1605
- };
1606
- const deleteOrganizationInvitation = async ({
1607
- organizationId,
1608
- invitationId
1609
- }) => {
1610
- await client.delete("/manage/organizations/{id}/invitations/{invitationId}", {
1611
- path: { id: organizationId, invitationId }
1612
- });
1613
- };
1614
- const getOrganizationProjects = async (organizationId, signal) => {
1615
- const { data } = await client.get(
1616
- "/manage/organizations/{id}/projects",
1617
- { path: { id: organizationId } },
1618
- { signal }
1619
- );
1620
- return data;
1621
- };
1622
- const createOrganizationProject = async ({
1623
- organizationId,
1624
- ...body
1625
- }) => {
1626
- const { data } = await client.post("/manage/organizations/{id}/projects", {
1627
- path: { id: organizationId },
1628
- body
1629
- });
1630
- return data;
1631
- };
1632
- const getOrganizationMetadata = async (organizationId, signal) => {
1633
- const { data } = await client.get(
1634
- "/manage/organizations/{id}/metadata",
1635
- { path: { id: organizationId } },
1636
- { signal }
1637
- );
1638
- return data;
1639
- };
1640
- const setOrganizationMetadata = async ({
1641
- organizationId,
1642
- ...body
1643
- }) => {
1644
- const { data } = await client.post("/manage/organizations/{id}/metadata", {
1645
- path: { id: organizationId },
1646
- body
1647
- });
1648
- return data;
1649
- };
1650
- const deleteOrganizationMetadata = async ({
1651
- organizationId,
1652
- metadataId
1653
- }) => {
1654
- await client.delete("/manage/organizations/{id}/metadata/{metadataId}", {
1655
- path: { id: organizationId, metadataId }
1656
- });
1657
- };
1658
- return {
1659
- getOrganizations,
1660
- getOrganization,
1661
- updateOrganization,
1662
- deleteOrganization,
1663
- forceMfa,
1664
- joinOrganization,
1665
- getOrganizationUsers,
1666
- addOrganizationUser,
1667
- removeOrganizationUser,
1668
- getOrganizationProjectsUsers,
1669
- getOrganizationInvitations,
1670
- getOrganizationInvitation,
1671
- createOrganizationInvitation,
1672
- deleteOrganizationInvitation,
1673
- getOrganizationProjects,
1674
- createOrganizationProject,
1675
- getOrganizationMetadata,
1676
- setOrganizationMetadata,
1677
- deleteOrganizationMetadata
1678
- };
1679
- };
1680
-
1681
- // src/clients/management/projects/projects.ts
1682
- var createProjects = (client) => {
1683
- const getProject = async (projectId, signal) => {
1684
- const { data } = await client.get(
1685
- "/projects/{projectId}",
1686
- { path: { projectId } },
1687
- { signal }
1688
- );
1689
- return data;
1690
- };
1691
- const addProjectFeature = async ({
1692
- projectId,
1693
- feature
1694
- }) => {
1695
- const { data } = await client.post("/projects/{projectId}/features", { path: { projectId }, body: { feature } });
1696
- return data;
1697
- };
1698
- const removeProjectFeature = async (path) => {
1699
- const { data } = await client.delete(
1700
- "/projects/{projectId}/features/{feature}",
1701
- { path }
1702
- );
1703
- return data;
1704
- };
1705
- const changeProjectUserRole = async ({
1706
- projectId,
1707
- userId,
1708
- role
1709
- }) => {
1710
- const { data } = await client.patch("/projects/{projectId}/users/{userId}", {
1711
- path: { projectId, userId },
1712
- body: { role }
1713
- });
1714
- return data;
1715
- };
1716
- const getProjectUsers = async (projectId, signal) => {
1717
- const { data } = await client.get(
1718
- "/projects/{projectId}/users",
1719
- { path: { projectId } },
1720
- { signal }
1721
- );
1722
- return data;
1723
- };
1724
- const getProjectMetadata = async (projectId, signal) => {
1725
- const { data } = await client.get(
1726
- "/projects/{projectId}/metadata",
1727
- { path: { projectId } },
1728
- { signal }
1729
- );
1730
- return data;
1731
- };
1732
- const setProjectMetadata = async ({
1733
- projectId,
1734
- provider,
1735
- metadata
1736
- }) => {
1737
- const { data } = await client.post("/projects/{projectId}/metadata", {
1738
- path: { projectId },
1739
- body: { provider, metadata }
1740
- });
1741
- return data;
1742
- };
1743
- const getProjectReviewers = async (projectId, signal) => {
1744
- const { data } = await client.get(
1745
- "/projects/{projectId}/reviewers",
1746
- { path: { projectId } },
1747
- { signal }
1748
- );
1749
- return data;
1750
- };
1751
- const setProjectReviewers = async ({
1752
- projectId,
1753
- adminIds
1754
- }) => {
1755
- const { data } = await client.put("/projects/{projectId}/reviewers", {
1756
- path: { projectId },
1757
- body: { adminIds }
1758
- });
1759
- return data;
1760
- };
1761
- return {
1762
- getProject,
1763
- addProjectFeature,
1764
- removeProjectFeature,
1765
- changeProjectUserRole,
1766
- getProjectUsers,
1767
- getProjectMetadata,
1768
- setProjectMetadata,
1769
- getProjectReviewers,
1770
- setProjectReviewers
1771
- };
1772
- };
1773
-
1774
- // src/clients/management/users/users.ts
1775
- var createUsers = (client) => {
1776
- const addUserAdminFeature = async ({ feature, userIdOrMail }, signal) => {
1777
- const { data } = await client.post(
1778
- "/users/{userIdOrMail}/features",
1779
- { path: { userIdOrMail: encodeURIComponent(userIdOrMail) }, body: { feature } },
1780
- { signal }
1781
- );
1782
- return data;
1783
- };
1784
- const removeUserAdminFeature = async ({ userIdOrMail, feature }, signal) => {
1785
- const { data } = await client.delete(
1786
- "/users/{userIdOrMail}/features/{feature}",
1787
- { path: { userIdOrMail: encodeURIComponent(userIdOrMail), feature } },
1788
- { signal }
1789
- );
1790
- return data;
1791
- };
1792
- return {
1793
- addUserAdminFeature,
1794
- removeUserAdminFeature
1795
- };
1796
- };
1797
-
1798
- // src/clients/management/managementClient.ts
1799
- var createManagementClient = ({
1800
- baseUrl,
1801
- callbacks,
1802
- token
1803
- }) => {
1804
- const callbackMiddleware = createCallbackMiddleware(callbacks);
1805
- const authMiddleware = createAuthMiddleware({
1806
- baseUrl,
1807
- accessToken: token
1808
- });
1809
- const middlewares = [
1810
- callbackMiddleware,
1811
- authMiddleware
1812
- // 👈 beware order of middlewares always matter
1813
- ];
1814
- const client = createGenericFetchClient({
1815
- baseUrl: `${baseUrl}/manage`,
1816
- middlewares
1817
- });
1818
- const openApiClient = createOpenapiFetchClient({
1819
- baseUrl,
1820
- middlewares
1821
- });
1822
- const verifyToken = async (signal) => {
1823
- const { data } = await openApiClient.get("/manage/tokens/verify", {}, { signal });
1824
- return data;
1825
- };
1826
- return {
1827
- currentUser: createCurrentUser(openApiClient),
1828
- features: createFeatures(client),
1829
- maintainers: createMaintainers(openApiClient),
1830
- organizations: createOrganizations(openApiClient),
1831
- projects: createProjects(client),
1832
- users: createUsers(client),
1833
- verifyToken
1834
- };
1835
- };
1836
-
1837
- // src/clients/metastore/repository/repository.ts
1838
- var createRepository = (client) => {
1839
- const getMetaObjects = async (input, signal) => {
1840
- const { data } = await client.get(
1841
- "/api/v1/repository/{objectType}",
1842
- {
1843
- path: input
1844
- },
1845
- { signal }
1846
- );
1847
- return data;
1848
- };
1849
- const getMetaObjectRevisions = async (input, signal) => {
1850
- const { data } = await client.get(
1851
- "/api/v1/repository/{objectType}/revisions",
1852
- {
1853
- path: input
1854
- },
1855
- { signal }
1856
- );
1857
- return data;
1858
- };
1859
- const getMetaObject = async (input, signal) => {
1860
- const { data } = await client.get(
1861
- "/api/v1/repository/{objectType}/{UUID}",
1862
- {
1863
- path: input
1864
- },
1865
- {
1866
- signal
1867
- }
1868
- );
1869
- return data;
1870
- };
1871
- const createMetaObject = async ({
1872
- objectType,
1873
- data,
1874
- ...body
1875
- }) => {
1876
- const { data: createdMetaObject } = await client.post("/api/v1/repository/{objectType}", {
1877
- path: { objectType },
1878
- body: {
1879
- data,
1880
- ...body
1881
- }
1882
- });
1883
- return createdMetaObject;
1884
- };
1885
- const deleteMetaObject = async (input) => {
1886
- const { data } = await client.delete("/api/v1/repository/{objectType}/{UUID}", {
1887
- path: input
1888
- });
1889
- return data;
1890
- };
1891
- const updateMetaObject = async ({
1892
- objectType,
1893
- UUID,
1894
- data,
1895
- ...body
1896
- }) => {
1897
- const { data: updatedMetaObject } = await client.patch(
1898
- "/api/v1/repository/{objectType}/{UUID}",
1899
- {
1900
- path: {
1901
- objectType,
1902
- UUID
1903
- },
1904
- body: {
1905
- data,
1906
- ...body
1907
- }
1908
- }
1909
- );
1910
- return updatedMetaObject;
1911
- };
1912
- const replaceMetaObject = async ({
1913
- objectType,
1914
- UUID,
1915
- data,
1916
- ...body
1917
- }) => {
1918
- const { data: replacedMetaObject } = await client.put(
1919
- "/api/v1/repository/{objectType}/{UUID}",
1920
- {
1921
- path: {
1922
- objectType,
1923
- UUID
1924
- },
1925
- body: {
1926
- data,
1927
- ...body
1928
- }
1929
- }
1930
- );
1931
- return replacedMetaObject;
1932
- };
1933
- const getMetaObjectRevision = async (input, signal) => {
1934
- const { data } = await client.get(
1935
- "/api/v1/repository/{objectType}/{UUID}/revisions/{revision}",
1936
- {
1937
- path: input
1938
- },
1939
- { signal }
1940
- );
1941
- return data;
1942
- };
1943
- const deleteMetaObjectRevision = async (input) => {
1944
- const { data } = await client.delete(
1945
- "/api/v1/repository/{objectType}/{UUID}/revisions/{revision}",
1946
- {
1947
- path: input
1948
- }
1949
- );
1950
- return data;
1951
- };
1952
- return {
1953
- // lists
1954
- getMetaObjects,
1955
- getMetaObjectRevisions,
1956
- // objects
1957
- getMetaObject,
1958
- createMetaObject,
1959
- deleteMetaObject,
1960
- updateMetaObject,
1961
- replaceMetaObject,
1962
- // revisons
1963
- getMetaObjectRevision,
1964
- deleteMetaObjectRevision
1965
- };
1966
- };
1967
-
1968
- // src/clients/metastore/schema/schema.ts
1969
- var createSchema = (client) => {
1970
- const getSchema = async (input, signal) => {
1971
- const { data } = await client.get(
1972
- "/api/v1/schema/{objectType}",
1973
- {
1974
- path: input
1975
- },
1976
- { signal }
1977
- );
1978
- return data;
1979
- };
1980
- const getVersionedSchema = async (input, signal) => {
1981
- const { data } = await client.get(
1982
- "/api/v1/schema/{objectType}/{version}",
1983
- {
1984
- path: input
1985
- },
1986
- { signal }
1987
- );
1988
- return data;
1989
- };
1990
- return {
1991
- getSchema,
1992
- getVersionedSchema
1993
- };
1994
- };
1995
-
1996
- // src/clients/metastore/metastoreClient.ts
1997
- var createMetastoreClient = ({ baseUrl, middlewares }) => {
1998
- const client = createOpenapiFetchClient({
1999
- baseUrl,
2000
- middlewares
2001
- });
2002
- const healthCheck = async (signal) => {
2003
- const { data } = await client.get("/health-check", {}, { signal });
2004
- return data;
2005
- };
2006
- return {
2007
- healthCheck,
2008
- repository: createRepository(client),
2009
- schema: createSchema(client)
2010
- };
2011
- };
2012
-
2013
- // src/clients/oauth/oauthClient.ts
2014
- var createOauthClient = ({ baseUrl, middlewares }) => {
2015
- const client = createGenericFetchClient({ baseUrl, middlewares });
2016
- const getCredentials = async (query, signal) => {
2017
- const { data } = await client.get(
2018
- "/credentials",
2019
- { query },
2020
- { signal }
2021
- );
2022
- return data;
2023
- };
2024
- const getCredential = async (componentId, id, signal) => {
2025
- const { data } = await client.get(
2026
- "/credentials/{componentId}/{id}",
2027
- { path: { componentId, id } },
2028
- { signal }
2029
- );
2030
- return data;
2031
- };
2032
- const _createCredentials = async (componentId, body, signal) => {
2033
- const { data } = await client.post(
2034
- "/credentials/{componentId}",
2035
- { path: { componentId }, body },
2036
- { signal }
2037
- );
2038
- return data;
2039
- };
2040
- const _createLegacyCredentials = async (componentId, { data: credentialsData, ...rest }, signal) => {
2041
- const { data } = await client.post(
2042
- "/credentials/{componentId}",
2043
- {
2044
- path: { componentId },
2045
- body: {
2046
- ...rest,
2047
- "#data": JSON.stringify(credentialsData)
2048
- }
2049
- },
2050
- { signal }
2051
- );
2052
- return data;
2053
- };
2054
- const createCredential = async (componentId, body, signal) => {
2055
- try {
2056
- return await _createCredentials(componentId, body, signal);
2057
- } catch (error) {
2058
- if (isApiError(error) && error.response.status === HttpStatus.UNPROCESSABLE_ENTITY) {
2059
- return _createLegacyCredentials(componentId, body, signal);
2060
- }
2061
- throw error;
2062
- }
2063
- };
2064
- const deleteCredential = async (componentId, id, signal) => {
2065
- await client.delete(
2066
- "/credentials/{componentId}/{id}",
2067
- { path: { componentId, id } },
2068
- { signal }
2069
- );
2070
- };
2071
- return {
2072
- getCredentials,
2073
- getCredential,
2074
- createCredential,
2075
- deleteCredential
2076
- };
2077
- };
2078
-
2079
- // src/clients/queryService/queryServiceClient.ts
2080
- var createQueryServiceClient = ({ baseUrl, middlewares }) => {
2081
- const client = createOpenapiFetchClient({
2082
- baseUrl,
2083
- middlewares
2084
- });
2085
- const createQueryJob = async (branchId, workspaceId, body) => {
2086
- const { data } = await client.post(
2087
- "/api/v1/branches/{branchId}/workspaces/{workspaceId}/queries",
2088
- { path: { branchId, workspaceId }, body }
2089
- );
2090
- return data;
2091
- };
2092
- const cancelQueryJob = async (queryJobId) => {
2093
- const { data } = await client.post("/api/v1/queries/{queryJobId}/cancel", {
2094
- path: { queryJobId },
2095
- body: { reason: "Cancelled by user" }
2096
- });
2097
- return data;
2098
- };
2099
- const getQueryJob = async (queryJobId) => {
2100
- const { data } = await client.get("/api/v1/queries/{queryJobId}", { path: { queryJobId } });
2101
- return data;
2102
- };
2103
- const getQueryResults = async (queryJobId, statementId, query) => {
2104
- const { data } = await client.get("/api/v1/queries/{queryJobId}/{statementId}/results", {
2105
- path: { queryJobId, statementId },
2106
- query
2107
- });
2108
- return data;
2109
- };
2110
- const getQueryHistory = async (branchId, workspaceId, query) => {
2111
- const { data } = await client.get(
2112
- "/api/v1/branches/{branchId}/workspaces/{workspaceId}/queries",
2113
- {
2114
- path: { branchId, workspaceId },
2115
- query
2116
- }
2117
- );
2118
- return data;
2119
- };
2120
- const exportResults = async (queryJobId, statementId, query, signal) => {
2121
- const { data, response } = await client.get(
2122
- "/api/v1/queries/{queryJobId}/{statementId}/export",
2123
- {
2124
- path: { queryJobId, statementId },
2125
- query
2126
- },
2127
- { signal }
2128
- );
2129
- const mimeType = response.headers.get(HttpHeader.CONTENT_TYPE) ?? "text/csv";
2130
- const contentDisposition = parseContentDispositionHeader(
2131
- response.headers.get(HttpHeader.CONTENT_DISPOSITION)
2132
- );
2133
- return {
2134
- mimeType,
2135
- content: data,
2136
- fileName: contentDisposition?.filename ?? "export.csv"
2137
- };
2138
- };
2139
- return {
2140
- createQueryJob,
2141
- cancelQueryJob,
2142
- getQueryJob,
2143
- getQueryResults,
2144
- getQueryHistory,
2145
- exportResults
2146
- };
2147
- };
2148
-
2149
- // src/clients/queue/queueClient.ts
2150
- var createQueueClient = ({ baseUrl, middlewares }) => {
2151
- const client = createOpenapiFetchClient({
2152
- baseUrl,
2153
- middlewares
2154
- });
2155
- const getJob = async (jobId, signal) => {
2156
- const { data } = await client.get(
2157
- "/jobs/{jobId}",
2158
- {
2159
- path: { jobId }
2160
- },
2161
- { signal }
2162
- );
2163
- return data;
2164
- };
2165
- const searchJobs = async (query, signal) => {
2166
- const { data } = await client.get(
2167
- "/search/jobs",
2168
- {
2169
- query
2170
- },
2171
- { signal }
2172
- );
2173
- return data;
2174
- };
2175
- return { getJob, searchJobs };
2176
- };
2177
-
2178
- // src/clients/status/statusClient.ts
2179
- var createStatusClient = ({ baseUrl, middlewares }) => {
2180
- const client = createGenericFetchClient({
2181
- baseUrl,
2182
- middlewares
2183
- });
2184
- const getSummary = async (signal) => {
2185
- const { data } = await client.get("/summary.json", {}, { signal });
2186
- return data;
2187
- };
2188
- return {
2189
- getSummary
2190
- };
2191
- };
2192
-
2193
- // src/clients/storage/configurationVersions/configurationVersions.ts
2194
- var createConfigurationVersions = (client) => {
2195
- const listConfigurationVersions = async ({ branchId, componentId, configId }, signal) => {
2196
- const { data } = await client.get(
2197
- "/branch/{branchId}/components/{componentId}/configs/{configId}/versions",
2198
- { path: { branchId, componentId, configId } },
2199
- { signal }
2200
- );
2201
- return data;
2202
- };
2203
- const getConfigurationVersion = async ({ branchId, componentId, configId, versionId }, signal) => {
2204
- const { data } = await client.get(
2205
- "/branch/{branchId}/components/{componentId}/configs/{configId}/versions/{versionId}",
2206
- { path: { branchId, componentId, configId, versionId } },
2207
- { signal }
2208
- );
2209
- return data;
2210
- };
2211
- return {
2212
- listConfigurationVersions,
2213
- getConfigurationVersion
2214
- };
2215
- };
2216
-
2217
- // src/clients/storage/mergeRequests/mergeRequests.ts
2218
- var createMergeRequests = (client) => {
2219
- const getMergeRequests = async (signal) => {
2220
- const { data } = await client.get("/v2/storage/merge-request", {}, { signal });
2221
- return data;
2222
- };
2223
- const getMergeRequest = async (id, signal) => {
2224
- const { data } = await client.get(
2225
- "/v2/storage/merge-request/{id}",
2226
- { path: { id } },
2227
- { signal }
2228
- );
2229
- return data;
2230
- };
2231
- const getMergeRequestWithActivityLog = async (id, signal) => {
2232
- const { data } = await client.get(
2233
- "/v2/storage/merge-request/{id}",
2234
- { path: { id }, query: { include: "activityLog" } },
2235
- { signal }
2236
- );
2237
- return data;
2238
- };
2239
- const createMergeRequest = async (params) => {
2240
- const { data } = await client.post("/v2/storage/merge-request", { body: params });
2241
- return data;
2242
- };
2243
- const updateMergeRequest = async (id, params) => {
2244
- const { data } = await client.put("/v2/storage/merge-request/{id}", {
2245
- path: { id },
2246
- body: params
2247
- });
2248
- return data;
2249
- };
2250
- const requestReview = async (id) => {
2251
- const { data } = await client.put("/v2/storage/merge-request/{id}/request-review", {
2252
- path: { id }
2253
- });
2254
- return data;
2255
- };
2256
- const approveMergeRequest = async (id) => {
2257
- const { data } = await client.put("/v2/storage/merge-request/{id}/approve", {
2258
- path: { id }
2259
- });
2260
- return data;
2261
- };
2262
- const requestChangesMergeRequest = async (id, reason) => {
2263
- const { data } = await client.put("/v2/storage/merge-request/{id}/request-changes", {
2264
- path: { id },
2265
- body: reason ? { reason } : void 0
2266
- });
2267
- return data;
2268
- };
2269
- const getMergeRequestConflicts = async (id, signal) => {
2270
- const { data } = await client.get(
2271
- "/v2/storage/merge-request/{id}/conflicts",
2272
- { path: { id } },
2273
- { signal }
2274
- );
2275
- return data;
2276
- };
2277
- return {
2278
- getMergeRequests,
2279
- getMergeRequest,
2280
- getMergeRequestWithActivityLog,
2281
- createMergeRequest,
2282
- updateMergeRequest,
2283
- requestReview,
2284
- approveMergeRequest,
2285
- requestChangesMergeRequest,
2286
- getMergeRequestConflicts
2287
- };
2288
- };
2289
-
2290
- // src/clients/storage/branches/mappers.ts
2291
- var mapBranchMetadata = (data) => ({
2292
- ...data,
2293
- timestamp: new Date(data.timestamp)
2294
- });
2295
-
2296
- // src/clients/storage/branches/branches.ts
2297
- var createBranches = (client) => {
2298
- const getDevBranches = async (signal) => {
2299
- const { data } = await client.get("/dev-branches", {}, { signal });
2300
- return data;
2301
- };
2302
- const createDevBranchJob = async (body) => {
2303
- const { data } = await client.post(
2304
- "/dev-branches",
2305
- {
2306
- body
2307
- }
2308
- );
2309
- return data;
2310
- };
2311
- const updateDevBranch = async ({
2312
- id,
2313
- name,
2314
- description
2315
- }) => {
2316
- const { data } = await client.put(
2317
- "/dev-branches/{id}",
2318
- {
2319
- path: { id },
2320
- body: {
2321
- name,
2322
- description
2323
- }
2324
- }
2325
- );
2326
- return data;
2327
- };
2328
- const deleteDevBranchJob = async (id) => {
2329
- const { data } = await client.delete(
2330
- "/dev-branches/{id}",
2331
- {
2332
- path: { id }
2333
- }
2334
- );
2335
- return data;
2336
- };
2337
- const getDevBranchMetadata = async (id, signal) => {
2338
- const { data } = await client.get(
2339
- "/branch/{id}/metadata",
2340
- { path: { id } },
2341
- { signal }
2342
- );
2343
- return data.map(mapBranchMetadata);
2344
- };
2345
- const saveDevBranchMetadata = async (id, metadata, signal) => {
2346
- const { data } = await client.post("/branch/{id}/metadata", { path: { id }, body: { metadata } }, { signal });
2347
- return data.map(mapBranchMetadata);
2348
- };
2349
- const deleteDevBranchMetadata = async (id, metadataId, signal) => {
2350
- await client.delete(
2351
- "/branch/{id}/metadata/{metadataId}",
2352
- { path: { id, metadataId } },
2353
- { signal }
2354
- );
2355
- };
2356
- return {
2357
- getDevBranches,
2358
- createDevBranchJob,
2359
- updateDevBranch,
2360
- deleteDevBranchJob,
2361
- getDevBranchMetadata,
2362
- saveDevBranchMetadata,
2363
- deleteDevBranchMetadata
2364
- };
2365
- };
2366
-
2367
- // src/clients/storage/buckets/listingConversion.ts
2368
- var toBackendSubscribers = (subscribers) => subscribers.map((s) => `${s.type}:${s.email}`);
2369
- var fromBackendSubscribers = (raw) => {
2370
- const result = [];
2371
- for (const entry of raw) {
2372
- const colon = entry.indexOf(":");
2373
- if (colon === -1) continue;
2374
- const prefix = entry.slice(0, colon);
2375
- const email2 = entry.slice(colon + 1);
2376
- if (prefix !== "user" && prefix !== "group") continue;
2377
- if (email2.length === 0) continue;
2378
- result.push({ type: prefix, email: email2 });
2379
- }
2380
- return result;
2381
- };
2382
- var toBucketListing = (raw, bucketId) => ({
2383
- bucketId,
2384
- name: raw.name,
2385
- description: raw.description ?? null,
2386
- listingId: raw.bigquery.listingId,
2387
- subscribers: fromBackendSubscribers(raw.bigquery.subscribers),
2388
- createdAt: raw.createdAt
2389
- });
2390
-
2391
- // src/clients/storage/buckets/buckets.ts
2392
- var createBuckets = (client) => {
2393
- const getBuckets = async (query = {}, signal) => {
2394
- const { data } = await client.get(
2395
- `/buckets`,
2396
- { query },
2397
- { signal, queryArrayFormat: "comma" }
2398
- );
2399
- return data;
2400
- };
2401
- const getBucket = async (id, signal) => {
2402
- const { data } = await client.get(
2403
- `/buckets/{id}`,
2404
- { path: { id } },
2405
- { signal }
2406
- );
2407
- return data;
2408
- };
2409
- const createBucket = async (body) => {
2410
- const { data } = await client.post(`/buckets`, {
2411
- body
2412
- });
2413
- return data;
2414
- };
2415
- const updateBucket = async (id, body) => {
2416
- const { data } = await client.patch(
2417
- `/buckets/{id}`,
2418
- { path: { id }, body }
2419
- );
2420
- return data;
2421
- };
2422
- const deleteBucket = async (id) => {
2423
- await client.delete(`/buckets/{id}`, { path: { id } });
2424
- };
2425
- const deleteBucketAsync = async (id, options = {}) => {
2426
- const { data } = await client.delete(`/buckets/{id}`, { path: { id }, query: { async: true, ...options } });
2427
- return data;
2428
- };
2429
- const createScheduledRefresh = async (input) => {
2430
- const { branchId, bucketId, cronExpression } = input;
2431
- const { data } = await client.post(`/branch/{branchId}/buckets/{bucketId}/scheduled-tasks/refresh`, {
2432
- path: { branchId, bucketId },
2433
- body: { cronExpression }
2434
- });
2435
- return data;
2436
- };
2437
- const deleteScheduledTask = async (taskId) => {
2438
- await client.delete(`/scheduled-tasks/{taskId}`, {
2439
- path: { taskId }
2440
- });
2441
- };
2442
- const getListing = async (bucketId, signal) => {
2443
- try {
2444
- const { data } = await client.get(
2445
- `/buckets/{bucketId}/listing`,
2446
- { path: { bucketId } },
2447
- { signal }
2448
- );
2449
- return toBucketListing(data, bucketId);
2450
- } catch (error) {
2451
- if (isApiError(error) && error.response.status === 404) return null;
2452
- throw error;
2453
- }
2454
- };
2455
- const createListing = async (bucketId, input, signal) => {
2456
- const { data } = await client.post(
2457
- `/buckets/{bucketId}/listing`,
2458
- {
2459
- path: { bucketId },
2460
- body: {
2461
- listingName: input.name,
2462
- listingDescription: input.description?.trim() || null,
2463
- bigquery: {
2464
- listingId: input.listingId,
2465
- subscribers: toBackendSubscribers(input.subscribers)
2466
- }
2467
- }
2468
- },
2469
- { signal }
2470
- );
2471
- return data;
2472
- };
2473
- const updateListing = async (bucketId, input, signal) => {
2474
- const body = {};
2475
- if (input.name !== void 0) body.exposureName = input.name;
2476
- if (input.description !== void 0) {
2477
- body.exposureDescription = input.description?.trim() || null;
2478
- }
2479
- if (input.subscribers !== void 0) {
2480
- body.bigquery = { subscribers: toBackendSubscribers(input.subscribers) };
2481
- }
2482
- if (Object.keys(body).length === 0) {
2483
- throw new Error("updateListing requires at least one field");
2484
- }
2485
- const { data } = await client.patch(`/buckets/{bucketId}/listing`, { path: { bucketId }, body }, { signal });
2486
- return data;
2487
- };
2488
- const deleteListing = async (bucketId, signal) => {
2489
- const { data } = await client.delete(
2490
- `/buckets/{bucketId}/listing`,
2491
- { path: { bucketId } },
2492
- { signal }
2493
- );
2494
- return data;
2495
- };
2496
- const listListings = async (signal) => {
2497
- const { data } = await client.get(`/listings`, {}, { signal });
2498
- return data.map((row) => toBucketListing(row, row.bucketId));
2499
- };
2500
- return {
2501
- getBuckets,
2502
- getBucket,
2503
- createBucket,
2504
- updateBucket,
2505
- deleteBucket,
2506
- deleteBucketAsync,
2507
- createScheduledRefresh,
2508
- deleteScheduledTask,
2509
- getListing,
2510
- createListing,
2511
- updateListing,
2512
- deleteListing,
2513
- listListings
2514
- };
2515
- };
2516
-
2517
- // src/utils/assert.ts
2518
- function assert(value, message2) {
2519
- if (value == null) {
2520
- throw new Error(message2);
2521
- }
2522
- }
2523
-
2524
- // src/utils/concurrent.ts
2525
- var concurrent = async ({
2526
- items,
2527
- process: process2,
2528
- concurrency = 2,
2529
- middlewares = []
2530
- }) => {
2531
- if (concurrency < 1) throw new Error("Concurrency must be greater than 0");
2532
- if (items.length === 0) return [];
2533
- if (concurrency === Infinity)
2534
- return Promise.all(items.map((item, index) => process2(item, index, items.length)));
2535
- const n = items.length;
2536
- const results = new Array(n);
2537
- const processWithMiddlewares = middlewares.reduceRight(
2538
- (next, middleware) => middleware(next),
2539
- process2
2540
- );
2541
- const queue = items.map((item, index) => async () => {
2542
- results[index] = await processWithMiddlewares(item, index, items.length);
2543
- });
2544
- const workers = Array.from(
2545
- { length: Math.min(concurrency, items.length) },
2546
- async function processQueue() {
2547
- while (queue.length) {
2548
- await queue.shift()?.();
2549
- }
2550
- }
2551
- );
2552
- await Promise.all(workers);
2553
- return results;
2554
- };
2555
-
2556
- // src/utils/createAbortError.ts
2557
- var createAbortError = (reason) => new DOMException(reason, "AbortError");
2558
-
2559
- // src/utils/delay.ts
2560
- var delay = (timeout, signal) => new Promise((resolve, reject) => {
2561
- if (signal?.aborted) return reject(createAbortError(signal.reason));
2562
- const timeoutId = setTimeout(resolve, timeout);
2563
- signal?.addEventListener(
2564
- "abort",
2565
- () => {
2566
- clearTimeout(timeoutId);
2567
- reject(createAbortError(signal.reason));
2568
- },
2569
- { once: true }
2570
- );
2571
- });
2572
-
2573
- // src/utils/poll.ts
2574
- var message = {
2575
- PollPredicateError: "Poll predicate failed",
2576
- PollTimeoutError: "Poll timeout exceeded",
2577
- PollPollTimeoutError: "Poll data failed condition"
2578
- };
2579
- var PollException = class extends Error {
2580
- result;
2581
- constructor(type, result) {
2582
- super(type, { cause: message[type] });
2583
- this.result = result;
2584
- }
2585
- };
2586
- var poll = async ({
2587
- pollFn,
2588
- interval,
2589
- isDone,
2590
- isFailed,
2591
- abortSignal,
2592
- maxAttempts = Infinity
2593
- }) => {
2594
- if (abortSignal?.aborted) throw createAbortError(abortSignal.reason);
2595
- if (interval < 1) throw new Error("Invalid poll interval");
2596
- if (maxAttempts < 1) throw new Error("Invalid poll maxAttempts");
2597
- let callCount = 0;
2598
- while (true) {
2599
- callCount++;
2600
- const data = await pollFn(abortSignal);
2601
- const result = { data, callCount };
2602
- try {
2603
- if (isDone(data)) return result;
2604
- if (isFailed?.(data) ?? false) throw new PollException("PollPollTimeoutError", result);
2605
- } catch (error) {
2606
- if (error instanceof PollException) throw error;
2607
- throw new PollException("PollPredicateError", result);
2608
- }
2609
- if (callCount >= maxAttempts) throw new PollException("PollTimeoutError", result);
2610
- await delay(interval, abortSignal);
2611
- }
2612
- };
2613
-
2614
- // src/utils/keboolaUID.ts
2615
- var KEBOOLA_OBJECT_ID_DELIMITER = "--";
2616
- var keboolaUID = {
2617
- serialize: (input) => {
2618
- if (input.uid === "")
2619
- throw new Error("Invalid Keboola Object ID: uid of an object cannot be empty");
2620
- return ["KID", input.projectId, input.type, input.uid].join(KEBOOLA_OBJECT_ID_DELIMITER);
2621
- },
2622
- deserialize: (input) => {
2623
- const [identifier, projectId, type, uid] = input.split(KEBOOLA_OBJECT_ID_DELIMITER);
2624
- if (identifier !== "KID" || !projectId || !type || !uid)
2625
- throw new Error("Invalid Keboola Object ID");
2626
- return {
2627
- projectId: Number(projectId),
2628
- type,
2629
- uid
2630
- };
2631
- }
2632
- };
2633
-
2634
- // src/utils/generateUUID.ts
2635
- var generateUUID = () => crypto.randomUUID();
2636
-
2637
- // src/utils/series.ts
2638
- var series = async (options) => concurrent({
2639
- ...options,
2640
- concurrency: 1
2641
- });
2642
-
2643
- // src/clients/storage/componentsAndConfigurations/componentsAndConfigurations.ts
2644
- var createComponentsAndConfigurations = (client) => {
2645
- const getComponent = async ({ componentId, branchId = "default" }, signal) => {
2646
- const { data } = await client.get(
2647
- "/branch/{branchId}/components/{componentId}",
2648
- { path: { componentId, branchId } },
2649
- { signal }
2650
- );
2651
- return data;
2652
- };
2653
- const getComponents = async ({ branchId = "default", ...query } = {}, signal) => {
2654
- const { data } = await client.get(
2655
- "/branch/{branchId}/components",
2656
- { path: { branchId }, query },
2657
- { signal, queryArrayFormat: "comma" }
2658
- );
2659
- return data;
2660
- };
2661
- const getConfiguration = async ({ componentId, configId, branchId = "default" }, signal) => {
2662
- const { data } = await client.get(
2663
- "/branch/{branchId}/components/{componentId}/configs/{configId}",
2664
- { path: { componentId, configId, branchId } },
2665
- { signal }
2666
- );
2667
- return data;
2668
- };
2669
- const createConfiguration = async ({
2670
- branchId = "default",
2671
- componentId,
2672
- ...body
2673
- }) => {
2674
- const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs", {
2675
- path: { branchId, componentId },
2676
- body
2677
- });
2678
- return data;
2679
- };
2680
- const deleteConfiguration = async (path) => {
2681
- await client.delete(
2682
- "/branch/{branchId}/components/{componentId}/configs/{configId}",
2683
- { path }
2684
- );
2685
- };
2686
- const deleteConfigurations = async ({
2687
- configIds,
2688
- ...rest
2689
- }) => {
2690
- await concurrent({
2691
- items: configIds,
2692
- process: async (configId) => deleteConfiguration({ ...rest, configId })
2693
- });
2694
- };
2695
- const getConfigurations = async ({ componentId, branchId = "default" }, signal) => {
2696
- const { data } = await client.get(
2697
- "/branch/{branchId}/components/{componentId}/configs",
2698
- { path: { componentId, branchId } },
2699
- { signal }
2700
- );
2701
- return data;
2702
- };
2703
- const getConfigurationWorkspaces = async ({
2704
- componentId,
2705
- branchId,
2706
- configId
2707
- }) => {
2708
- const { data } = await client.get(
2709
- "/branch/{branchId}/components/{componentId}/configs/{configId}/workspaces",
2710
- {
2711
- path: { componentId, branchId, configId }
2712
- }
2713
- );
2714
- return data;
2715
- };
2716
- const createConfigurationWorkspace = async ({
2717
- componentId,
2718
- branchId,
2719
- configId,
2720
- ...body
2721
- }) => {
2722
- const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs/{configId}/workspaces", {
2723
- path: { componentId, branchId, configId },
2724
- body
2725
- });
2726
- return data;
2727
- };
2728
- const createConfigurationWorkspaceJob = async ({
2729
- componentId,
2730
- branchId,
2731
- configId,
2732
- ...body
2733
- }) => {
2734
- const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs/{configId}/workspaces", {
2735
- path: { componentId, branchId, configId },
2736
- body,
2737
- query: { async: true }
2738
- });
2739
- return data;
2740
- };
2741
- const createConfigurationRow = async ({
2742
- branchId = "default",
2743
- componentId,
2744
- configId,
2745
- ...body
2746
- }) => {
2747
- const { data } = await client.post("/branch/{branchId}/components/{componentId}/configs/{configId}/rows", {
2748
- path: { branchId, componentId, configId },
2749
- body
2750
- });
2751
- return data;
2752
- };
2753
- const createConfigurationRows = async ({
2754
- branchId = "default",
2755
- componentId,
2756
- configId,
2757
- data
2758
- }, options) => {
2759
- return series({
2760
- items: data,
2761
- process: (rowBody) => {
2762
- return createConfigurationRow({
2763
- branchId,
2764
- componentId,
2765
- configId,
2766
- ...rowBody
2767
- });
2768
- },
2769
- middlewares: options?.middlewares
2770
- });
2771
- };
2772
- const deleteConfigurationRow = async ({
2773
- changeDescription,
2774
- ...path
2775
- }) => {
2776
- await client.delete(
2777
- "/branch/{branchId}/components/{componentId}/configs/{configId}/rows/{rowId}",
2778
- {
2779
- path,
2780
- body: { changeDescription }
2781
- }
2782
- );
2783
- };
2784
- const deleteConfigurationRows = async ({ rowIds, changeDescription, ...input }, options) => {
2785
- await concurrent({
2786
- items: rowIds,
2787
- process: (rowId) => {
2788
- const resolvedDescription = typeof changeDescription === "string" ? changeDescription : changeDescription?.(rowId);
2789
- return deleteConfigurationRow({
2790
- rowId,
2791
- changeDescription: resolvedDescription,
2792
- ...input
2793
- });
2794
- },
2795
- concurrency: 5,
2796
- middlewares: options?.middlewares
2797
- });
2798
- };
2799
- const searchComponentConfigurations = async ({ branchId = "default" } = {}, query, signal) => {
2800
- const { data } = await client.get(
2801
- "/branch/{branchId}/search/component-configurations",
2802
- { path: { branchId }, query },
2803
- { signal, queryArrayFormat: "comma" }
2804
- );
2805
- return data;
2806
- };
2807
- return {
2808
- // components
2809
- getComponent,
2810
- getComponents,
2811
- searchComponentConfigurations,
2812
- // configurations
2813
- createConfiguration,
2814
- getConfiguration,
2815
- deleteConfiguration,
2816
- deleteConfigurations,
2817
- getConfigurations,
2818
- // configuration's rows
2819
- createConfigurationRow,
2820
- createConfigurationRows,
2821
- deleteConfigurationRow,
2822
- deleteConfigurationRows,
2823
- // configuration's workspaces
2824
- createConfigurationWorkspace,
2825
- createConfigurationWorkspaceJob,
2826
- getConfigurationWorkspaces
2827
- };
2828
- };
2829
-
2830
- // src/clients/storage/events/events.ts
2831
- var createEvents = (client) => {
2832
- const getEvents = async (query, signal) => {
2833
- const { data } = await client.get(
2834
- "/events",
2835
- { query },
2836
- { signal }
2837
- );
2838
- return data;
2839
- };
2840
- const getEvent = async (eventId, signal) => {
2841
- const { data } = await client.get(
2842
- "/events/{eventId}",
2843
- {
2844
- path: { eventId }
2845
- },
2846
- { signal }
2847
- );
2848
- return data;
2849
- };
2850
- const createEvent = async (body, signal) => {
2851
- const { data } = await client.post(
2852
- "/events",
2853
- {
2854
- body
2855
- },
2856
- { signal }
2857
- );
2858
- return data;
2859
- };
2860
- return {
2861
- getEvents,
2862
- getEvent,
2863
- createEvent
2864
- };
2865
- };
2866
-
2867
- // src/clients/storage/files/files.ts
2868
- var createFiles = (client) => {
2869
- const getFile = async (fileId, signal) => {
2870
- const { data } = await client.get(
2871
- `/files/{fileId}`,
2872
- {
2873
- path: { fileId }
2874
- },
2875
- { signal }
2876
- );
2877
- return data;
2878
- };
2879
- const getFiles = async (query, signal) => {
2880
- const { data } = await client.get(
2881
- "/files",
2882
- { query },
2883
- { signal, queryArrayFormat: "brackets" }
2884
- );
2885
- return data;
2886
- };
2887
- const deleteFile = async (fileId) => {
2888
- const { data } = await client.delete(`/files/{fileId}`, {
2889
- path: { fileId }
2890
- });
2891
- return data;
2892
- };
2893
- const addFileTag = async (fileId, tag) => {
2894
- const { data } = await client.post(
2895
- `/files/{fileId}/tags`,
2896
- {
2897
- path: { fileId },
2898
- body: { tag }
2899
- }
2900
- );
2901
- return data;
2902
- };
2903
- const getFileContent = async (fileId, signal) => {
2904
- const { data } = await client.get(
2905
- `/files/{fileId}/content`,
2906
- {
2907
- path: { fileId }
2908
- },
2909
- { signal }
2910
- );
2911
- return typeof data === "string" ? data : JSON.stringify(data, null, 2);
2912
- };
2913
- const deleteFileTag = async (fileId, tag) => {
2914
- const { data } = await client.delete(
2915
- "/files/{fileId}/tags/{tag}",
2916
- {
2917
- path: { fileId, tag }
2918
- }
2919
- );
2920
- return data;
2921
- };
2922
- const prepareFile = async (body, signal) => {
2923
- const { data } = await client.post(
2924
- "/files/prepare",
2925
- { body },
2926
- { signal }
2927
- );
2928
- return data;
2929
- };
2930
- return {
2931
- getFile,
2932
- getFileContent,
2933
- getFiles,
2934
- deleteFile,
2935
- addFileTag,
2936
- deleteFileTag,
2937
- prepareFile
2938
- };
2939
- };
2940
-
2941
- // src/clients/storage/jobs/jobs.ts
2942
- var createJobs = (client) => {
2943
- const getJob = async (id, signal) => {
2944
- const { data } = await client.get(
2945
- `/jobs/{id}`,
2946
- {
2947
- path: { id }
2948
- },
2949
- { signal }
2950
- );
2951
- return data;
2952
- };
2953
- const getJobs = async (query, signal) => {
2954
- const { data } = await client.get(
2955
- "/jobs",
2956
- { query },
2957
- { signal, queryArrayFormat: "brackets" }
2958
- );
2959
- return data;
2960
- };
2961
- return { getJob, getJobs };
2962
- };
2963
-
2964
- // src/clients/storage/tables/tables.ts
2965
- var createTables = (client) => {
2966
- const getTables = async (query = { include: [] }, signal) => {
2967
- const { data } = await client.get(
2968
- `/tables`,
2969
- { query },
2970
- { signal, queryArrayFormat: "comma" }
2971
- );
2972
- return data;
2973
- };
2974
- const getTable = async (id, signal) => {
2975
- const { data } = await client.get(
2976
- `/tables/{id}`,
2977
- { path: { id } },
2978
- { signal }
2979
- );
2980
- return data;
2981
- };
2982
- const deleteTable = async (id, signal) => {
2983
- await client.delete(`/tables/{id}`, { path: { id } }, { signal });
2984
- };
2985
- const deleteTables = async (ids) => {
2986
- await concurrent({
2987
- items: ids,
2988
- process: (id) => deleteTable(id)
2989
- });
2990
- };
2991
- const deleteTableRows = async (id, query, signal) => {
2992
- const { data } = await client.delete(
2993
- `/tables/{id}/rows`,
2994
- { path: { id }, query },
2995
- { signal }
2996
- );
2997
- return data;
2998
- };
2999
- const getDataPreview = async (id, query, signal) => {
3000
- const { data } = await client.get(
3001
- `/tables/{id}/data-preview`,
3002
- { path: { id }, query: { format: "json", ...query } },
3003
- { signal }
3004
- );
3005
- return data;
3006
- };
3007
- const exportAsync = async (tableId, body, signal) => {
3008
- const { data } = await client.post(
3009
- "/tables/{id}/export-async",
3010
- { path: { id: tableId }, body },
3011
- { signal }
3012
- );
3013
- return data;
3014
- };
3015
- const createTableAsync = async (bucketId, body, signal) => {
3016
- const { data } = await client.post("/buckets/{bucketId}/tables-async", { path: { bucketId }, body }, { signal });
3017
- return data;
3018
- };
3019
- const importAsync = async (tableId, body, signal) => {
3020
- const { data } = await client.post(
3021
- "/tables/{id}/import-async",
3022
- { path: { id: tableId }, body },
3023
- { signal }
3024
- );
3025
- return data;
3026
- };
3027
- return {
3028
- getTables,
3029
- getTable,
3030
- getDataPreview,
3031
- deleteTable,
3032
- deleteTables,
3033
- deleteTableRows,
3034
- exportAsync,
3035
- createTableAsync,
3036
- importAsync
3037
- };
3038
- };
3039
-
3040
- // src/clients/storage/tokens/tokens.ts
3041
- var createTokens = (client) => {
3042
- const verify = async (signal) => {
3043
- const { data } = await client.get(
3044
- "/tokens/verify",
3045
- {},
3046
- { signal }
3047
- );
3048
- return data;
3049
- };
3050
- const refresh = async (id, signal) => {
3051
- const { data } = await client.post(
3052
- `/tokens/${id}/refresh`,
3053
- {},
3054
- { signal }
3055
- );
3056
- return data;
3057
- };
3058
- return {
3059
- verify,
3060
- refresh
3061
- };
3062
- };
3063
-
3064
- // src/clients/storage/workspaces/workspaces.ts
3065
- var createWorkspaces = (client) => {
3066
- const getWorkspaces = async (branchId, signal) => {
3067
- const { data } = await client.get(
3068
- "/branch/{branchId}/workspaces",
3069
- { path: { branchId } },
3070
- { signal }
3071
- );
3072
- return data;
3073
- };
3074
- const getWorkspace = async (path, signal) => {
3075
- const { data } = await client.get(
3076
- "/branch/{branchId}/workspaces/{workspaceId}",
3077
- { path },
3078
- { signal }
3079
- );
3080
- return data;
3081
- };
3082
- const deleteWorkspace = async (path) => {
3083
- await client.delete(
3084
- "/branch/{branchId}/workspaces/{workspaceId}",
3085
- { path }
3086
- );
3087
- };
3088
- const deleteWorkspaces = async ({
3089
- workspaceIds,
3090
- branchId
3091
- }) => {
3092
- await concurrent({
3093
- items: workspaceIds,
3094
- process: async (workspaceId) => deleteWorkspace({ branchId, workspaceId }),
3095
- concurrency: 5
3096
- });
3097
- };
3098
- const deleteWorkspaceJob = async (path) => {
3099
- const { data } = await client.delete(
3100
- "/branch/{branchId}/workspaces/{workspaceId}",
3101
- { path, query: { async: true } },
3102
- {}
3103
- );
3104
- return data;
3105
- };
3106
- const resetWorkspacePassword = async ({ branchId, workspaceId }) => {
3107
- const { data } = await client.post(
3108
- "/branch/{branchId}/workspaces/{workspaceId}/password",
3109
- {
3110
- path: { branchId, workspaceId }
3111
- }
3112
- );
3113
- return data;
3114
- };
3115
- const getWorkspaceSaml2Login = async (path, signal) => {
3116
- const { data } = await client.get(
3117
- "/branch/{branchId}/workspaces/{workspaceId}/saml2-login",
3118
- { path },
3119
- { signal }
3120
- );
3121
- return data;
3122
- };
3123
- const setWorkspacePublicKey = async ({
3124
- branchId,
3125
- workspaceId,
3126
- publicKey
3127
- }) => {
3128
- const { data } = await client.post("/branch/{branchId}/workspaces/{workspaceId}/public-key", {
3129
- path: { branchId, workspaceId },
3130
- body: { publicKey }
3131
- });
3132
- return data;
3133
- };
3134
- const getWorkspaceObjects = async (path, signal) => {
3135
- const { data } = await client.get(
3136
- "/branch/{branchId}/workspaces/{workspaceId}/objects",
3137
- { path },
3138
- { signal }
3139
- );
3140
- return data;
3141
- };
3142
- const deleteWorkspaceObjectsAsync = async ({
3143
- branchId,
3144
- workspaceId,
3145
- ...body
3146
- }) => {
3147
- const { data } = await client.post("/branch/{branchId}/workspaces/{workspaceId}/objects/batch-delete", {
3148
- path: { branchId, workspaceId },
3149
- body
3150
- });
3151
- return data;
3152
- };
3153
- return {
3154
- getWorkspace,
3155
- getWorkspaces,
3156
- deleteWorkspace,
3157
- resetWorkspacePassword,
3158
- deleteWorkspaces,
3159
- deleteWorkspaceJob,
3160
- setWorkspacePublicKey,
3161
- getWorkspaceSaml2Login,
3162
- getWorkspaceObjects,
3163
- deleteWorkspaceObjectsAsync
3164
- };
3165
- };
3166
-
3167
- // src/clients/storage/storageClient.ts
3168
- var createStorageClient = ({ baseUrl, middlewares = [] }) => {
3169
- const storageBaseUrl = `${baseUrl}/v2/storage`;
3170
- const client = createGenericFetchClient({
3171
- baseUrl: storageBaseUrl,
3172
- middlewares
3173
- });
3174
- const openApiClient = createOpenapiFetchClient({
3175
- baseUrl,
3176
- middlewares
3177
- });
3178
- const getStackInfo = async (query, signal) => {
3179
- const { data } = await client.get(
3180
- "",
3181
- { query },
3182
- { signal }
3183
- );
3184
- return data;
3185
- };
3186
- return {
3187
- buckets: createBuckets(client),
3188
- events: createEvents(client),
3189
- files: createFiles(client),
3190
- tables: createTables(client),
3191
- branches: createBranches(client),
3192
- workspaces: createWorkspaces(client),
3193
- mergeRequests: createMergeRequests(openApiClient),
3194
- jobs: createJobs(client),
3195
- componentsAndConfigurations: createComponentsAndConfigurations(client),
3196
- configurationVersions: createConfigurationVersions(client),
3197
- tokens: createTokens(client),
3198
- getStackInfo
3199
- };
3200
- };
3201
-
3202
- // src/clients/storage/storageTokenMiddleware.ts
3203
- var isTokenRefreshEndpoint = (request) => {
3204
- const url = new URL(request.url);
3205
- return request.method === "POST" && /\/tokens\/[^/]+\/refresh$/.test(url.pathname);
3206
- };
3207
- var tryParseNewToken = (data) => {
3208
- if (data === null || typeof data !== "object") return null;
3209
- const token = data.token;
3210
- return typeof token === "string" ? token : null;
3211
- };
3212
- var createStorageTokenMiddleware = (initialToken) => {
3213
- let current = initialToken;
3214
- return (next) => async (request) => {
3215
- request.request.headers.set(KeboolaHttpHeader.STORAGE_API_TOKEN, current);
3216
- const response = await next(request);
3217
- if (isTokenRefreshEndpoint(request.request)) {
3218
- const newToken = tryParseNewToken(response.data);
3219
- if (newToken !== null) current = newToken;
3220
- }
3221
- return response;
3222
- };
3223
- };
3224
-
3225
- // src/clients/syncActions/constants.ts
3226
- var SyncAction = {
3227
- DATA_APP_GIT_REPOSITORY: "git-repository",
3228
- GIT_REPOSITORY: "gitRepository",
3229
- ENROLL_MFA: "enrollMFA"
3230
- };
3231
- var Component = {
3232
- DATA_APP: "keboola.data-apps"
3233
- };
3234
- var Author = z5.object({
3235
- name: z5.string(),
3236
- email: z5.email()
3237
- });
3238
- var RepositoryBranch = z5.object({
3239
- sha: z5.string(),
3240
- date: z5.string(),
3241
- comment: z5.string(),
3242
- branch: z5.string(),
3243
- author: Author
3244
- });
3245
- var Repository = z5.object({
3246
- repository: z5.object({
3247
- url: z5.string()
3248
- }),
3249
- branches: z5.array(RepositoryBranch)
3250
- });
3251
-
3252
- // src/clients/syncActions/gitRepository/utils.ts
3253
- var GitRepoConfigDataBuilder = class {
3254
- repositoryUrl;
3255
- config = {};
3256
- constructor(repositoryUrl) {
3257
- this.repositoryUrl = repositoryUrl;
3258
- }
3259
- withCredentials(username, password) {
3260
- this.config.username = username;
3261
- delete this.config["#sshKey"];
3262
- this.config["#password"] = password;
3263
- return this;
3264
- }
3265
- withSshKey(username, sshKey) {
3266
- this.config.username = username;
3267
- delete this.config["#password"];
3268
- this.config["#sshKey"] = sshKey;
3269
- return this;
3270
- }
3271
- build() {
3272
- return {
3273
- parameters: {
3274
- git: {
3275
- repo: this.repositoryUrl,
3276
- ...this.config
3277
- }
3278
- }
3279
- };
3280
- }
3281
- buildForDataApp() {
3282
- return {
3283
- parameters: {
3284
- dataApp: {
3285
- git: {
3286
- repository: this.repositoryUrl,
3287
- ...this.config
3288
- }
3289
- }
3290
- }
3291
- };
3292
- }
3293
- };
3294
- var createGitRepoConfigDataBuilder = (repositoryUrl) => new GitRepoConfigDataBuilder(repositoryUrl);
3295
-
3296
- // src/clients/syncActions/gitRepository/gitRepository.ts
3297
- var createGitRepository = (sendSyncAction) => {
3298
- const getDataAppPublicGitRepository = async ({ repositoryUrl, ...other }, signal) => {
3299
- const data = await sendSyncAction(
3300
- {
3301
- ...other,
3302
- action: SyncAction.DATA_APP_GIT_REPOSITORY,
3303
- componentId: Component.DATA_APP,
3304
- configData: createGitRepoConfigDataBuilder(repositoryUrl).buildForDataApp()
3305
- },
3306
- signal
3307
- );
3308
- return Repository.parse(data);
3309
- };
3310
- const getDataAppPasswordPrivateGitRepository = async ({ repositoryUrl, username, password, ...other }, signal) => {
3311
- const data = await sendSyncAction(
3312
- {
3313
- ...other,
3314
- action: SyncAction.DATA_APP_GIT_REPOSITORY,
3315
- componentId: Component.DATA_APP,
3316
- configData: createGitRepoConfigDataBuilder(repositoryUrl).withCredentials(username, password).buildForDataApp()
3317
- },
3318
- signal
3319
- );
3320
- return Repository.parse(data);
3321
- };
3322
- const getDataAppSSHKeyPrivateGitRepository = async ({ repositoryUrl, username, sshKey, ...other }, signal) => {
3323
- const data = await sendSyncAction(
3324
- {
3325
- ...other,
3326
- action: SyncAction.DATA_APP_GIT_REPOSITORY,
3327
- componentId: Component.DATA_APP,
3328
- configData: createGitRepoConfigDataBuilder(repositoryUrl).withSshKey(username, sshKey).buildForDataApp()
3329
- },
3330
- signal
3331
- );
3332
- return Repository.parse(data);
3333
- };
3334
- const getPublicGitRepository = async ({ repositoryUrl, componentId, ...other }, signal) => {
3335
- const data = await sendSyncAction(
3336
- {
3337
- ...other,
3338
- action: SyncAction.GIT_REPOSITORY,
3339
- componentId,
3340
- configData: createGitRepoConfigDataBuilder(repositoryUrl).build()
3341
- },
3342
- signal
3343
- );
3344
- return Repository.parse(data);
3345
- };
3346
- const getPrivateGitRepository = async ({ repositoryUrl, username, password, componentId, ...other }, signal) => {
3347
- const data = await sendSyncAction(
3348
- {
3349
- ...other,
3350
- action: SyncAction.GIT_REPOSITORY,
3351
- componentId,
3352
- configData: createGitRepoConfigDataBuilder(repositoryUrl).withCredentials(username, password).build()
3353
- },
3354
- signal
3355
- );
3356
- return Repository.parse(data);
3357
- };
3358
- return {
3359
- getDataAppPublicGitRepository,
3360
- getDataAppPasswordPrivateGitRepository,
3361
- getDataAppSSHKeyPrivateGitRepository,
3362
- getPublicGitRepository,
3363
- getPrivateGitRepository
3364
- };
3365
- };
3366
-
3367
- // src/clients/syncActions/syncActionsClient.ts
3368
- var createSendSyncAction = (client) => {
3369
- return async (body, signal) => {
3370
- const { data } = await client.post(
3371
- "/actions",
3372
- {
3373
- body
3374
- },
3375
- { signal }
3376
- );
3377
- return data;
3378
- };
3379
- };
3380
- var createSyncActionsClient = ({ baseUrl, middlewares }) => {
3381
- const client = createOpenapiFetchClient({
3382
- baseUrl,
3383
- middlewares
3384
- });
3385
- const sendSyncAction = createSendSyncAction(client);
3386
- const enrollMFA = ({ email: email2, ...rest }, signal) => {
3387
- return sendSyncAction(
3388
- {
3389
- ...rest,
3390
- action: SyncAction.ENROLL_MFA,
3391
- configData: {
3392
- parameters: {
3393
- user: {
3394
- email: email2
3395
- }
3396
- }
3397
- }
3398
- },
3399
- signal
3400
- );
3401
- };
3402
- return {
3403
- enrollMFA,
3404
- gitRepository: createGitRepository(sendSyncAction)
3405
- };
3406
- };
3407
-
3408
- // src/clients/telemetry/provisioning/provisioning.ts
3409
- var createProvisioning = (client) => {
3410
- const createCredentials = async (body, signal) => {
3411
- const { data } = await client.post(
3412
- "/provisioning/workspace",
3413
- { body },
3414
- { signal }
3415
- );
3416
- return data;
3417
- };
3418
- return {
3419
- createCredentials
3420
- };
3421
- };
3422
-
3423
- // src/clients/telemetry/telemetryClient.ts
3424
- var createTelemetryClient = ({ baseUrl, middlewares }) => {
3425
- const client = createGenericFetchClient({
3426
- baseUrl,
3427
- middlewares
3428
- });
3429
- return {
3430
- provisioning: createProvisioning(client)
3431
- };
3432
- };
3433
-
3434
- // src/clients/vault/vaultClient.ts
3435
- var createVaultClient = ({ baseUrl, middlewares }) => {
3436
- const client = createOpenapiFetchClient({
3437
- baseUrl,
3438
- middlewares
3439
- });
3440
- const getVariables = async (query, signal) => {
3441
- const { data } = await client.get(
3442
- "/variables",
3443
- { query },
3444
- {
3445
- signal
3446
- }
3447
- );
3448
- return data;
3449
- };
3450
- const deleteVariable = async (hash, signal) => {
3451
- await client.delete(
3452
- "/variables/{hash}",
3453
- {
3454
- path: { hash }
3455
- },
3456
- { signal }
3457
- );
3458
- };
3459
- const createVariable = async (body, signal) => {
3460
- if (body.flags.includes("encrypted") && !body.value.startsWith(ENCRYPTED_VALUE_PREFIX)) {
3461
- throw new UserError("Encryption of a value failed. Please contact our support.");
3462
- }
3463
- const { data } = await client.post("/variables", { body }, { signal });
3464
- return data;
3465
- };
3466
- const getVariablesByBranchId = async (branchId, signal) => {
3467
- const { data } = await client.get(
3468
- "/variables/scoped/branch/{branchId}",
3469
- {
3470
- path: { branchId }
3471
- },
3472
- { signal }
3473
- );
3474
- return data;
3475
- };
3476
- const getProjectWideVariables = (signal) => getVariablesByBranchId("null", signal);
3477
- return {
3478
- createVariable,
3479
- deleteVariable,
3480
- getProjectWideVariables,
3481
- getVariables,
3482
- getVariablesByBranchId
3483
- };
3484
- };
3485
-
3486
- // src/domain/project.ts
3487
- var createProject = ({ sapiToken }) => {
3488
- const { owner, admin } = sapiToken;
3489
- const projectFeatureSet = new Set(owner.features);
3490
- const adminFeatureSet = new Set(admin.features);
3491
- const hasFeature = (...feature) => {
3492
- if (feature.length === 0) return false;
3493
- return feature.every((x) => projectFeatureSet.has(x));
3494
- };
3495
- const hasAdminFeature = (...feature) => {
3496
- if (feature.length === 0) return false;
3497
- return feature.every((x) => adminFeatureSet.has(x));
3498
- };
3499
- const hasBackend = (backend) => {
3500
- if (backend === "bigquery") return owner.hasBigquery;
3501
- if (backend === "snowflake") return owner.hasSnowflake;
3502
- return false;
3503
- };
3504
- return {
3505
- hasFeature,
3506
- hasAdminFeature,
3507
- hasBackend,
3508
- sapiToken
3509
- };
3510
- };
3511
-
3512
- // src/domain/stack.ts
3513
- var SERVICE_URL_OVERRIDES = {
3514
- // The service URL for the Kai Assistant is incomplete; we need to add the `/api` suffix to get the full URL for the API.
3515
- // I assume the service is versioned.
3516
- "kai-assistant": (url) => `${url}/api`
3517
- };
3518
- var createStack = ({ stackInfo, clientServiceUrls }) => {
3519
- const { services, components, features, ...infoRest } = stackInfo;
3520
- const serviceMap = new Map(
3521
- services.map((service) => {
3522
- const devOverride = clientServiceUrls?.[service.id]?.(service.url);
3523
- const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
3524
- const url = devOverride ?? prodOverride ?? service.url;
3525
- return [service.id, url];
3526
- })
3527
- );
3528
- const componentMap = new Map(components.map((component) => [component.id, component]));
3529
- const featureSet = new Set(features);
3530
- const hasFeature = (...feature) => {
3531
- if (feature.length === 0) return false;
3532
- return feature.every((x) => featureSet.has(x));
3533
- };
3534
- const hasComponent = (...componentId) => {
3535
- if (componentId.length === 0) return false;
3536
- return componentId.every((x) => componentMap.has(x));
285
+ const hasComponent = (...componentId) => {
286
+ if (componentId.length === 0) return false;
287
+ return componentId.every((x) => componentMap.has(x));
3537
288
  };
3538
289
  const getComponent = (componentId) => componentMap.get(componentId) ?? null;
3539
290
  const hasService = (serviceId) => serviceMap.has(serviceId);
@@ -3551,208 +302,6 @@ var createStack = ({ stackInfo, clientServiceUrls }) => {
3551
302
  };
3552
303
  };
3553
304
 
3554
- // src/sdks/storage/storageSdk.ts
3555
- var DEFAULT_POLL_INTERVAL = 2e3;
3556
- var JOB_TERMINAL_STATUSES = /* @__PURE__ */ new Set(["success", "warning", "error", "terminated", "cancelled"]);
3557
- var createStorageSdk = ({ storageClient }) => {
3558
- const waitForJob = async (job, options) => {
3559
- const { data } = await poll({
3560
- pollFn: (abortSignal) => storageClient.jobs.getJob(job.id, abortSignal),
3561
- isDone: (j) => JOB_TERMINAL_STATUSES.has(j.status),
3562
- interval: options?.interval ?? DEFAULT_POLL_INTERVAL,
3563
- maxAttempts: options?.maxAttempts,
3564
- abortSignal: options?.abortSignal
3565
- });
3566
- return data;
3567
- };
3568
- const createTable = async (bucketId, body, options) => {
3569
- const job = await storageClient.tables.createTableAsync(bucketId, body, options?.abortSignal);
3570
- return waitForJob(job, options);
3571
- };
3572
- const importFromFile = async (tableId, body, options) => {
3573
- const job = await storageClient.tables.importAsync(tableId, body, options?.abortSignal);
3574
- return waitForJob(job, options);
3575
- };
3576
- const exportToFile = async (tableId, body, options) => {
3577
- const job = await storageClient.tables.exportAsync(tableId, body, options?.abortSignal);
3578
- return waitForJob(job, options);
3579
- };
3580
- const getBucketListing = async (bucketId, signal) => storageClient.buckets.getListing(bucketId, signal);
3581
- const listBucketListings = async (signal) => storageClient.buckets.listListings(signal);
3582
- const createBucketListing = async (bucketId, input, options) => {
3583
- const job = await storageClient.buckets.createListing(bucketId, input, options?.abortSignal);
3584
- return waitForJob(job, options);
3585
- };
3586
- const updateBucketListing = async (bucketId, input, options) => {
3587
- const job = await storageClient.buckets.updateListing(bucketId, input, options?.abortSignal);
3588
- return waitForJob(job, options);
3589
- };
3590
- const deleteBucketListing = async (bucketId, options) => {
3591
- const job = await storageClient.buckets.deleteListing(bucketId, options?.abortSignal);
3592
- return waitForJob(job, options);
3593
- };
3594
- return {
3595
- createTable,
3596
- importFromFile,
3597
- exportToFile,
3598
- getBucketListing,
3599
- listBucketListings,
3600
- createBucketListing,
3601
- updateBucketListing,
3602
- deleteBucketListing
3603
- };
3604
- };
3605
-
3606
- // src/sdks/tag/tagSdk.ts
3607
- var ObjectType = {
3608
- TAG: "tag",
3609
- TAG_BINDING: "tag-binding"
3610
- };
3611
- var createTagSdk = ({ metastoreClient }) => {
3612
- const _getTagMetaObjects = async (type, signal) => {
3613
- const response = await metastoreClient.repository.getMetaObjects(
3614
- {
3615
- objectType: type
3616
- },
3617
- signal
3618
- );
3619
- return response.data.map(({ attributes }) => attributes);
3620
- };
3621
- const _getAllTagBindingMapByTagId = async (signal) => {
3622
- const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
3623
- return Object.groupBy(tagBindings, (binding) => binding.data.tagUUID);
3624
- };
3625
- const _getTagBindingMapByTagId = async (tagUUIDs, objectId, signal) => {
3626
- const tagBindingMapByTagId = await _getAllTagBindingMapByTagId(signal);
3627
- const objectUID = keboolaUID.serialize(objectId);
3628
- return tagUUIDs.reduce((acc, tagUUID) => {
3629
- if (acc[tagUUID]) return acc;
3630
- const tagBindings = tagBindingMapByTagId[tagUUID] ?? [];
3631
- acc[tagUUID] = tagBindings.find((binding) => binding.data.objectUID === objectUID) ?? null;
3632
- return acc;
3633
- }, {});
3634
- };
3635
- const _deleteTagBindings = async (tagBindings) => {
3636
- await concurrent({
3637
- items: tagBindings,
3638
- process: async (binding) => metastoreClient.repository.deleteMetaObject({
3639
- objectType: ObjectType.TAG_BINDING,
3640
- UUID: binding.uuid
3641
- }),
3642
- concurrency: 5
3643
- });
3644
- };
3645
- const getTags = async (signal) => {
3646
- const [tags, tagBindingMapByTagId] = await Promise.all([
3647
- _getTagMetaObjects(ObjectType.TAG, signal),
3648
- _getAllTagBindingMapByTagId(signal)
3649
- ]);
3650
- return tags.map((tag) => ({
3651
- tag,
3652
- bindings: tagBindingMapByTagId[tag.uuid] ?? []
3653
- }));
3654
- };
3655
- const getTagsByObjectId = async (objectId, signal) => {
3656
- const tags = await getTags(signal);
3657
- const keboolaObjectUID = keboolaUID.serialize(objectId);
3658
- const mapByTagId = tags.reduce((acc, { tag, bindings }) => {
3659
- acc[tag.uuid] = new Set(bindings.map((binding) => binding.data.objectUID));
3660
- return acc;
3661
- }, {});
3662
- return tags.filter(({ tag }) => mapByTagId[tag.uuid]?.has(keboolaObjectUID));
3663
- };
3664
- const createTag = async (data, meta = {}) => {
3665
- const {
3666
- data: { attributes: tag }
3667
- } = await metastoreClient.repository.createMetaObject({
3668
- objectType: ObjectType.TAG,
3669
- data,
3670
- name: generateUUID(),
3671
- ...meta
3672
- });
3673
- return tag;
3674
- };
3675
- const updateTag = async (tagUUID, data, meta = {}) => {
3676
- const {
3677
- data: { attributes: tag }
3678
- } = await metastoreClient.repository.updateMetaObject({
3679
- objectType: ObjectType.TAG,
3680
- UUID: tagUUID,
3681
- data,
3682
- ...meta
3683
- });
3684
- return tag;
3685
- };
3686
- const deleteTag = async (tagUUID) => {
3687
- const allBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING);
3688
- const tagBindings = allBindings.filter(({ data }) => data.tagUUID === tagUUID);
3689
- await Promise.all([
3690
- // delete tag itself
3691
- metastoreClient.repository.deleteMetaObject({
3692
- objectType: ObjectType.TAG,
3693
- UUID: tagUUID
3694
- }),
3695
- // delete all tag associations
3696
- _deleteTagBindings(tagBindings)
3697
- ]);
3698
- };
3699
- const assignTags = async (tagUUIDs, objectId, meta = {}) => {
3700
- const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectId);
3701
- const unassignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] === null);
3702
- await concurrent({
3703
- items: unassignedTagUUIDs,
3704
- process: async (tagUUID) => metastoreClient.repository.createMetaObject({
3705
- objectType: ObjectType.TAG_BINDING,
3706
- data: {
3707
- objectUID: keboolaUID.serialize(objectId),
3708
- tagUUID
3709
- },
3710
- name: generateUUID(),
3711
- ...meta
3712
- }),
3713
- concurrency: 5
3714
- });
3715
- };
3716
- const unassignTags = async (tagUUIDs, objectID) => {
3717
- const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectID);
3718
- const assignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] !== null);
3719
- const tagBindings = assignedTagUUIDs.map((tagUUID) => tagBindingMapByTagId[tagUUID]);
3720
- await concurrent({
3721
- items: tagBindings,
3722
- process: async (tagBinding) => metastoreClient.repository.deleteMetaObject({
3723
- objectType: ObjectType.TAG_BINDING,
3724
- UUID: tagBinding.uuid
3725
- }),
3726
- concurrency: 5
3727
- });
3728
- };
3729
- const unassignAllTags = async (objectID, signal) => {
3730
- const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
3731
- const objectsTagBindings = tagBindings.filter(
3732
- ({ data }) => data.objectUID === keboolaUID.serialize(objectID)
3733
- );
3734
- await _deleteTagBindings(objectsTagBindings);
3735
- };
3736
- const createAndAssignTag = async (data, objectId, meta = {}) => {
3737
- const tag = await createTag(data, meta);
3738
- await assignTags([tag.uuid], objectId, meta);
3739
- return tag;
3740
- };
3741
- return {
3742
- // retrievals
3743
- getTags,
3744
- getTagsByObjectId,
3745
- // modifications
3746
- createTag,
3747
- updateTag,
3748
- deleteTag,
3749
- assignTags,
3750
- unassignTags,
3751
- unassignAllTags,
3752
- createAndAssignTag
3753
- };
3754
- };
3755
-
3756
305
  // src/serviceClientRegistry/utils.ts
3757
306
  var isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
3758
307
  var createDummyClient = ({
@@ -4119,6 +668,6 @@ var createDevApiClient = () => ({
4119
668
  verify: createVerifyClient()
4120
669
  });
4121
670
 
4122
- export { ApiError, HttpContentType, HttpHeader, KeboolaHttpHeader, ManagementClientAuthError, PollException, ServiceUnavailableError, UserError, assert, concurrent, consoleLogger, createApiClient, createDevApiClient, createGenericFetchClient, createLoggingMiddleware, createRetryMiddleware, createStorageSdk, delay, generateUUID, isAbortError, isApiError, isFetchClientError, isManagementClientAuthError, keboolaUID, parseLogLines, poll, series };
671
+ export { ServiceUnavailableError, assert, consoleLogger, createApiClient, createDevApiClient, createLoggingMiddleware, createRetryMiddleware };
4123
672
  //# sourceMappingURL=index.js.map
4124
673
  //# sourceMappingURL=index.js.map