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
@@ -0,0 +1,16 @@
1
+ import { resolvePath } from "./PathResolver.js";
2
+ /**
3
+ * Convenience wrapper that resolves a list of candidate paths (fallback).
4
+ * Returns first non-undefined value, along with the ResolveResult for that path.
5
+ */
6
+ export function resolveFirst(ns, paths, opts) {
7
+ let last = { value: undefined, usedPath: "", namespace: "payload", usedAlias: false };
8
+ for (const p of paths) {
9
+ const r = resolvePath(ns, p, opts);
10
+ last = r;
11
+ if (r.value !== undefined)
12
+ return r;
13
+ }
14
+ return last;
15
+ }
16
+ //# sourceMappingURL=AliasResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AliasResolver.js","sourceRoot":"","sources":["../../src/resolvers/AliasResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAc,EAAE,KAAe,EAAE,IAAoB;IAChF,IAAI,IAAI,GAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACrG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,CAAC;QACT,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type DotPath = string;
2
+ export declare function splitPath(path: string): string[];
3
+ //# sourceMappingURL=DotPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DotPath.d.ts","sourceRoot":"","sources":["../../src/resolvers/DotPath.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD"}
@@ -0,0 +1,4 @@
1
+ export function splitPath(path) {
2
+ return path.split(".").filter(Boolean);
3
+ }
4
+ //# sourceMappingURL=DotPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DotPath.js","sourceRoot":"","sources":["../../src/resolvers/DotPath.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,51 @@
1
+ export type NamespaceName = "payload" | "meta" | "pre";
2
+ export interface Namespaces {
3
+ payload: any;
4
+ meta: any;
5
+ pre: any;
6
+ }
7
+ export interface ResolveOptions {
8
+ /** If true, bare paths resolve against $payload */
9
+ allowBarePaths: boolean;
10
+ /** Aliases apply to PAYLOAD only */
11
+ aliases?: Record<string, ReadonlyArray<string>>;
12
+ }
13
+ export interface ResolveResult {
14
+ value: any;
15
+ /** the concrete path that was actually used (after alias expansion) */
16
+ usedPath: string;
17
+ /** namespace where it was resolved */
18
+ namespace: NamespaceName;
19
+ /** true if used alias expansion */
20
+ usedAlias: boolean;
21
+ }
22
+ /**
23
+ * Resolve paths with namespaces:
24
+ * - $payload.*, $meta.*, $pre.*
25
+ * - bare paths default to $payload if allowBarePaths=true
26
+ *
27
+ * Aliases:
28
+ * - apply to payload-only
29
+ * - support alias keys of multiple segments (e.g., "source.system")
30
+ * - longest alias key match wins
31
+ *
32
+ * NOTE: selector variable X is handled by SelectorEngine (not here).
33
+ */
34
+ export declare function resolvePath(ns: Namespaces, path: string, opts: ResolveOptions): ResolveResult;
35
+ /**
36
+ * Expands payload aliasing.
37
+ *
38
+ * Supports:
39
+ * - alias key is one segment: "customers"
40
+ * - alias key is multi-segment: "source.system"
41
+ *
42
+ * If input path is "source.system.id" and alias key is "source.system",
43
+ * restPath is "id" and candidate becomes "<aliasRoot>.id".
44
+ *
45
+ * Longest alias-key match wins to avoid partial overrides.
46
+ */
47
+ export declare function expandAlias(path: string, aliases?: Record<string, ReadonlyArray<string>>): {
48
+ aliasKey: string;
49
+ candidates: string[];
50
+ } | null;
51
+ //# sourceMappingURL=PathResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/PathResolver.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,EAAE,GAAG,CAAC;CACV;AAED,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,cAAc,EAAE,OAAO,CAAC;IACxB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,GAAG,CAAC;IACX,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,SAAS,EAAE,aAAa,CAAC;IACzB,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,cAAc,GACnB,aAAa,CA+Df;AAkED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,GAC9C;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAWnD"}
@@ -0,0 +1,163 @@
1
+ import { deepGet } from "../utils/deepGet.js";
2
+ /**
3
+ * Resolve paths with namespaces:
4
+ * - $payload.*, $meta.*, $pre.*
5
+ * - bare paths default to $payload if allowBarePaths=true
6
+ *
7
+ * Aliases:
8
+ * - apply to payload-only
9
+ * - support alias keys of multiple segments (e.g., "source.system")
10
+ * - longest alias key match wins
11
+ *
12
+ * NOTE: selector variable X is handled by SelectorEngine (not here).
13
+ */
14
+ export function resolvePath(ns, path, opts) {
15
+ const p = (path ?? "").trim();
16
+ if (!p)
17
+ return {
18
+ value: undefined,
19
+ usedPath: "",
20
+ namespace: "payload",
21
+ usedAlias: false,
22
+ };
23
+ // Explicit namespace
24
+ const explicit = parseExplicitNamespace(p);
25
+ if (explicit) {
26
+ const { namespace, innerPath } = explicit;
27
+ const base = namespace === "payload"
28
+ ? ns.payload
29
+ : namespace === "meta"
30
+ ? ns.meta
31
+ : ns.pre;
32
+ const value = innerPath ? deepGet(base, innerPath) : base;
33
+ const usedPath = innerPath ? `$${namespace}.${innerPath}` : `$${namespace}`;
34
+ return { value, usedPath, namespace, usedAlias: false };
35
+ }
36
+ // Bare path
37
+ if (!opts.allowBarePaths) {
38
+ return {
39
+ value: undefined,
40
+ usedPath: p,
41
+ namespace: "payload",
42
+ usedAlias: false,
43
+ };
44
+ }
45
+ // Alias expansion (payload default, but candidates may point to $payload/$pre/$meta)
46
+ const expanded = expandAlias(p, opts.aliases ?? {});
47
+ if (expanded) {
48
+ for (const candidate of expanded.candidates) {
49
+ // candidate can be "$pre.x.y" or "$meta.x" or a payload path
50
+ const r = resolvePathNoAlias(ns, candidate, opts);
51
+ if (r.value !== undefined) {
52
+ return {
53
+ ...r,
54
+ usedPath: r.usedPath,
55
+ usedAlias: true,
56
+ };
57
+ }
58
+ }
59
+ // none matched: return undefined but report first candidate as "used"
60
+ const first = expanded.candidates[0] ?? p;
61
+ const r0 = resolvePathNoAlias(ns, first, opts);
62
+ return { ...r0, usedAlias: true };
63
+ }
64
+ // No alias; resolve directly from payload
65
+ return {
66
+ value: deepGet(ns.payload, p),
67
+ usedPath: p,
68
+ namespace: "payload",
69
+ usedAlias: false,
70
+ };
71
+ }
72
+ function resolvePathNoAlias(ns, path, opts) {
73
+ const p = (path ?? "").trim();
74
+ if (!p) {
75
+ return {
76
+ value: undefined,
77
+ usedPath: "",
78
+ namespace: "payload",
79
+ usedAlias: false,
80
+ };
81
+ }
82
+ const explicit = parseExplicitNamespace(p);
83
+ if (explicit) {
84
+ const { namespace, innerPath } = explicit;
85
+ const base = namespace === "payload"
86
+ ? ns.payload
87
+ : namespace === "meta"
88
+ ? ns.meta
89
+ : ns.pre;
90
+ const value = innerPath ? deepGet(base, innerPath) : base;
91
+ const usedPath = innerPath ? `$${namespace}.${innerPath}` : `$${namespace}`;
92
+ return { value, usedPath, namespace, usedAlias: false };
93
+ }
94
+ // bare path => payload (no alias here)
95
+ if (!opts.allowBarePaths) {
96
+ return {
97
+ value: undefined,
98
+ usedPath: p,
99
+ namespace: "payload",
100
+ usedAlias: false,
101
+ };
102
+ }
103
+ return {
104
+ value: deepGet(ns.payload, p),
105
+ usedPath: p,
106
+ namespace: "payload",
107
+ usedAlias: false,
108
+ };
109
+ }
110
+ function parseExplicitNamespace(p) {
111
+ if (p === "$payload")
112
+ return { namespace: "payload", innerPath: "" };
113
+ if (p === "$meta")
114
+ return { namespace: "meta", innerPath: "" };
115
+ if (p === "$pre")
116
+ return { namespace: "pre", innerPath: "" };
117
+ if (p.startsWith("$payload."))
118
+ return { namespace: "payload", innerPath: p.slice("$payload.".length) };
119
+ if (p.startsWith("$meta."))
120
+ return { namespace: "meta", innerPath: p.slice("$meta.".length) };
121
+ if (p.startsWith("$pre."))
122
+ return { namespace: "pre", innerPath: p.slice("$pre.".length) };
123
+ return null;
124
+ }
125
+ /**
126
+ * Expands payload aliasing.
127
+ *
128
+ * Supports:
129
+ * - alias key is one segment: "customers"
130
+ * - alias key is multi-segment: "source.system"
131
+ *
132
+ * If input path is "source.system.id" and alias key is "source.system",
133
+ * restPath is "id" and candidate becomes "<aliasRoot>.id".
134
+ *
135
+ * Longest alias-key match wins to avoid partial overrides.
136
+ */
137
+ export function expandAlias(path, aliases) {
138
+ if (!aliases || Object.keys(aliases).length === 0)
139
+ return null;
140
+ const best = findLongestAliasKeyMatch(path, aliases);
141
+ if (!best)
142
+ return null;
143
+ const { key, roots } = best;
144
+ const rest = path.length === key.length ? "" : path.slice(key.length + 1); // +1 for "."
145
+ const candidates = roots.map((r) => (rest ? `${r}.${rest}` : r));
146
+ return { aliasKey: key, candidates };
147
+ }
148
+ function findLongestAliasKeyMatch(path, aliases) {
149
+ let bestKey = null;
150
+ for (const key of Object.keys(aliases)) {
151
+ if (path === key || path.startsWith(key + ".")) {
152
+ if (bestKey == null || key.length > bestKey.length)
153
+ bestKey = key;
154
+ }
155
+ }
156
+ if (!bestKey)
157
+ return null;
158
+ const roots = aliases[bestKey] ?? [];
159
+ if (!roots.length)
160
+ return null;
161
+ return { key: bestKey, roots };
162
+ }
163
+ //# sourceMappingURL=PathResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathResolver.js","sourceRoot":"","sources":["../../src/resolvers/PathResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FunctionRegistry, MapperContext } from "../types/functions.js";
2
+ export declare class TransformRegistry {
3
+ private map;
4
+ constructor(fn?: FunctionRegistry["transforms"]);
5
+ apply(value: unknown, transformNames: ReadonlyArray<string> | undefined, ctx: MapperContext): unknown;
6
+ }
7
+ //# sourceMappingURL=TransformRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformRegistry.d.ts","sourceRoot":"","sources":["../../src/transforms/TransformRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAG/B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAA8B;gBAE7B,EAAE,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC;IAI/C,KAAK,CACH,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EACjD,GAAG,EAAE,aAAa,GACjB,OAAO;CASX"}
@@ -0,0 +1,18 @@
1
+ import { builtInTransforms } from "./builtins.js";
2
+ export class TransformRegistry {
3
+ map;
4
+ constructor(fn) {
5
+ this.map = { ...builtInTransforms, ...(fn ?? {}) };
6
+ }
7
+ apply(value, transformNames, ctx) {
8
+ let v = value;
9
+ for (const name of transformNames ?? []) {
10
+ const t = this.map[name];
11
+ if (!t)
12
+ throw new Error(`Unknown transform: ${name}`);
13
+ v = t(v, ctx);
14
+ }
15
+ return v;
16
+ }
17
+ }
18
+ //# sourceMappingURL=TransformRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformRegistry.js","sourceRoot":"","sources":["../../src/transforms/TransformRegistry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,OAAO,iBAAiB;IACpB,GAAG,CAA8B;IAEzC,YAAY,EAAmC;QAC7C,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,iBAAiB,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAS,CAAC;IAC5D,CAAC;IAED,KAAK,CACH,KAAc,EACd,cAAiD,EACjD,GAAkB;QAElB,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export declare const builtInTransforms: {
2
+ readonly trim: (v: unknown) => unknown;
3
+ readonly upper: (v: unknown) => unknown;
4
+ readonly lower: (v: unknown) => unknown;
5
+ readonly toString: (v: unknown) => string | null | undefined;
6
+ readonly toNumber: (v: unknown) => number;
7
+ readonly toBoolean: (v: unknown) => boolean;
8
+ };
9
+ //# sourceMappingURL=builtins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/transforms/builtins.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB;uBAClB,OAAO;wBACN,OAAO;wBACP,OAAO;2BACJ,OAAO;2BACP,OAAO;4BASN,OAAO;CASd,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const builtInTransforms = {
2
+ trim: (v) => (typeof v === "string" ? v.trim() : v),
3
+ upper: (v) => (typeof v === "string" ? v.toUpperCase() : v),
4
+ lower: (v) => (typeof v === "string" ? v.toLowerCase() : v),
5
+ toString: (v) => (v == null ? v : String(v)),
6
+ toNumber: (v) => {
7
+ if (typeof v === "number")
8
+ return v;
9
+ if (typeof v === "string") {
10
+ const n = Number(v);
11
+ if (Number.isNaN(n))
12
+ throw new Error(`toNumber: NaN for value '${v}'`);
13
+ return n;
14
+ }
15
+ throw new Error(`toNumber: unsupported type '${typeof v}'`);
16
+ },
17
+ toBoolean: (v) => {
18
+ if (typeof v === "boolean")
19
+ return v;
20
+ if (typeof v === "string") {
21
+ const s = v.toLowerCase().trim();
22
+ if (s === "true")
23
+ return true;
24
+ if (s === "false")
25
+ return false;
26
+ }
27
+ throw new Error(`toBoolean: unsupported value '${String(v)}'`);
28
+ },
29
+ };
30
+ //# sourceMappingURL=builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/transforms/builtins.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,KAAK,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,QAAQ,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAU,EAAE,EAAE;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YACvE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,SAAS,EAAE,CAAC,CAAU,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC9B,IAAI,CAAC,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;CACO,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { PayloadType } from "./spec.js";
2
+ import type { NamespaceInput } from "./internal.js";
3
+ export type InitResult = {
4
+ metadata?: unknown;
5
+ payload?: unknown;
6
+ rawPayload?: string;
7
+ payloadType?: PayloadType;
8
+ /** seed for $pre namespace (e.g., parsed CDATA, extracted message, etc.) */
9
+ pre?: Record<string, any>;
10
+ };
11
+ export interface MapperContext {
12
+ requestId?: string;
13
+ [k: string]: unknown;
14
+ }
15
+ export type InitializerFn = (input: unknown, ctx: MapperContext) => Promise<InitResult> | InitResult;
16
+ export type PreprocessorFn = (ns: NamespaceInput, ctx: MapperContext) => Promise<unknown> | unknown;
17
+ export type PostProcessorFn = (out: unknown, ns: NamespaceInput, ctx: MapperContext) => Promise<unknown> | unknown;
18
+ export type TransformFn = (value: unknown, ctx: MapperContext) => unknown;
19
+ export interface FunctionRegistry {
20
+ initializer?: Record<string, InitializerFn>;
21
+ preprocessors?: Record<string, PreprocessorFn>;
22
+ postProcessors?: Record<string, PostProcessorFn>;
23
+ transforms?: Record<string, TransformFn>;
24
+ }
25
+ //# sourceMappingURL=functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/types/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAEtC,MAAM,MAAM,cAAc,GAAG,CAC3B,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,OAAO,EACZ,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAC1C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/types/functions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ export type SelectorBindings = Record<string, number>;
2
+ export interface NamespaceInput {
3
+ payload: any;
4
+ meta: any;
5
+ pre: Record<string, any>;
6
+ }
7
+ export type InputKind = "json" | "xml";
8
+ export interface MatchedInfo {
9
+ ruleIndex: number;
10
+ mappingPath: string;
11
+ selector?: SelectorBindings;
12
+ }
13
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC1B;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import type { InputKind, MatchedInfo } from "./internal.js";
2
+ export type MapResult = {
3
+ ok: true;
4
+ value: any;
5
+ meta?: MapMeta;
6
+ warnings?: MapWarning[];
7
+ } | {
8
+ ok: false;
9
+ error: MapError;
10
+ meta?: MapMeta;
11
+ warnings?: MapWarning[];
12
+ };
13
+ export interface MapMeta {
14
+ inputType: InputKind;
15
+ pre: Record<string, any>;
16
+ matched: Record<string, MatchedInfo | undefined>;
17
+ }
18
+ export interface MapWarning {
19
+ code: string;
20
+ message: string;
21
+ path?: string;
22
+ }
23
+ export interface MapError {
24
+ code: "INITIALIZER_ERROR" | "PAYLOAD_PARSE_ERROR" | "PREPROCESSOR_ERROR" | "MISSING_REQUIRED_FIELD" | "NO_RULE_MATCHED_REQUIRED" | "TRANSFORM_ERROR" | "INVALID_SELECTOR_ROOT" | "NOT_IMPLEMENTED";
25
+ message: string;
26
+ field?: string;
27
+ details?: any;
28
+ }
29
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/types/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,MAAM,SAAS,GACjB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE,GACjE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAE5E,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EACA,mBAAmB,GACnB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,0BAA0B,GAC1B,iBAAiB,GACjB,uBAAuB,GACvB,iBAAiB,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/types/result.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ export type PayloadType = "json" | "xml" | "auto";
2
+ export interface RuleDocumentV1 {
3
+ version: "1.0";
4
+ name?: string;
5
+ initializer?: FunctionRef;
6
+ /** Aliases apply to PAYLOAD paths only. Key = logical root, value = list of candidate roots */
7
+ aliases?: Record<string, ReadonlyArray<string>>;
8
+ preprocessors?: Record<string, FunctionRef>;
9
+ rules: Record<string, RuleEntryV1 | ReadonlyArray<RuleEntryV1>>;
10
+ postProcessors?: ReadonlyArray<string>;
11
+ }
12
+ export type MappingV1 = string | MappingObjV1;
13
+ export interface RuleEntryV1 {
14
+ conditions?: Record<string, unknown>;
15
+ mappings: ReadonlyArray<MappingV1>;
16
+ value?: unknown;
17
+ required?: boolean;
18
+ }
19
+ export interface FunctionRef {
20
+ function: string;
21
+ options?: Record<string, unknown>;
22
+ }
23
+ export interface MappingObjV1 {
24
+ path: string;
25
+ transform?: ReadonlyArray<string>;
26
+ }
27
+ export interface RuleDocumentV1 {
28
+ version: "1.0";
29
+ name?: string;
30
+ initializer?: FunctionRef;
31
+ preprocessors?: Record<string, FunctionRef>;
32
+ /** Canonical output keys are dot-paths (nested output) */
33
+ rules: Record<string, RuleEntryV1 | ReadonlyArray<RuleEntryV1>>;
34
+ postProcessors?: ReadonlyArray<string>;
35
+ }
36
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/types/spec.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAE5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAEhE,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,YAAY,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAE5C,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAEhE,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/types/spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Get value by dot-path with numeric indexes. Returns undefined if not found. */
2
+ export declare function deepGet(obj: any, path: string): any;
3
+ //# sourceMappingURL=deepGet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepGet.d.ts","sourceRoot":"","sources":["../../src/utils/deepGet.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,CAenD"}
@@ -0,0 +1,22 @@
1
+ /** Get value by dot-path with numeric indexes. Returns undefined if not found. */
2
+ export function deepGet(obj, path) {
3
+ if (!path)
4
+ return obj;
5
+ const parts = path.split(".").filter(Boolean);
6
+ let cur = obj;
7
+ for (const p of parts) {
8
+ if (cur == null)
9
+ return undefined;
10
+ const idx = Number(p);
11
+ if (!Number.isNaN(idx) && String(idx) === p) {
12
+ if (!Array.isArray(cur))
13
+ return undefined;
14
+ cur = cur[idx];
15
+ }
16
+ else {
17
+ cur = cur[p];
18
+ }
19
+ }
20
+ return cur;
21
+ }
22
+ //# sourceMappingURL=deepGet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepGet.js","sourceRoot":"","sources":["../../src/utils/deepGet.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,OAAO,CAAC,GAAQ,EAAE,IAAY;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,GAAG,GAAQ,GAAG,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC1C,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "ruleforge",
3
+ "version": "0.1.0",
4
+ "description": "Declarative rule engine to map JSON/XML payloads into canonical nested JSON.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE",
18
+ "CHANGELOG.md"
19
+ ],
20
+ "scripts": {
21
+ "clean": "rimraf dist dist-example",
22
+ "build": "rimraf dist && tsc -p tsconfig.build.json",
23
+ "build:examples": "rimraf dist-example && tsc -p tsconfig.example.json",
24
+ "typecheck": "tsc -p tsconfig.json --noEmit",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest"
27
+ },
28
+ "dependencies": {
29
+ "fast-xml-parser": "^4.5.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^22.0.0",
33
+ "rimraf": "^6.0.0",
34
+ "typescript": "^5.5.0",
35
+ "vitest": "^2.0.0"
36
+ },
37
+ "engines": {
38
+ "node": ">=18"
39
+ },
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/abhi-d-git/ruleforge.git"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/abhi-d-git/ruleforge/issues"
47
+ },
48
+ "homepage": "https://github.com/abhi-d-git/ruleforge#readme",
49
+ "keywords": [
50
+ "rule-engine",
51
+ "mapping",
52
+ "transform",
53
+ "integration",
54
+ "xml",
55
+ "json",
56
+ "etl",
57
+ "canonical-model"
58
+ ]
59
+ }