@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 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -0,0 +1,263 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * Sluice — pipeline config schema
5
+ * @caracal-lynx/sluice
6
+ *
7
+ * Canonical Zod schema for all pipeline YAML configs.
8
+ * All TypeScript types are inferred from these schemas — do not write
9
+ * manual interfaces for anything that maps to pipeline config.
10
+ *
11
+ * Usage:
12
+ * import { PipelineSchema } from '@caracal-lynx/sluice';
13
+ * const pipeline = PipelineSchema.parse(yaml.load(fs.readFileSync('customers.pipeline.yaml', 'utf8')));
14
+ *
15
+ * ${ENV_VAR} strings in connection/url fields are resolved by ConfigLoader
16
+ * before this schema is called — Zod sees plain strings, not tokens.
17
+ */
18
+ import { z } from 'zod';
19
+ // ── Primitives ────────────────────────────────────────────────────────────────
20
+ const Severity = z.enum(['critical', 'warning', 'info']);
21
+ const SourceAd = z.enum(['mssql', 'pg', 'csv', 'xlsx', 'rest']);
22
+ const TargetAd = z.enum(['bc', 'ifs', 'bluecherry', 'csv', 'pg', 'rest']);
23
+ const CleanseOps = z.string().regex(/^[a-zA-Z|:0-9]+$/);
24
+ // ── Pagination (REST source) ──────────────────────────────────────────────────
25
+ const PaginationSchema = z.object({
26
+ type: z.enum(['offset', 'cursor', 'page']),
27
+ pageSize: z.number().int().positive().default(100),
28
+ pageParam: z.string().optional(),
29
+ totalField: z.string().optional(),
30
+ dataField: z.string().optional(),
31
+ cursorField: z.string().optional(),
32
+ cursorParam: z.string().optional(),
33
+ });
34
+ // ── Source ────────────────────────────────────────────────────────────────────
35
+ const SourceBaseSchema = z.object({
36
+ adapter: SourceAd,
37
+ connection: z.string().optional(),
38
+ query: z.string().optional(),
39
+ file: z.string().optional(),
40
+ endpoint: z.string().optional(),
41
+ headers: z.record(z.string()).optional(),
42
+ delimiter: z.string().default(','),
43
+ encoding: z.string().default('utf-8'),
44
+ sheet: z.union([z.string(), z.number()]).optional(),
45
+ pagination: PaginationSchema.optional(),
46
+ });
47
+ export const SourceSchema = SourceBaseSchema.refine(s => s.query || s.file || s.endpoint, { message: 'source must have query, file, or endpoint' });
48
+ // ── DQ ────────────────────────────────────────────────────────────────────────
49
+ // Exported because (a) ConfigLoader needs .options at runtime to discriminate
50
+ // built-in checks from composite-rule references during expansion, and
51
+ // (b) plugin authors may want to introspect the built-in check set.
52
+ export const CheckType = z.enum([
53
+ 'notNull', 'unique', 'pattern', 'email', 'ukPostcode',
54
+ 'maxLength', 'min', 'max', 'allowedValues',
55
+ ]);
56
+ const CheckSchema = z.object({
57
+ type: CheckType,
58
+ value: z.union([z.string(), z.number(), z.array(z.string())]).optional(),
59
+ severity: Severity,
60
+ message: z.string().optional(),
61
+ });
62
+ const DqRuleSchema = z.object({
63
+ field: z.string(),
64
+ sourceId: z.string().optional(), // scopes a rule to a named source in multi-source pipelines; ignored in single-source mode
65
+ checks: z.array(CheckSchema).min(1),
66
+ });
67
+ export const DqSchema = z.object({
68
+ rulesFile: z.string().optional(), // Phase 2: composite rule library path
69
+ stopOnCritical: z.boolean().default(true),
70
+ rejectionFile: z.string().optional(),
71
+ rules: z.array(DqRuleSchema).default([]),
72
+ });
73
+ // ── Enrich (Phase 4a) ─────────────────────────────────────────────────────────
74
+ //
75
+ // The framework that consumes these schemas — EnrichRegistry, EnrichmentRunner,
76
+ // EnrichCache, plugin loader, and built-in providers — lives in the private
77
+ // `@caracal-lynx/sluice-enrich` package and is not part of the open-source core.
78
+ // What ships here is the schema, the public `EnrichPlugin` interface
79
+ // (in src/enrich/types.ts), and the `registerEnrichPhase()` injection hook.
80
+ const EnrichWriteColumnsSchema = z
81
+ .object({ valid: z.string() }) // 'valid' key is required
82
+ .catchall(z.string()); // additional data-field mappings are optional
83
+ const EnrichLookupSchema = z.object({
84
+ field: z.string(),
85
+ provider: z.string(),
86
+ writeColumns: EnrichWriteColumnsSchema,
87
+ preValidate: z.string().optional(),
88
+ onError: z.enum(['flag', 'skip', 'fail']).optional(),
89
+ cache: z.boolean().optional(),
90
+ options: z.record(z.unknown()).optional(),
91
+ });
92
+ export const EnrichSchema = z.object({
93
+ cache: z.union([z.boolean(), z.literal('persist')]).default(true),
94
+ onError: z.enum(['flag', 'skip', 'fail']).default('flag'),
95
+ lookups: z.array(EnrichLookupSchema).min(1),
96
+ });
97
+ // ── Transform ─────────────────────────────────────────────────────────────────
98
+ const LookupSchema = z.object({
99
+ name: z.string(),
100
+ source: SourceSchema,
101
+ key: z.string(),
102
+ value: z.string(),
103
+ });
104
+ const FieldType = z.enum([
105
+ 'string', 'number', 'decimal', 'boolean', 'date',
106
+ 'lookup', 'concat', 'constant', 'expression',
107
+ 'custom', // Phase 2: delegates to a TransformPlugin via customOp
108
+ ]);
109
+ // Field types that read from the source row — `from` must be set.
110
+ // `constant` emits a fixed value, `expression` evaluates against the full row,
111
+ // `custom` receives the whole row and chooses what to use — all three may omit `from`.
112
+ const TYPES_REQUIRING_FROM = new Set([
113
+ 'string', 'number', 'decimal', 'boolean', 'date', 'lookup', 'concat',
114
+ ]);
115
+ const FieldMappingSchema = z.object({
116
+ from: z.union([z.string(), z.array(z.string())]).optional(),
117
+ to: z.string(),
118
+ type: FieldType,
119
+ max: z.number().optional(),
120
+ precision: z.number().optional(),
121
+ format: z.string().optional(),
122
+ cleanse: CleanseOps.optional(),
123
+ lookup: z.string().optional(),
124
+ separator: z.string().optional(),
125
+ value: z.union([z.string(), z.number(), z.boolean()]).optional(),
126
+ default: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),
127
+ optional: z.boolean().default(false),
128
+ // Phase 2:
129
+ customOp: z.string().optional(),
130
+ options: z.record(z.unknown()).optional(),
131
+ }).refine(m => m.type !== 'custom' || !!m.customOp, { message: 'type: custom requires customOp to be set', path: ['customOp'] }).refine(m => !TYPES_REQUIRING_FROM.has(m.type) || m.from !== undefined, { message: 'this field type requires "from" to be set', path: ['from'] });
132
+ export const TransformSchema = z.object({
133
+ lookups: z.array(LookupSchema).default([]),
134
+ fields: z.array(FieldMappingSchema).min(1),
135
+ });
136
+ // ── Target ────────────────────────────────────────────────────────────────────
137
+ export const TargetSchema = z.object({
138
+ adapter: TargetAd,
139
+ output: z.string().optional(),
140
+ entity: z.string().optional(),
141
+ connection: z.string().optional(),
142
+ includeHeader: z.boolean().optional(),
143
+ columnOrder: z.array(z.string()).optional(),
144
+ dateFormat: z.string().optional(),
145
+ delimiter: z.string().default(','),
146
+ encoding: z.string().default('utf-8'),
147
+ nullValue: z.string().default(''),
148
+ template: z.string().optional(),
149
+ // Business Central REST:
150
+ baseUrl: z.string().optional(),
151
+ company: z.string().optional(),
152
+ apiVersion: z.string().default('v2.0'),
153
+ onConflict: z.enum(['fail', 'upsert', 'ignore']).default('fail'),
154
+ upsertKey: z.array(z.string()).optional(),
155
+ batchEndpoint: z.boolean().default(true),
156
+ // PostgreSQL:
157
+ table: z.string().optional(),
158
+ schema: z.string().default('public'),
159
+ }).refine(t => t.onConflict !== 'upsert' || (t.upsertKey !== undefined && t.upsertKey.length > 0), { message: 'upsertKey is required when onConflict is "upsert"', path: ['upsertKey'] });
160
+ // ── Run ───────────────────────────────────────────────────────────────────────
161
+ export const RunSchema = z.object({
162
+ mode: z.enum(['full', 'incremental', 'validate-only']).default('full'),
163
+ batchSize: z.number().int().positive().default(500),
164
+ onError: z.enum(['continue', 'stop']).default('continue'),
165
+ logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
166
+ dryRun: z.boolean().default(false),
167
+ outputDir: z.string().default('./output'),
168
+ stagingDb: z.string().default(''),
169
+ // Phase 4a — per-run enrich tuning (consumed by @caracal-lynx/sluice-enrich)
170
+ enrichConcurrency: z.number().int().positive().default(5),
171
+ enrichTimeoutMs: z.number().int().positive().default(5000),
172
+ enrichMaxRetries: z.number().int().min(0).max(5).default(3),
173
+ incrementalField: z.string().optional(),
174
+ incrementalSince: z.string().optional(),
175
+ });
176
+ // ── Multi-source merge ────────────────────────────────────────────────────────
177
+ const MergeFieldStrategySchema = z.object({
178
+ field: z.string(),
179
+ strategy: z.enum(['coalesce', 'priority-override']).optional(),
180
+ source: z.string().optional(), // named source id
181
+ }).refine(s => s.strategy !== undefined || s.source !== undefined, { message: 'fieldStrategy must specify strategy, source, or both' });
182
+ export const MergeSchema = z.object({
183
+ key: z.union([z.string(), z.array(z.string())]),
184
+ strategy: z.enum(['coalesce', 'priority-override', 'union', 'intersect'])
185
+ .default('coalesce'),
186
+ onUnmatched: z.enum(['include', 'exclude', 'warn', 'error']).default('include'),
187
+ fieldStrategies: z.array(MergeFieldStrategySchema).default([]),
188
+ conflictLog: z.string().optional(),
189
+ incrementalSource: z.string().optional(), // source id; required when run.mode = 'incremental'
190
+ });
191
+ export const MultiSourceEntrySchema = SourceBaseSchema.extend({
192
+ id: z.string().regex(/^[a-z0-9-]+$/, {
193
+ message: 'source id must be lowercase alphanumeric with hyphens only',
194
+ }),
195
+ priority: z.number().int().positive(),
196
+ rename: z.record(z.string()).optional(), // { 'old column': 'new column' }
197
+ }).refine(s => s.query || s.file || s.endpoint, { message: 'source must have query, file, or endpoint' });
198
+ // ── Pipeline root ─────────────────────────────────────────────────────────────
199
+ const PipelineMetaSchema = z.object({
200
+ name: z.string().regex(/^[a-z0-9-]+$/, 'name must be lowercase-hyphenated'),
201
+ client: z.string(),
202
+ version: z.string(),
203
+ entity: z.string(),
204
+ description: z.string().optional(),
205
+ });
206
+ export const PipelineSchema = z.object({
207
+ pipeline: PipelineMetaSchema,
208
+ source: SourceSchema.optional(),
209
+ sources: z.array(MultiSourceEntrySchema).min(2).optional(),
210
+ merge: MergeSchema.optional(),
211
+ enrich: EnrichSchema.optional(), // Phase 4a — runs between Extract/Merge and DQ
212
+ dq: DqSchema,
213
+ transform: TransformSchema,
214
+ target: TargetSchema,
215
+ run: RunSchema.default({}),
216
+ }).refine(p => (!!p.source && !p.sources && !p.merge) || (!p.source && !!p.sources && !!p.merge), { message: 'pipeline must have either source (single) or both sources and merge (multi)' }).refine(p => {
217
+ if (!p.sources)
218
+ return true;
219
+ const ids = p.sources.map(s => s.id);
220
+ return new Set(ids).size === ids.length;
221
+ }, { message: 'duplicate source ids in sources array' }).refine(p => {
222
+ if (!p.sources || !p.merge || p.run?.mode !== 'incremental')
223
+ return true;
224
+ return !!p.merge.incrementalSource;
225
+ }, { message: 'merge.incrementalSource is required when run.mode is incremental' }).refine(p => {
226
+ if (!p.sources || !p.merge || !p.merge.incrementalSource)
227
+ return true;
228
+ const ids = new Set(p.sources.map(s => s.id));
229
+ return ids.has(p.merge.incrementalSource);
230
+ }, { message: 'merge.incrementalSource must match one of the source ids in sources' });
231
+ // ── Phase 2: toolkit-level config (sluice.config.yaml) ───────────────────────
232
+ export const ToolkitConfigSchema = z.object({
233
+ version: z.string(),
234
+ plugins: z.array(z.object({
235
+ package: z.string(),
236
+ options: z.record(z.unknown()).optional(),
237
+ })).default([]),
238
+ });
239
+ // ── Phase 2: composite rule library (shared/rules.yaml) ──────────────────────
240
+ const BUILT_IN_CHECK_NAMES = new Set(CheckType.options);
241
+ export const CompositeRuleSchema = z.object({
242
+ id: z.string()
243
+ .regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/)
244
+ .refine(id => !BUILT_IN_CHECK_NAMES.has(id), {
245
+ message: 'composite rule id must not collide with a built-in check type',
246
+ }),
247
+ description: z.string().optional(),
248
+ checks: z.array(CheckSchema).min(1),
249
+ });
250
+ export const CompositeRuleLibrarySchema = z.object({
251
+ version: z.string(),
252
+ rules: z.array(CompositeRuleSchema).min(1),
253
+ });
254
+ // ── Type guards ───────────────────────────────────────────────────────────────
255
+ /** Narrows a Pipeline to one with a defined `source` (single-source pipeline). */
256
+ export function isSingleSource(p) {
257
+ return p.source !== undefined;
258
+ }
259
+ /** Narrows a Pipeline to one with defined `sources` and `merge` (multi-source pipeline). */
260
+ export function isMultiSource(p) {
261
+ return p.sources !== undefined;
262
+ }
263
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { Pipeline, SourceConfig, TargetConfig, RunConfig, FieldMapping, DqRule, CheckConfig, Lookup, ToolkitConfig, CompositeRule, CompositeRuleLibrary, MergeConfig, MultiSourceEntry, EnrichConfig, EnrichLookupConfig, EnrichWriteColumns, } from './schema.js';
2
+ export { isSingleSource, isMultiSource } from './schema.js';
3
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,MAAM,EACN,WAAW,EACX,MAAM,EACN,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ export { isSingleSource, isMultiSource } from './schema.js';
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAqBvC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Pipeline } from '../config/types.js';
2
+ import type { RuleRegistry } from '../plugins/registry.js';
3
+ import { StagingStore } from '../staging/index.js';
4
+ import type { DQSummary } from './types.js';
5
+ export declare class DQEngine {
6
+ private readonly ruleRegistry?;
7
+ constructor(ruleRegistry?: RuleRegistry | undefined);
8
+ run(config: Pipeline, store: StagingStore, tableName?: string, onProgress?: (rows: number) => void): Promise<DQSummary>;
9
+ }
10
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/dq/engine.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAc,MAAM,qBAAqB,CAAC;AAK/D,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAE7D,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAb,YAAY,CAAC,EAAE,YAAY,YAAA;IAElD,GAAG,CACP,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,YAAY,EACnB,SAAS,SAAY,EACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAClC,OAAO,CAAC,SAAS,CAAC;CA4GtB"}
@@ -0,0 +1,114 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * DQ engine.
5
+ *
6
+ * `run()` takes `tableName` so callers can point the engine at `stg_raw`,
7
+ * `stg_merged`, or `stg_raw_{sourceId}` — the engine itself is table-agnostic.
8
+ *
9
+ * `DqRule.sourceId` is parsed by the schema but not consulted here. The
10
+ * MultiSourcePipelineRunner filters rules by `sourceId` before invoking
11
+ * this engine.
12
+ */
13
+ import * as path from 'node:path';
14
+ import { quoteIdent } from '../staging/index.js';
15
+ import { ConfigError } from '../utils/errors.js';
16
+ import { writeRejectionCsv, writeSummaryJson } from './reporter.js';
17
+ import { BUILT_IN_RULES } from './rules/index.js';
18
+ export class DQEngine {
19
+ ruleRegistry;
20
+ constructor(ruleRegistry) {
21
+ this.ruleRegistry = ruleRegistry;
22
+ }
23
+ async run(config, store, tableName = 'stg_raw', onProgress) {
24
+ const rules = config.dq.rules;
25
+ // Short-circuit when there are no rules: still write a summary so callers
26
+ // have a consistent report-path contract.
27
+ const rows = await store.query(`SELECT * FROM ${quoteIdent(tableName)}`);
28
+ // ── Pre-pass: compute duplicate sets for every field carrying a `unique` check ──
29
+ const duplicatesByField = new Map();
30
+ for (const rule of rules) {
31
+ const hasUnique = rule.checks.some((c) => c.type === 'unique');
32
+ if (!hasUnique || duplicatesByField.has(rule.field))
33
+ continue;
34
+ const qField = quoteIdent(rule.field);
35
+ const dupRows = await store.query(`SELECT ${qField} AS v, count(*) AS n FROM ${quoteIdent(tableName)} WHERE ${qField} IS NOT NULL GROUP BY v HAVING count(*) > 1`);
36
+ duplicatesByField.set(rule.field, new Set(dupRows.map((r) => String(r.v))));
37
+ }
38
+ // ── Main pass: validate every (row, rule, check) combination ──
39
+ const violations = [];
40
+ const progressEvery = 500;
41
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
42
+ if (onProgress && rowIndex > 0 && rowIndex % progressEvery === 0) {
43
+ onProgress(rowIndex);
44
+ }
45
+ const row = rows[rowIndex];
46
+ for (const rule of rules) {
47
+ const value = row[rule.field];
48
+ for (const check of rule.checks) {
49
+ if (check.type === 'unique') {
50
+ const dups = duplicatesByField.get(rule.field);
51
+ if (value !== null &&
52
+ value !== undefined &&
53
+ value !== '' &&
54
+ dups?.has(String(value))) {
55
+ violations.push({
56
+ field: rule.field,
57
+ rowIndex,
58
+ value,
59
+ rule: 'unique',
60
+ severity: check.severity,
61
+ message: check.message ?? `${rule.field} value "${String(value)}" is not unique`,
62
+ });
63
+ }
64
+ continue;
65
+ }
66
+ const impl = BUILT_IN_RULES[check.type] ??
67
+ this.ruleRegistry?.get(check.type);
68
+ if (!impl) {
69
+ throw new ConfigError(`Unknown DQ rule type "${String(check.type)}". ` +
70
+ `Built-in types: ${Object.keys(BUILT_IN_RULES).join(', ')}`);
71
+ }
72
+ const violation = impl.validate(value, check, rowIndex, rule.field);
73
+ if (violation)
74
+ violations.push(violation);
75
+ }
76
+ }
77
+ }
78
+ // ── Aggregate ──
79
+ const counts = { critical: 0, warning: 0, info: 0 };
80
+ const byField = {};
81
+ const criticalRows = new Set();
82
+ for (const v of violations) {
83
+ counts[v.severity]++;
84
+ if (v.severity === 'critical')
85
+ criticalRows.add(v.rowIndex);
86
+ const bf = (byField[v.field] ??= { critical: 0, warning: 0, info: 0 });
87
+ bf[v.severity]++;
88
+ }
89
+ const rowsChecked = rows.length;
90
+ const rowsRejected = criticalRows.size;
91
+ const rowsPassed = rowsChecked - rowsRejected;
92
+ if (onProgress)
93
+ onProgress(rowsChecked);
94
+ // ── Write reports ──
95
+ const outputDir = path.resolve(config.run.outputDir);
96
+ const rejectionFile = config.dq.rejectionFile ?? path.join(outputDir, `${config.pipeline.name}-rejected.csv`);
97
+ const summaryFile = path.join(outputDir, `${config.pipeline.name}-dq-summary.json`);
98
+ await writeRejectionCsv(rejectionFile, violations);
99
+ const summary = {
100
+ pipeline: config.pipeline.name,
101
+ runAt: new Date().toISOString(),
102
+ rowsChecked,
103
+ rowsPassed,
104
+ rowsRejected,
105
+ violations: counts,
106
+ byField,
107
+ reportPath: summaryFile,
108
+ rejectedRowIndices: [...criticalRows].sort((a, b) => a - b),
109
+ };
110
+ await writeSummaryJson(summaryFile, summary);
111
+ return summary;
112
+ }
113
+ }
114
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/dq/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { DQEngine } from './engine.js';
2
+ export { writeRejectionCsv, writeSummaryJson } from './reporter.js';
3
+ export { BUILT_IN_RULES } from './rules/index.js';
4
+ export type { Rule, RuleViolation } from './rules/types.js';
5
+ export type { DQSummary, ViolationCounts } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dq/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ export { DQEngine } from './engine.js';
4
+ export { writeRejectionCsv, writeSummaryJson } from './reporter.js';
5
+ export { BUILT_IN_RULES } from './rules/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dq/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RuleViolation } from './rules/types.js';
2
+ import type { DQSummary } from './types.js';
3
+ export declare function writeRejectionCsv(outputPath: string, violations: RuleViolation[]): Promise<void>;
4
+ export declare function writeSummaryJson(outputPath: string, summary: DQSummary): Promise<void>;
5
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/dq/reporter.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAW5C,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,aAAa,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -0,0 +1,41 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ /**
4
+ * DQ reporter — writes rejection CSV + summary JSON.
5
+ * Pure file I/O; no DuckDB access.
6
+ */
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ import { stringify } from 'csv-stringify/sync';
10
+ const REJECTION_CSV_HEADER = [
11
+ 'row_index',
12
+ 'field',
13
+ 'value',
14
+ 'rule',
15
+ 'severity',
16
+ 'message',
17
+ ];
18
+ export async function writeRejectionCsv(outputPath, violations) {
19
+ const rows = violations.map((v) => [
20
+ String(v.rowIndex),
21
+ v.field,
22
+ v.value === null || v.value === undefined ? '' : String(v.value),
23
+ v.rule,
24
+ v.severity,
25
+ v.message,
26
+ ]);
27
+ const csv = stringify([[...REJECTION_CSV_HEADER], ...rows]);
28
+ await fs.mkdir(path.dirname(outputPath), { recursive: true });
29
+ await fs.writeFile(outputPath, csv, 'utf-8');
30
+ }
31
+ export async function writeSummaryJson(outputPath, summary) {
32
+ // Strip the internal `rejectedRowIndices` field from the serialised JSON —
33
+ // CLAUDE.md's published summary shape does not include it, and the list
34
+ // could be huge for large datasets. It stays on the in-memory summary for
35
+ // the runner to consume when filtering rejected rows pre-transform.
36
+ const { rejectedRowIndices: _omit, ...publicShape } = summary;
37
+ void _omit;
38
+ await fs.mkdir(path.dirname(outputPath), { recursive: true });
39
+ await fs.writeFile(outputPath, `${JSON.stringify(publicShape, null, 2)}\n`, 'utf-8');
40
+ }
41
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/dq/reporter.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAEvC;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAK/C,MAAM,oBAAoB,GAAG;IAC3B,WAAW;IACX,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;IACV,SAAS;CACD,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,UAA2B;IAE3B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,OAAO;KACV,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,OAAkB;IAElB,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,GAAG,OAErD,CAAC;IACF,KAAK,KAAK,CAAC;IACX,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CheckConfig } from '../../config/types.js';
2
+ import type { Rule, RuleViolation } from './types.js';
3
+ export declare class AllowedValuesRule implements Rule {
4
+ readonly id = "allowedValues";
5
+ validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
6
+ }
7
+ //# sourceMappingURL=allowedValues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowedValues.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/allowedValues.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,qBAAa,iBAAkB,YAAW,IAAI;IAC5C,QAAQ,CAAC,EAAE,mBAAmB;IAE9B,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAoBxB"}
@@ -0,0 +1,26 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ import { DQError } from '../../utils/errors.js';
4
+ export class AllowedValuesRule {
5
+ id = 'allowedValues';
6
+ validate(value, config, rowIndex, field) {
7
+ if (value === null || value === undefined || value === '')
8
+ return null;
9
+ if (!Array.isArray(config.value)) {
10
+ throw new DQError(`allowedValues rule on field "${field}" requires an array of permitted strings`);
11
+ }
12
+ const s = String(value);
13
+ if (config.value.includes(s))
14
+ return null;
15
+ return {
16
+ field,
17
+ rowIndex,
18
+ value,
19
+ rule: 'allowedValues',
20
+ severity: config.severity,
21
+ message: config.message ??
22
+ `${field} value "${s}" not in allowed list [${config.value.join(', ')}]`,
23
+ };
24
+ }
25
+ }
26
+ //# sourceMappingURL=allowedValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowedValues.js","sourceRoot":"","sources":["../../../src/dq/rules/allowedValues.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,MAAM,OAAO,iBAAiB;IACnB,EAAE,GAAG,eAAe,CAAC;IAE9B,QAAQ,CACN,KAAc,EACd,MAAmB,EACnB,QAAgB,EAChB,KAAa;QAEb,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,OAAO,CACf,gCAAgC,KAAK,0CAA0C,CAChF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EACL,MAAM,CAAC,OAAO;gBACd,GAAG,KAAK,WAAW,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAC3E,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { CheckConfig } from '../../config/types.js';
2
+ import type { Rule, RuleViolation } from './types.js';
3
+ export declare class EmailRule implements Rule {
4
+ readonly id = "email";
5
+ validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
6
+ }
7
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/email.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQtD,qBAAa,SAAU,YAAW,IAAI;IACpC,QAAQ,CAAC,EAAE,WAAW;IAEtB,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAYxB"}
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: Elastic-2.0
2
+ // Copyright (c) 2026 Caracal Lynx Ltd.
3
+ // Pragmatic RFC 5322-ish regex — matches the vast majority of real addresses
4
+ // without the full 400-line spec. Rejects leading/trailing dots, multiple @,
5
+ // and obviously-malformed domains.
6
+ const EMAIL_RE = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$/;
7
+ export class EmailRule {
8
+ id = 'email';
9
+ validate(value, config, rowIndex, field) {
10
+ if (value === null || value === undefined || value === '')
11
+ return null;
12
+ if (EMAIL_RE.test(String(value)))
13
+ return null;
14
+ return {
15
+ field,
16
+ rowIndex,
17
+ value,
18
+ rule: 'email',
19
+ severity: config.severity,
20
+ message: config.message ?? `${field} is not a valid email address`,
21
+ };
22
+ }
23
+ }
24
+ //# sourceMappingURL=email.js.map