@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.
- package/CLAUDE.md +1822 -0
- package/LICENCE-FAQ.md +74 -0
- package/LICENSE +92 -0
- package/README.md +582 -0
- package/dist/adapters/source/csv.d.ts +10 -0
- package/dist/adapters/source/csv.d.ts.map +1 -0
- package/dist/adapters/source/csv.js +110 -0
- package/dist/adapters/source/csv.js.map +1 -0
- package/dist/adapters/source/index.d.ts +9 -0
- package/dist/adapters/source/index.d.ts.map +1 -0
- package/dist/adapters/source/index.js +26 -0
- package/dist/adapters/source/index.js.map +1 -0
- package/dist/adapters/source/mssql.d.ts +11 -0
- package/dist/adapters/source/mssql.d.ts.map +1 -0
- package/dist/adapters/source/mssql.js +230 -0
- package/dist/adapters/source/mssql.js.map +1 -0
- package/dist/adapters/source/pg.d.ts +11 -0
- package/dist/adapters/source/pg.d.ts.map +1 -0
- package/dist/adapters/source/pg.js +88 -0
- package/dist/adapters/source/pg.js.map +1 -0
- package/dist/adapters/source/registry.d.ts +10 -0
- package/dist/adapters/source/registry.d.ts.map +1 -0
- package/dist/adapters/source/registry.js +36 -0
- package/dist/adapters/source/registry.js.map +1 -0
- package/dist/adapters/source/rest.d.ts +16 -0
- package/dist/adapters/source/rest.d.ts.map +1 -0
- package/dist/adapters/source/rest.js +182 -0
- package/dist/adapters/source/rest.js.map +1 -0
- package/dist/adapters/source/rest.types.d.ts +15 -0
- package/dist/adapters/source/rest.types.d.ts.map +1 -0
- package/dist/adapters/source/rest.types.js +6 -0
- package/dist/adapters/source/rest.types.js.map +1 -0
- package/dist/adapters/source/types.d.ts +23 -0
- package/dist/adapters/source/types.d.ts.map +1 -0
- package/dist/adapters/source/types.js +4 -0
- package/dist/adapters/source/types.js.map +1 -0
- package/dist/adapters/source/xlsx.d.ts +10 -0
- package/dist/adapters/source/xlsx.d.ts.map +1 -0
- package/dist/adapters/source/xlsx.js +71 -0
- package/dist/adapters/source/xlsx.js.map +1 -0
- package/dist/adapters/target/bc.d.ts +21 -0
- package/dist/adapters/target/bc.d.ts.map +1 -0
- package/dist/adapters/target/bc.js +188 -0
- package/dist/adapters/target/bc.js.map +1 -0
- package/dist/adapters/target/bluecherry.d.ts +10 -0
- package/dist/adapters/target/bluecherry.d.ts.map +1 -0
- package/dist/adapters/target/bluecherry.js +127 -0
- package/dist/adapters/target/bluecherry.js.map +1 -0
- package/dist/adapters/target/csv.d.ts +10 -0
- package/dist/adapters/target/csv.d.ts.map +1 -0
- package/dist/adapters/target/csv.js +40 -0
- package/dist/adapters/target/csv.js.map +1 -0
- package/dist/adapters/target/ifs.d.ts +10 -0
- package/dist/adapters/target/ifs.d.ts.map +1 -0
- package/dist/adapters/target/ifs.js +55 -0
- package/dist/adapters/target/ifs.js.map +1 -0
- package/dist/adapters/target/index.d.ts +8 -0
- package/dist/adapters/target/index.d.ts.map +1 -0
- package/dist/adapters/target/index.js +22 -0
- package/dist/adapters/target/index.js.map +1 -0
- package/dist/adapters/target/pg.d.ts +11 -0
- package/dist/adapters/target/pg.d.ts.map +1 -0
- package/dist/adapters/target/pg.js +103 -0
- package/dist/adapters/target/pg.js.map +1 -0
- package/dist/adapters/target/registry.d.ts +9 -0
- package/dist/adapters/target/registry.d.ts.map +1 -0
- package/dist/adapters/target/registry.js +29 -0
- package/dist/adapters/target/registry.js.map +1 -0
- package/dist/adapters/target/types.d.ts +15 -0
- package/dist/adapters/target/types.d.ts.map +1 -0
- package/dist/adapters/target/types.js +4 -0
- package/dist/adapters/target/types.js.map +1 -0
- package/dist/cli.d.ts +25 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +354 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +5 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +135 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +4162 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +263 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +3 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +4 -0
- package/dist/config/types.js.map +1 -0
- package/dist/dq/engine.d.ts +10 -0
- package/dist/dq/engine.d.ts.map +1 -0
- package/dist/dq/engine.js +114 -0
- package/dist/dq/engine.js.map +1 -0
- package/dist/dq/index.d.ts +6 -0
- package/dist/dq/index.d.ts.map +1 -0
- package/dist/dq/index.js +6 -0
- package/dist/dq/index.js.map +1 -0
- package/dist/dq/reporter.d.ts +5 -0
- package/dist/dq/reporter.d.ts.map +1 -0
- package/dist/dq/reporter.js +41 -0
- package/dist/dq/reporter.js.map +1 -0
- package/dist/dq/rules/allowedValues.d.ts +7 -0
- package/dist/dq/rules/allowedValues.d.ts.map +1 -0
- package/dist/dq/rules/allowedValues.js +26 -0
- package/dist/dq/rules/allowedValues.js.map +1 -0
- package/dist/dq/rules/email.d.ts +7 -0
- package/dist/dq/rules/email.d.ts.map +1 -0
- package/dist/dq/rules/email.js +24 -0
- package/dist/dq/rules/email.js.map +1 -0
- package/dist/dq/rules/index.d.ts +15 -0
- package/dist/dq/rules/index.d.ts.map +1 -0
- package/dist/dq/rules/index.js +30 -0
- package/dist/dq/rules/index.js.map +1 -0
- package/dist/dq/rules/maxLength.d.ts +7 -0
- package/dist/dq/rules/maxLength.d.ts.map +1 -0
- package/dist/dq/rules/maxLength.js +25 -0
- package/dist/dq/rules/maxLength.js.map +1 -0
- package/dist/dq/rules/minMax.d.ts +11 -0
- package/dist/dq/rules/minMax.d.ts.map +1 -0
- package/dist/dq/rules/minMax.js +52 -0
- package/dist/dq/rules/minMax.js.map +1 -0
- package/dist/dq/rules/notNull.d.ts +7 -0
- package/dist/dq/rules/notNull.d.ts.map +1 -0
- package/dist/dq/rules/notNull.js +21 -0
- package/dist/dq/rules/notNull.js.map +1 -0
- package/dist/dq/rules/pattern.d.ts +7 -0
- package/dist/dq/rules/pattern.d.ts.map +1 -0
- package/dist/dq/rules/pattern.js +31 -0
- package/dist/dq/rules/pattern.js.map +1 -0
- package/dist/dq/rules/types.d.ts +6 -0
- package/dist/dq/rules/types.d.ts.map +1 -0
- package/dist/dq/rules/types.js +4 -0
- package/dist/dq/rules/types.js.map +1 -0
- package/dist/dq/rules/ukPostcode.d.ts +7 -0
- package/dist/dq/rules/ukPostcode.d.ts.map +1 -0
- package/dist/dq/rules/ukPostcode.js +24 -0
- package/dist/dq/rules/ukPostcode.js.map +1 -0
- package/dist/dq/rules/unique.d.ts +14 -0
- package/dist/dq/rules/unique.d.ts.map +1 -0
- package/dist/dq/rules/unique.js +9 -0
- package/dist/dq/rules/unique.js.map +1 -0
- package/dist/dq/types.d.ts +29 -0
- package/dist/dq/types.d.ts.map +1 -0
- package/dist/dq/types.js +4 -0
- package/dist/dq/types.js.map +1 -0
- package/dist/enrich/types.d.ts +87 -0
- package/dist/enrich/types.d.ts.map +1 -0
- package/dist/enrich/types.js +4 -0
- package/dist/enrich/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/merge/conflict-log.d.ts +9 -0
- package/dist/merge/conflict-log.d.ts.map +1 -0
- package/dist/merge/conflict-log.js +28 -0
- package/dist/merge/conflict-log.js.map +1 -0
- package/dist/merge/engine.d.ts +7 -0
- package/dist/merge/engine.d.ts.map +1 -0
- package/dist/merge/engine.js +19 -0
- package/dist/merge/engine.js.map +1 -0
- package/dist/merge/index.d.ts +11 -0
- package/dist/merge/index.d.ts.map +1 -0
- package/dist/merge/index.js +34 -0
- package/dist/merge/index.js.map +1 -0
- package/dist/merge/sql-builder.d.ts +19 -0
- package/dist/merge/sql-builder.d.ts.map +1 -0
- package/dist/merge/sql-builder.js +148 -0
- package/dist/merge/sql-builder.js.map +1 -0
- package/dist/merge/strategies/coalesce.d.ts +17 -0
- package/dist/merge/strategies/coalesce.d.ts.map +1 -0
- package/dist/merge/strategies/coalesce.js +77 -0
- package/dist/merge/strategies/coalesce.js.map +1 -0
- package/dist/merge/strategies/index.d.ts +5 -0
- package/dist/merge/strategies/index.d.ts.map +1 -0
- package/dist/merge/strategies/index.js +7 -0
- package/dist/merge/strategies/index.js.map +1 -0
- package/dist/merge/strategies/intersect.d.ts +17 -0
- package/dist/merge/strategies/intersect.d.ts.map +1 -0
- package/dist/merge/strategies/intersect.js +75 -0
- package/dist/merge/strategies/intersect.js.map +1 -0
- package/dist/merge/strategies/priority-override.d.ts +16 -0
- package/dist/merge/strategies/priority-override.d.ts.map +1 -0
- package/dist/merge/strategies/priority-override.js +78 -0
- package/dist/merge/strategies/priority-override.js.map +1 -0
- package/dist/merge/strategies/registry.d.ts +8 -0
- package/dist/merge/strategies/registry.d.ts.map +1 -0
- package/dist/merge/strategies/registry.js +19 -0
- package/dist/merge/strategies/registry.js.map +1 -0
- package/dist/merge/strategies/union.d.ts +15 -0
- package/dist/merge/strategies/union.d.ts.map +1 -0
- package/dist/merge/strategies/union.js +75 -0
- package/dist/merge/strategies/union.js.map +1 -0
- package/dist/merge/types.d.ts +24 -0
- package/dist/merge/types.d.ts.map +1 -0
- package/dist/merge/types.js +4 -0
- package/dist/merge/types.js.map +1 -0
- package/dist/multi-source-runner.d.ts +22 -0
- package/dist/multi-source-runner.d.ts.map +1 -0
- package/dist/multi-source-runner.js +398 -0
- package/dist/multi-source-runner.js.map +1 -0
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +5 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +22 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +151 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/registry.d.ts +25 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +42 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +61 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +4 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/runner.d.ts +97 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +520 -0
- package/dist/runner.js.map +1 -0
- package/dist/staging/index.d.ts +3 -0
- package/dist/staging/index.d.ts.map +1 -0
- package/dist/staging/index.js +5 -0
- package/dist/staging/index.js.map +1 -0
- package/dist/staging/schema.d.ts +19 -0
- package/dist/staging/schema.d.ts.map +1 -0
- package/dist/staging/schema.js +15 -0
- package/dist/staging/schema.js.map +1 -0
- package/dist/staging/store.d.ts +71 -0
- package/dist/staging/store.d.ts.map +1 -0
- package/dist/staging/store.js +270 -0
- package/dist/staging/store.js.map +1 -0
- package/dist/transform/cleanse.d.ts +2 -0
- package/dist/transform/cleanse.d.ts.map +1 -0
- package/dist/transform/cleanse.js +59 -0
- package/dist/transform/cleanse.js.map +1 -0
- package/dist/transform/engine.d.ts +10 -0
- package/dist/transform/engine.d.ts.map +1 -0
- package/dist/transform/engine.js +225 -0
- package/dist/transform/engine.js.map +1 -0
- package/dist/transform/expression.d.ts +5 -0
- package/dist/transform/expression.d.ts.map +1 -0
- package/dist/transform/expression.js +52 -0
- package/dist/transform/expression.js.map +1 -0
- package/dist/transform/index.d.ts +6 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +7 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/transform/lookup.d.ts +10 -0
- package/dist/transform/lookup.d.ts.map +1 -0
- package/dist/transform/lookup.js +66 -0
- package/dist/transform/lookup.js.map +1 -0
- package/dist/transform/types.d.ts +10 -0
- package/dist/transform/types.d.ts.map +1 -0
- package/dist/transform/types.js +4 -0
- package/dist/transform/types.js.map +1 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +26 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/errors.d.ts +26 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +39 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +16 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/progress.d.ts +66 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +283 -0
- package/dist/utils/progress.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/dq/rules/email.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAKvC,6EAA6E;AAC7E,6EAA6E;AAC7E,mCAAmC;AACnC,MAAM,QAAQ,GACZ,uHAAuH,CAAC;AAE1H,MAAM,OAAO,SAAS;IACX,EAAE,GAAG,OAAO,CAAC;IAEtB,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,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9C,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,+BAA+B;SACnE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { CheckType } from '../../config/schema.js';
|
|
3
|
+
import type { Rule } from './types.js';
|
|
4
|
+
export type BuiltInCheckType = z.infer<typeof CheckType>;
|
|
5
|
+
export declare const BUILT_IN_RULES: Readonly<Record<BuiltInCheckType, Rule>>;
|
|
6
|
+
export { AllowedValuesRule } from './allowedValues.js';
|
|
7
|
+
export { EmailRule } from './email.js';
|
|
8
|
+
export { MaxLengthRule } from './maxLength.js';
|
|
9
|
+
export { MaxRule, MinRule } from './minMax.js';
|
|
10
|
+
export { NotNullRule } from './notNull.js';
|
|
11
|
+
export { PatternRule } from './pattern.js';
|
|
12
|
+
export { UkPostcodeRule } from './ukPostcode.js';
|
|
13
|
+
export { UniqueRule } from './unique.js';
|
|
14
|
+
export type { Rule, RuleViolation } from './types.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AASnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAEzD,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAUlE,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
import { AllowedValuesRule } from './allowedValues.js';
|
|
4
|
+
import { EmailRule } from './email.js';
|
|
5
|
+
import { MaxLengthRule } from './maxLength.js';
|
|
6
|
+
import { MaxRule, MinRule } from './minMax.js';
|
|
7
|
+
import { NotNullRule } from './notNull.js';
|
|
8
|
+
import { PatternRule } from './pattern.js';
|
|
9
|
+
import { UkPostcodeRule } from './ukPostcode.js';
|
|
10
|
+
import { UniqueRule } from './unique.js';
|
|
11
|
+
export const BUILT_IN_RULES = Object.freeze({
|
|
12
|
+
notNull: new NotNullRule(),
|
|
13
|
+
unique: new UniqueRule(),
|
|
14
|
+
pattern: new PatternRule(),
|
|
15
|
+
email: new EmailRule(),
|
|
16
|
+
ukPostcode: new UkPostcodeRule(),
|
|
17
|
+
maxLength: new MaxLengthRule(),
|
|
18
|
+
min: new MinRule(),
|
|
19
|
+
max: new MaxRule(),
|
|
20
|
+
allowedValues: new AllowedValuesRule(),
|
|
21
|
+
});
|
|
22
|
+
export { AllowedValuesRule } from './allowedValues.js';
|
|
23
|
+
export { EmailRule } from './email.js';
|
|
24
|
+
export { MaxLengthRule } from './maxLength.js';
|
|
25
|
+
export { MaxRule, MinRule } from './minMax.js';
|
|
26
|
+
export { NotNullRule } from './notNull.js';
|
|
27
|
+
export { PatternRule } from './pattern.js';
|
|
28
|
+
export { UkPostcodeRule } from './ukPostcode.js';
|
|
29
|
+
export { UniqueRule } from './unique.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dq/rules/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAKvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,CAAC,MAAM,cAAc,GAA6C,MAAM,CAAC,MAAM,CAAC;IACpF,OAAO,EAAE,IAAI,WAAW,EAAE;IAC1B,MAAM,EAAE,IAAI,UAAU,EAAE;IACxB,OAAO,EAAE,IAAI,WAAW,EAAE;IAC1B,KAAK,EAAE,IAAI,SAAS,EAAE;IACtB,UAAU,EAAE,IAAI,cAAc,EAAE;IAChC,SAAS,EAAE,IAAI,aAAa,EAAE;IAC9B,GAAG,EAAE,IAAI,OAAO,EAAE;IAClB,GAAG,EAAE,IAAI,OAAO,EAAE;IAClB,aAAa,EAAE,IAAI,iBAAiB,EAAE;CACvC,CAAC,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,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 MaxLengthRule implements Rule {
|
|
4
|
+
readonly id = "maxLength";
|
|
5
|
+
validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=maxLength.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxLength.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/maxLength.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,aAAc,YAAW,IAAI;IACxC,QAAQ,CAAC,EAAE,eAAe;IAE1B,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAiBxB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
import { DQError } from '../../utils/errors.js';
|
|
4
|
+
export class MaxLengthRule {
|
|
5
|
+
id = 'maxLength';
|
|
6
|
+
validate(value, config, rowIndex, field) {
|
|
7
|
+
if (value === null || value === undefined)
|
|
8
|
+
return null;
|
|
9
|
+
if (typeof config.value !== 'number') {
|
|
10
|
+
throw new DQError(`maxLength rule on field "${field}" requires a numeric value`);
|
|
11
|
+
}
|
|
12
|
+
const len = String(value).length;
|
|
13
|
+
if (len <= config.value)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
field,
|
|
17
|
+
rowIndex,
|
|
18
|
+
value,
|
|
19
|
+
rule: 'maxLength',
|
|
20
|
+
severity: config.severity,
|
|
21
|
+
message: config.message ?? `${field} length ${len} exceeds maximum ${config.value}`,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=maxLength.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxLength.js","sourceRoot":"","sources":["../../../src/dq/rules/maxLength.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,MAAM,OAAO,aAAa;IACf,EAAE,GAAG,WAAW,CAAC;IAE1B,QAAQ,CACN,KAAc,EACd,MAAmB,EACnB,QAAgB,EAChB,KAAa;QAEb,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,OAAO,CAAC,4BAA4B,KAAK,4BAA4B,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QACjC,IAAI,GAAG,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EACL,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,WAAW,GAAG,oBAAoB,MAAM,CAAC,KAAK,EAAE;SAC7E,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CheckConfig } from '../../config/types.js';
|
|
2
|
+
import type { Rule, RuleViolation } from './types.js';
|
|
3
|
+
export declare class MinRule implements Rule {
|
|
4
|
+
readonly id = "min";
|
|
5
|
+
validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
|
|
6
|
+
}
|
|
7
|
+
export declare class MaxRule implements Rule {
|
|
8
|
+
readonly id = "max";
|
|
9
|
+
validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=minMax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minMax.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/minMax.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQtD,qBAAa,OAAQ,YAAW,IAAI;IAClC,QAAQ,CAAC,EAAE,SAAS;IAEpB,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAgBxB;AAED,qBAAa,OAAQ,YAAW,IAAI;IAClC,QAAQ,CAAC,EAAE,SAAS;IAEpB,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAgBxB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
import { DQError } from '../../utils/errors.js';
|
|
4
|
+
function toNumber(value) {
|
|
5
|
+
if (value === null || value === undefined || value === '')
|
|
6
|
+
return null;
|
|
7
|
+
const n = typeof value === 'number' ? value : parseFloat(String(value));
|
|
8
|
+
return Number.isFinite(n) ? n : null;
|
|
9
|
+
}
|
|
10
|
+
export class MinRule {
|
|
11
|
+
id = 'min';
|
|
12
|
+
validate(value, config, rowIndex, field) {
|
|
13
|
+
if (typeof config.value !== 'number') {
|
|
14
|
+
throw new DQError(`min rule on field "${field}" requires a numeric value`);
|
|
15
|
+
}
|
|
16
|
+
const n = toNumber(value);
|
|
17
|
+
if (n === null)
|
|
18
|
+
return null; // let notNull handle unparseable nulls
|
|
19
|
+
if (n >= config.value)
|
|
20
|
+
return null;
|
|
21
|
+
return {
|
|
22
|
+
field,
|
|
23
|
+
rowIndex,
|
|
24
|
+
value,
|
|
25
|
+
rule: 'min',
|
|
26
|
+
severity: config.severity,
|
|
27
|
+
message: config.message ?? `${field} value ${n} is below minimum ${config.value}`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class MaxRule {
|
|
32
|
+
id = 'max';
|
|
33
|
+
validate(value, config, rowIndex, field) {
|
|
34
|
+
if (typeof config.value !== 'number') {
|
|
35
|
+
throw new DQError(`max rule on field "${field}" requires a numeric value`);
|
|
36
|
+
}
|
|
37
|
+
const n = toNumber(value);
|
|
38
|
+
if (n === null)
|
|
39
|
+
return null;
|
|
40
|
+
if (n <= config.value)
|
|
41
|
+
return null;
|
|
42
|
+
return {
|
|
43
|
+
field,
|
|
44
|
+
rowIndex,
|
|
45
|
+
value,
|
|
46
|
+
rule: 'max',
|
|
47
|
+
severity: config.severity,
|
|
48
|
+
message: config.message ?? `${field} value ${n} exceeds maximum ${config.value}`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=minMax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minMax.js","sourceRoot":"","sources":["../../../src/dq/rules/minMax.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACvE,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,OAAO,OAAO;IACT,EAAE,GAAG,KAAK,CAAC;IAEpB,QAAQ,CACN,KAAc,EACd,MAAmB,EACnB,QAAgB,EAChB,KAAa;QAEb,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,OAAO,CAAC,sBAAsB,KAAK,4BAA4B,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,uCAAuC;QACpE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,UAAU,CAAC,qBAAqB,MAAM,CAAC,KAAK,EAAE;SAClF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,OAAO;IACT,EAAE,GAAG,KAAK,CAAC;IAEpB,QAAQ,CACN,KAAc,EACd,MAAmB,EACnB,QAAgB,EAChB,KAAa;QAEb,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,OAAO,CAAC,sBAAsB,KAAK,4BAA4B,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,UAAU,CAAC,oBAAoB,MAAM,CAAC,KAAK,EAAE;SACjF,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 NotNullRule implements Rule {
|
|
4
|
+
readonly id = "notNull";
|
|
5
|
+
validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=notNull.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notNull.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/notNull.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,qBAAa,WAAY,YAAW,IAAI;IACtC,QAAQ,CAAC,EAAE,aAAa;IAExB,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAexB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
export class NotNullRule {
|
|
4
|
+
id = 'notNull';
|
|
5
|
+
validate(value, config, rowIndex, field) {
|
|
6
|
+
const isNull = value === null ||
|
|
7
|
+
value === undefined ||
|
|
8
|
+
(typeof value === 'string' && value.trim() === '');
|
|
9
|
+
if (!isNull)
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
field,
|
|
13
|
+
rowIndex,
|
|
14
|
+
value,
|
|
15
|
+
rule: 'notNull',
|
|
16
|
+
severity: config.severity,
|
|
17
|
+
message: config.message ?? `${field} must not be null or empty`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=notNull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notNull.js","sourceRoot":"","sources":["../../../src/dq/rules/notNull.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAKvC,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,SAAS,CAAC;IAExB,QAAQ,CACN,KAAc,EACd,MAAmB,EACnB,QAAgB,EAChB,KAAa;QAEb,MAAM,MAAM,GACV,KAAK,KAAK,IAAI;YACd,KAAK,KAAK,SAAS;YACnB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,4BAA4B;SAChE,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 PatternRule implements Rule {
|
|
4
|
+
readonly id = "pattern";
|
|
5
|
+
validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/pattern.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,WAAY,YAAW,IAAI;IACtC,QAAQ,CAAC,EAAE,aAAa;IAExB,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAwBxB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
import { DQError } from '../../utils/errors.js';
|
|
4
|
+
export class PatternRule {
|
|
5
|
+
id = 'pattern';
|
|
6
|
+
validate(value, config, rowIndex, field) {
|
|
7
|
+
if (value === null || value === undefined || value === '')
|
|
8
|
+
return null;
|
|
9
|
+
if (typeof config.value !== 'string') {
|
|
10
|
+
throw new DQError(`pattern rule on field "${field}" requires a string value (the regex)`);
|
|
11
|
+
}
|
|
12
|
+
let regex;
|
|
13
|
+
try {
|
|
14
|
+
regex = new RegExp(config.value);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
throw new DQError(`pattern rule on field "${field}" has invalid regex "${config.value}"`, err);
|
|
18
|
+
}
|
|
19
|
+
if (regex.test(String(value)))
|
|
20
|
+
return null;
|
|
21
|
+
return {
|
|
22
|
+
field,
|
|
23
|
+
rowIndex,
|
|
24
|
+
value,
|
|
25
|
+
rule: 'pattern',
|
|
26
|
+
severity: config.severity,
|
|
27
|
+
message: config.message ?? `${field} does not match pattern ${config.value}`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../../src/dq/rules/pattern.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,SAAS,CAAC;IAExB,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,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,OAAO,CAAC,0BAA0B,KAAK,uCAAuC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,OAAO,CACf,0BAA0B,KAAK,wBAAwB,MAAM,CAAC,KAAK,GAAG,EACtE,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,2BAA2B,MAAM,CAAC,KAAK,EAAE;SAC7E,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in DQ rules share the same interface as user-registered RulePlugins.
|
|
3
|
+
* Keeping the shapes aligned means the engine can look up rules uniformly.
|
|
4
|
+
*/
|
|
5
|
+
export type { RulePlugin as Rule, RuleViolation } from '../../plugins/types.js';
|
|
6
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/types.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,YAAY,EAAE,UAAU,IAAI,IAAI,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/dq/rules/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CheckConfig } from '../../config/types.js';
|
|
2
|
+
import type { Rule, RuleViolation } from './types.js';
|
|
3
|
+
export declare class UkPostcodeRule implements Rule {
|
|
4
|
+
readonly id = "ukPostcode";
|
|
5
|
+
validate(value: unknown, config: CheckConfig, rowIndex: number, field: string): RuleViolation | null;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=ukPostcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ukPostcode.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/ukPostcode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMtD,qBAAa,cAAe,YAAW,IAAI;IACzC,QAAQ,CAAC,EAAE,gBAAgB;IAE3B,QAAQ,CACN,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI;CAaxB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
// Covers all current UK postcode formats after whitespace stripping:
|
|
4
|
+
// A9 9AA, A99 9AA, AA9 9AA, AA99 9AA, A9A 9AA, AA9A 9AA
|
|
5
|
+
const UK_POSTCODE_RE = /^[A-Z]{1,2}[0-9][A-Z0-9]?[0-9][A-Z]{2}$/;
|
|
6
|
+
export class UkPostcodeRule {
|
|
7
|
+
id = 'ukPostcode';
|
|
8
|
+
validate(value, config, rowIndex, field) {
|
|
9
|
+
if (value === null || value === undefined || value === '')
|
|
10
|
+
return null;
|
|
11
|
+
const normalised = String(value).replace(/\s+/g, '').toUpperCase();
|
|
12
|
+
if (UK_POSTCODE_RE.test(normalised))
|
|
13
|
+
return null;
|
|
14
|
+
return {
|
|
15
|
+
field,
|
|
16
|
+
rowIndex,
|
|
17
|
+
value,
|
|
18
|
+
rule: 'ukPostcode',
|
|
19
|
+
severity: config.severity,
|
|
20
|
+
message: config.message ?? `${field} is not a valid UK postcode`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ukPostcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ukPostcode.js","sourceRoot":"","sources":["../../../src/dq/rules/ukPostcode.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAKvC,qEAAqE;AACrE,0DAA0D;AAC1D,MAAM,cAAc,GAAG,yCAAyC,CAAC;AAEjE,MAAM,OAAO,cAAc;IAChB,EAAE,GAAG,YAAY,CAAC;IAE3B,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,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,GAAG,KAAK,6BAA6B;SACjE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unique is handled specially by DQEngine: the engine runs a GROUP BY
|
|
3
|
+
* pre-pass and collects duplicate values per-field, then emits violations
|
|
4
|
+
* directly for rows whose value appears in that set. The validate() method
|
|
5
|
+
* below exists only so the rule fits the registry shape — it always returns
|
|
6
|
+
* null because per-cell validation can't determine uniqueness in isolation.
|
|
7
|
+
*/
|
|
8
|
+
import type { CheckConfig } from '../../config/types.js';
|
|
9
|
+
import type { Rule, RuleViolation } from './types.js';
|
|
10
|
+
export declare class UniqueRule implements Rule {
|
|
11
|
+
readonly id = "unique";
|
|
12
|
+
validate(_value: unknown, _config: CheckConfig, _rowIndex: number, _field: string): RuleViolation | null;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=unique.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unique.d.ts","sourceRoot":"","sources":["../../../src/dq/rules/unique.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,qBAAa,UAAW,YAAW,IAAI;IACrC,QAAQ,CAAC,EAAE,YAAY;IAEvB,QAAQ,CACN,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,aAAa,GAAG,IAAI;CAGxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unique.js","sourceRoot":"","sources":["../../../src/dq/rules/unique.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAavC,MAAM,OAAO,UAAU;IACZ,EAAE,GAAG,QAAQ,CAAC;IAEvB,QAAQ,CACN,MAAe,EACf,OAAoB,EACpB,SAAiB,EACjB,MAAc;QAEd,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DQ summary shape shared between the engine, reporter, and runner.
|
|
3
|
+
*
|
|
4
|
+
* Phase 4: runner emits a stub summary with zero violations.
|
|
5
|
+
* Phase 5: DQEngine and reporter populate this from real rule evaluations.
|
|
6
|
+
*/
|
|
7
|
+
export interface ViolationCounts {
|
|
8
|
+
critical: number;
|
|
9
|
+
warning: number;
|
|
10
|
+
info: number;
|
|
11
|
+
}
|
|
12
|
+
export interface DQSummary {
|
|
13
|
+
pipeline: string;
|
|
14
|
+
runAt: string;
|
|
15
|
+
rowsChecked: number;
|
|
16
|
+
rowsPassed: number;
|
|
17
|
+
rowsRejected: number;
|
|
18
|
+
violations: ViolationCounts;
|
|
19
|
+
byField: Record<string, ViolationCounts>;
|
|
20
|
+
/** Filesystem path of the written summary JSON; empty string when not written. */
|
|
21
|
+
reportPath: string;
|
|
22
|
+
/**
|
|
23
|
+
* Row indices (0-based) that carry at least one `critical` violation.
|
|
24
|
+
* Consumed by the transform engine to exclude rejected rows from stg_transformed.
|
|
25
|
+
* Stripped before the summary is serialised to disk.
|
|
26
|
+
*/
|
|
27
|
+
rejectedRowIndices?: number[];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dq/types.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B"}
|
package/dist/dq/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/dq/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sluice — Phase 4a public enrich interfaces
|
|
3
|
+
* @caracal-lynx/sluice
|
|
4
|
+
*
|
|
5
|
+
* Type-only public surface for the enrich subsystem. The implementation
|
|
6
|
+
* (EnrichRegistry, EnrichmentRunner, EnrichCache, plugin loader, providers)
|
|
7
|
+
* lives in the private `@caracal-lynx/sluice-enrich` package and is not
|
|
8
|
+
* shipped with the open-source core.
|
|
9
|
+
*
|
|
10
|
+
* Third-party plugin authors implement `EnrichPlugin` here and drop a
|
|
11
|
+
* `*.enrich.ts` file into a client `plugins/` directory. The private
|
|
12
|
+
* package's loader picks them up at runtime via the registered phase factory.
|
|
13
|
+
*
|
|
14
|
+
* Unlike `RulePlugin` and `TransformPlugin` (Phase 2/3) — which are
|
|
15
|
+
* contractually synchronous and pure — `EnrichPlugin.enrich()` is async.
|
|
16
|
+
* It is the only plugin interface in Sluice that may perform I/O.
|
|
17
|
+
*/
|
|
18
|
+
import type { Logger } from 'pino';
|
|
19
|
+
import type { EnrichConfig, EnrichLookupConfig, RunConfig } from '../config/schema.js';
|
|
20
|
+
import type { StagingStore } from '../staging/store.js';
|
|
21
|
+
export interface EnrichOptions extends Record<string, unknown> {
|
|
22
|
+
/** Per-call timeout in milliseconds. Inherited from RunConfig.enrichTimeoutMs. */
|
|
23
|
+
timeoutMs: number;
|
|
24
|
+
/** Retries per call (axios-retry exponential backoff). */
|
|
25
|
+
maxRetries: number;
|
|
26
|
+
}
|
|
27
|
+
export interface EnrichResult {
|
|
28
|
+
/** True if the external source confirms the value is valid/registered. */
|
|
29
|
+
valid: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Additional data fields from the API response. Keys must match the
|
|
32
|
+
* logical names used in `writeColumns` (excluding `valid`).
|
|
33
|
+
*/
|
|
34
|
+
data?: Record<string, unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* Set when the API call failed (timeout, 5xx, parse error).
|
|
37
|
+
* Must NOT be set when `valid: false` is a legitimate "not found" answer.
|
|
38
|
+
*/
|
|
39
|
+
error?: string;
|
|
40
|
+
/** Set by EnrichCache; not populated by plugins. */
|
|
41
|
+
fromCache?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface EnrichPlugin {
|
|
44
|
+
/** Unique kebab-case id; matches the `provider` key in pipeline YAML. */
|
|
45
|
+
readonly id: string;
|
|
46
|
+
/** Human-readable description for CLI output and error messages. */
|
|
47
|
+
readonly description?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Validate or enrich a single value against an external source.
|
|
50
|
+
*
|
|
51
|
+
* MUST be async; MUST NOT block the event loop.
|
|
52
|
+
* MUST return EnrichResult — never throw, except for HTTP 429 which
|
|
53
|
+
* should bubble out so axios-retry can apply exponential backoff.
|
|
54
|
+
* MUST respect `options.timeoutMs`.
|
|
55
|
+
*/
|
|
56
|
+
enrich(value: string, options: EnrichOptions): Promise<EnrichResult>;
|
|
57
|
+
}
|
|
58
|
+
export interface LookupSummary {
|
|
59
|
+
provider: string;
|
|
60
|
+
field: string;
|
|
61
|
+
totalRows: number;
|
|
62
|
+
validCount: number;
|
|
63
|
+
errorCount: number;
|
|
64
|
+
skipCount: number;
|
|
65
|
+
cacheHits: number;
|
|
66
|
+
/**
|
|
67
|
+
* Populated when `writeColumns` includes a `consultation_ref` (or
|
|
68
|
+
* similarly-named) reference key. Maps source field value → reference
|
|
69
|
+
* string. Empty object when no consultation reference is in scope.
|
|
70
|
+
*/
|
|
71
|
+
consultationRefs: Record<string, string>;
|
|
72
|
+
}
|
|
73
|
+
export interface EnrichSummary {
|
|
74
|
+
lookups: LookupSummary[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Factory shape that `@caracal-lynx/sluice-enrich` registers via
|
|
78
|
+
* `registerEnrichPhase()` on the open-source `PipelineRunner`. The runner
|
|
79
|
+
* stores this factory and invokes it for every pipeline run that has an
|
|
80
|
+
* `enrich:` block. If the factory is never registered (i.e. the private
|
|
81
|
+
* package is not installed), the open-source runner skips the phase.
|
|
82
|
+
*/
|
|
83
|
+
export type EnrichPhaseFactory = (config: EnrichConfig, runConfig: RunConfig, staging: StagingStore, pluginDir: string, logger: Logger) => {
|
|
84
|
+
run(): Promise<EnrichSummary>;
|
|
85
|
+
};
|
|
86
|
+
export type { EnrichConfig, EnrichLookupConfig };
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/enrich/types.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,KAAK,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,KACX;IAAE,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;CAAE,CAAC;AAIvC,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/enrich/types.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from './config/index.js';
|
|
2
|
+
export * from './utils/index.js';
|
|
3
|
+
export * from './plugins/index.js';
|
|
4
|
+
export * from './staging/index.js';
|
|
5
|
+
export * from './adapters/source/index.js';
|
|
6
|
+
export * from './adapters/target/index.js';
|
|
7
|
+
export { DQEngine, writeRejectionCsv, writeSummaryJson, BUILT_IN_RULES } from './dq/index.js';
|
|
8
|
+
export type { Rule, DQSummary, ViolationCounts } from './dq/index.js';
|
|
9
|
+
export { applyCleanse, TransformEngine, ExpressionEvaluator, LookupResolver, } from './transform/index.js';
|
|
10
|
+
export type { TransformResult } from './transform/index.js';
|
|
11
|
+
export { PipelineRunner, registerEnrichPhase } from './runner.js';
|
|
12
|
+
export type { RunResult, RunOverrides } from './runner.js';
|
|
13
|
+
export { MultiSourcePipelineRunner } from './multi-source-runner.js';
|
|
14
|
+
export { MergeEngine, MergeStrategyRegistry } from './merge/index.js';
|
|
15
|
+
export type { MergeStrategyPlugin, MergeSourceMeta, MergeResult } from './merge/index.js';
|
|
16
|
+
export type { EnrichPlugin, EnrichResult, EnrichOptions, EnrichSummary, LookupSummary, EnrichPhaseFactory, } from './enrich/types.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAK3C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9F,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1F,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
export * from './config/index.js';
|
|
4
|
+
export * from './utils/index.js';
|
|
5
|
+
export * from './plugins/index.js';
|
|
6
|
+
export * from './staging/index.js';
|
|
7
|
+
export * from './adapters/source/index.js';
|
|
8
|
+
export * from './adapters/target/index.js';
|
|
9
|
+
// dq and transform barrels re-export RuleViolation (from plugins) and
|
|
10
|
+
// ColumnMeta (via staging). Re-export only the names that don't collide so
|
|
11
|
+
// consumers can still reach the engines and reporter from the package root.
|
|
12
|
+
export { DQEngine, writeRejectionCsv, writeSummaryJson, BUILT_IN_RULES } from './dq/index.js';
|
|
13
|
+
export { applyCleanse, TransformEngine, ExpressionEvaluator, LookupResolver, } from './transform/index.js';
|
|
14
|
+
export { PipelineRunner, registerEnrichPhase } from './runner.js';
|
|
15
|
+
export { MultiSourcePipelineRunner } from './multi-source-runner.js';
|
|
16
|
+
export { MergeEngine, MergeStrategyRegistry } from './merge/index.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAEvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAE3C,sEAAsE;AACtE,2EAA2E;AAC3E,4EAA4E;AAC5E,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE9F,OAAO,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MergeConfig } from '../config/types.js';
|
|
2
|
+
import type { StagingStore } from '../staging/index.js';
|
|
3
|
+
import { type BuildMergeContext } from './sql-builder.js';
|
|
4
|
+
export interface ConflictLogResult {
|
|
5
|
+
count: number;
|
|
6
|
+
tableName: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildConflictLog(store: StagingStore, joinedTable: string, context: BuildMergeContext, config: MergeConfig, outputColumns: string[], conflictTableName?: string): Promise<ConflictLogResult>;
|
|
9
|
+
//# sourceMappingURL=conflict-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-log.d.ts","sourceRoot":"","sources":["../../src/merge/conflict-log.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,SAAwB,GACxC,OAAO,CAAC,iBAAiB,CAAC,CAmB5B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
+
// Copyright (c) 2026 Caracal Lynx Ltd.
|
|
3
|
+
import { quoteIdent } from '../staging/index.js';
|
|
4
|
+
import { buildConflictFieldSelectSql, } from './sql-builder.js';
|
|
5
|
+
function buildEmptyConflictTableSql(tableName, keyColumns) {
|
|
6
|
+
const keyCols = keyColumns
|
|
7
|
+
.map((k) => `CAST(NULL AS VARCHAR) AS ${quoteIdent(k)}`)
|
|
8
|
+
.join(', ');
|
|
9
|
+
const leading = keyCols.length > 0 ? `${keyCols}, ` : '';
|
|
10
|
+
return `CREATE OR REPLACE TABLE ${quoteIdent(tableName)} AS SELECT ${leading}CAST(NULL AS VARCHAR) AS field, CAST(NULL AS VARCHAR) AS winning_source, CAST(NULL AS VARCHAR) AS winning_value, CAST(NULL AS VARCHAR) AS source_values WHERE FALSE`;
|
|
11
|
+
}
|
|
12
|
+
export async function buildConflictLog(store, joinedTable, context, config, outputColumns, conflictTableName = 'stg_merge_conflicts') {
|
|
13
|
+
const selects = outputColumns
|
|
14
|
+
.map((field) => buildConflictFieldSelectSql(joinedTable, context, field, config))
|
|
15
|
+
.filter((s) => s !== null);
|
|
16
|
+
if (selects.length === 0) {
|
|
17
|
+
await store.query(buildEmptyConflictTableSql(conflictTableName, context.keyColumns));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
await store.query(`CREATE OR REPLACE TABLE ${quoteIdent(conflictTableName)} AS ${selects.join(' UNION ALL ')}`);
|
|
21
|
+
}
|
|
22
|
+
const count = await store.rowCount(conflictTableName);
|
|
23
|
+
if (config.conflictLog && count > 0) {
|
|
24
|
+
await store.exportToCsv(conflictTableName, config.conflictLog, { header: true });
|
|
25
|
+
}
|
|
26
|
+
return { count, tableName: conflictTableName };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=conflict-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-log.js","sourceRoot":"","sources":["../../src/merge/conflict-log.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,uCAAuC;AAIvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAEL,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAO1B,SAAS,0BAA0B,CAAC,SAAiB,EAAE,UAAoB;IACzE,MAAM,OAAO,GAAG,UAAU;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,4BAA4B,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,OAAO,2BAA2B,UAAU,CAAC,SAAS,CAAC,cAAc,OAAO,qKAAqK,CAAC;AACpP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAmB,EACnB,WAAmB,EACnB,OAA0B,EAC1B,MAAmB,EACnB,aAAuB,EACvB,iBAAiB,GAAG,qBAAqB;IAEzC,MAAM,OAAO,GAAG,aAAa;SAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;SAChF,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,KAAK,CACf,2BAA2B,UAAU,CAAC,iBAAiB,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,WAAW,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MergeConfig } from '../config/types.js';
|
|
2
|
+
import type { StagingStore } from '../staging/index.js';
|
|
3
|
+
import type { MergeResult, MergeSourceMeta } from './types.js';
|
|
4
|
+
export declare class MergeEngine {
|
|
5
|
+
run(store: StagingStore, rawSources: MergeSourceMeta[], config: MergeConfig): Promise<MergeResult>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=engine.d.ts.map
|