@caracal-lynx/sluice 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 (281) hide show
  1. package/CLAUDE.md +1822 -0
  2. package/LICENCE-FAQ.md +74 -0
  3. package/LICENSE +92 -0
  4. package/README.md +582 -0
  5. package/dist/adapters/source/csv.d.ts +10 -0
  6. package/dist/adapters/source/csv.d.ts.map +1 -0
  7. package/dist/adapters/source/csv.js +110 -0
  8. package/dist/adapters/source/csv.js.map +1 -0
  9. package/dist/adapters/source/index.d.ts +9 -0
  10. package/dist/adapters/source/index.d.ts.map +1 -0
  11. package/dist/adapters/source/index.js +26 -0
  12. package/dist/adapters/source/index.js.map +1 -0
  13. package/dist/adapters/source/mssql.d.ts +11 -0
  14. package/dist/adapters/source/mssql.d.ts.map +1 -0
  15. package/dist/adapters/source/mssql.js +230 -0
  16. package/dist/adapters/source/mssql.js.map +1 -0
  17. package/dist/adapters/source/pg.d.ts +11 -0
  18. package/dist/adapters/source/pg.d.ts.map +1 -0
  19. package/dist/adapters/source/pg.js +88 -0
  20. package/dist/adapters/source/pg.js.map +1 -0
  21. package/dist/adapters/source/registry.d.ts +10 -0
  22. package/dist/adapters/source/registry.d.ts.map +1 -0
  23. package/dist/adapters/source/registry.js +36 -0
  24. package/dist/adapters/source/registry.js.map +1 -0
  25. package/dist/adapters/source/rest.d.ts +16 -0
  26. package/dist/adapters/source/rest.d.ts.map +1 -0
  27. package/dist/adapters/source/rest.js +182 -0
  28. package/dist/adapters/source/rest.js.map +1 -0
  29. package/dist/adapters/source/rest.types.d.ts +15 -0
  30. package/dist/adapters/source/rest.types.d.ts.map +1 -0
  31. package/dist/adapters/source/rest.types.js +6 -0
  32. package/dist/adapters/source/rest.types.js.map +1 -0
  33. package/dist/adapters/source/types.d.ts +23 -0
  34. package/dist/adapters/source/types.d.ts.map +1 -0
  35. package/dist/adapters/source/types.js +4 -0
  36. package/dist/adapters/source/types.js.map +1 -0
  37. package/dist/adapters/source/xlsx.d.ts +10 -0
  38. package/dist/adapters/source/xlsx.d.ts.map +1 -0
  39. package/dist/adapters/source/xlsx.js +71 -0
  40. package/dist/adapters/source/xlsx.js.map +1 -0
  41. package/dist/adapters/target/bc.d.ts +21 -0
  42. package/dist/adapters/target/bc.d.ts.map +1 -0
  43. package/dist/adapters/target/bc.js +188 -0
  44. package/dist/adapters/target/bc.js.map +1 -0
  45. package/dist/adapters/target/bluecherry.d.ts +10 -0
  46. package/dist/adapters/target/bluecherry.d.ts.map +1 -0
  47. package/dist/adapters/target/bluecherry.js +127 -0
  48. package/dist/adapters/target/bluecherry.js.map +1 -0
  49. package/dist/adapters/target/csv.d.ts +10 -0
  50. package/dist/adapters/target/csv.d.ts.map +1 -0
  51. package/dist/adapters/target/csv.js +40 -0
  52. package/dist/adapters/target/csv.js.map +1 -0
  53. package/dist/adapters/target/ifs.d.ts +10 -0
  54. package/dist/adapters/target/ifs.d.ts.map +1 -0
  55. package/dist/adapters/target/ifs.js +55 -0
  56. package/dist/adapters/target/ifs.js.map +1 -0
  57. package/dist/adapters/target/index.d.ts +8 -0
  58. package/dist/adapters/target/index.d.ts.map +1 -0
  59. package/dist/adapters/target/index.js +22 -0
  60. package/dist/adapters/target/index.js.map +1 -0
  61. package/dist/adapters/target/pg.d.ts +11 -0
  62. package/dist/adapters/target/pg.d.ts.map +1 -0
  63. package/dist/adapters/target/pg.js +103 -0
  64. package/dist/adapters/target/pg.js.map +1 -0
  65. package/dist/adapters/target/registry.d.ts +9 -0
  66. package/dist/adapters/target/registry.d.ts.map +1 -0
  67. package/dist/adapters/target/registry.js +29 -0
  68. package/dist/adapters/target/registry.js.map +1 -0
  69. package/dist/adapters/target/types.d.ts +15 -0
  70. package/dist/adapters/target/types.d.ts.map +1 -0
  71. package/dist/adapters/target/types.js +4 -0
  72. package/dist/adapters/target/types.js.map +1 -0
  73. package/dist/cli.d.ts +25 -0
  74. package/dist/cli.d.ts.map +1 -0
  75. package/dist/cli.js +354 -0
  76. package/dist/cli.js.map +1 -0
  77. package/dist/config/index.d.ts +4 -0
  78. package/dist/config/index.d.ts.map +1 -0
  79. package/dist/config/index.js +6 -0
  80. package/dist/config/index.js.map +1 -0
  81. package/dist/config/loader.d.ts +5 -0
  82. package/dist/config/loader.d.ts.map +1 -0
  83. package/dist/config/loader.js +135 -0
  84. package/dist/config/loader.js.map +1 -0
  85. package/dist/config/schema.d.ts +4162 -0
  86. package/dist/config/schema.d.ts.map +1 -0
  87. package/dist/config/schema.js +263 -0
  88. package/dist/config/schema.js.map +1 -0
  89. package/dist/config/types.d.ts +3 -0
  90. package/dist/config/types.d.ts.map +1 -0
  91. package/dist/config/types.js +4 -0
  92. package/dist/config/types.js.map +1 -0
  93. package/dist/dq/engine.d.ts +10 -0
  94. package/dist/dq/engine.d.ts.map +1 -0
  95. package/dist/dq/engine.js +114 -0
  96. package/dist/dq/engine.js.map +1 -0
  97. package/dist/dq/index.d.ts +6 -0
  98. package/dist/dq/index.d.ts.map +1 -0
  99. package/dist/dq/index.js +6 -0
  100. package/dist/dq/index.js.map +1 -0
  101. package/dist/dq/reporter.d.ts +5 -0
  102. package/dist/dq/reporter.d.ts.map +1 -0
  103. package/dist/dq/reporter.js +41 -0
  104. package/dist/dq/reporter.js.map +1 -0
  105. package/dist/dq/rules/allowedValues.d.ts +7 -0
  106. package/dist/dq/rules/allowedValues.d.ts.map +1 -0
  107. package/dist/dq/rules/allowedValues.js +26 -0
  108. package/dist/dq/rules/allowedValues.js.map +1 -0
  109. package/dist/dq/rules/email.d.ts +7 -0
  110. package/dist/dq/rules/email.d.ts.map +1 -0
  111. package/dist/dq/rules/email.js +24 -0
  112. package/dist/dq/rules/email.js.map +1 -0
  113. package/dist/dq/rules/index.d.ts +15 -0
  114. package/dist/dq/rules/index.d.ts.map +1 -0
  115. package/dist/dq/rules/index.js +30 -0
  116. package/dist/dq/rules/index.js.map +1 -0
  117. package/dist/dq/rules/maxLength.d.ts +7 -0
  118. package/dist/dq/rules/maxLength.d.ts.map +1 -0
  119. package/dist/dq/rules/maxLength.js +25 -0
  120. package/dist/dq/rules/maxLength.js.map +1 -0
  121. package/dist/dq/rules/minMax.d.ts +11 -0
  122. package/dist/dq/rules/minMax.d.ts.map +1 -0
  123. package/dist/dq/rules/minMax.js +52 -0
  124. package/dist/dq/rules/minMax.js.map +1 -0
  125. package/dist/dq/rules/notNull.d.ts +7 -0
  126. package/dist/dq/rules/notNull.d.ts.map +1 -0
  127. package/dist/dq/rules/notNull.js +21 -0
  128. package/dist/dq/rules/notNull.js.map +1 -0
  129. package/dist/dq/rules/pattern.d.ts +7 -0
  130. package/dist/dq/rules/pattern.d.ts.map +1 -0
  131. package/dist/dq/rules/pattern.js +31 -0
  132. package/dist/dq/rules/pattern.js.map +1 -0
  133. package/dist/dq/rules/types.d.ts +6 -0
  134. package/dist/dq/rules/types.d.ts.map +1 -0
  135. package/dist/dq/rules/types.js +4 -0
  136. package/dist/dq/rules/types.js.map +1 -0
  137. package/dist/dq/rules/ukPostcode.d.ts +7 -0
  138. package/dist/dq/rules/ukPostcode.d.ts.map +1 -0
  139. package/dist/dq/rules/ukPostcode.js +24 -0
  140. package/dist/dq/rules/ukPostcode.js.map +1 -0
  141. package/dist/dq/rules/unique.d.ts +14 -0
  142. package/dist/dq/rules/unique.d.ts.map +1 -0
  143. package/dist/dq/rules/unique.js +9 -0
  144. package/dist/dq/rules/unique.js.map +1 -0
  145. package/dist/dq/types.d.ts +29 -0
  146. package/dist/dq/types.d.ts.map +1 -0
  147. package/dist/dq/types.js +4 -0
  148. package/dist/dq/types.js.map +1 -0
  149. package/dist/enrich/types.d.ts +87 -0
  150. package/dist/enrich/types.d.ts.map +1 -0
  151. package/dist/enrich/types.js +4 -0
  152. package/dist/enrich/types.js.map +1 -0
  153. package/dist/index.d.ts +17 -0
  154. package/dist/index.d.ts.map +1 -0
  155. package/dist/index.js +17 -0
  156. package/dist/index.js.map +1 -0
  157. package/dist/merge/conflict-log.d.ts +9 -0
  158. package/dist/merge/conflict-log.d.ts.map +1 -0
  159. package/dist/merge/conflict-log.js +28 -0
  160. package/dist/merge/conflict-log.js.map +1 -0
  161. package/dist/merge/engine.d.ts +7 -0
  162. package/dist/merge/engine.d.ts.map +1 -0
  163. package/dist/merge/engine.js +19 -0
  164. package/dist/merge/engine.js.map +1 -0
  165. package/dist/merge/index.d.ts +11 -0
  166. package/dist/merge/index.d.ts.map +1 -0
  167. package/dist/merge/index.js +34 -0
  168. package/dist/merge/index.js.map +1 -0
  169. package/dist/merge/sql-builder.d.ts +19 -0
  170. package/dist/merge/sql-builder.d.ts.map +1 -0
  171. package/dist/merge/sql-builder.js +148 -0
  172. package/dist/merge/sql-builder.js.map +1 -0
  173. package/dist/merge/strategies/coalesce.d.ts +17 -0
  174. package/dist/merge/strategies/coalesce.d.ts.map +1 -0
  175. package/dist/merge/strategies/coalesce.js +77 -0
  176. package/dist/merge/strategies/coalesce.js.map +1 -0
  177. package/dist/merge/strategies/index.d.ts +5 -0
  178. package/dist/merge/strategies/index.d.ts.map +1 -0
  179. package/dist/merge/strategies/index.js +7 -0
  180. package/dist/merge/strategies/index.js.map +1 -0
  181. package/dist/merge/strategies/intersect.d.ts +17 -0
  182. package/dist/merge/strategies/intersect.d.ts.map +1 -0
  183. package/dist/merge/strategies/intersect.js +75 -0
  184. package/dist/merge/strategies/intersect.js.map +1 -0
  185. package/dist/merge/strategies/priority-override.d.ts +16 -0
  186. package/dist/merge/strategies/priority-override.d.ts.map +1 -0
  187. package/dist/merge/strategies/priority-override.js +78 -0
  188. package/dist/merge/strategies/priority-override.js.map +1 -0
  189. package/dist/merge/strategies/registry.d.ts +8 -0
  190. package/dist/merge/strategies/registry.d.ts.map +1 -0
  191. package/dist/merge/strategies/registry.js +19 -0
  192. package/dist/merge/strategies/registry.js.map +1 -0
  193. package/dist/merge/strategies/union.d.ts +15 -0
  194. package/dist/merge/strategies/union.d.ts.map +1 -0
  195. package/dist/merge/strategies/union.js +75 -0
  196. package/dist/merge/strategies/union.js.map +1 -0
  197. package/dist/merge/types.d.ts +24 -0
  198. package/dist/merge/types.d.ts.map +1 -0
  199. package/dist/merge/types.js +4 -0
  200. package/dist/merge/types.js.map +1 -0
  201. package/dist/multi-source-runner.d.ts +22 -0
  202. package/dist/multi-source-runner.d.ts.map +1 -0
  203. package/dist/multi-source-runner.js +398 -0
  204. package/dist/multi-source-runner.js.map +1 -0
  205. package/dist/plugins/index.d.ts +4 -0
  206. package/dist/plugins/index.d.ts.map +1 -0
  207. package/dist/plugins/index.js +5 -0
  208. package/dist/plugins/index.js.map +1 -0
  209. package/dist/plugins/loader.d.ts +22 -0
  210. package/dist/plugins/loader.d.ts.map +1 -0
  211. package/dist/plugins/loader.js +151 -0
  212. package/dist/plugins/loader.js.map +1 -0
  213. package/dist/plugins/registry.d.ts +25 -0
  214. package/dist/plugins/registry.d.ts.map +1 -0
  215. package/dist/plugins/registry.js +42 -0
  216. package/dist/plugins/registry.js.map +1 -0
  217. package/dist/plugins/types.d.ts +61 -0
  218. package/dist/plugins/types.d.ts.map +1 -0
  219. package/dist/plugins/types.js +4 -0
  220. package/dist/plugins/types.js.map +1 -0
  221. package/dist/runner.d.ts +97 -0
  222. package/dist/runner.d.ts.map +1 -0
  223. package/dist/runner.js +520 -0
  224. package/dist/runner.js.map +1 -0
  225. package/dist/staging/index.d.ts +3 -0
  226. package/dist/staging/index.d.ts.map +1 -0
  227. package/dist/staging/index.js +5 -0
  228. package/dist/staging/index.js.map +1 -0
  229. package/dist/staging/schema.d.ts +19 -0
  230. package/dist/staging/schema.d.ts.map +1 -0
  231. package/dist/staging/schema.js +15 -0
  232. package/dist/staging/schema.js.map +1 -0
  233. package/dist/staging/store.d.ts +71 -0
  234. package/dist/staging/store.d.ts.map +1 -0
  235. package/dist/staging/store.js +270 -0
  236. package/dist/staging/store.js.map +1 -0
  237. package/dist/transform/cleanse.d.ts +2 -0
  238. package/dist/transform/cleanse.d.ts.map +1 -0
  239. package/dist/transform/cleanse.js +59 -0
  240. package/dist/transform/cleanse.js.map +1 -0
  241. package/dist/transform/engine.d.ts +10 -0
  242. package/dist/transform/engine.d.ts.map +1 -0
  243. package/dist/transform/engine.js +225 -0
  244. package/dist/transform/engine.js.map +1 -0
  245. package/dist/transform/expression.d.ts +5 -0
  246. package/dist/transform/expression.d.ts.map +1 -0
  247. package/dist/transform/expression.js +52 -0
  248. package/dist/transform/expression.js.map +1 -0
  249. package/dist/transform/index.d.ts +6 -0
  250. package/dist/transform/index.d.ts.map +1 -0
  251. package/dist/transform/index.js +7 -0
  252. package/dist/transform/index.js.map +1 -0
  253. package/dist/transform/lookup.d.ts +10 -0
  254. package/dist/transform/lookup.d.ts.map +1 -0
  255. package/dist/transform/lookup.js +66 -0
  256. package/dist/transform/lookup.js.map +1 -0
  257. package/dist/transform/types.d.ts +10 -0
  258. package/dist/transform/types.d.ts.map +1 -0
  259. package/dist/transform/types.js +4 -0
  260. package/dist/transform/types.js.map +1 -0
  261. package/dist/utils/env.d.ts +3 -0
  262. package/dist/utils/env.d.ts.map +1 -0
  263. package/dist/utils/env.js +26 -0
  264. package/dist/utils/env.js.map +1 -0
  265. package/dist/utils/errors.d.ts +26 -0
  266. package/dist/utils/errors.d.ts.map +1 -0
  267. package/dist/utils/errors.js +39 -0
  268. package/dist/utils/errors.js.map +1 -0
  269. package/dist/utils/index.d.ts +5 -0
  270. package/dist/utils/index.d.ts.map +1 -0
  271. package/dist/utils/index.js +7 -0
  272. package/dist/utils/index.js.map +1 -0
  273. package/dist/utils/logger.d.ts +14 -0
  274. package/dist/utils/logger.d.ts.map +1 -0
  275. package/dist/utils/logger.js +16 -0
  276. package/dist/utils/logger.js.map +1 -0
  277. package/dist/utils/progress.d.ts +66 -0
  278. package/dist/utils/progress.d.ts.map +1 -0
  279. package/dist/utils/progress.js +283 -0
  280. package/dist/utils/progress.js.map +1 -0
  281. package/package.json +92 -0
@@ -0,0 +1,182 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * REST source adapter.
5
+ *
6
+ * - axios + axios-retry (3 retries, exponential backoff, 429 + 5xx)
7
+ * - Flattens nested JSON objects using `__` separator (`a.b` → `a__b`)
8
+ * - Three pagination styles supported: offset, page, cursor
9
+ * - `targetTable` defaults to 'stg_raw'.
10
+ */
11
+ import axios from 'axios';
12
+ import axiosRetry from 'axios-retry';
13
+ import { SourceError } from '../../utils/errors.js';
14
+ import { logger } from '../../utils/logger.js';
15
+ function getPath(obj, dotPath) {
16
+ let cur = obj;
17
+ for (const key of dotPath.split('.')) {
18
+ if (cur === null || cur === undefined || typeof cur !== 'object')
19
+ return undefined;
20
+ cur = cur[key];
21
+ }
22
+ return cur;
23
+ }
24
+ function flatten(obj, prefix = '', out = {}) {
25
+ for (const [k, v] of Object.entries(obj)) {
26
+ const key = prefix ? `${prefix}__${k}` : k;
27
+ if (v !== null && typeof v === 'object' && !Array.isArray(v)) {
28
+ flatten(v, key, out);
29
+ }
30
+ else {
31
+ out[key] = Array.isArray(v) ? JSON.stringify(v) : v;
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ export class RestSourceAdapter {
37
+ id = 'rest';
38
+ client = null;
39
+ async connect(config) {
40
+ if (!config.endpoint) {
41
+ throw new SourceError('rest source requires `endpoint`');
42
+ }
43
+ const axiosCfg = { timeout: 30000 };
44
+ if (config.headers)
45
+ axiosCfg.headers = config.headers;
46
+ const client = axios.create(axiosCfg);
47
+ axiosRetry(client, {
48
+ retries: 3,
49
+ retryDelay: axiosRetry.exponentialDelay,
50
+ retryCondition: (err) => {
51
+ const status = err.response?.status;
52
+ return (axiosRetry.isNetworkOrIdempotentRequestError(err) ||
53
+ status === 429 ||
54
+ (status !== undefined && status >= 500));
55
+ },
56
+ });
57
+ this.client = client;
58
+ }
59
+ async disconnect() {
60
+ this.client = null;
61
+ }
62
+ async extract(config, store, runConfig, onProgress, targetTable = 'stg_raw') {
63
+ if (!config.endpoint)
64
+ throw new SourceError('rest source requires `endpoint`');
65
+ if (!this.client)
66
+ throw new SourceError('rest: not connected');
67
+ const pagination = config.pagination;
68
+ let allRecords = [];
69
+ if (!pagination) {
70
+ allRecords = await this.fetchOne(config.endpoint, config, undefined);
71
+ }
72
+ else {
73
+ allRecords = await this.fetchPaged(config.endpoint, config, pagination);
74
+ }
75
+ if (allRecords.length === 0) {
76
+ throw new SourceError(`rest endpoint "${config.endpoint}" returned zero records`);
77
+ }
78
+ const flatRecords = allRecords.map((r) => flatten(r));
79
+ const columns = collectColumns(flatRecords);
80
+ await store.createTable(targetTable, columns);
81
+ for (let i = 0; i < flatRecords.length; i += runConfig.batchSize) {
82
+ const batch = flatRecords.slice(i, i + runConfig.batchSize);
83
+ await store.insertBatch(targetTable, batch);
84
+ onProgress(Math.min(i + batch.length, flatRecords.length));
85
+ }
86
+ return { rowsExtracted: flatRecords.length, tableName: targetTable, columns };
87
+ }
88
+ async fetchOne(endpoint, config, params) {
89
+ const body = await this.get(endpoint, params);
90
+ const dataField = config.pagination?.dataField;
91
+ const data = dataField ? getPath(body, dataField) : body;
92
+ if (!Array.isArray(data)) {
93
+ throw new SourceError(`rest: expected an array at dataField "${dataField ?? '(root)'}", got ${typeof data}`);
94
+ }
95
+ return data;
96
+ }
97
+ async fetchPaged(endpoint, config, pagination) {
98
+ const pageSize = pagination.pageSize;
99
+ const dataField = pagination.dataField ?? 'data';
100
+ const pageParam = pagination.pageParam ?? 'page';
101
+ const totalField = pagination.totalField;
102
+ const all = [];
103
+ let page = 0;
104
+ let offset = 0;
105
+ let cursor;
106
+ let total;
107
+ while (true) {
108
+ const params = {};
109
+ if (pagination.type === 'offset') {
110
+ params[pageParam] = offset;
111
+ params['limit'] = pageSize;
112
+ }
113
+ else if (pagination.type === 'page') {
114
+ params[pageParam] = page + 1;
115
+ params['pageSize'] = pageSize;
116
+ }
117
+ else {
118
+ if (cursor !== undefined) {
119
+ const cursorParam = pagination.cursorParam ?? 'cursor';
120
+ params[cursorParam] = cursor;
121
+ }
122
+ }
123
+ const body = await this.get(endpoint, params);
124
+ const chunk = getPath(body, dataField);
125
+ if (!Array.isArray(chunk)) {
126
+ throw new SourceError(`rest: expected array at dataField "${dataField}" on page ${page}`);
127
+ }
128
+ all.push(...chunk);
129
+ if (total === undefined && totalField) {
130
+ const t = getPath(body, totalField);
131
+ if (typeof t === 'number')
132
+ total = t;
133
+ }
134
+ if (chunk.length === 0)
135
+ break;
136
+ if (pagination.type === 'offset') {
137
+ offset += chunk.length;
138
+ if (total !== undefined && offset >= total)
139
+ break;
140
+ if (chunk.length < pageSize)
141
+ break;
142
+ }
143
+ else if (pagination.type === 'page') {
144
+ page += 1;
145
+ if (total !== undefined && all.length >= total)
146
+ break;
147
+ if (chunk.length < pageSize)
148
+ break;
149
+ }
150
+ else {
151
+ const cursorField = pagination.cursorField;
152
+ if (!cursorField) {
153
+ throw new SourceError('rest: cursor pagination requires `pagination.cursorField`');
154
+ }
155
+ const next = getPath(body, cursorField);
156
+ if (next === null || next === undefined || next === '')
157
+ break;
158
+ cursor = String(next);
159
+ }
160
+ }
161
+ logger.debug({ total: all.length, pagination: pagination.type }, 'rest: paged fetch complete');
162
+ return all;
163
+ }
164
+ async get(url, params) {
165
+ try {
166
+ const res = await this.client.get(url, { params });
167
+ return res.data;
168
+ }
169
+ catch (err) {
170
+ throw new SourceError(`rest: GET ${url} failed: ${err instanceof Error ? err.message : String(err)}`, err);
171
+ }
172
+ }
173
+ }
174
+ function collectColumns(rows) {
175
+ const names = new Set();
176
+ for (const r of rows) {
177
+ for (const k of Object.keys(r))
178
+ names.add(k);
179
+ }
180
+ return [...names].map((n) => ({ name: n, duckDbType: 'VARCHAR' }));
181
+ }
182
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/adapters/source/rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Local re-exports of the config types most used in rest.ts. Keeps rest.ts
3
+ * imports readable without pulling broadly from config.
4
+ */
5
+ export type { RunConfig, SourceConfig } from '../../config/types.js';
6
+ export interface PaginationConfig {
7
+ type: 'offset' | 'cursor' | 'page';
8
+ pageSize: number;
9
+ pageParam?: string;
10
+ totalField?: string;
11
+ dataField?: string;
12
+ cursorField?: string;
13
+ cursorParam?: string;
14
+ }
15
+ //# sourceMappingURL=rest.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.types.d.ts","sourceRoot":"","sources":["../../../src/adapters/source/rest.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Local re-exports of the config types most used in rest.ts. Keeps rest.ts
3
+ * imports readable without pulling broadly from config.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=rest.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.types.js","sourceRoot":"","sources":["../../../src/adapters/source/rest.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Source adapter interface.
3
+ *
4
+ * `ExtractResult.tableName` is caller-supplied; single-source pipelines use
5
+ * `'stg_raw'`, and `MultiSourcePipelineRunner` passes `'stg_raw_{sourceId}'`
6
+ * via the optional `targetTable` parameter on `extract()`.
7
+ */
8
+ import type { RunConfig, SourceConfig } from '../../config/types.js';
9
+ import type { ColumnMeta, StagingStore } from '../../staging/index.js';
10
+ export interface SourceAdapter {
11
+ readonly id: string;
12
+ connect(config: SourceConfig): Promise<void>;
13
+ extract(config: SourceConfig, store: StagingStore, runConfig: RunConfig, onProgress: (rows: number) => void, targetTable?: string): Promise<ExtractResult>;
14
+ disconnect(): Promise<void>;
15
+ }
16
+ export interface ExtractResult {
17
+ rowsExtracted: number;
18
+ /** Caller-supplied (or adapter default). Single-source pipelines use 'stg_raw'. */
19
+ tableName: string;
20
+ columns: ColumnMeta[];
21
+ }
22
+ export type { ColumnMeta } from '../../staging/index.js';
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/source/types.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,CACL,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAClC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/source/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC"}
@@ -0,0 +1,10 @@
1
+ import type { RunConfig, SourceConfig } from '../../config/types.js';
2
+ import type { StagingStore } from '../../staging/index.js';
3
+ import type { ExtractResult, SourceAdapter } from './types.js';
4
+ export declare class XlsxSourceAdapter implements SourceAdapter {
5
+ readonly id = "xlsx";
6
+ connect(_config: SourceConfig): Promise<void>;
7
+ disconnect(): Promise<void>;
8
+ extract(config: SourceConfig, store: StagingStore, runConfig: RunConfig, onProgress: (rows: number) => void, targetTable?: string): Promise<ExtractResult>;
9
+ }
10
+ //# sourceMappingURL=xlsx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx.d.ts","sourceRoot":"","sources":["../../../src/adapters/source/xlsx.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,EAAE,UAAU;IAEf,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,OAAO,CACX,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAClC,WAAW,SAAY,GACtB,OAAO,CAAC,aAAa,CAAC;CAiE1B"}
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * Excel (XLSX) source adapter. Uses SheetJS to convert the selected sheet
5
+ * to a CSV blob, then re-parses it with csv-parse — all columns VARCHAR.
6
+ * `targetTable` defaults to 'stg_raw'.
7
+ */
8
+ import { readFile as readFileAsync } from 'node:fs/promises';
9
+ import { parse } from 'csv-parse/sync';
10
+ import { read as xlsxRead, utils as xlsxUtils } from 'xlsx';
11
+ import { SourceError } from '../../utils/errors.js';
12
+ import { logger } from '../../utils/logger.js';
13
+ export class XlsxSourceAdapter {
14
+ id = 'xlsx';
15
+ async connect(_config) {
16
+ // File-based; nothing to establish.
17
+ }
18
+ async disconnect() {
19
+ // nothing to release.
20
+ }
21
+ async extract(config, store, runConfig, onProgress, targetTable = 'stg_raw') {
22
+ if (!config.file) {
23
+ throw new SourceError('xlsx source requires `file`');
24
+ }
25
+ let buf;
26
+ try {
27
+ buf = await readFileAsync(config.file);
28
+ }
29
+ catch (err) {
30
+ throw new SourceError(`xlsx: failed to read "${config.file}": ${err instanceof Error ? err.message : String(err)}`, err);
31
+ }
32
+ const workbook = xlsxRead(buf, { type: 'buffer' });
33
+ const sheetNames = workbook.SheetNames;
34
+ if (sheetNames.length === 0) {
35
+ throw new SourceError(`xlsx: workbook "${config.file}" has no sheets`);
36
+ }
37
+ if (sheetNames.length > 1 && config.sheet === undefined) {
38
+ logger.warn({ file: config.file, sheets: sheetNames, using: sheetNames[0] }, 'xlsx: multiple sheets found and `source.sheet` is unset — using first sheet');
39
+ }
40
+ const sheetKey = config.sheet === undefined
41
+ ? sheetNames[0]
42
+ : typeof config.sheet === 'number'
43
+ ? sheetNames[config.sheet]
44
+ : config.sheet;
45
+ if (!sheetKey || !workbook.Sheets[sheetKey]) {
46
+ throw new SourceError(`xlsx: sheet "${String(config.sheet)}" not found in ${config.file}`);
47
+ }
48
+ const csvText = xlsxUtils.sheet_to_csv(workbook.Sheets[sheetKey], { strip: false });
49
+ const records = parse(csvText, {
50
+ columns: true,
51
+ skip_empty_lines: true,
52
+ bom: true,
53
+ });
54
+ if (records.length === 0) {
55
+ throw new SourceError(`xlsx: sheet "${sheetKey}" is empty`);
56
+ }
57
+ const first = records[0];
58
+ const columns = Object.keys(first).map((n) => ({
59
+ name: n,
60
+ duckDbType: 'VARCHAR',
61
+ }));
62
+ await store.createTable(targetTable, columns);
63
+ for (let i = 0; i < records.length; i += runConfig.batchSize) {
64
+ const batch = records.slice(i, i + runConfig.batchSize);
65
+ await store.insertBatch(targetTable, batch);
66
+ onProgress(Math.min(i + batch.length, records.length));
67
+ }
68
+ return { rowsExtracted: records.length, tableName: targetTable, columns };
69
+ }
70
+ }
71
+ //# sourceMappingURL=xlsx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx.js","sourceRoot":"","sources":["../../../src/adapters/source/xlsx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type AxiosInstance } from 'axios';
2
+ import type { RunConfig, TargetConfig } from '../../config/types.js';
3
+ import { type StagingStore } from '../../staging/index.js';
4
+ import type { LoadResult, TargetAdapter } from './types.js';
5
+ export declare class BcTokenManager {
6
+ private readonly http;
7
+ private token;
8
+ private expiresAt;
9
+ constructor(http?: AxiosInstance);
10
+ getToken(): Promise<string>;
11
+ }
12
+ export declare class BcTargetAdapter implements TargetAdapter {
13
+ readonly id = "bc";
14
+ private tokenManager;
15
+ private http;
16
+ connect(config: TargetConfig): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ load(config: TargetConfig, store: StagingStore, runConfig: RunConfig, onProgress: (rows: number) => void): Promise<LoadResult>;
19
+ private handleRowError;
20
+ }
21
+ //# sourceMappingURL=bc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bc.d.ts","sourceRoot":"","sources":["../../../src/adapters/target/bc.ts"],"names":[],"mappings":"AAsBA,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAIvE,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM5D,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAK;gBAEO,IAAI,GAAE,aAAiD;IAE9E,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;CAiClC;AAED,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,EAAE,QAAQ;IACnB,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,IAAI,CAAoD;IAE1D,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,IAAI,CACR,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,UAAU,CAAC;YA+ER,cAAc;CA0B7B"}
@@ -0,0 +1,188 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * Business Central REST (OData v4) target adapter.
5
+ *
6
+ * Token management: BcTokenManager acquires OAuth2 client-credential tokens
7
+ * against login.microsoftonline.com, caches in-memory, refreshes 60s before
8
+ * expiry. Tenant id, client id, and client secret are read from
9
+ * BC_TENANT_ID / BC_CLIENT_ID / BC_CLIENT_SECRET env vars (per CLAUDE.md).
10
+ *
11
+ * Load path: for each batch (max 100 rows per $batch), build a multipart
12
+ * body and POST to `{baseUrl}/api/{version}/companies({company})/$batch`.
13
+ * HTTP 409 with onConflict: upsert → individual PATCH. Other 4xx → increment
14
+ * rowsFailed and continue iff runConfig.onError === 'continue'.
15
+ *
16
+ * Implementation is intentionally minimal. Rigorous multipart parsing is
17
+ * deferred; tests mock the token endpoint and response shape.
18
+ */
19
+ import { randomUUID } from 'node:crypto';
20
+ import axios from 'axios';
21
+ import { quoteIdent } from '../../staging/index.js';
22
+ import { requireEnv } from '../../utils/env.js';
23
+ import { ConfigError, LoadError } from '../../utils/errors.js';
24
+ import { logger } from '../../utils/logger.js';
25
+ const STAGING_TABLE = 'stg_transformed';
26
+ const MAX_BATCH_OPS = 100;
27
+ const TOKEN_REFRESH_BUFFER_MS = 60_000;
28
+ export class BcTokenManager {
29
+ http;
30
+ token = null;
31
+ expiresAt = 0;
32
+ constructor(http = axios.create({ timeout: 30_000 })) {
33
+ this.http = http;
34
+ }
35
+ async getToken() {
36
+ if (this.token && Date.now() < this.expiresAt - TOKEN_REFRESH_BUFFER_MS) {
37
+ return this.token;
38
+ }
39
+ const tenantId = requireEnv('BC_TENANT_ID');
40
+ const clientId = requireEnv('BC_CLIENT_ID');
41
+ const clientSecret = requireEnv('BC_CLIENT_SECRET');
42
+ const url = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;
43
+ try {
44
+ const res = await this.http.post(url, new URLSearchParams({
45
+ grant_type: 'client_credentials',
46
+ client_id: clientId,
47
+ client_secret: clientSecret,
48
+ scope: 'https://api.businesscentral.dynamics.com/.default',
49
+ }));
50
+ const body = res.data;
51
+ if (!body.access_token) {
52
+ throw new LoadError(`bc: token response had no access_token`);
53
+ }
54
+ this.token = body.access_token;
55
+ const expiresIn = typeof body.expires_in === 'number' ? body.expires_in : 3600;
56
+ this.expiresAt = Date.now() + expiresIn * 1000;
57
+ return this.token;
58
+ }
59
+ catch (err) {
60
+ throw new LoadError(`bc: token acquisition failed: ${err instanceof Error ? err.message : String(err)}`, err);
61
+ }
62
+ }
63
+ }
64
+ export class BcTargetAdapter {
65
+ id = 'bc';
66
+ tokenManager = new BcTokenManager();
67
+ http = axios.create({ timeout: 30_000 });
68
+ async connect(config) {
69
+ if (!config.baseUrl)
70
+ throw new ConfigError('bc target requires `baseUrl`');
71
+ if (!config.company)
72
+ throw new ConfigError('bc target requires `company`');
73
+ if (!config.entity)
74
+ throw new ConfigError('bc target requires `entity`');
75
+ // Token is fetched lazily on first load call.
76
+ }
77
+ async disconnect() {
78
+ // nothing to release — axios client is reused per process.
79
+ }
80
+ async load(config, store, runConfig, onProgress) {
81
+ const rows = await store.query(`SELECT * FROM ${quoteIdent(STAGING_TABLE)}`);
82
+ if (rows.length === 0) {
83
+ return { rowsLoaded: 0, rowsFailed: 0 };
84
+ }
85
+ const token = await this.tokenManager.getToken();
86
+ const endpoint = `${config.baseUrl}/api/${config.apiVersion}/companies(${encodeURIComponent(config.company)})/${config.entity}`;
87
+ let rowsLoaded = 0;
88
+ let rowsFailed = 0;
89
+ for (let i = 0; i < rows.length; i += MAX_BATCH_OPS) {
90
+ const batch = rows.slice(i, i + MAX_BATCH_OPS);
91
+ if (!config.batchEndpoint) {
92
+ // Fall back to per-row POST when $batch is disabled
93
+ for (const row of batch) {
94
+ try {
95
+ await this.http.post(endpoint, row, {
96
+ headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
97
+ });
98
+ rowsLoaded++;
99
+ }
100
+ catch (err) {
101
+ const handled = await this.handleRowError(err, endpoint, row, token, config);
102
+ if (handled)
103
+ rowsLoaded++;
104
+ else {
105
+ rowsFailed++;
106
+ if (runConfig.onError === 'stop') {
107
+ throw new LoadError(`bc: row insert failed: ${err instanceof Error ? err.message : String(err)}`, err);
108
+ }
109
+ }
110
+ }
111
+ onProgress(rowsLoaded);
112
+ }
113
+ continue;
114
+ }
115
+ // $batch path
116
+ const boundary = `batch_${randomUUID()}`;
117
+ const body = buildBatchBody(batch, endpoint, boundary);
118
+ const batchUrl = `${config.baseUrl}/api/${config.apiVersion}/companies(${encodeURIComponent(config.company)})/$batch`;
119
+ try {
120
+ const res = await this.http.post(batchUrl, body, {
121
+ headers: {
122
+ Authorization: `Bearer ${token}`,
123
+ 'Content-Type': `multipart/mixed; boundary=${boundary}`,
124
+ },
125
+ });
126
+ const counts = countBatchResponses(String(res.data ?? ''));
127
+ rowsLoaded += counts.succeeded;
128
+ rowsFailed += counts.failed;
129
+ if (counts.failed > 0 && runConfig.onError === 'stop') {
130
+ throw new LoadError(`bc: ${counts.failed} batch operations failed`);
131
+ }
132
+ }
133
+ catch (err) {
134
+ rowsFailed += batch.length;
135
+ if (runConfig.onError === 'stop') {
136
+ throw new LoadError(`bc: $batch failed: ${err instanceof Error ? err.message : String(err)}`, err);
137
+ }
138
+ logger.warn({ err: err instanceof Error ? err.message : String(err) }, 'bc: $batch failed (onError: continue)');
139
+ }
140
+ onProgress(rowsLoaded);
141
+ }
142
+ return { rowsLoaded, rowsFailed };
143
+ }
144
+ async handleRowError(err, endpoint, row, token, config) {
145
+ if (!axios.isAxiosError(err))
146
+ return false;
147
+ const status = err.response?.status;
148
+ if (status === 409 && config.onConflict === 'upsert') {
149
+ try {
150
+ await this.http.patch(endpoint, row, {
151
+ headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
152
+ });
153
+ return true;
154
+ }
155
+ catch (patchErr) {
156
+ logger.warn({ err: patchErr instanceof Error ? patchErr.message : String(patchErr) }, 'bc: upsert PATCH failed');
157
+ return false;
158
+ }
159
+ }
160
+ logger.warn({ status }, 'bc: row insert failed');
161
+ return false;
162
+ }
163
+ }
164
+ function buildBatchBody(batch, endpoint, boundary) {
165
+ const parts = [];
166
+ for (const row of batch) {
167
+ const payload = JSON.stringify(row);
168
+ parts.push(`--${boundary}`, 'Content-Type: application/http', 'Content-Transfer-Encoding: binary', '', `POST ${endpoint} HTTP/1.1`, 'Content-Type: application/json', '', payload, '');
169
+ }
170
+ parts.push(`--${boundary}--`, '');
171
+ return parts.join('\r\n');
172
+ }
173
+ function countBatchResponses(body) {
174
+ // Minimal parser: count HTTP status lines. 2xx → success, else failure.
175
+ const re = /HTTP\/[0-9.]+ (\d{3})/g;
176
+ let match;
177
+ let succeeded = 0;
178
+ let failed = 0;
179
+ while ((match = re.exec(body))) {
180
+ const code = Number.parseInt(match[1], 10);
181
+ if (code >= 200 && code < 300)
182
+ succeeded++;
183
+ else
184
+ failed++;
185
+ }
186
+ return { succeeded, failed };
187
+ }
188
+ //# sourceMappingURL=bc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bc.js","sourceRoot":"","sources":["../../../src/adapters/target/bc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RunConfig, TargetConfig } from '../../config/types.js';
2
+ import type { StagingStore } from '../../staging/index.js';
3
+ import type { LoadResult, TargetAdapter } from './types.js';
4
+ export declare class BlueCherryTargetAdapter implements TargetAdapter {
5
+ readonly id = "bluecherry";
6
+ connect(config: TargetConfig): Promise<void>;
7
+ disconnect(): Promise<void>;
8
+ load(config: TargetConfig, store: StagingStore, _runConfig: RunConfig, onProgress: (rows: number) => void): Promise<LoadResult>;
9
+ }
10
+ //# sourceMappingURL=bluecherry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluecherry.d.ts","sourceRoot":"","sources":["../../../src/adapters/target/bluecherry.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA6B5D,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,QAAQ,CAAC,EAAE,gBAAgB;IAErB,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,IAAI,CACR,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,UAAU,CAAC;CA6EvB"}