@keboola/api-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/ai/index.cjs +203 -0
  4. package/dist/ai/index.cjs.map +1 -0
  5. package/dist/ai/index.d.cts +35 -0
  6. package/dist/ai/index.d.ts +35 -0
  7. package/dist/ai/index.js +197 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/ai/types.cjs +4 -0
  10. package/dist/ai/types.cjs.map +1 -0
  11. package/dist/ai/types.d.cts +2 -0
  12. package/dist/ai/types.d.ts +2 -0
  13. package/dist/ai/types.js +3 -0
  14. package/dist/ai/types.js.map +1 -0
  15. package/dist/assets/index.cjs +182 -0
  16. package/dist/assets/index.cjs.map +1 -0
  17. package/dist/assets/index.d.cts +9 -0
  18. package/dist/assets/index.d.ts +9 -0
  19. package/dist/assets/index.js +176 -0
  20. package/dist/assets/index.js.map +1 -0
  21. package/dist/assets/types.cjs +4 -0
  22. package/dist/assets/types.cjs.map +1 -0
  23. package/dist/assets/types.d.cts +8 -0
  24. package/dist/assets/types.d.ts +8 -0
  25. package/dist/assets/types.js +3 -0
  26. package/dist/assets/types.js.map +1 -0
  27. package/dist/authMiddleware-BTFSCMTE.d.ts +11 -0
  28. package/dist/authMiddleware-BteBe1Bt.d.cts +11 -0
  29. package/dist/chat/index.cjs +428 -0
  30. package/dist/chat/index.cjs.map +1 -0
  31. package/dist/chat/index.d.cts +51 -0
  32. package/dist/chat/index.d.ts +51 -0
  33. package/dist/chat/index.js +422 -0
  34. package/dist/chat/index.js.map +1 -0
  35. package/dist/chat/suggestions.cjs +158 -0
  36. package/dist/chat/suggestions.cjs.map +1 -0
  37. package/dist/chat/suggestions.d.cts +437 -0
  38. package/dist/chat/suggestions.d.ts +437 -0
  39. package/dist/chat/suggestions.js +140 -0
  40. package/dist/chat/suggestions.js.map +1 -0
  41. package/dist/chat/types.cjs +10 -0
  42. package/dist/chat/types.cjs.map +1 -0
  43. package/dist/chat/types.d.cts +3 -0
  44. package/dist/chat/types.d.ts +3 -0
  45. package/dist/chat/types.js +8 -0
  46. package/dist/chat/types.js.map +1 -0
  47. package/dist/createGenericFetchClient-CLUzu-jY.d.cts +18 -0
  48. package/dist/createGenericFetchClient-DEakI3F1.d.ts +18 -0
  49. package/dist/createOpenapiFetchClient-CpXmAIFB.d.cts +24 -0
  50. package/dist/createOpenapiFetchClient-_sm4bchL.d.ts +24 -0
  51. package/dist/dataScience/index.cjs +416 -0
  52. package/dist/dataScience/index.cjs.map +1 -0
  53. package/dist/dataScience/index.d.cts +191 -0
  54. package/dist/dataScience/index.d.ts +191 -0
  55. package/dist/dataScience/index.js +388 -0
  56. package/dist/dataScience/index.js.map +1 -0
  57. package/dist/dataScience/types.cjs +4 -0
  58. package/dist/dataScience/types.cjs.map +1 -0
  59. package/dist/dataScience/types.d.cts +2 -0
  60. package/dist/dataScience/types.d.ts +2 -0
  61. package/dist/dataScience/types.js +3 -0
  62. package/dist/dataScience/types.js.map +1 -0
  63. package/dist/editor/index.cjs +275 -0
  64. package/dist/editor/index.cjs.map +1 -0
  65. package/dist/editor/index.d.cts +172 -0
  66. package/dist/editor/index.d.ts +172 -0
  67. package/dist/editor/index.js +269 -0
  68. package/dist/editor/index.js.map +1 -0
  69. package/dist/editor/types.cjs +4 -0
  70. package/dist/editor/types.cjs.map +1 -0
  71. package/dist/editor/types.d.cts +2 -0
  72. package/dist/editor/types.d.ts +2 -0
  73. package/dist/editor/types.js +3 -0
  74. package/dist/editor/types.js.map +1 -0
  75. package/dist/encryption/index.cjs +192 -0
  76. package/dist/encryption/index.cjs.map +1 -0
  77. package/dist/encryption/index.d.cts +14 -0
  78. package/dist/encryption/index.d.ts +14 -0
  79. package/dist/encryption/index.js +186 -0
  80. package/dist/encryption/index.js.map +1 -0
  81. package/dist/encryption/types.cjs +4 -0
  82. package/dist/encryption/types.cjs.map +1 -0
  83. package/dist/encryption/types.d.cts +8 -0
  84. package/dist/encryption/types.d.ts +8 -0
  85. package/dist/encryption/types.js +3 -0
  86. package/dist/encryption/types.js.map +1 -0
  87. package/dist/import/index.cjs +198 -0
  88. package/dist/import/index.cjs.map +1 -0
  89. package/dist/import/index.d.cts +9 -0
  90. package/dist/import/index.d.ts +9 -0
  91. package/dist/import/index.js +192 -0
  92. package/dist/import/index.js.map +1 -0
  93. package/dist/index.cjs +3910 -0
  94. package/dist/index.cjs.map +1 -0
  95. package/dist/index.d.cts +3108 -0
  96. package/dist/index.d.ts +3108 -0
  97. package/dist/index.js +3858 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/keboolaUID-D1DGSbge.d.cts +19 -0
  100. package/dist/keboolaUID-D1DGSbge.d.ts +19 -0
  101. package/dist/management/index.cjs +872 -0
  102. package/dist/management/index.cjs.map +1 -0
  103. package/dist/management/index.d.cts +440 -0
  104. package/dist/management/index.d.ts +440 -0
  105. package/dist/management/index.js +865 -0
  106. package/dist/management/index.js.map +1 -0
  107. package/dist/management/types.cjs +4 -0
  108. package/dist/management/types.cjs.map +1 -0
  109. package/dist/management/types.d.cts +9 -0
  110. package/dist/management/types.d.ts +9 -0
  111. package/dist/management/types.js +3 -0
  112. package/dist/management/types.js.map +1 -0
  113. package/dist/metastore/index.cjs +339 -0
  114. package/dist/metastore/index.cjs.map +1 -0
  115. package/dist/metastore/index.d.cts +52 -0
  116. package/dist/metastore/index.d.ts +52 -0
  117. package/dist/metastore/index.js +333 -0
  118. package/dist/metastore/index.js.map +1 -0
  119. package/dist/metastore/types.cjs +4 -0
  120. package/dist/metastore/types.cjs.map +1 -0
  121. package/dist/metastore/types.d.cts +2 -0
  122. package/dist/metastore/types.d.ts +2 -0
  123. package/dist/metastore/types.js +3 -0
  124. package/dist/metastore/types.js.map +1 -0
  125. package/dist/queryService/index.cjs +250 -0
  126. package/dist/queryService/index.cjs.map +1 -0
  127. package/dist/queryService/index.d.cts +39 -0
  128. package/dist/queryService/index.d.ts +39 -0
  129. package/dist/queryService/index.js +244 -0
  130. package/dist/queryService/index.js.map +1 -0
  131. package/dist/queryService/types.cjs +4 -0
  132. package/dist/queryService/types.cjs.map +1 -0
  133. package/dist/queryService/types.d.cts +2 -0
  134. package/dist/queryService/types.d.ts +2 -0
  135. package/dist/queryService/types.js +3 -0
  136. package/dist/queryService/types.js.map +1 -0
  137. package/dist/queue/index.cjs +192 -0
  138. package/dist/queue/index.cjs.map +1 -0
  139. package/dist/queue/index.d.cts +133 -0
  140. package/dist/queue/index.d.ts +133 -0
  141. package/dist/queue/index.js +186 -0
  142. package/dist/queue/index.js.map +1 -0
  143. package/dist/queue/types.cjs +4 -0
  144. package/dist/queue/types.cjs.map +1 -0
  145. package/dist/queue/types.d.cts +2 -0
  146. package/dist/queue/types.d.ts +2 -0
  147. package/dist/queue/types.js +3 -0
  148. package/dist/queue/types.js.map +1 -0
  149. package/dist/sdk/storage/index.cjs +96 -0
  150. package/dist/sdk/storage/index.cjs.map +1 -0
  151. package/dist/sdk/storage/index.d.cts +24 -0
  152. package/dist/sdk/storage/index.d.ts +24 -0
  153. package/dist/sdk/storage/index.js +94 -0
  154. package/dist/sdk/storage/index.js.map +1 -0
  155. package/dist/sdk/tag/index.cjs +210 -0
  156. package/dist/sdk/tag/index.cjs.map +1 -0
  157. package/dist/sdk/tag/index.d.cts +25 -0
  158. package/dist/sdk/tag/index.d.ts +25 -0
  159. package/dist/sdk/tag/index.js +208 -0
  160. package/dist/sdk/tag/index.js.map +1 -0
  161. package/dist/sdk/tag/types.cjs +4 -0
  162. package/dist/sdk/tag/types.cjs.map +1 -0
  163. package/dist/sdk/tag/types.d.cts +30 -0
  164. package/dist/sdk/tag/types.d.ts +30 -0
  165. package/dist/sdk/tag/types.js +3 -0
  166. package/dist/sdk/tag/types.js.map +1 -0
  167. package/dist/status/index.cjs +178 -0
  168. package/dist/status/index.cjs.map +1 -0
  169. package/dist/status/index.d.cts +10 -0
  170. package/dist/status/index.d.ts +10 -0
  171. package/dist/status/index.js +172 -0
  172. package/dist/status/index.js.map +1 -0
  173. package/dist/status/types.cjs +4 -0
  174. package/dist/status/types.cjs.map +1 -0
  175. package/dist/status/types.d.cts +19 -0
  176. package/dist/status/types.d.ts +19 -0
  177. package/dist/status/types.js +3 -0
  178. package/dist/status/types.js.map +1 -0
  179. package/dist/storage/index.cjs +1021 -0
  180. package/dist/storage/index.cjs.map +1 -0
  181. package/dist/storage/index.d.cts +12 -0
  182. package/dist/storage/index.d.ts +12 -0
  183. package/dist/storage/index.js +1014 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/types.cjs +4 -0
  186. package/dist/storage/types.cjs.map +1 -0
  187. package/dist/storage/types.d.cts +10976 -0
  188. package/dist/storage/types.d.ts +10976 -0
  189. package/dist/storage/types.js +3 -0
  190. package/dist/storage/types.js.map +1 -0
  191. package/dist/storageClient-DPLh_p0V.d.cts +608 -0
  192. package/dist/storageClient-YVWer22Y.d.ts +608 -0
  193. package/dist/syncActions/index.cjs +366 -0
  194. package/dist/syncActions/index.cjs.map +1 -0
  195. package/dist/syncActions/index.d.cts +94 -0
  196. package/dist/syncActions/index.d.ts +94 -0
  197. package/dist/syncActions/index.js +341 -0
  198. package/dist/syncActions/index.js.map +1 -0
  199. package/dist/syncActions/types.cjs +4 -0
  200. package/dist/syncActions/types.cjs.map +1 -0
  201. package/dist/syncActions/types.d.cts +261 -0
  202. package/dist/syncActions/types.d.ts +261 -0
  203. package/dist/syncActions/types.js +3 -0
  204. package/dist/syncActions/types.js.map +1 -0
  205. package/dist/telemetry/index.cjs +189 -0
  206. package/dist/telemetry/index.cjs.map +1 -0
  207. package/dist/telemetry/index.d.cts +13 -0
  208. package/dist/telemetry/index.d.ts +13 -0
  209. package/dist/telemetry/index.js +183 -0
  210. package/dist/telemetry/index.js.map +1 -0
  211. package/dist/telemetry/types.cjs +4 -0
  212. package/dist/telemetry/types.cjs.map +1 -0
  213. package/dist/telemetry/types.d.cts +12 -0
  214. package/dist/telemetry/types.d.ts +12 -0
  215. package/dist/telemetry/types.js +3 -0
  216. package/dist/telemetry/types.js.map +1 -0
  217. package/dist/types-B51cQMrX.d.ts +1408 -0
  218. package/dist/types-B7k8S4ki.d.ts +1520 -0
  219. package/dist/types-BNQK_jR_.d.cts +1520 -0
  220. package/dist/types-BY0tjg2Q.d.ts +1079 -0
  221. package/dist/types-BeShtGlc.d.cts +8591 -0
  222. package/dist/types-BeShtGlc.d.ts +8591 -0
  223. package/dist/types-BjrNNn5I.d.ts +1643 -0
  224. package/dist/types-C-bd4ArM.d.cts +1079 -0
  225. package/dist/types-C7mpAfq-.d.cts +64 -0
  226. package/dist/types-C7mpAfq-.d.ts +64 -0
  227. package/dist/types-CGMJT3JL.d.ts +943 -0
  228. package/dist/types-CRSKcua9.d.cts +1314 -0
  229. package/dist/types-DJ6nbNq5.d.cts +1643 -0
  230. package/dist/types-DJkU9gvB.d.cts +943 -0
  231. package/dist/types-DYMMsuU0.d.cts +78 -0
  232. package/dist/types-DYMMsuU0.d.ts +78 -0
  233. package/dist/types-Dg1tEsVR.d.cts +17 -0
  234. package/dist/types-Dg1tEsVR.d.ts +17 -0
  235. package/dist/types-DgaMV8FF.d.cts +60 -0
  236. package/dist/types-DgaMV8FF.d.ts +60 -0
  237. package/dist/types-Dws8mFNY.d.cts +1408 -0
  238. package/dist/types-cH0_hkCW.d.ts +1314 -0
  239. package/dist/utils-BNQZiNOu.d.ts +1657 -0
  240. package/dist/utils-DE09pDTi.d.cts +1657 -0
  241. package/dist/vault/index.cjs +225 -0
  242. package/dist/vault/index.cjs.map +1 -0
  243. package/dist/vault/index.d.cts +26 -0
  244. package/dist/vault/index.d.ts +26 -0
  245. package/dist/vault/index.js +219 -0
  246. package/dist/vault/index.js.map +1 -0
  247. package/dist/vault/types.cjs +4 -0
  248. package/dist/vault/types.cjs.map +1 -0
  249. package/dist/vault/types.d.cts +390 -0
  250. package/dist/vault/types.d.ts +390 -0
  251. package/dist/vault/types.js +3 -0
  252. package/dist/vault/types.js.map +1 -0
  253. package/dist/verify/index.cjs +190 -0
  254. package/dist/verify/index.cjs.map +1 -0
  255. package/dist/verify/index.d.cts +9 -0
  256. package/dist/verify/index.d.ts +9 -0
  257. package/dist/verify/index.js +184 -0
  258. package/dist/verify/index.js.map +1 -0
  259. package/dist/verify/types.cjs +4 -0
  260. package/dist/verify/types.cjs.map +1 -0
  261. package/dist/verify/types.d.cts +29 -0
  262. package/dist/verify/types.d.ts +29 -0
  263. package/dist/verify/types.js +3 -0
  264. package/dist/verify/types.js.map +1 -0
  265. package/package.json +570 -0
@@ -0,0 +1,210 @@
1
+ 'use strict';
2
+
3
+ // src/utils/concurrent.ts
4
+ var concurrent = async ({
5
+ items,
6
+ process,
7
+ concurrency = 2,
8
+ middlewares = []
9
+ }) => {
10
+ if (concurrency < 1) throw new Error("Concurrency must be greater than 0");
11
+ if (items.length === 0) return [];
12
+ if (concurrency === Infinity)
13
+ return Promise.all(items.map((item, index) => process(item, index, items.length)));
14
+ const n = items.length;
15
+ const results = new Array(n);
16
+ const processWithMiddlewares = middlewares.reduceRight(
17
+ (next, middleware) => middleware(next),
18
+ process
19
+ );
20
+ const queue = items.map((item, index) => async () => {
21
+ results[index] = await processWithMiddlewares(item, index, items.length);
22
+ });
23
+ const workers = Array.from(
24
+ { length: Math.min(concurrency, items.length) },
25
+ async function processQueue() {
26
+ while (queue.length) {
27
+ await queue.shift()?.();
28
+ }
29
+ }
30
+ );
31
+ await Promise.all(workers);
32
+ return results;
33
+ };
34
+
35
+ // src/utils/keboolaUID.ts
36
+ var KEBOOLA_OBJECT_ID_DELIMITER = "--";
37
+ var keboolaUID = {
38
+ serialize: (input) => {
39
+ if (input.uid === "")
40
+ throw new Error("Invalid Keboola Object ID: uid of an object cannot be empty");
41
+ return ["KID", input.projectId, input.type, input.uid].join(KEBOOLA_OBJECT_ID_DELIMITER);
42
+ },
43
+ deserialize: (input) => {
44
+ const [identifier, projectId, type, uid] = input.split(KEBOOLA_OBJECT_ID_DELIMITER);
45
+ if (identifier !== "KID" || !projectId || !type || !uid)
46
+ throw new Error("Invalid Keboola Object ID");
47
+ return {
48
+ projectId: Number(projectId),
49
+ type,
50
+ uid
51
+ };
52
+ }
53
+ };
54
+
55
+ // src/utils/generateUUID.ts
56
+ var generateUUID = () => crypto.randomUUID();
57
+
58
+ // src/sdks/tag/tagSdk.ts
59
+ var ObjectType = {
60
+ TAG: "tag",
61
+ TAG_BINDING: "tag-binding"
62
+ };
63
+ var createTagSdk = ({ metastoreClient }) => {
64
+ const _getTagMetaObjects = async (type, signal) => {
65
+ const response = await metastoreClient.repository.getMetaObjects(
66
+ {
67
+ objectType: type
68
+ },
69
+ signal
70
+ );
71
+ return response.data.map(({ attributes }) => attributes);
72
+ };
73
+ const _getAllTagBindingMapByTagId = async (signal) => {
74
+ const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
75
+ return Object.groupBy(tagBindings, (binding) => binding.data.tagUUID);
76
+ };
77
+ const _getTagBindingMapByTagId = async (tagUUIDs, objectId, signal) => {
78
+ const tagBindingMapByTagId = await _getAllTagBindingMapByTagId(signal);
79
+ const objectUID = keboolaUID.serialize(objectId);
80
+ return tagUUIDs.reduce((acc, tagUUID) => {
81
+ if (acc[tagUUID]) return acc;
82
+ const tagBindings = tagBindingMapByTagId[tagUUID] ?? [];
83
+ acc[tagUUID] = tagBindings.find((binding) => binding.data.objectUID === objectUID) ?? null;
84
+ return acc;
85
+ }, {});
86
+ };
87
+ const _deleteTagBindings = async (tagBindings) => {
88
+ await concurrent({
89
+ items: tagBindings,
90
+ process: async (binding) => metastoreClient.repository.deleteMetaObject({
91
+ objectType: ObjectType.TAG_BINDING,
92
+ UUID: binding.uuid
93
+ }),
94
+ concurrency: 5
95
+ });
96
+ };
97
+ const getTags = async (signal) => {
98
+ const [tags, tagBindingMapByTagId] = await Promise.all([
99
+ _getTagMetaObjects(ObjectType.TAG, signal),
100
+ _getAllTagBindingMapByTagId(signal)
101
+ ]);
102
+ return tags.map((tag) => ({
103
+ tag,
104
+ bindings: tagBindingMapByTagId[tag.uuid] ?? []
105
+ }));
106
+ };
107
+ const getTagsByObjectId = async (objectId, signal) => {
108
+ const tags = await getTags(signal);
109
+ const keboolaObjectUID = keboolaUID.serialize(objectId);
110
+ const mapByTagId = tags.reduce((acc, { tag, bindings }) => {
111
+ acc[tag.uuid] = new Set(bindings.map((binding) => binding.data.objectUID));
112
+ return acc;
113
+ }, {});
114
+ return tags.filter(({ tag }) => mapByTagId[tag.uuid]?.has(keboolaObjectUID));
115
+ };
116
+ const createTag = async (data, meta = {}) => {
117
+ const {
118
+ data: { attributes: tag }
119
+ } = await metastoreClient.repository.createMetaObject({
120
+ objectType: ObjectType.TAG,
121
+ data,
122
+ name: generateUUID(),
123
+ ...meta
124
+ });
125
+ return tag;
126
+ };
127
+ const updateTag = async (tagUUID, data, meta = {}) => {
128
+ const {
129
+ data: { attributes: tag }
130
+ } = await metastoreClient.repository.updateMetaObject({
131
+ objectType: ObjectType.TAG,
132
+ UUID: tagUUID,
133
+ data,
134
+ ...meta
135
+ });
136
+ return tag;
137
+ };
138
+ const deleteTag = async (tagUUID) => {
139
+ const allBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING);
140
+ const tagBindings = allBindings.filter(({ data }) => data.tagUUID === tagUUID);
141
+ await Promise.all([
142
+ // delete tag itself
143
+ metastoreClient.repository.deleteMetaObject({
144
+ objectType: ObjectType.TAG,
145
+ UUID: tagUUID
146
+ }),
147
+ // delete all tag associations
148
+ _deleteTagBindings(tagBindings)
149
+ ]);
150
+ };
151
+ const assignTags = async (tagUUIDs, objectId, meta = {}) => {
152
+ const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectId);
153
+ const unassignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] === null);
154
+ await concurrent({
155
+ items: unassignedTagUUIDs,
156
+ process: async (tagUUID) => metastoreClient.repository.createMetaObject({
157
+ objectType: ObjectType.TAG_BINDING,
158
+ data: {
159
+ objectUID: keboolaUID.serialize(objectId),
160
+ tagUUID
161
+ },
162
+ name: generateUUID(),
163
+ ...meta
164
+ }),
165
+ concurrency: 5
166
+ });
167
+ };
168
+ const unassignTags = async (tagUUIDs, objectID) => {
169
+ const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectID);
170
+ const assignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] !== null);
171
+ const tagBindings = assignedTagUUIDs.map((tagUUID) => tagBindingMapByTagId[tagUUID]);
172
+ await concurrent({
173
+ items: tagBindings,
174
+ process: async (tagBinding) => metastoreClient.repository.deleteMetaObject({
175
+ objectType: ObjectType.TAG_BINDING,
176
+ UUID: tagBinding.uuid
177
+ }),
178
+ concurrency: 5
179
+ });
180
+ };
181
+ const unassignAllTags = async (objectID, signal) => {
182
+ const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
183
+ const objectsTagBindings = tagBindings.filter(
184
+ ({ data }) => data.objectUID === keboolaUID.serialize(objectID)
185
+ );
186
+ await _deleteTagBindings(objectsTagBindings);
187
+ };
188
+ const createAndAssignTag = async (data, objectId, meta = {}) => {
189
+ const tag = await createTag(data, meta);
190
+ await assignTags([tag.uuid], objectId, meta);
191
+ return tag;
192
+ };
193
+ return {
194
+ // retrievals
195
+ getTags,
196
+ getTagsByObjectId,
197
+ // modifications
198
+ createTag,
199
+ updateTag,
200
+ deleteTag,
201
+ assignTags,
202
+ unassignTags,
203
+ unassignAllTags,
204
+ createAndAssignTag
205
+ };
206
+ };
207
+
208
+ exports.createTagSdk = createTagSdk;
209
+ //# sourceMappingURL=index.cjs.map
210
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/concurrent.ts","../../../src/utils/keboolaUID.ts","../../../src/utils/generateUUID.ts","../../../src/sdks/tag/tagSdk.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["type ProcessFn<T, R> = (item: T, index: number, arrayLength: number) => Promise<R>;\nexport type MiddlewareFn<T, R> = (next: ProcessFn<T, R>) => ProcessFn<T, R>;\n\nexport type ConcurrentOptions<T, R> = {\n items: T[];\n process: ProcessFn<T, R>;\n concurrency?: number;\n middlewares?: MiddlewareFn<T, R>[];\n};\n\n/**\n * Executes an asynchronous callback function on an array of items, processing multiple items concurrently with a specified concurrency limit.\n * It behaves similarly to Promise.all(), failing on the first rejected promise.\n * The order of the results matches the order of the promises.\n * The API is the same as Bluebird.map().\n */\nexport const concurrent = async <T, R>({\n items,\n process,\n concurrency = 2,\n middlewares = [],\n}: ConcurrentOptions<T, R>): Promise<R[]> => {\n if (concurrency < 1) throw new Error('Concurrency must be greater than 0');\n if (items.length === 0) return [];\n if (concurrency === Infinity)\n return Promise.all(items.map((item, index) => process(item, index, items.length)));\n\n const n = items.length;\n const results: R[] = new Array(n);\n\n const processWithMiddlewares = middlewares.reduceRight(\n (next, middleware) => middleware(next),\n process,\n );\n\n const queue = items.map((item, index) => async () => {\n results[index] = await processWithMiddlewares(item, index, items.length);\n });\n\n const workers = Array.from(\n { length: Math.min(concurrency, items.length) },\n async function processQueue() {\n while (queue.length) {\n await queue.shift()?.();\n }\n },\n );\n\n await Promise.all(workers);\n return results;\n};\n","type KeboolaObjectType =\n | 'data-catalog'\n | 'table'\n | 'bucket'\n | 'flow'\n | 'configuration'\n | 'transformation'\n | 'data-app'\n | 'workspace';\n\nexport type KeboolaObjectId = {\n uid: string;\n type: KeboolaObjectType;\n projectId: number;\n};\n\n//As a delimiter for serialization, we use a double hyphen (--) instead of a single hyphen in type names.\nconst KEBOOLA_OBJECT_ID_DELIMITER = '--';\n\n/**\n * There is a proposal for a string format to identify objects in Keboola.\n *\n * https://keboola.atlassian.net/wiki/spaces/ENGG/pages/3967615431/Keboola+UUID+Format\n * Unfortunately, this format will not pass BE validation as `:` is not allowed in the `uid`, and the length is limited to 50 characters only.\n *\n */\nexport const keboolaUID = {\n serialize: (input: KeboolaObjectId): string => {\n if (input.uid === '')\n throw new Error('Invalid Keboola Object ID: uid of an object cannot be empty');\n\n return ['KID', input.projectId, input.type, input.uid].join(KEBOOLA_OBJECT_ID_DELIMITER);\n },\n\n deserialize: (input: string): KeboolaObjectId => {\n const [identifier, projectId, type, uid] = input.split(KEBOOLA_OBJECT_ID_DELIMITER);\n if (identifier !== 'KID' || !projectId || !type || !uid)\n throw new Error('Invalid Keboola Object ID');\n\n return {\n projectId: Number(projectId),\n type: type as KeboolaObjectType,\n uid,\n };\n },\n};\n","export const generateUUID = () => crypto.randomUUID();\n","import type { MetaObject } from '../../clients/metastore/repository/types';\nimport { concurrent, generateUUID, type KeboolaObjectId, keboolaUID } from '../../utils';\n\nimport type {\n CreateMetaObjectMetaDataInput,\n MetastoreClient,\n TagBindingData,\n TagData,\n TagWithBindings,\n UpdateMetaObjectMetaDataInput,\n} from './types';\n\nconst ObjectType = {\n TAG: 'tag',\n TAG_BINDING: 'tag-binding',\n};\ntype ObjectTypes = (typeof ObjectType)[keyof typeof ObjectType];\n\ntype Options = {\n metastoreClient: MetastoreClient;\n};\n\nexport const createTagSdk = ({ metastoreClient }: Options) => {\n const _getTagMetaObjects = async <T extends Record<string, unknown>>(\n type: ObjectTypes,\n signal?: AbortSignal,\n ) => {\n const response = await metastoreClient.repository.getMetaObjects<T>(\n {\n objectType: type,\n },\n signal,\n );\n return response.data.map(({ attributes }) => attributes);\n };\n\n const _getAllTagBindingMapByTagId = async (signal?: AbortSignal) => {\n const tagBindings = await _getTagMetaObjects<TagBindingData>(ObjectType.TAG_BINDING, signal);\n return Object.groupBy(tagBindings, (binding) => binding.data.tagUUID);\n };\n\n const _getTagBindingMapByTagId = async (\n tagUUIDs: string[],\n objectId: KeboolaObjectId,\n signal?: AbortSignal,\n ) => {\n const tagBindingMapByTagId = await _getAllTagBindingMapByTagId(signal);\n const objectUID = keboolaUID.serialize(objectId);\n return tagUUIDs.reduce<Record<string, MetaObject<TagBindingData> | null>>((acc, tagUUID) => {\n if (acc[tagUUID]) return acc; // filter out duplicated ids\n\n const tagBindings = tagBindingMapByTagId[tagUUID] ?? [];\n acc[tagUUID] = tagBindings.find((binding) => binding.data.objectUID === objectUID) ?? null;\n return acc;\n }, {});\n };\n\n const _deleteTagBindings = async (tagBindings: MetaObject<TagBindingData>[]) => {\n await concurrent({\n items: tagBindings,\n process: async (binding) =>\n metastoreClient.repository.deleteMetaObject({\n objectType: ObjectType.TAG_BINDING,\n UUID: binding.uuid!,\n }),\n concurrency: 5,\n });\n };\n\n const getTags = async (signal?: AbortSignal) => {\n const [tags, tagBindingMapByTagId] = await Promise.all([\n _getTagMetaObjects<TagData>(ObjectType.TAG, signal),\n _getAllTagBindingMapByTagId(signal),\n ]);\n\n return tags.map<TagWithBindings>((tag) => ({\n tag,\n bindings: tagBindingMapByTagId[tag.uuid!] ?? [],\n }));\n };\n\n const getTagsByObjectId = async (objectId: KeboolaObjectId, signal?: AbortSignal) => {\n const tags = await getTags(signal);\n\n const keboolaObjectUID = keboolaUID.serialize(objectId);\n const mapByTagId = tags.reduce<Record<string, Set<string>>>((acc, { tag, bindings }) => {\n acc[tag.uuid!] = new Set(bindings.map((binding) => binding.data.objectUID));\n return acc;\n }, {});\n\n return tags.filter(({ tag }) => mapByTagId[tag.uuid!]?.has(keboolaObjectUID));\n };\n\n const createTag = async (data: TagData, meta: CreateMetaObjectMetaDataInput = {}) => {\n const {\n data: { attributes: tag },\n } = await metastoreClient.repository.createMetaObject({\n objectType: ObjectType.TAG,\n data,\n name: generateUUID(),\n ...meta,\n });\n\n return tag;\n };\n\n const updateTag = async (\n tagUUID: string,\n data: TagData,\n meta: UpdateMetaObjectMetaDataInput = {},\n ) => {\n const {\n data: { attributes: tag },\n } = await metastoreClient.repository.updateMetaObject<TagData>({\n objectType: ObjectType.TAG,\n UUID: tagUUID,\n data,\n ...meta,\n });\n\n return tag;\n };\n\n const deleteTag = async (tagUUID: string) => {\n const allBindings = await _getTagMetaObjects<TagBindingData>(ObjectType.TAG_BINDING);\n const tagBindings = allBindings.filter(({ data }) => data.tagUUID === tagUUID);\n\n await Promise.all([\n // delete tag itself\n metastoreClient.repository.deleteMetaObject({\n objectType: ObjectType.TAG,\n UUID: tagUUID,\n }),\n // delete all tag associations\n _deleteTagBindings(tagBindings),\n ]);\n };\n\n const assignTags = async (\n tagUUIDs: string[],\n objectId: KeboolaObjectId,\n meta: CreateMetaObjectMetaDataInput = {},\n ) => {\n const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectId);\n // Assign only the unassigned tag IDs. Ignore the rest.\n const unassignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] === null);\n\n await concurrent({\n items: unassignedTagUUIDs,\n process: async (tagUUID) =>\n metastoreClient.repository.createMetaObject<TagBindingData>({\n objectType: ObjectType.TAG_BINDING,\n data: {\n objectUID: keboolaUID.serialize(objectId),\n tagUUID: tagUUID,\n },\n name: generateUUID(),\n ...meta,\n }),\n concurrency: 5,\n });\n };\n\n const unassignTags = async (tagUUIDs: string[], objectID: KeboolaObjectId) => {\n const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectID);\n const assignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] !== null);\n\n const tagBindings = assignedTagUUIDs.map((tagUUID) => tagBindingMapByTagId[tagUUID]!);\n\n await concurrent({\n items: tagBindings,\n process: async (tagBinding) =>\n metastoreClient.repository.deleteMetaObject({\n objectType: ObjectType.TAG_BINDING,\n UUID: tagBinding.uuid!,\n }),\n concurrency: 5,\n });\n };\n\n const unassignAllTags = async (objectID: KeboolaObjectId, signal?: AbortSignal) => {\n const tagBindings = await _getTagMetaObjects<TagBindingData>(ObjectType.TAG_BINDING, signal);\n\n const objectsTagBindings = tagBindings.filter(\n ({ data }) => data.objectUID === keboolaUID.serialize(objectID),\n );\n\n await _deleteTagBindings(objectsTagBindings);\n };\n\n const createAndAssignTag = async (\n data: TagData,\n objectId: KeboolaObjectId,\n meta: CreateMetaObjectMetaDataInput = {},\n ) => {\n const tag = await createTag(data, meta);\n await assignTags([tag.uuid!], objectId, meta);\n return tag;\n };\n\n return {\n // retrievals\n getTags,\n getTagsByObjectId,\n\n // modifications\n createTag,\n updateTag,\n deleteTag,\n assignTags,\n unassignTags,\n unassignAllTags,\n createAndAssignTag,\n };\n};\n"]}
@@ -0,0 +1,25 @@
1
+ import { M as MetaObject } from '../../types-C-bd4ArM.cjs';
2
+ import { K as KeboolaObjectId } from '../../keboolaUID-D1DGSbge.cjs';
3
+ import { MetastoreClient, TagWithBindings, TagData, CreateMetaObjectMetaDataInput, UpdateMetaObjectMetaDataInput } from './types.cjs';
4
+ import '../../types-C7mpAfq-.cjs';
5
+ import '../../metastore/index.cjs';
6
+ import '../../createOpenapiFetchClient-CpXmAIFB.cjs';
7
+ import '../../types-DgaMV8FF.cjs';
8
+ import 'qs';
9
+
10
+ type Options = {
11
+ metastoreClient: MetastoreClient;
12
+ };
13
+ declare const createTagSdk: ({ metastoreClient }: Options) => {
14
+ getTags: (signal?: AbortSignal) => Promise<TagWithBindings[]>;
15
+ getTagsByObjectId: (objectId: KeboolaObjectId, signal?: AbortSignal) => Promise<TagWithBindings[]>;
16
+ createTag: (data: TagData, meta?: CreateMetaObjectMetaDataInput) => Promise<MetaObject<TagData, false>>;
17
+ updateTag: (tagUUID: string, data: TagData, meta?: UpdateMetaObjectMetaDataInput) => Promise<MetaObject<TagData, false>>;
18
+ deleteTag: (tagUUID: string) => Promise<void>;
19
+ assignTags: (tagUUIDs: string[], objectId: KeboolaObjectId, meta?: CreateMetaObjectMetaDataInput) => Promise<void>;
20
+ unassignTags: (tagUUIDs: string[], objectID: KeboolaObjectId) => Promise<void>;
21
+ unassignAllTags: (objectID: KeboolaObjectId, signal?: AbortSignal) => Promise<void>;
22
+ createAndAssignTag: (data: TagData, objectId: KeboolaObjectId, meta?: CreateMetaObjectMetaDataInput) => Promise<MetaObject<TagData, false>>;
23
+ };
24
+
25
+ export { createTagSdk };
@@ -0,0 +1,25 @@
1
+ import { M as MetaObject } from '../../types-BY0tjg2Q.js';
2
+ import { K as KeboolaObjectId } from '../../keboolaUID-D1DGSbge.js';
3
+ import { MetastoreClient, TagWithBindings, TagData, CreateMetaObjectMetaDataInput, UpdateMetaObjectMetaDataInput } from './types.js';
4
+ import '../../types-C7mpAfq-.js';
5
+ import '../../metastore/index.js';
6
+ import '../../createOpenapiFetchClient-_sm4bchL.js';
7
+ import '../../types-DgaMV8FF.js';
8
+ import 'qs';
9
+
10
+ type Options = {
11
+ metastoreClient: MetastoreClient;
12
+ };
13
+ declare const createTagSdk: ({ metastoreClient }: Options) => {
14
+ getTags: (signal?: AbortSignal) => Promise<TagWithBindings[]>;
15
+ getTagsByObjectId: (objectId: KeboolaObjectId, signal?: AbortSignal) => Promise<TagWithBindings[]>;
16
+ createTag: (data: TagData, meta?: CreateMetaObjectMetaDataInput) => Promise<MetaObject<TagData, false>>;
17
+ updateTag: (tagUUID: string, data: TagData, meta?: UpdateMetaObjectMetaDataInput) => Promise<MetaObject<TagData, false>>;
18
+ deleteTag: (tagUUID: string) => Promise<void>;
19
+ assignTags: (tagUUIDs: string[], objectId: KeboolaObjectId, meta?: CreateMetaObjectMetaDataInput) => Promise<void>;
20
+ unassignTags: (tagUUIDs: string[], objectID: KeboolaObjectId) => Promise<void>;
21
+ unassignAllTags: (objectID: KeboolaObjectId, signal?: AbortSignal) => Promise<void>;
22
+ createAndAssignTag: (data: TagData, objectId: KeboolaObjectId, meta?: CreateMetaObjectMetaDataInput) => Promise<MetaObject<TagData, false>>;
23
+ };
24
+
25
+ export { createTagSdk };
@@ -0,0 +1,208 @@
1
+ // src/utils/concurrent.ts
2
+ var concurrent = async ({
3
+ items,
4
+ process,
5
+ concurrency = 2,
6
+ middlewares = []
7
+ }) => {
8
+ if (concurrency < 1) throw new Error("Concurrency must be greater than 0");
9
+ if (items.length === 0) return [];
10
+ if (concurrency === Infinity)
11
+ return Promise.all(items.map((item, index) => process(item, index, items.length)));
12
+ const n = items.length;
13
+ const results = new Array(n);
14
+ const processWithMiddlewares = middlewares.reduceRight(
15
+ (next, middleware) => middleware(next),
16
+ process
17
+ );
18
+ const queue = items.map((item, index) => async () => {
19
+ results[index] = await processWithMiddlewares(item, index, items.length);
20
+ });
21
+ const workers = Array.from(
22
+ { length: Math.min(concurrency, items.length) },
23
+ async function processQueue() {
24
+ while (queue.length) {
25
+ await queue.shift()?.();
26
+ }
27
+ }
28
+ );
29
+ await Promise.all(workers);
30
+ return results;
31
+ };
32
+
33
+ // src/utils/keboolaUID.ts
34
+ var KEBOOLA_OBJECT_ID_DELIMITER = "--";
35
+ var keboolaUID = {
36
+ serialize: (input) => {
37
+ if (input.uid === "")
38
+ throw new Error("Invalid Keboola Object ID: uid of an object cannot be empty");
39
+ return ["KID", input.projectId, input.type, input.uid].join(KEBOOLA_OBJECT_ID_DELIMITER);
40
+ },
41
+ deserialize: (input) => {
42
+ const [identifier, projectId, type, uid] = input.split(KEBOOLA_OBJECT_ID_DELIMITER);
43
+ if (identifier !== "KID" || !projectId || !type || !uid)
44
+ throw new Error("Invalid Keboola Object ID");
45
+ return {
46
+ projectId: Number(projectId),
47
+ type,
48
+ uid
49
+ };
50
+ }
51
+ };
52
+
53
+ // src/utils/generateUUID.ts
54
+ var generateUUID = () => crypto.randomUUID();
55
+
56
+ // src/sdks/tag/tagSdk.ts
57
+ var ObjectType = {
58
+ TAG: "tag",
59
+ TAG_BINDING: "tag-binding"
60
+ };
61
+ var createTagSdk = ({ metastoreClient }) => {
62
+ const _getTagMetaObjects = async (type, signal) => {
63
+ const response = await metastoreClient.repository.getMetaObjects(
64
+ {
65
+ objectType: type
66
+ },
67
+ signal
68
+ );
69
+ return response.data.map(({ attributes }) => attributes);
70
+ };
71
+ const _getAllTagBindingMapByTagId = async (signal) => {
72
+ const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
73
+ return Object.groupBy(tagBindings, (binding) => binding.data.tagUUID);
74
+ };
75
+ const _getTagBindingMapByTagId = async (tagUUIDs, objectId, signal) => {
76
+ const tagBindingMapByTagId = await _getAllTagBindingMapByTagId(signal);
77
+ const objectUID = keboolaUID.serialize(objectId);
78
+ return tagUUIDs.reduce((acc, tagUUID) => {
79
+ if (acc[tagUUID]) return acc;
80
+ const tagBindings = tagBindingMapByTagId[tagUUID] ?? [];
81
+ acc[tagUUID] = tagBindings.find((binding) => binding.data.objectUID === objectUID) ?? null;
82
+ return acc;
83
+ }, {});
84
+ };
85
+ const _deleteTagBindings = async (tagBindings) => {
86
+ await concurrent({
87
+ items: tagBindings,
88
+ process: async (binding) => metastoreClient.repository.deleteMetaObject({
89
+ objectType: ObjectType.TAG_BINDING,
90
+ UUID: binding.uuid
91
+ }),
92
+ concurrency: 5
93
+ });
94
+ };
95
+ const getTags = async (signal) => {
96
+ const [tags, tagBindingMapByTagId] = await Promise.all([
97
+ _getTagMetaObjects(ObjectType.TAG, signal),
98
+ _getAllTagBindingMapByTagId(signal)
99
+ ]);
100
+ return tags.map((tag) => ({
101
+ tag,
102
+ bindings: tagBindingMapByTagId[tag.uuid] ?? []
103
+ }));
104
+ };
105
+ const getTagsByObjectId = async (objectId, signal) => {
106
+ const tags = await getTags(signal);
107
+ const keboolaObjectUID = keboolaUID.serialize(objectId);
108
+ const mapByTagId = tags.reduce((acc, { tag, bindings }) => {
109
+ acc[tag.uuid] = new Set(bindings.map((binding) => binding.data.objectUID));
110
+ return acc;
111
+ }, {});
112
+ return tags.filter(({ tag }) => mapByTagId[tag.uuid]?.has(keboolaObjectUID));
113
+ };
114
+ const createTag = async (data, meta = {}) => {
115
+ const {
116
+ data: { attributes: tag }
117
+ } = await metastoreClient.repository.createMetaObject({
118
+ objectType: ObjectType.TAG,
119
+ data,
120
+ name: generateUUID(),
121
+ ...meta
122
+ });
123
+ return tag;
124
+ };
125
+ const updateTag = async (tagUUID, data, meta = {}) => {
126
+ const {
127
+ data: { attributes: tag }
128
+ } = await metastoreClient.repository.updateMetaObject({
129
+ objectType: ObjectType.TAG,
130
+ UUID: tagUUID,
131
+ data,
132
+ ...meta
133
+ });
134
+ return tag;
135
+ };
136
+ const deleteTag = async (tagUUID) => {
137
+ const allBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING);
138
+ const tagBindings = allBindings.filter(({ data }) => data.tagUUID === tagUUID);
139
+ await Promise.all([
140
+ // delete tag itself
141
+ metastoreClient.repository.deleteMetaObject({
142
+ objectType: ObjectType.TAG,
143
+ UUID: tagUUID
144
+ }),
145
+ // delete all tag associations
146
+ _deleteTagBindings(tagBindings)
147
+ ]);
148
+ };
149
+ const assignTags = async (tagUUIDs, objectId, meta = {}) => {
150
+ const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectId);
151
+ const unassignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] === null);
152
+ await concurrent({
153
+ items: unassignedTagUUIDs,
154
+ process: async (tagUUID) => metastoreClient.repository.createMetaObject({
155
+ objectType: ObjectType.TAG_BINDING,
156
+ data: {
157
+ objectUID: keboolaUID.serialize(objectId),
158
+ tagUUID
159
+ },
160
+ name: generateUUID(),
161
+ ...meta
162
+ }),
163
+ concurrency: 5
164
+ });
165
+ };
166
+ const unassignTags = async (tagUUIDs, objectID) => {
167
+ const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectID);
168
+ const assignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] !== null);
169
+ const tagBindings = assignedTagUUIDs.map((tagUUID) => tagBindingMapByTagId[tagUUID]);
170
+ await concurrent({
171
+ items: tagBindings,
172
+ process: async (tagBinding) => metastoreClient.repository.deleteMetaObject({
173
+ objectType: ObjectType.TAG_BINDING,
174
+ UUID: tagBinding.uuid
175
+ }),
176
+ concurrency: 5
177
+ });
178
+ };
179
+ const unassignAllTags = async (objectID, signal) => {
180
+ const tagBindings = await _getTagMetaObjects(ObjectType.TAG_BINDING, signal);
181
+ const objectsTagBindings = tagBindings.filter(
182
+ ({ data }) => data.objectUID === keboolaUID.serialize(objectID)
183
+ );
184
+ await _deleteTagBindings(objectsTagBindings);
185
+ };
186
+ const createAndAssignTag = async (data, objectId, meta = {}) => {
187
+ const tag = await createTag(data, meta);
188
+ await assignTags([tag.uuid], objectId, meta);
189
+ return tag;
190
+ };
191
+ return {
192
+ // retrievals
193
+ getTags,
194
+ getTagsByObjectId,
195
+ // modifications
196
+ createTag,
197
+ updateTag,
198
+ deleteTag,
199
+ assignTags,
200
+ unassignTags,
201
+ unassignAllTags,
202
+ createAndAssignTag
203
+ };
204
+ };
205
+
206
+ export { createTagSdk };
207
+ //# sourceMappingURL=index.js.map
208
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/concurrent.ts","../../../src/utils/keboolaUID.ts","../../../src/utils/generateUUID.ts","../../../src/sdks/tag/tagSdk.ts"],"names":[],"mappings":";AAgBO,IAAM,aAAa,OAAa;AAAA,EACrC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,cAAc;AAChB,CAAA,KAA6C;AAC3C,EAAA,IAAI,WAAA,GAAc,CAAA,EAAG,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACzE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,IAAI,WAAA,KAAgB,QAAA;AAClB,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAEnF,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,MAAM,OAAA,GAAe,IAAI,KAAA,CAAM,CAAC,CAAA;AAEhC,EAAA,MAAM,yBAAyB,WAAA,CAAY,WAAA;AAAA,IACzC,CAAC,IAAA,EAAM,UAAA,KAAe,UAAA,CAAW,IAAI,CAAA;AAAA,IACrC;AAAA,GACF;AAEA,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,UAAU,YAAY;AACnD,IAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAM,uBAAuB,IAAA,EAAM,KAAA,EAAO,MAAM,MAAM,CAAA;AAAA,EACzE,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,IACpB,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,WAAA,EAAa,KAAA,CAAM,MAAM,CAAA,EAAE;AAAA,IAC9C,eAAe,YAAA,GAAe;AAC5B,MAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,QAAA,MAAM,KAAA,CAAM,OAAM,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,CAAQ,IAAI,OAAO,CAAA;AACzB,EAAA,OAAO,OAAA;AACT,CAAA;;;ACjCA,IAAM,2BAAA,GAA8B,IAAA;AAS7B,IAAM,UAAA,GAAa;AAAA,EACxB,SAAA,EAAW,CAAC,KAAA,KAAmC;AAC7C,IAAA,IAAI,MAAM,GAAA,KAAQ,EAAA;AAChB,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAE/E,IAAA,OAAO,CAAC,KAAA,EAAO,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,MAAM,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,CAAK,2BAA2B,CAAA;AAAA,EACzF,CAAA;AAAA,EAEA,WAAA,EAAa,CAAC,KAAA,KAAmC;AAC/C,IAAA,MAAM,CAAC,YAAY,SAAA,EAAW,IAAA,EAAM,GAAG,CAAA,GAAI,KAAA,CAAM,MAAM,2BAA2B,CAAA;AAClF,IAAA,IAAI,eAAe,KAAA,IAAS,CAAC,SAAA,IAAa,CAAC,QAAQ,CAAC,GAAA;AAClD,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAE7C,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,OAAO,SAAS,CAAA;AAAA,MAC3B,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;AC7CO,IAAM,YAAA,GAAe,MAAM,MAAA,CAAO,UAAA,EAAW;;;ACYpD,IAAM,UAAA,GAAa;AAAA,EACjB,GAAA,EAAK,KAAA;AAAA,EACL,WAAA,EAAa;AACf,CAAA;AAOO,IAAM,YAAA,GAAe,CAAC,EAAE,eAAA,EAAgB,KAAe;AAC5D,EAAA,MAAM,kBAAA,GAAqB,OACzB,IAAA,EACA,MAAA,KACG;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,UAAA,CAAW,cAAA;AAAA,MAChD;AAAA,QACE,UAAA,EAAY;AAAA,OACd;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,UAAA,OAAiB,UAAU,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,2BAAA,GAA8B,OAAO,MAAA,KAAyB;AAClE,IAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmC,UAAA,CAAW,aAAa,MAAM,CAAA;AAC3F,IAAA,OAAO,OAAO,OAAA,CAAQ,WAAA,EAAa,CAAC,OAAA,KAAY,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtE,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,OAC/B,QAAA,EACA,QAAA,EACA,MAAA,KACG;AACH,IAAA,MAAM,oBAAA,GAAuB,MAAM,2BAAA,CAA4B,MAAM,CAAA;AACrE,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAA,CAAU,QAAQ,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,MAAA,CAA0D,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1F,MAAA,IAAI,GAAA,CAAI,OAAO,CAAA,EAAG,OAAO,GAAA;AAEzB,MAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAO,CAAA,IAAK,EAAC;AACtD,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,IAAA,CAAK,SAAA,KAAc,SAAS,CAAA,IAAK,IAAA;AACtF,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,OAAO,WAAA,KAA8C;AAC9E,IAAA,MAAM,UAAA,CAAW;AAAA,MACf,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,OAAO,OAAA,KACd,eAAA,CAAgB,WAAW,gBAAA,CAAiB;AAAA,QAC1C,YAAY,UAAA,CAAW,WAAA;AAAA,QACvB,MAAM,OAAA,CAAQ;AAAA,OACf,CAAA;AAAA,MACH,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,KAAyB;AAC9C,IAAA,MAAM,CAAC,IAAA,EAAM,oBAAoB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACrD,kBAAA,CAA4B,UAAA,CAAW,GAAA,EAAK,MAAM,CAAA;AAAA,MAClD,4BAA4B,MAAM;AAAA,KACnC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAqB,CAAC,GAAA,MAAS;AAAA,MACzC,GAAA;AAAA,MACA,QAAA,EAAU,oBAAA,CAAqB,GAAA,CAAI,IAAK,KAAK;AAAC,KAChD,CAAE,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,OAAO,QAAA,EAA2B,MAAA,KAAyB;AACnF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAM,CAAA;AAEjC,IAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,SAAA,CAAU,QAAQ,CAAA;AACtD,IAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAoC,CAAC,KAAK,EAAE,GAAA,EAAK,UAAS,KAAM;AACtF,MAAA,GAAA,CAAI,GAAA,CAAI,IAAK,CAAA,GAAI,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAC1E,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,UAAA,CAAW,GAAA,CAAI,IAAK,CAAA,EAAG,GAAA,CAAI,gBAAgB,CAAC,CAAA;AAAA,EAC9E,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,EAAe,IAAA,GAAsC,EAAC,KAAM;AACnF,IAAA,MAAM;AAAA,MACJ,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KAC1B,GAAI,MAAM,eAAA,CAAgB,UAAA,CAAW,gBAAA,CAAiB;AAAA,MACpD,YAAY,UAAA,CAAW,GAAA;AAAA,MACvB,IAAA;AAAA,MACA,MAAM,YAAA,EAAa;AAAA,MACnB,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,YAAY,OAChB,OAAA,EACA,IAAA,EACA,IAAA,GAAsC,EAAC,KACpC;AACH,IAAA,MAAM;AAAA,MACJ,IAAA,EAAM,EAAE,UAAA,EAAY,GAAA;AAAI,KAC1B,GAAI,MAAM,eAAA,CAAgB,UAAA,CAAW,gBAAA,CAA0B;AAAA,MAC7D,YAAY,UAAA,CAAW,GAAA;AAAA,MACvB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,OAAA,KAAoB;AAC3C,IAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmC,UAAA,CAAW,WAAW,CAAA;AACnF,IAAA,MAAM,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK,KAAM,IAAA,CAAK,OAAA,KAAY,OAAO,CAAA;AAE7E,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA;AAAA,MAEhB,eAAA,CAAgB,WAAW,gBAAA,CAAiB;AAAA,QAC1C,YAAY,UAAA,CAAW,GAAA;AAAA,QACvB,IAAA,EAAM;AAAA,OACP,CAAA;AAAA;AAAA,MAED,mBAAmB,WAAW;AAAA,KAC/B,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,OACjB,QAAA,EACA,QAAA,EACA,IAAA,GAAsC,EAAC,KACpC;AACH,IAAA,MAAM,oBAAA,GAAuB,MAAM,wBAAA,CAAyB,QAAA,EAAU,QAAQ,CAAA;AAE9E,IAAA,MAAM,kBAAA,GAAqB,SAAS,MAAA,CAAO,CAAC,YAAY,oBAAA,CAAqB,OAAO,MAAM,IAAI,CAAA;AAE9F,IAAA,MAAM,UAAA,CAAW;AAAA,MACf,KAAA,EAAO,kBAAA;AAAA,MACP,OAAA,EAAS,OAAO,OAAA,KACd,eAAA,CAAgB,WAAW,gBAAA,CAAiC;AAAA,QAC1D,YAAY,UAAA,CAAW,WAAA;AAAA,QACvB,IAAA,EAAM;AAAA,UACJ,SAAA,EAAW,UAAA,CAAW,SAAA,CAAU,QAAQ,CAAA;AAAA,UACxC;AAAA,SACF;AAAA,QACA,MAAM,YAAA,EAAa;AAAA,QACnB,GAAG;AAAA,OACJ,CAAA;AAAA,MACH,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,EAAoB,QAAA,KAA8B;AAC5E,IAAA,MAAM,oBAAA,GAAuB,MAAM,wBAAA,CAAyB,QAAA,EAAU,QAAQ,CAAA;AAC9E,IAAA,MAAM,gBAAA,GAAmB,SAAS,MAAA,CAAO,CAAC,YAAY,oBAAA,CAAqB,OAAO,MAAM,IAAI,CAAA;AAE5F,IAAA,MAAM,cAAc,gBAAA,CAAiB,GAAA,CAAI,CAAC,OAAA,KAAY,oBAAA,CAAqB,OAAO,CAAE,CAAA;AAEpF,IAAA,MAAM,UAAA,CAAW;AAAA,MACf,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,OAAO,UAAA,KACd,eAAA,CAAgB,WAAW,gBAAA,CAAiB;AAAA,QAC1C,YAAY,UAAA,CAAW,WAAA;AAAA,QACvB,MAAM,UAAA,CAAW;AAAA,OAClB,CAAA;AAAA,MACH,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,EAA2B,MAAA,KAAyB;AACjF,IAAA,MAAM,WAAA,GAAc,MAAM,kBAAA,CAAmC,UAAA,CAAW,aAAa,MAAM,CAAA;AAE3F,IAAA,MAAM,qBAAqB,WAAA,CAAY,MAAA;AAAA,MACrC,CAAC,EAAE,IAAA,EAAK,KAAM,KAAK,SAAA,KAAc,UAAA,CAAW,UAAU,QAAQ;AAAA,KAChE;AAEA,IAAA,MAAM,mBAAmB,kBAAkB,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,qBAAqB,OACzB,IAAA,EACA,QAAA,EACA,IAAA,GAAsC,EAAC,KACpC;AACH,IAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AACtC,IAAA,MAAM,WAAW,CAAC,GAAA,CAAI,IAAK,CAAA,EAAG,UAAU,IAAI,CAAA;AAC5C,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA;AAAA,IAEL,OAAA;AAAA,IACA,iBAAA;AAAA;AAAA,IAGA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.js","sourcesContent":["type ProcessFn<T, R> = (item: T, index: number, arrayLength: number) => Promise<R>;\nexport type MiddlewareFn<T, R> = (next: ProcessFn<T, R>) => ProcessFn<T, R>;\n\nexport type ConcurrentOptions<T, R> = {\n items: T[];\n process: ProcessFn<T, R>;\n concurrency?: number;\n middlewares?: MiddlewareFn<T, R>[];\n};\n\n/**\n * Executes an asynchronous callback function on an array of items, processing multiple items concurrently with a specified concurrency limit.\n * It behaves similarly to Promise.all(), failing on the first rejected promise.\n * The order of the results matches the order of the promises.\n * The API is the same as Bluebird.map().\n */\nexport const concurrent = async <T, R>({\n items,\n process,\n concurrency = 2,\n middlewares = [],\n}: ConcurrentOptions<T, R>): Promise<R[]> => {\n if (concurrency < 1) throw new Error('Concurrency must be greater than 0');\n if (items.length === 0) return [];\n if (concurrency === Infinity)\n return Promise.all(items.map((item, index) => process(item, index, items.length)));\n\n const n = items.length;\n const results: R[] = new Array(n);\n\n const processWithMiddlewares = middlewares.reduceRight(\n (next, middleware) => middleware(next),\n process,\n );\n\n const queue = items.map((item, index) => async () => {\n results[index] = await processWithMiddlewares(item, index, items.length);\n });\n\n const workers = Array.from(\n { length: Math.min(concurrency, items.length) },\n async function processQueue() {\n while (queue.length) {\n await queue.shift()?.();\n }\n },\n );\n\n await Promise.all(workers);\n return results;\n};\n","type KeboolaObjectType =\n | 'data-catalog'\n | 'table'\n | 'bucket'\n | 'flow'\n | 'configuration'\n | 'transformation'\n | 'data-app'\n | 'workspace';\n\nexport type KeboolaObjectId = {\n uid: string;\n type: KeboolaObjectType;\n projectId: number;\n};\n\n//As a delimiter for serialization, we use a double hyphen (--) instead of a single hyphen in type names.\nconst KEBOOLA_OBJECT_ID_DELIMITER = '--';\n\n/**\n * There is a proposal for a string format to identify objects in Keboola.\n *\n * https://keboola.atlassian.net/wiki/spaces/ENGG/pages/3967615431/Keboola+UUID+Format\n * Unfortunately, this format will not pass BE validation as `:` is not allowed in the `uid`, and the length is limited to 50 characters only.\n *\n */\nexport const keboolaUID = {\n serialize: (input: KeboolaObjectId): string => {\n if (input.uid === '')\n throw new Error('Invalid Keboola Object ID: uid of an object cannot be empty');\n\n return ['KID', input.projectId, input.type, input.uid].join(KEBOOLA_OBJECT_ID_DELIMITER);\n },\n\n deserialize: (input: string): KeboolaObjectId => {\n const [identifier, projectId, type, uid] = input.split(KEBOOLA_OBJECT_ID_DELIMITER);\n if (identifier !== 'KID' || !projectId || !type || !uid)\n throw new Error('Invalid Keboola Object ID');\n\n return {\n projectId: Number(projectId),\n type: type as KeboolaObjectType,\n uid,\n };\n },\n};\n","export const generateUUID = () => crypto.randomUUID();\n","import type { MetaObject } from '../../clients/metastore/repository/types';\nimport { concurrent, generateUUID, type KeboolaObjectId, keboolaUID } from '../../utils';\n\nimport type {\n CreateMetaObjectMetaDataInput,\n MetastoreClient,\n TagBindingData,\n TagData,\n TagWithBindings,\n UpdateMetaObjectMetaDataInput,\n} from './types';\n\nconst ObjectType = {\n TAG: 'tag',\n TAG_BINDING: 'tag-binding',\n};\ntype ObjectTypes = (typeof ObjectType)[keyof typeof ObjectType];\n\ntype Options = {\n metastoreClient: MetastoreClient;\n};\n\nexport const createTagSdk = ({ metastoreClient }: Options) => {\n const _getTagMetaObjects = async <T extends Record<string, unknown>>(\n type: ObjectTypes,\n signal?: AbortSignal,\n ) => {\n const response = await metastoreClient.repository.getMetaObjects<T>(\n {\n objectType: type,\n },\n signal,\n );\n return response.data.map(({ attributes }) => attributes);\n };\n\n const _getAllTagBindingMapByTagId = async (signal?: AbortSignal) => {\n const tagBindings = await _getTagMetaObjects<TagBindingData>(ObjectType.TAG_BINDING, signal);\n return Object.groupBy(tagBindings, (binding) => binding.data.tagUUID);\n };\n\n const _getTagBindingMapByTagId = async (\n tagUUIDs: string[],\n objectId: KeboolaObjectId,\n signal?: AbortSignal,\n ) => {\n const tagBindingMapByTagId = await _getAllTagBindingMapByTagId(signal);\n const objectUID = keboolaUID.serialize(objectId);\n return tagUUIDs.reduce<Record<string, MetaObject<TagBindingData> | null>>((acc, tagUUID) => {\n if (acc[tagUUID]) return acc; // filter out duplicated ids\n\n const tagBindings = tagBindingMapByTagId[tagUUID] ?? [];\n acc[tagUUID] = tagBindings.find((binding) => binding.data.objectUID === objectUID) ?? null;\n return acc;\n }, {});\n };\n\n const _deleteTagBindings = async (tagBindings: MetaObject<TagBindingData>[]) => {\n await concurrent({\n items: tagBindings,\n process: async (binding) =>\n metastoreClient.repository.deleteMetaObject({\n objectType: ObjectType.TAG_BINDING,\n UUID: binding.uuid!,\n }),\n concurrency: 5,\n });\n };\n\n const getTags = async (signal?: AbortSignal) => {\n const [tags, tagBindingMapByTagId] = await Promise.all([\n _getTagMetaObjects<TagData>(ObjectType.TAG, signal),\n _getAllTagBindingMapByTagId(signal),\n ]);\n\n return tags.map<TagWithBindings>((tag) => ({\n tag,\n bindings: tagBindingMapByTagId[tag.uuid!] ?? [],\n }));\n };\n\n const getTagsByObjectId = async (objectId: KeboolaObjectId, signal?: AbortSignal) => {\n const tags = await getTags(signal);\n\n const keboolaObjectUID = keboolaUID.serialize(objectId);\n const mapByTagId = tags.reduce<Record<string, Set<string>>>((acc, { tag, bindings }) => {\n acc[tag.uuid!] = new Set(bindings.map((binding) => binding.data.objectUID));\n return acc;\n }, {});\n\n return tags.filter(({ tag }) => mapByTagId[tag.uuid!]?.has(keboolaObjectUID));\n };\n\n const createTag = async (data: TagData, meta: CreateMetaObjectMetaDataInput = {}) => {\n const {\n data: { attributes: tag },\n } = await metastoreClient.repository.createMetaObject({\n objectType: ObjectType.TAG,\n data,\n name: generateUUID(),\n ...meta,\n });\n\n return tag;\n };\n\n const updateTag = async (\n tagUUID: string,\n data: TagData,\n meta: UpdateMetaObjectMetaDataInput = {},\n ) => {\n const {\n data: { attributes: tag },\n } = await metastoreClient.repository.updateMetaObject<TagData>({\n objectType: ObjectType.TAG,\n UUID: tagUUID,\n data,\n ...meta,\n });\n\n return tag;\n };\n\n const deleteTag = async (tagUUID: string) => {\n const allBindings = await _getTagMetaObjects<TagBindingData>(ObjectType.TAG_BINDING);\n const tagBindings = allBindings.filter(({ data }) => data.tagUUID === tagUUID);\n\n await Promise.all([\n // delete tag itself\n metastoreClient.repository.deleteMetaObject({\n objectType: ObjectType.TAG,\n UUID: tagUUID,\n }),\n // delete all tag associations\n _deleteTagBindings(tagBindings),\n ]);\n };\n\n const assignTags = async (\n tagUUIDs: string[],\n objectId: KeboolaObjectId,\n meta: CreateMetaObjectMetaDataInput = {},\n ) => {\n const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectId);\n // Assign only the unassigned tag IDs. Ignore the rest.\n const unassignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] === null);\n\n await concurrent({\n items: unassignedTagUUIDs,\n process: async (tagUUID) =>\n metastoreClient.repository.createMetaObject<TagBindingData>({\n objectType: ObjectType.TAG_BINDING,\n data: {\n objectUID: keboolaUID.serialize(objectId),\n tagUUID: tagUUID,\n },\n name: generateUUID(),\n ...meta,\n }),\n concurrency: 5,\n });\n };\n\n const unassignTags = async (tagUUIDs: string[], objectID: KeboolaObjectId) => {\n const tagBindingMapByTagId = await _getTagBindingMapByTagId(tagUUIDs, objectID);\n const assignedTagUUIDs = tagUUIDs.filter((tagUUID) => tagBindingMapByTagId[tagUUID] !== null);\n\n const tagBindings = assignedTagUUIDs.map((tagUUID) => tagBindingMapByTagId[tagUUID]!);\n\n await concurrent({\n items: tagBindings,\n process: async (tagBinding) =>\n metastoreClient.repository.deleteMetaObject({\n objectType: ObjectType.TAG_BINDING,\n UUID: tagBinding.uuid!,\n }),\n concurrency: 5,\n });\n };\n\n const unassignAllTags = async (objectID: KeboolaObjectId, signal?: AbortSignal) => {\n const tagBindings = await _getTagMetaObjects<TagBindingData>(ObjectType.TAG_BINDING, signal);\n\n const objectsTagBindings = tagBindings.filter(\n ({ data }) => data.objectUID === keboolaUID.serialize(objectID),\n );\n\n await _deleteTagBindings(objectsTagBindings);\n };\n\n const createAndAssignTag = async (\n data: TagData,\n objectId: KeboolaObjectId,\n meta: CreateMetaObjectMetaDataInput = {},\n ) => {\n const tag = await createTag(data, meta);\n await assignTags([tag.uuid!], objectId, meta);\n return tag;\n };\n\n return {\n // retrievals\n getTags,\n getTagsByObjectId,\n\n // modifications\n createTag,\n updateTag,\n deleteTag,\n assignTags,\n unassignTags,\n unassignAllTags,\n createAndAssignTag,\n };\n};\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=types.cjs.map
4
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.cjs"}
@@ -0,0 +1,30 @@
1
+ import { createMetastoreClient } from '../../metastore/index.cjs';
2
+ import { M as MetaObject, C as CreateMetaObjectInput, U as UpdateMetaObjectInput } from '../../types-C-bd4ArM.cjs';
3
+ import '../../createOpenapiFetchClient-CpXmAIFB.cjs';
4
+ import '../../types-DgaMV8FF.cjs';
5
+ import 'qs';
6
+ import '../../types-C7mpAfq-.cjs';
7
+
8
+ type MetastoreClient = ReturnType<typeof createMetastoreClient>;
9
+
10
+ type TagData = {
11
+ name: string;
12
+ color: string;
13
+ creator: {
14
+ id: string;
15
+ email: string;
16
+ name?: string;
17
+ };
18
+ };
19
+ type TagBindingData = {
20
+ tagUUID: string;
21
+ objectUID: string;
22
+ };
23
+ type TagWithBindings = {
24
+ tag: MetaObject<TagData>;
25
+ bindings: MetaObject<TagBindingData>[];
26
+ };
27
+ type CreateMetaObjectMetaDataInput = Omit<CreateMetaObjectInput, 'data' | 'objectType'>;
28
+ type UpdateMetaObjectMetaDataInput = Omit<UpdateMetaObjectInput, 'data' | 'objectType' | 'UUID'>;
29
+
30
+ export type { CreateMetaObjectMetaDataInput, MetastoreClient, TagBindingData, TagData, TagWithBindings, UpdateMetaObjectMetaDataInput };
@@ -0,0 +1,30 @@
1
+ import { createMetastoreClient } from '../../metastore/index.js';
2
+ import { M as MetaObject, C as CreateMetaObjectInput, U as UpdateMetaObjectInput } from '../../types-BY0tjg2Q.js';
3
+ import '../../createOpenapiFetchClient-_sm4bchL.js';
4
+ import '../../types-DgaMV8FF.js';
5
+ import 'qs';
6
+ import '../../types-C7mpAfq-.js';
7
+
8
+ type MetastoreClient = ReturnType<typeof createMetastoreClient>;
9
+
10
+ type TagData = {
11
+ name: string;
12
+ color: string;
13
+ creator: {
14
+ id: string;
15
+ email: string;
16
+ name?: string;
17
+ };
18
+ };
19
+ type TagBindingData = {
20
+ tagUUID: string;
21
+ objectUID: string;
22
+ };
23
+ type TagWithBindings = {
24
+ tag: MetaObject<TagData>;
25
+ bindings: MetaObject<TagBindingData>[];
26
+ };
27
+ type CreateMetaObjectMetaDataInput = Omit<CreateMetaObjectInput, 'data' | 'objectType'>;
28
+ type UpdateMetaObjectMetaDataInput = Omit<UpdateMetaObjectInput, 'data' | 'objectType' | 'UUID'>;
29
+
30
+ export type { CreateMetaObjectMetaDataInput, MetastoreClient, TagBindingData, TagData, TagWithBindings, UpdateMetaObjectMetaDataInput };
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=types.js.map
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"}