@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
package/dist/runner.js ADDED
@@ -0,0 +1,520 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * PipelineRunner — the single entry point for a single-source Sluice pipeline.
5
+ *
6
+ * Public API: `run()` (and `profile()`). Everything else is decomposed into
7
+ * `protected` phase methods so `MultiSourcePipelineRunner` can override each
8
+ * phase cleanly. `runDQ` carries an unused `sourceId?: string` parameter used
9
+ * by the multi-source runner when it filters per-source DQ rules.
10
+ */
11
+ import * as fs from 'node:fs/promises';
12
+ import * as path from 'node:path';
13
+ // The adapter barrels have a side effect that self-registers built-in adapters
14
+ // on first evaluation. Importing from them is sufficient — no extra "for side
15
+ // effect" import required.
16
+ import { SourceAdapterRegistry } from './adapters/source/index.js';
17
+ import { TargetAdapterRegistry } from './adapters/target/index.js';
18
+ import { ConfigLoader } from './config/loader.js';
19
+ import { isMultiSource } from './config/schema.js';
20
+ import { DQEngine } from './dq/index.js';
21
+ import { MergeStrategyRegistry } from './merge/index.js';
22
+ import { StagingStore, quoteIdent } from './staging/index.js';
23
+ import { TransformEngine } from './transform/index.js';
24
+ import { RuleRegistry, TransformRegistry } from './plugins/registry.js';
25
+ import { loadPlugins, loadNpmPlugins } from './plugins/loader.js';
26
+ import { ConfigError, PipelineDQError } from './utils/errors.js';
27
+ import { logger } from './utils/logger.js';
28
+ import { createSilentProgress } from './utils/progress.js';
29
+ // ── Phase 4a — Enrich phase injection hook ─────────────────────────────────
30
+ //
31
+ // `@caracal-lynx/sluice-enrich` calls `registerEnrichPhase()` once at import
32
+ // time to inject its phase factory. If the private package is not installed,
33
+ // the slot stays undefined and `runEnrich()` no-ops with a WARN log so the
34
+ // operator notices the misconfiguration.
35
+ let _enrichPhaseFactory;
36
+ export function registerEnrichPhase(factory) {
37
+ _enrichPhaseFactory = factory;
38
+ }
39
+ /** Test-only helper. Not exported from `src/index.ts`. */
40
+ export function _resetEnrichPhaseForTesting() {
41
+ _enrichPhaseFactory = undefined;
42
+ }
43
+ /** Test-only helper. Not exported from `src/index.ts`. */
44
+ export function _isEnrichPhaseRegistered() {
45
+ return _enrichPhaseFactory !== undefined;
46
+ }
47
+ export class PipelineRunner {
48
+ ruleRegistry;
49
+ transformRegistry;
50
+ dqEngine;
51
+ transformEngine;
52
+ progress = createSilentProgress();
53
+ pluginsLoaded = false;
54
+ incrementalSinceUsed = '';
55
+ constructor(ruleRegistry, transformRegistry) {
56
+ this.ruleRegistry = ruleRegistry ?? new RuleRegistry();
57
+ this.transformRegistry = transformRegistry ?? new TransformRegistry();
58
+ this.dqEngine = new DQEngine(this.ruleRegistry);
59
+ this.transformEngine = new TransformEngine(this.transformRegistry);
60
+ }
61
+ /**
62
+ * Load plugins from the file system and npm packages.
63
+ * Called once per runner instance at the start of the first pipeline run.
64
+ *
65
+ * - Tier 2: Scans `{cwd}/plugins/` for `*.rule.{ts,js}` and `*.transform.{ts,js}`.
66
+ * - Tier 3: Reads `{cwd}/sluice.config.yaml` for npm plugin declarations.
67
+ */
68
+ async loadAllPlugins(cwd, pluginDirs = []) {
69
+ if (this.pluginsLoaded)
70
+ return;
71
+ const defaultPluginDir = path.join(cwd, 'plugins');
72
+ const allPluginDirs = Array.from(new Set([
73
+ defaultPluginDir,
74
+ ...pluginDirs.map((d) => path.resolve(d)),
75
+ ]));
76
+ for (const pluginDir of allPluginDirs) {
77
+ await loadPlugins(pluginDir, this.ruleRegistry, this.transformRegistry, MergeStrategyRegistry);
78
+ }
79
+ const configPath = path.join(cwd, 'sluice.config.yaml');
80
+ await loadNpmPlugins(configPath, this.ruleRegistry, this.transformRegistry, MergeStrategyRegistry);
81
+ this.pluginsLoaded = true;
82
+ logger.info({
83
+ rules: this.ruleRegistry.list().length,
84
+ transforms: this.transformRegistry.list().length,
85
+ pluginDirs: allPluginDirs,
86
+ }, 'plugins: all loaded');
87
+ }
88
+ async run(yamlPath, overrides = {}) {
89
+ this.incrementalSinceUsed = '';
90
+ if (overrides.progress)
91
+ this.progress = overrides.progress;
92
+ const runStartMs = Date.now();
93
+ const loaded = await ConfigLoader.load(yamlPath);
94
+ const config = this.applyOverrides(loaded, overrides);
95
+ await this.loadAllPlugins(path.dirname(path.resolve(yamlPath)), overrides.pluginDirs ?? []);
96
+ logger.info({ pipeline: config.pipeline.name, yaml: yamlPath, mode: config.run.mode }, 'pipeline: start');
97
+ if (isMultiSource(config)) {
98
+ throw new ConfigError(`Pipeline "${config.pipeline.name}" declares multiple sources. ` +
99
+ 'Use MultiSourcePipelineRunner to run multi-source pipelines.');
100
+ }
101
+ if (config.run.mode === 'incremental' && !config.run.incrementalField) {
102
+ throw new ConfigError('run.incrementalField is required for incremental pipelines');
103
+ }
104
+ const outputDir = path.resolve(config.run.outputDir);
105
+ await fs.mkdir(outputDir, { recursive: true });
106
+ const store = new StagingStore(this.resolveStagingDb(config));
107
+ try {
108
+ await store.open();
109
+ const extractResult = await this.runExtract(config, store, 'stg_raw');
110
+ if (config.run.mode === 'incremental' && config.run.incrementalField) {
111
+ const incrementalSince = await this.resolveIncrementalSince(config);
112
+ this.incrementalSinceUsed = incrementalSince;
113
+ if (incrementalSince) {
114
+ await this.applyIncrementalFilter(store, extractResult.tableName, config.run.incrementalField, incrementalSince);
115
+ extractResult.rowsExtracted = await store.rowCount(extractResult.tableName);
116
+ logger.info({
117
+ tableName: extractResult.tableName,
118
+ incrementalField: config.run.incrementalField,
119
+ incrementalSince,
120
+ rowsAfterFilter: extractResult.rowsExtracted,
121
+ }, 'pipeline: incremental filter applied');
122
+ }
123
+ }
124
+ const enrichSummary = await this.runEnrich(config, store, path.dirname(path.resolve(yamlPath)), overrides);
125
+ const dqSummary = await this.runDQ(config, store, extractResult.tableName);
126
+ if (config.dq.stopOnCritical && dqSummary.violations.critical > 0) {
127
+ throw new PipelineDQError(dqSummary.violations.critical, dqSummary.reportPath);
128
+ }
129
+ const transformSourceTable = await this.materializeAcceptedRows(store, extractResult.tableName, extractResult.columns, dqSummary.rejectedRowIndices ?? []);
130
+ const transformResult = await this.runTransform(config, store, transformSourceTable, 'stg_transformed');
131
+ if (config.run.dryRun || config.run.mode === 'validate-only') {
132
+ logger.info({ dryRun: config.run.dryRun, mode: config.run.mode }, 'pipeline: stopping before load');
133
+ this.progress.summary({
134
+ pipeline: config.pipeline.name,
135
+ elapsedMs: Date.now() - runStartMs,
136
+ rowsExtracted: extractResult.rowsExtracted,
137
+ warnings: dqSummary.violations.warning,
138
+ state: dqSummary.violations.warning > 0 ? 'warn' : 'success',
139
+ });
140
+ return this.buildRunResult(config, extractResult, dqSummary, transformResult, null, enrichSummary);
141
+ }
142
+ const loadResult = await this.runLoad(config, store);
143
+ const stateFilePath = await this.writeStateFile(config, extractResult, dqSummary, loadResult, enrichSummary);
144
+ logger.info({
145
+ pipeline: config.pipeline.name,
146
+ rowsExtracted: extractResult.rowsExtracted,
147
+ rowsLoaded: loadResult.rowsLoaded,
148
+ }, 'pipeline: done');
149
+ this.progress.summary({
150
+ pipeline: config.pipeline.name,
151
+ elapsedMs: Date.now() - runStartMs,
152
+ rowsExtracted: extractResult.rowsExtracted,
153
+ rowsLoaded: loadResult.rowsLoaded,
154
+ warnings: dqSummary.violations.warning,
155
+ state: dqSummary.violations.warning > 0 ? 'warn' : 'success',
156
+ });
157
+ return {
158
+ ...this.buildRunResult(config, extractResult, dqSummary, transformResult, loadResult, enrichSummary),
159
+ stateFilePath,
160
+ };
161
+ }
162
+ finally {
163
+ await store.close();
164
+ }
165
+ }
166
+ // ── Protected phase methods (overrideable by MultiSourcePipelineRunner) ─
167
+ async runExtract(config, store, tableName = 'stg_raw', phaseLabel = 'Extract') {
168
+ if (!config.source) {
169
+ throw new ConfigError('runExtract called on a multi-source pipeline; use MultiSourcePipelineRunner');
170
+ }
171
+ const adapter = SourceAdapterRegistry.get(config.source.adapter);
172
+ this.progress.startPhase('extract', phaseLabel);
173
+ // Staging DB files persist across runs. `CREATE TABLE IF NOT EXISTS`
174
+ // (from buildCreateTableSql) would silently reuse an old table and cause
175
+ // each run to append a fresh copy of the source data. Drop up-front so
176
+ // every extract starts from an empty table.
177
+ await store.dropTable(tableName);
178
+ await adapter.connect(config.source);
179
+ try {
180
+ const result = await adapter.extract(config.source, store, config.run, (rows) => {
181
+ logger.debug({ rows }, 'extracting');
182
+ this.progress.update(rows);
183
+ }, tableName);
184
+ logger.info({ rowsExtracted: result.rowsExtracted, table: result.tableName }, 'pipeline: extract complete');
185
+ this.progress.update(result.rowsExtracted);
186
+ this.progress.endPhase({ state: 'success' });
187
+ return result;
188
+ }
189
+ catch (err) {
190
+ this.progress.endPhase({ state: 'fail' });
191
+ throw err;
192
+ }
193
+ finally {
194
+ await adapter.disconnect();
195
+ }
196
+ }
197
+ async runDQ(config, store, tableName = 'stg_raw', _sourceId, // Reserved for per-source filtering in MultiSourcePipelineRunner.
198
+ phaseLabel = 'Data quality') {
199
+ const total = (await store.tableExists(tableName))
200
+ ? await store.rowCount(tableName)
201
+ : undefined;
202
+ this.progress.startPhase('dq', phaseLabel, total !== undefined ? { total } : {});
203
+ try {
204
+ const summary = await this.dqEngine.run(config, store, tableName, (rows) => {
205
+ this.progress.update(rows);
206
+ });
207
+ logger.info({
208
+ rowsChecked: summary.rowsChecked,
209
+ rowsRejected: summary.rowsRejected,
210
+ critical: summary.violations.critical,
211
+ warning: summary.violations.warning,
212
+ info: summary.violations.info,
213
+ }, 'pipeline: dq complete');
214
+ const state = summary.violations.critical > 0
215
+ ? 'fail'
216
+ : summary.violations.warning > 0 ? 'warn' : 'success';
217
+ this.progress.endPhase({ state });
218
+ return summary;
219
+ }
220
+ catch (err) {
221
+ this.progress.endPhase({ state: 'fail' });
222
+ throw err;
223
+ }
224
+ }
225
+ /**
226
+ * Phase 4a enrich phase. No-ops (returns `undefined`) when:
227
+ * - the pipeline has no `enrich:` block;
228
+ * - `--no-enrich` was set (`overrides.skipEnrich`);
229
+ * - the run is `validate-only` or `dryRun`;
230
+ * - `@caracal-lynx/sluice-enrich` is not installed (no factory registered).
231
+ *
232
+ * The "not installed" case logs a WARN so an operator who configured an
233
+ * `enrich:` block expecting it to run notices the misconfiguration.
234
+ */
235
+ async runEnrich(config, store, pluginDir, overrides) {
236
+ if (!config.enrich)
237
+ return undefined;
238
+ if (overrides.skipEnrich) {
239
+ logger.info({ pipeline: config.pipeline.name }, 'pipeline: enrich skipped (--no-enrich)');
240
+ return undefined;
241
+ }
242
+ if (config.run.dryRun || config.run.mode === 'validate-only') {
243
+ logger.info({ mode: config.run.mode, dryRun: config.run.dryRun }, 'pipeline: enrich skipped (validate / dry run)');
244
+ return undefined;
245
+ }
246
+ if (!_enrichPhaseFactory) {
247
+ logger.warn({ pipeline: config.pipeline.name }, 'pipeline: enrich block configured but @caracal-lynx/sluice-enrich is not installed — skipping');
248
+ return undefined;
249
+ }
250
+ this.progress.startPhase('enrich', 'Enrich');
251
+ try {
252
+ const phase = _enrichPhaseFactory(config.enrich, config.run, store, pluginDir, logger);
253
+ const summary = await phase.run();
254
+ logger.info({ lookups: summary.lookups.length }, 'pipeline: enrich complete');
255
+ this.progress.endPhase({ state: 'success' });
256
+ return summary;
257
+ }
258
+ catch (err) {
259
+ this.progress.endPhase({ state: 'fail' });
260
+ throw err;
261
+ }
262
+ }
263
+ async runTransform(config, store, sourceTable = 'stg_raw', targetTable = 'stg_transformed') {
264
+ const total = (await store.tableExists(sourceTable))
265
+ ? await store.rowCount(sourceTable)
266
+ : undefined;
267
+ this.progress.startPhase('transform', 'Transform', total !== undefined ? { total } : {});
268
+ try {
269
+ const result = await this.transformEngine.run(config, store, sourceTable, targetTable, (rows) => this.progress.update(rows));
270
+ logger.info({
271
+ rowsIn: result.rowsIn,
272
+ rowsOut: result.rowsOut,
273
+ rowsFailed: result.rowsFailed,
274
+ sourceTable,
275
+ targetTable,
276
+ }, 'pipeline: transform complete');
277
+ this.progress.endPhase({
278
+ state: result.rowsFailed > 0 ? 'warn' : 'success',
279
+ });
280
+ return result;
281
+ }
282
+ catch (err) {
283
+ this.progress.endPhase({ state: 'fail' });
284
+ throw err;
285
+ }
286
+ }
287
+ async runLoad(config, store) {
288
+ const adapter = TargetAdapterRegistry.get(config.target.adapter);
289
+ const total = (await store.tableExists('stg_transformed'))
290
+ ? await store.rowCount('stg_transformed')
291
+ : undefined;
292
+ this.progress.startPhase('load', 'Load', total !== undefined ? { total } : {});
293
+ await adapter.connect(config.target);
294
+ try {
295
+ const result = await adapter.load(config.target, store, config.run, (rows) => {
296
+ logger.debug({ rows }, 'loading');
297
+ this.progress.update(rows);
298
+ });
299
+ logger.info({ rowsLoaded: result.rowsLoaded, outputPath: result.outputPath }, 'pipeline: load complete');
300
+ this.progress.update(result.rowsLoaded);
301
+ this.progress.endPhase({
302
+ state: result.rowsFailed > 0 ? 'warn' : 'success',
303
+ });
304
+ return result;
305
+ }
306
+ catch (err) {
307
+ this.progress.endPhase({ state: 'fail' });
308
+ throw err;
309
+ }
310
+ finally {
311
+ await adapter.disconnect();
312
+ }
313
+ }
314
+ async writeStateFile(config, extract, dq, load, enrichSummary) {
315
+ const outputDir = path.resolve(config.run.outputDir);
316
+ await fs.mkdir(outputDir, { recursive: true });
317
+ const stateFilePath = path.join(outputDir, `${config.pipeline.name}-state.json`);
318
+ const state = {
319
+ pipeline: config.pipeline.name,
320
+ lastRunAt: new Date().toISOString(),
321
+ lastMode: config.run.mode,
322
+ rowsExtracted: extract.rowsExtracted,
323
+ rowsLoaded: load.rowsLoaded,
324
+ criticalViolations: dq.violations.critical,
325
+ warnings: dq.violations.warning,
326
+ incrementalSince: this.incrementalSinceUsed || (config.run.incrementalSince ?? ''),
327
+ };
328
+ // Omit the key entirely when no enrich phase ran, so existing pipelines
329
+ // produce byte-for-byte identical state files.
330
+ if (enrichSummary !== undefined) {
331
+ state['enrichSummary'] = enrichSummary;
332
+ }
333
+ await fs.writeFile(stateFilePath, `${JSON.stringify(state, null, 2)}\n`, 'utf-8');
334
+ logger.debug({ stateFilePath }, 'pipeline: state file written');
335
+ return stateFilePath;
336
+ }
337
+ // ── Private helpers ────────────────────────────────────────────────────
338
+ /**
339
+ * `sluice profile` entry point — extract only, then emit per-column stats.
340
+ * Never writes an output CSV, never runs DQ or transforms.
341
+ */
342
+ async profile(yamlPath, overrides = {}) {
343
+ if (overrides.progress)
344
+ this.progress = overrides.progress;
345
+ const loaded = await ConfigLoader.load(yamlPath);
346
+ const config = this.applyOverrides(loaded, overrides);
347
+ await this.loadAllPlugins(path.dirname(path.resolve(yamlPath)), overrides.pluginDirs ?? []);
348
+ if (isMultiSource(config)) {
349
+ throw new ConfigError(`Pipeline "${config.pipeline.name}" declares multiple sources. ` +
350
+ 'Use MultiSourcePipelineRunner to profile multi-source pipelines.');
351
+ }
352
+ if (config.run.mode === 'incremental' && !config.run.incrementalField) {
353
+ throw new ConfigError('run.incrementalField is required for incremental pipelines');
354
+ }
355
+ const outputDir = path.resolve(config.run.outputDir);
356
+ await fs.mkdir(outputDir, { recursive: true });
357
+ const store = new StagingStore(this.resolveStagingDb(config));
358
+ try {
359
+ await store.open();
360
+ const extractResult = await this.runExtract(config, store, 'stg_raw');
361
+ if (config.run.mode === 'incremental' && config.run.incrementalField) {
362
+ const incrementalSince = await this.resolveIncrementalSince(config);
363
+ if (incrementalSince) {
364
+ await this.applyIncrementalFilter(store, extractResult.tableName, config.run.incrementalField, incrementalSince);
365
+ extractResult.rowsExtracted = await store.rowCount(extractResult.tableName);
366
+ logger.info({
367
+ tableName: extractResult.tableName,
368
+ incrementalField: config.run.incrementalField,
369
+ incrementalSince,
370
+ rowsAfterFilter: extractResult.rowsExtracted,
371
+ }, 'pipeline: incremental filter applied (profile)');
372
+ }
373
+ }
374
+ const profile = await this.buildProfile(store, extractResult.tableName, extractResult.columns);
375
+ const profilePath = path.join(outputDir, `${config.pipeline.name}-profile.json`);
376
+ await fs.writeFile(profilePath, `${JSON.stringify(profile, null, 2)}\n`, 'utf-8');
377
+ logger.info({ profilePath, columns: profile.length }, 'pipeline: profile complete');
378
+ return {
379
+ pipeline: config.pipeline.name,
380
+ mode: config.run.mode,
381
+ extract: extractResult,
382
+ dq: stubDqSummary(config.pipeline.name, extractResult.rowsExtracted),
383
+ transform: null,
384
+ load: null,
385
+ profilePath,
386
+ };
387
+ }
388
+ finally {
389
+ await store.close();
390
+ }
391
+ }
392
+ async buildProfile(store, tableName, columns) {
393
+ const result = [];
394
+ const tbl = tableName;
395
+ const rowCountRow = await store.query(`SELECT count(*) AS n FROM "${tbl}"`);
396
+ const rowCount = Number(rowCountRow[0]?.n ?? 0);
397
+ for (const col of columns) {
398
+ const qCol = `"${col.name.replace(/"/g, '""')}"`;
399
+ const [nullCountRow] = await store.query(`SELECT count(*) AS n FROM "${tbl}" WHERE ${qCol} IS NULL`);
400
+ const [distinctRow] = await store.query(`SELECT count(DISTINCT ${qCol}) AS n FROM "${tbl}"`);
401
+ const lenRow = await store.query(`SELECT min(length(CAST(${qCol} AS VARCHAR))) AS mn, max(length(CAST(${qCol} AS VARCHAR))) AS mx FROM "${tbl}"`);
402
+ const sampleRows = await store.query(`SELECT DISTINCT ${qCol} AS v FROM "${tbl}" WHERE ${qCol} IS NOT NULL LIMIT 5`);
403
+ result.push({
404
+ name: col.name,
405
+ duckDbType: col.duckDbType,
406
+ rowCount,
407
+ nullCount: Number(nullCountRow?.n ?? 0),
408
+ distinctCount: Number(distinctRow?.n ?? 0),
409
+ minLen: lenRow[0]?.mn === null || lenRow[0]?.mn === undefined ? null : Number(lenRow[0].mn),
410
+ maxLen: lenRow[0]?.mx === null || lenRow[0]?.mx === undefined ? null : Number(lenRow[0].mx),
411
+ sample: sampleRows.map((r) => (r['v'] === null || r['v'] === undefined ? null : String(r['v']))),
412
+ });
413
+ }
414
+ return result;
415
+ }
416
+ applyOverrides(config, overrides) {
417
+ if (Object.keys(overrides).length === 0)
418
+ return config;
419
+ const run = { ...config.run };
420
+ if (overrides.outputDir !== undefined)
421
+ run.outputDir = overrides.outputDir;
422
+ if (overrides.dryRun !== undefined)
423
+ run.dryRun = overrides.dryRun;
424
+ if (overrides.mode !== undefined)
425
+ run.mode = overrides.mode;
426
+ return { ...config, run };
427
+ }
428
+ resolveStagingDb(config) {
429
+ if (config.run.stagingDb)
430
+ return config.run.stagingDb;
431
+ if (config.run.dryRun)
432
+ return ':memory:';
433
+ return path.join(path.resolve(config.run.outputDir), `${config.pipeline.name}.duckdb`);
434
+ }
435
+ async resolveIncrementalSince(config) {
436
+ if (config.run.incrementalSince)
437
+ return config.run.incrementalSince;
438
+ const statePath = path.join(path.resolve(config.run.outputDir), `${config.pipeline.name}-state.json`);
439
+ try {
440
+ const raw = await fs.readFile(statePath, 'utf-8');
441
+ const parsed = JSON.parse(raw);
442
+ return typeof parsed.lastRunAt === 'string' ? parsed.lastRunAt : '';
443
+ }
444
+ catch {
445
+ return '';
446
+ }
447
+ }
448
+ async applyIncrementalFilter(store, tableName, incrementalField, incrementalSince) {
449
+ const columns = await store.columnNames(tableName);
450
+ if (!columns.includes(incrementalField)) {
451
+ throw new ConfigError(`incrementalField "${incrementalField}" was not found in source table "${tableName}"`);
452
+ }
453
+ const sinceCheck = await store.query('SELECT TRY_CAST(? AS TIMESTAMP) AS ts', [incrementalSince]);
454
+ if (!sinceCheck[0]?.ts) {
455
+ throw new ConfigError(`run.incrementalSince "${incrementalSince}" is not a valid timestamp`);
456
+ }
457
+ const invalidRows = await store.query(`
458
+ SELECT count(*) AS n
459
+ FROM ${quoteIdent(tableName)}
460
+ WHERE ${quoteIdent(incrementalField)} IS NOT NULL
461
+ AND TRY_CAST(${quoteIdent(incrementalField)} AS TIMESTAMP) IS NULL
462
+ `);
463
+ const invalidCount = Number(invalidRows[0]?.n ?? 0);
464
+ if (invalidCount > 0) {
465
+ throw new ConfigError(`incrementalField "${incrementalField}" contains ${invalidCount} non-parseable timestamp value(s)`);
466
+ }
467
+ await store.query(`
468
+ CREATE OR REPLACE TABLE ${quoteIdent(tableName)} AS
469
+ SELECT *
470
+ FROM ${quoteIdent(tableName)}
471
+ WHERE TRY_CAST(${quoteIdent(incrementalField)} AS TIMESTAMP) >= TRY_CAST(? AS TIMESTAMP)
472
+ `, [incrementalSince]);
473
+ }
474
+ async materializeAcceptedRows(store, tableName, columns, rejectedRowIndices) {
475
+ if (rejectedRowIndices.length === 0)
476
+ return tableName;
477
+ const rejected = new Set(rejectedRowIndices);
478
+ const rows = await store.query(`SELECT * FROM ${quoteIdent(tableName)}`);
479
+ const acceptedRows = rows.filter((_row, index) => !rejected.has(index));
480
+ const acceptedTable = `${tableName}_accepted`;
481
+ await store.dropTable(acceptedTable);
482
+ await store.createTable(acceptedTable, columns);
483
+ if (acceptedRows.length > 0) {
484
+ await store.insertBatch(acceptedTable, acceptedRows);
485
+ }
486
+ logger.info({
487
+ sourceTable: tableName,
488
+ acceptedTable,
489
+ rejectedRows: rejectedRowIndices.length,
490
+ acceptedRows: acceptedRows.length,
491
+ }, 'pipeline: filtered rejected rows before transform');
492
+ return acceptedTable;
493
+ }
494
+ buildRunResult(config, extract, dq, transform, load, enrichSummary) {
495
+ const result = {
496
+ pipeline: config.pipeline.name,
497
+ mode: config.run.mode,
498
+ extract,
499
+ dq,
500
+ transform,
501
+ load,
502
+ };
503
+ if (enrichSummary !== undefined)
504
+ result.enrichSummary = enrichSummary;
505
+ return result;
506
+ }
507
+ }
508
+ function stubDqSummary(pipelineName, rowsChecked) {
509
+ return {
510
+ pipeline: pipelineName,
511
+ runAt: new Date().toISOString(),
512
+ rowsChecked,
513
+ rowsPassed: rowsChecked,
514
+ rowsRejected: 0,
515
+ violations: { critical: 0, warning: 0, info: 0 },
516
+ byField: {},
517
+ reportPath: '',
518
+ };
519
+ }
520
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { StagingStore, type ExportToCsvOptions } from './store.js';
2
+ export { buildCreateTableSql, quoteIdent, type ColumnMeta, type DuckDbType, } from './schema.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/staging/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ export { StagingStore } from './store.js';
4
+ export { buildCreateTableSql, quoteIdent, } from './schema.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/staging/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAEvC,OAAO,EAAE,YAAY,EAA2B,MAAM,YAAY,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,UAAU,GAGX,MAAM,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Staging-table schema helpers.
3
+ *
4
+ * ColumnMeta lives here (not in `src/adapters/source/types.ts` as the original
5
+ * spec suggested) because source adapters already depend on the staging module
6
+ * via the `StagingStore` parameter in `extract()`. Hosting ColumnMeta in
7
+ * staging keeps the dependency direction one-way: adapters → staging.
8
+ */
9
+ /** DuckDB primitive types produced by the source adapters. */
10
+ export type DuckDbType = 'VARCHAR' | 'BIGINT' | 'DOUBLE' | 'BOOLEAN' | 'TIMESTAMP';
11
+ export interface ColumnMeta {
12
+ name: string;
13
+ duckDbType: string;
14
+ }
15
+ /** Double-quote an identifier and escape embedded double-quotes per SQL standard. */
16
+ export declare function quoteIdent(name: string): string;
17
+ /** Build a CREATE TABLE statement from ColumnMeta. */
18
+ export declare function buildCreateTableSql(tableName: string, columns: ColumnMeta[]): string;
19
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/staging/schema.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAEnF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,sDAAsD;AACtD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAMpF"}
@@ -0,0 +1,15 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /** Double-quote an identifier and escape embedded double-quotes per SQL standard. */
4
+ export function quoteIdent(name) {
5
+ return `"${name.replace(/"/g, '""')}"`;
6
+ }
7
+ /** Build a CREATE TABLE statement from ColumnMeta. */
8
+ export function buildCreateTableSql(tableName, columns) {
9
+ if (columns.length === 0) {
10
+ throw new Error(`cannot create table ${tableName} with no columns`);
11
+ }
12
+ const colsSql = columns.map((c) => `${quoteIdent(c.name)} ${c.duckDbType}`).join(', ');
13
+ return `CREATE TABLE IF NOT EXISTS ${quoteIdent(tableName)} (${colsSql})`;
14
+ }
15
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/staging/schema.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAmBvC,qFAAqF;AACrF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACzC,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,OAAqB;IAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,kBAAkB,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,OAAO,8BAA8B,UAAU,CAAC,SAAS,CAAC,KAAK,OAAO,GAAG,CAAC;AAC5E,CAAC"}