ruleforge 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 (100) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +1 -0
  3. package/README.md +126 -0
  4. package/dist/core/Errors.d.ts +3 -0
  5. package/dist/core/Errors.d.ts.map +1 -0
  6. package/dist/core/Errors.js +4 -0
  7. package/dist/core/Errors.js.map +1 -0
  8. package/dist/core/Initializer.d.ts +16 -0
  9. package/dist/core/Initializer.d.ts.map +1 -0
  10. package/dist/core/Initializer.js +48 -0
  11. package/dist/core/Initializer.js.map +1 -0
  12. package/dist/core/Mapper.d.ts +19 -0
  13. package/dist/core/Mapper.d.ts.map +1 -0
  14. package/dist/core/Mapper.js +39 -0
  15. package/dist/core/Mapper.js.map +1 -0
  16. package/dist/core/OutputBuilder.d.ts +2 -0
  17. package/dist/core/OutputBuilder.d.ts.map +1 -0
  18. package/dist/core/OutputBuilder.js +62 -0
  19. package/dist/core/OutputBuilder.js.map +1 -0
  20. package/dist/core/Postprocessor.d.ts +9 -0
  21. package/dist/core/Postprocessor.d.ts.map +1 -0
  22. package/dist/core/Postprocessor.js +25 -0
  23. package/dist/core/Postprocessor.js.map +1 -0
  24. package/dist/core/Preprocessor.d.ts +16 -0
  25. package/dist/core/Preprocessor.d.ts.map +1 -0
  26. package/dist/core/Preprocessor.js +35 -0
  27. package/dist/core/Preprocessor.js.map +1 -0
  28. package/dist/core/RuleEngine.d.ts +16 -0
  29. package/dist/core/RuleEngine.d.ts.map +1 -0
  30. package/dist/core/RuleEngine.js +168 -0
  31. package/dist/core/RuleEngine.js.map +1 -0
  32. package/dist/core/SelectorEngine.d.ts +36 -0
  33. package/dist/core/SelectorEngine.d.ts.map +1 -0
  34. package/dist/core/SelectorEngine.js +186 -0
  35. package/dist/core/SelectorEngine.js.map +1 -0
  36. package/dist/core/validateSpec.d.ts +3 -0
  37. package/dist/core/validateSpec.d.ts.map +1 -0
  38. package/dist/core/validateSpec.js +11 -0
  39. package/dist/core/validateSpec.js.map +1 -0
  40. package/dist/example.d.ts +2 -0
  41. package/dist/example.d.ts.map +1 -0
  42. package/dist/example.js +32 -0
  43. package/dist/example.js.map +1 -0
  44. package/dist/index.d.ts +8 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +6 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/parsing/detect.d.ts +2 -0
  49. package/dist/parsing/detect.d.ts.map +1 -0
  50. package/dist/parsing/detect.js +9 -0
  51. package/dist/parsing/detect.js.map +1 -0
  52. package/dist/parsing/normalize.d.ts +8 -0
  53. package/dist/parsing/normalize.d.ts.map +1 -0
  54. package/dist/parsing/normalize.js +19 -0
  55. package/dist/parsing/normalize.js.map +1 -0
  56. package/dist/parsing/xml.d.ts +9 -0
  57. package/dist/parsing/xml.d.ts.map +1 -0
  58. package/dist/parsing/xml.js +25 -0
  59. package/dist/parsing/xml.js.map +1 -0
  60. package/dist/resolvers/AliasResolver.d.ts +7 -0
  61. package/dist/resolvers/AliasResolver.d.ts.map +1 -0
  62. package/dist/resolvers/AliasResolver.js +16 -0
  63. package/dist/resolvers/AliasResolver.js.map +1 -0
  64. package/dist/resolvers/DotPath.d.ts +3 -0
  65. package/dist/resolvers/DotPath.d.ts.map +1 -0
  66. package/dist/resolvers/DotPath.js +4 -0
  67. package/dist/resolvers/DotPath.js.map +1 -0
  68. package/dist/resolvers/PathResolver.d.ts +51 -0
  69. package/dist/resolvers/PathResolver.d.ts.map +1 -0
  70. package/dist/resolvers/PathResolver.js +163 -0
  71. package/dist/resolvers/PathResolver.js.map +1 -0
  72. package/dist/transforms/TransformRegistry.d.ts +7 -0
  73. package/dist/transforms/TransformRegistry.d.ts.map +1 -0
  74. package/dist/transforms/TransformRegistry.js +18 -0
  75. package/dist/transforms/TransformRegistry.js.map +1 -0
  76. package/dist/transforms/builtins.d.ts +9 -0
  77. package/dist/transforms/builtins.d.ts.map +1 -0
  78. package/dist/transforms/builtins.js +30 -0
  79. package/dist/transforms/builtins.js.map +1 -0
  80. package/dist/types/functions.d.ts +25 -0
  81. package/dist/types/functions.d.ts.map +1 -0
  82. package/dist/types/functions.js +2 -0
  83. package/dist/types/functions.js.map +1 -0
  84. package/dist/types/internal.d.ts +13 -0
  85. package/dist/types/internal.d.ts.map +1 -0
  86. package/dist/types/internal.js +2 -0
  87. package/dist/types/internal.js.map +1 -0
  88. package/dist/types/result.d.ts +29 -0
  89. package/dist/types/result.d.ts.map +1 -0
  90. package/dist/types/result.js +2 -0
  91. package/dist/types/result.js.map +1 -0
  92. package/dist/types/spec.d.ts +36 -0
  93. package/dist/types/spec.d.ts.map +1 -0
  94. package/dist/types/spec.js +2 -0
  95. package/dist/types/spec.js.map +1 -0
  96. package/dist/utils/deepGet.d.ts +3 -0
  97. package/dist/utils/deepGet.d.ts.map +1 -0
  98. package/dist/utils/deepGet.js +22 -0
  99. package/dist/utils/deepGet.js.map +1 -0
  100. package/package.json +59 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - Initial Draft (ESM-only)
package/LICENSE ADDED
@@ -0,0 +1 @@
1
+ MIT
package/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # ruleforge
2
+
3
+ A declarative rule-based engine to map heterogeneous JSON/XML payloads into a canonical nested JSON structure.
4
+
5
+ ---
6
+
7
+ ## ✨ Features
8
+
9
+ - JSON and XML support (XML normalized to JS object)
10
+ - Envelope / metadata support via `initializer`
11
+ - Payload inside string fields supported (JSON/XML strings)
12
+ - Preprocessors, PostProcessors
13
+ - Rule priority (top → bottom)
14
+ - Array selector (`X`) – first match
15
+ - Nested canonical output keys (dot-path targets)
16
+ - Transform functions (built-ins + custom)
17
+ - Debug metadata (`result.meta.matched`, `$pre`, etc.)
18
+
19
+ ---
20
+
21
+ ## 📦 Installation
22
+
23
+ ```bash
24
+ npm install ruleforge
25
+ ```
26
+
27
+ ---
28
+
29
+ ## 🚀 Basic Usage
30
+
31
+ ```ts
32
+ import { createMapper } from "ruleforge";
33
+ import rules from "./rules.json" assert { type: "json" };
34
+
35
+ const mapper = createMapper({
36
+ spec: rules,
37
+ functions: {
38
+ initializer: { initRequest },
39
+ preprocessors: { getClientName, getSource },
40
+ postProcessors: { normalizeCurrency },
41
+ transforms: {
42
+ /* custom transforms */
43
+ },
44
+ },
45
+ });
46
+
47
+ const result = await mapper.map(input, { requestId: "req-1" });
48
+
49
+ if (!result.ok) console.error(result.error);
50
+ else console.log(result.value);
51
+ ```
52
+
53
+ ---
54
+
55
+ ## 🧠 Initializer (Envelope + payload string parsing)
56
+
57
+ ```ts
58
+ async function initRequest(input: any) {
59
+ // Example: { metadata: {...}, message: "<xml/>" } OR { metadata: {...}, jsonData: "{...}" }
60
+ return {
61
+ metadata: input.metadata,
62
+ payload: input.message ?? input.jsonData ?? input.payload,
63
+ payloadType: "auto",
64
+ };
65
+ }
66
+ ```
67
+
68
+ After initializer, the engine exposes namespaces:
69
+
70
+ - `$payload.*` (normalized payload object)
71
+ - `$meta.*` (metadata)
72
+ - `$pre.*` (preprocessor outputs)
73
+
74
+ Bare paths like `account.id` default to `$payload.account.id`.
75
+
76
+ ---
77
+
78
+ ## 🔍 Selectors (Array Matching)
79
+
80
+ Rule example:
81
+
82
+ ```json
83
+ {
84
+ "conditions": {
85
+ "customers.X.name": "c2",
86
+ "customers.X.value": "v2"
87
+ },
88
+ "mappings": ["customers.X.id"]
89
+ }
90
+ ```
91
+
92
+ Engine:
93
+
94
+ - Iterates the `customers` array
95
+ - First matching element binds `X`
96
+ - Uses bound `X` during mapping
97
+
98
+ ---
99
+
100
+ ## 🔄 Built-in transforms
101
+
102
+ - trim
103
+ - upper
104
+ - lower
105
+ - toNumber
106
+ - toString
107
+ - toBoolean
108
+
109
+ ---
110
+
111
+ ## 🛠 Status
112
+
113
+ This repository currently includes:
114
+
115
+ - Full npm/TS scaffold (ESM-only)
116
+ - Typed spec interfaces
117
+ - Mapper pipeline skeleton
118
+ - Examples + test placeholders
119
+
120
+ Implementation of the rule engine will be completed next.
121
+
122
+ ---
123
+
124
+ ## License
125
+
126
+ MIT
@@ -0,0 +1,3 @@
1
+ import type { MapError } from "../types/result.js";
2
+ export declare function err(code: MapError["code"], message: string, details?: any, field?: string): MapError;
3
+ //# sourceMappingURL=Errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../src/core/Errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,wBAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAEpG"}
@@ -0,0 +1,4 @@
1
+ export function err(code, message, details, field) {
2
+ return { code, message, details, field };
3
+ }
4
+ //# sourceMappingURL=Errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Errors.js","sourceRoot":"","sources":["../../src/core/Errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,CAAC,IAAsB,EAAE,OAAe,EAAE,OAAa,EAAE,KAAc;IACxF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { RuleDocumentV1 } from "../types/spec.js";
2
+ import type { FunctionRegistry, MapperContext } from "../types/functions.js";
3
+ import type { MapResult } from "../types/result.js";
4
+ export declare function runInitializer(spec: RuleDocumentV1, fn: FunctionRegistry, input: unknown, ctx: MapperContext): Promise<{
5
+ ok: true;
6
+ ns: {
7
+ payload: any;
8
+ meta: any;
9
+ pre: any;
10
+ };
11
+ inputType: "json" | "xml";
12
+ } | {
13
+ ok: false;
14
+ result: MapResult;
15
+ }>;
16
+ //# sourceMappingURL=Initializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Initializer.d.ts","sourceRoot":"","sources":["../../src/core/Initializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIpD,wBAAsB,cAAc,CAClC,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,aAAa,GACjB,OAAO,CACN;IACE,EAAE,EAAE,IAAI,CAAC;IACT,EAAE,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC;QAAC,GAAG,EAAE,GAAG,CAAA;KAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;CAC3B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CACnC,CA8CA"}
@@ -0,0 +1,48 @@
1
+ import { err } from "./Errors.js";
2
+ import { normalizePayload } from "../parsing/normalize.js";
3
+ export async function runInitializer(spec, fn, input, ctx) {
4
+ try {
5
+ let meta = {};
6
+ let payload = input;
7
+ let hint = "auto";
8
+ let pre = {};
9
+ if (spec.initializer) {
10
+ const name = spec.initializer.function;
11
+ const initFn = fn.initializer?.[name];
12
+ if (!initFn) {
13
+ return {
14
+ ok: false,
15
+ result: {
16
+ ok: false,
17
+ error: err("INITIALIZER_ERROR", `Initializer not found: ${name}`),
18
+ meta: { inputType: "json", pre: {}, matched: {} },
19
+ },
20
+ };
21
+ }
22
+ const r = await initFn(input, ctx);
23
+ meta = r.metadata ?? {};
24
+ payload = r.payload ?? payload;
25
+ pre = r.pre ?? {};
26
+ hint = (r.payloadType ?? "auto");
27
+ }
28
+ const norm = await normalizePayload(payload, hint);
29
+ return {
30
+ ok: true,
31
+ ns: { payload: norm.obj, meta, pre },
32
+ inputType: norm.kind,
33
+ };
34
+ }
35
+ catch (e) {
36
+ return {
37
+ ok: false,
38
+ result: {
39
+ ok: false,
40
+ error: err("PAYLOAD_PARSE_ERROR", e?.message ?? String(e), {
41
+ cause: e,
42
+ }),
43
+ meta: { inputType: "json", pre: {}, matched: {} },
44
+ },
45
+ };
46
+ }
47
+ }
48
+ //# sourceMappingURL=Initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Initializer.js","sourceRoot":"","sources":["../../src/core/Initializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAoB,EACpB,EAAoB,EACpB,KAAc,EACd,GAAkB;IASlB,IAAI,CAAC;QACH,IAAI,IAAI,GAAQ,EAAE,CAAC;QACnB,IAAI,OAAO,GAAQ,KAAK,CAAC;QACzB,IAAI,IAAI,GAA4B,MAAM,CAAC;QAC3C,IAAI,GAAG,GAAQ,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE;wBACN,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,GAAG,CAAC,mBAAmB,EAAE,0BAA0B,IAAI,EAAE,CAAC;wBACjE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;qBAClD;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC;YAC/B,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,MAAM,CAAQ,CAAC;QAC1C,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEnD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;YACpC,SAAS,EAAE,IAAI,CAAC,IAAI;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE;gBACN,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,GAAG,CAAC,qBAAqB,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;oBACzD,KAAK,EAAE,CAAC;iBACT,CAAC;gBACF,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aAClD;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { RuleDocumentV1 } from "../types/spec.js";
2
+ import type { FunctionRegistry, MapperContext } from "../types/functions.js";
3
+ import type { MapResult } from "../types/result.js";
4
+ export interface MapperOptions {
5
+ spec: RuleDocumentV1;
6
+ functions?: FunctionRegistry;
7
+ /** default: true (bare path => $payload) */
8
+ allowBarePaths?: boolean;
9
+ debug?: boolean;
10
+ }
11
+ export declare class Mapper {
12
+ private spec;
13
+ private fn;
14
+ private allowBarePaths;
15
+ private debug;
16
+ constructor(opts: MapperOptions);
17
+ map(input: unknown, ctx?: MapperContext): Promise<MapResult>;
18
+ }
19
+ //# sourceMappingURL=Mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mapper.d.ts","sourceRoot":"","sources":["../../src/core/Mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAMpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,4CAA4C;IAC5C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,KAAK,CAAU;gBAEX,IAAI,EAAE,aAAa;IAOzB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;CA6BvE"}
@@ -0,0 +1,39 @@
1
+ import { runInitializer } from "./Initializer.js";
2
+ import { runPreprocessors } from "./Preprocessor.js";
3
+ import { runRules } from "./RuleEngine.js";
4
+ import { runPostProcessors } from "./Postprocessor.js";
5
+ export class Mapper {
6
+ spec;
7
+ fn;
8
+ allowBarePaths;
9
+ debug;
10
+ constructor(opts) {
11
+ this.spec = opts.spec;
12
+ this.fn = opts.functions ?? {};
13
+ this.allowBarePaths = opts.allowBarePaths ?? true;
14
+ this.debug = opts.debug ?? false;
15
+ }
16
+ async map(input, ctx = {}) {
17
+ const init = await runInitializer(this.spec, this.fn, input, ctx);
18
+ if (!init.ok)
19
+ return init.result;
20
+ const pre = await runPreprocessors(this.spec, this.fn, init.ns, ctx);
21
+ if (!pre.ok)
22
+ return pre.result;
23
+ const ns = { payload: init.ns.payload, meta: init.ns.meta, pre: pre.pre };
24
+ const mapped = await runRules(this.spec, this.fn, ns, ctx, this.allowBarePaths, init.inputType);
25
+ if (!mapped.ok)
26
+ return mapped.result;
27
+ const final = await runPostProcessors(this.spec, this.fn, mapped.value, ns, ctx, mapped.meta);
28
+ return finalizeResult(final, this.debug);
29
+ }
30
+ }
31
+ function finalizeResult(result, debug) {
32
+ if (debug)
33
+ return result;
34
+ if (result.ok) {
35
+ return { ok: true, value: result.value };
36
+ }
37
+ return { ok: false, error: result.error };
38
+ }
39
+ //# sourceMappingURL=Mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mapper.js","sourceRoot":"","sources":["../../src/core/Mapper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAUvD,MAAM,OAAO,MAAM;IACT,IAAI,CAAiB;IACrB,EAAE,CAAmB;IACrB,cAAc,CAAU;IACxB,KAAK,CAAU;IAEvB,YAAY,IAAmB;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAc,EAAE,MAAqB,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAEjC,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;QAE/B,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAE1E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,EAAE,EACP,EAAE,EACF,GAAG,EACH,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,SAAS,CACf,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QAErC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CACnC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,EAAE,EACP,MAAM,CAAC,KAAK,EACZ,EAAE,EACF,GAAG,EACH,MAAM,CAAC,IAAI,CACZ,CAAC;QACF,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,SAAS,cAAc,CAAC,MAAiB,EAAE,KAAc;IACvD,IAAI,KAAK;QAAE,OAAO,MAAM,CAAC;IAEzB,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setByDotPath(obj: any, dotPath: string, value: any): void;
2
+ //# sourceMappingURL=OutputBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutputBuilder.d.ts","sourceRoot":"","sources":["../../src/core/OutputBuilder.ts"],"names":[],"mappings":"AAOA,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CA6DxE"}
@@ -0,0 +1,62 @@
1
+ function isIndex(seg) {
2
+ if (seg.length === 0)
3
+ return false;
4
+ // "0" is valid; disallow "-1"
5
+ const n = Number(seg);
6
+ return Number.isInteger(n) && n >= 0 && String(n) === seg;
7
+ }
8
+ export function setByDotPath(obj, dotPath, value) {
9
+ const parts = dotPath.split(".").filter(Boolean);
10
+ if (parts.length === 0)
11
+ return;
12
+ let cur = obj;
13
+ for (let i = 0; i < parts.length; i++) {
14
+ const seg = parts[i];
15
+ const last = i === parts.length - 1;
16
+ const nextSeg = parts[i + 1];
17
+ if (isIndex(seg)) {
18
+ const idx = Number(seg);
19
+ // ensure cur is an array
20
+ if (!Array.isArray(cur)) {
21
+ // If cur is empty object at root, we can't "convert" it safely.
22
+ // But in normal flow we create arrays only when parent decides.
23
+ // So here, assume caller created correct container.
24
+ // We'll handle conversion when creating the child container below.
25
+ }
26
+ if (!Array.isArray(cur)) {
27
+ // convert in-place if possible (only works if cur is a property value; root case handled by parent)
28
+ // This function is used with a root object; numeric segment should only occur after a key segment.
29
+ throw new Error(`Invalid array index segment '${seg}' at root or non-array container`);
30
+ }
31
+ if (last) {
32
+ cur[idx] = value;
33
+ return;
34
+ }
35
+ // create next container if missing
36
+ if (cur[idx] == null || typeof cur[idx] !== "object") {
37
+ cur[idx] = nextSeg && isIndex(nextSeg) ? [] : {};
38
+ }
39
+ cur = cur[idx];
40
+ continue;
41
+ }
42
+ // seg is object key
43
+ if (last) {
44
+ cur[seg] = value;
45
+ return;
46
+ }
47
+ // ensure next container
48
+ const wantArray = nextSeg ? isIndex(nextSeg) : false;
49
+ if (cur[seg] == null || typeof cur[seg] !== "object") {
50
+ cur[seg] = wantArray ? [] : {};
51
+ }
52
+ else {
53
+ // if existing but wrong container type, replace (v1 deterministic)
54
+ if (wantArray && !Array.isArray(cur[seg]))
55
+ cur[seg] = [];
56
+ if (!wantArray && Array.isArray(cur[seg]))
57
+ cur[seg] = {};
58
+ }
59
+ cur = cur[seg];
60
+ }
61
+ }
62
+ //# sourceMappingURL=OutputBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutputBuilder.js","sourceRoot":"","sources":["../../src/core/OutputBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RuleDocumentV1 } from "../types/spec.js";
2
+ import type { FunctionRegistry, MapperContext } from "../types/functions.js";
3
+ import type { MapMeta, MapResult } from "../types/result.js";
4
+ export declare function runPostProcessors(spec: RuleDocumentV1, fn: FunctionRegistry, out: any, ns: {
5
+ payload: any;
6
+ meta: any;
7
+ pre: Record<string, any>;
8
+ }, ctx: MapperContext, meta: MapMeta): Promise<MapResult>;
9
+ //# sourceMappingURL=Postprocessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Postprocessor.d.ts","sourceRoot":"","sources":["../../src/core/Postprocessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG7D,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,gBAAgB,EACpB,GAAG,EAAE,GAAG,EACR,EAAE,EAAE;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,EACzD,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CA4BpB"}
@@ -0,0 +1,25 @@
1
+ import { err } from "./Errors.js";
2
+ export async function runPostProcessors(spec, fn, out, ns, ctx, meta) {
3
+ try {
4
+ let cur = out;
5
+ for (const name of spec.postProcessors ?? []) {
6
+ const f = fn.postProcessors?.[name];
7
+ if (!f)
8
+ return {
9
+ ok: false,
10
+ error: err("PREPROCESSOR_ERROR", `PostProcessor not found: ${name}`),
11
+ meta,
12
+ };
13
+ cur = await f(cur, { payload: ns.payload, meta: ns.meta, pre: ns.pre }, ctx);
14
+ }
15
+ return { ok: true, value: cur, meta };
16
+ }
17
+ catch (e) {
18
+ return {
19
+ ok: false,
20
+ error: err("PREPROCESSOR_ERROR", e?.message ?? String(e), { cause: e }),
21
+ meta,
22
+ };
23
+ }
24
+ }
25
+ //# sourceMappingURL=Postprocessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Postprocessor.js","sourceRoot":"","sources":["../../src/core/Postprocessor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAoB,EACpB,EAAoB,EACpB,GAAQ,EACR,EAAyD,EACzD,GAAkB,EAClB,IAAa;IAEb,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,GAAG,CAAC;QAEd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC;gBACJ,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,GAAG,CAAC,oBAAoB,EAAE,4BAA4B,IAAI,EAAE,CAAC;oBACpE,IAAI;iBACL,CAAC;YAEJ,GAAG,GAAG,MAAM,CAAC,CACX,GAAG,EACH,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EACnD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACvE,IAAI;SACL,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { RuleDocumentV1 } from "../types/spec.js";
2
+ import type { FunctionRegistry, MapperContext } from "../types/functions.js";
3
+ import type { MapResult } from "../types/result.js";
4
+ export declare function runPreprocessors(spec: RuleDocumentV1, fn: FunctionRegistry, ns: {
5
+ payload: any;
6
+ meta: any;
7
+ pre: Record<string, any>;
8
+ }, // ✅ include pre seed
9
+ ctx: MapperContext): Promise<{
10
+ ok: true;
11
+ pre: Record<string, any>;
12
+ } | {
13
+ ok: false;
14
+ result: MapResult;
15
+ }>;
16
+ //# sourceMappingURL=Preprocessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Preprocessor.d.ts","sourceRoot":"","sources":["../../src/core/Preprocessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,gBAAgB,EACpB,EAAE,EAAE;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,EAAE,qBAAqB;AAChF,GAAG,EAAE,aAAa,GACjB,OAAO,CACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAC1E,CAoCA"}
@@ -0,0 +1,35 @@
1
+ import { err } from "./Errors.js";
2
+ export async function runPreprocessors(spec, fn, ns, // ✅ include pre seed
3
+ ctx) {
4
+ // ✅ Seed with initializer pre so CDATA parsing etc stays available
5
+ const out = { ...(ns.pre ?? {}) };
6
+ try {
7
+ for (const [key, ref] of Object.entries(spec.preprocessors ?? {})) {
8
+ const f = fn.preprocessors?.[ref.function];
9
+ if (!f) {
10
+ return {
11
+ ok: false,
12
+ result: {
13
+ ok: false,
14
+ error: err("PREPROCESSOR_ERROR", `Preprocessor not found: ${ref.function}`),
15
+ meta: { inputType: "json", pre: {}, matched: {} },
16
+ },
17
+ };
18
+ }
19
+ // Preprocessors see pre as "current computed pre" (seed + previously computed)
20
+ out[key] = await f({ payload: ns.payload, meta: ns.meta, pre: out }, ctx);
21
+ }
22
+ return { ok: true, pre: out };
23
+ }
24
+ catch (e) {
25
+ return {
26
+ ok: false,
27
+ result: {
28
+ ok: false,
29
+ error: err("PREPROCESSOR_ERROR", e?.message ?? String(e), { cause: e }),
30
+ meta: { inputType: "json", pre: {}, matched: {} },
31
+ },
32
+ };
33
+ }
34
+ }
35
+ //# sourceMappingURL=Preprocessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Preprocessor.js","sourceRoot":"","sources":["../../src/core/Preprocessor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAoB,EACpB,EAAoB,EACpB,EAAyD,EAAE,qBAAqB;AAChF,GAAkB;IAIlB,mEAAmE;IACnE,MAAM,GAAG,GAAwB,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE;wBACN,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,GAAG,CACR,oBAAoB,EACpB,2BAA2B,GAAG,CAAC,QAAQ,EAAE,CAC1C;wBACD,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;qBAClD;iBACF,CAAC;YACJ,CAAC;YAED,+EAA+E;YAC/E,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE;gBACN,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACvE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aAClD;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { RuleDocumentV1 } from "../types/spec.js";
2
+ import type { FunctionRegistry, MapperContext } from "../types/functions.js";
3
+ import type { MapResult, MapMeta } from "../types/result.js";
4
+ export declare function runRules(spec: RuleDocumentV1, fn: FunctionRegistry, ns: {
5
+ payload: any;
6
+ meta: any;
7
+ pre: Record<string, any>;
8
+ }, ctx: MapperContext, allowBarePaths: boolean, inputType: "json" | "xml"): Promise<{
9
+ ok: true;
10
+ value: any;
11
+ meta: MapMeta;
12
+ } | {
13
+ ok: false;
14
+ result: MapResult;
15
+ }>;
16
+ //# sourceMappingURL=RuleEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleEngine.d.ts","sourceRoot":"","sources":["../../src/core/RuleEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAIf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAY,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAcvE,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,gBAAgB,EACpB,EAAE,EAAE;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,EACzD,GAAG,EAAE,aAAa,EAClB,cAAc,EAAE,OAAO,EACvB,SAAS,EAAE,MAAM,GAAG,KAAK,GACxB,OAAO,CACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAC3E,CA+JA"}