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,168 @@
1
+ import { err } from "./Errors.js";
2
+ import { setByDotPath } from "./OutputBuilder.js";
3
+ import { TransformRegistry } from "../transforms/TransformRegistry.js";
4
+ import { resolvePath } from "../resolvers/PathResolver.js";
5
+ import { bindSelectorsV1, applyBindingsToMappings, applyBindingsToPath, } from "./SelectorEngine.js";
6
+ export async function runRules(spec, fn, ns, ctx, allowBarePaths, inputType) {
7
+ const out = {};
8
+ const matched = {};
9
+ const metaBase = {
10
+ inputType,
11
+ pre: ns.pre,
12
+ matched,
13
+ };
14
+ const resolverOpts = {
15
+ allowBarePaths,
16
+ aliases: spec.aliases ?? {},
17
+ };
18
+ const namespaces = {
19
+ payload: ns.payload,
20
+ meta: ns.meta,
21
+ pre: ns.pre,
22
+ };
23
+ const transforms = new TransformRegistry(fn.transforms);
24
+ for (const [targetKey, ruleDef] of Object.entries(spec.rules ?? {})) {
25
+ const entries = Array.isArray(ruleDef)
26
+ ? ruleDef
27
+ : [ruleDef];
28
+ const anyRequired = entries.some((e) => e.required === true);
29
+ let matchedAnyRule = false;
30
+ for (let i = 0; i < entries.length; i++) {
31
+ const entry = entries[i];
32
+ // -------------------------
33
+ // 1️⃣ Bind selectors
34
+ // -------------------------
35
+ let bindings;
36
+ const sel = bindSelectorsV1(entry, {
37
+ ns: namespaces,
38
+ resolveOpts: resolverOpts,
39
+ });
40
+ if (!sel.ok) {
41
+ const e = err("INVALID_SELECTOR_ROOT", sel.error.message, { targetKey, ruleIndex: i }, targetKey);
42
+ return { ok: false, result: { ok: false, error: e, meta: metaBase } };
43
+ }
44
+ if (sel.result.kind === "bound") {
45
+ bindings = sel.result.bindings;
46
+ }
47
+ // -------------------------
48
+ // 2️⃣ Evaluate conditions
49
+ // -------------------------
50
+ if (!conditionsMatch(entry, namespaces, resolverOpts, bindings)) {
51
+ continue;
52
+ }
53
+ matchedAnyRule = true;
54
+ // -------------------------
55
+ // 3️⃣ Constant value support
56
+ // -------------------------
57
+ if ("value" in entry && entry.value !== undefined) {
58
+ setByDotPath(out, targetKey, entry.value);
59
+ matched[targetKey] = {
60
+ ruleIndex: i,
61
+ mappingPath: "(value)",
62
+ selector: bindings ? sanitizeSelector(bindings) : undefined,
63
+ };
64
+ break; // stop at first matched rule
65
+ }
66
+ // -------------------------
67
+ // 4️⃣ Resolve mappings (fallback list)
68
+ // -------------------------
69
+ const mappings = entry.mappings ?? [];
70
+ const mres = resolveMappings(mappings, namespaces, resolverOpts, transforms, ctx, bindings);
71
+ if (!mres.ok) {
72
+ const e = err("TRANSFORM_ERROR", mres.error.message, mres.error.details, targetKey);
73
+ return { ok: false, result: { ok: false, error: e, meta: metaBase } };
74
+ }
75
+ if (mres.valueFound) {
76
+ setByDotPath(out, targetKey, mres.value);
77
+ matched[targetKey] = {
78
+ ruleIndex: i,
79
+ mappingPath: mres.usedPath,
80
+ selector: bindings ? sanitizeSelector(bindings) : undefined,
81
+ };
82
+ break;
83
+ }
84
+ // -------------------------
85
+ // 5️⃣ Required but no value
86
+ // -------------------------
87
+ if (entry.required) {
88
+ const e = err("MISSING_REQUIRED_FIELD", `Required field '${targetKey}' matched rule ${i} but no mapping/value produced a result`, { attempted: mappings }, targetKey);
89
+ return { ok: false, result: { ok: false, error: e, meta: metaBase } };
90
+ }
91
+ // Rule matched but produced no value and not required → stop evaluation
92
+ matched[targetKey] = {
93
+ ruleIndex: i,
94
+ mappingPath: "",
95
+ selector: bindings ? sanitizeSelector(bindings) : undefined,
96
+ };
97
+ break;
98
+ }
99
+ // -------------------------
100
+ // 6️⃣ Required but no rule matched at all
101
+ // -------------------------
102
+ if (anyRequired && !matchedAnyRule) {
103
+ const e = err("NO_RULE_MATCHED_REQUIRED", `Required field '${targetKey}' did not match any rule entry`, { targetKey }, targetKey);
104
+ return { ok: false, result: { ok: false, error: e, meta: metaBase } };
105
+ }
106
+ }
107
+ return { ok: true, value: out, meta: metaBase };
108
+ }
109
+ function conditionsMatch(entry, ns, resolverOpts, bindings) {
110
+ const cond = entry.conditions ?? {};
111
+ const keys = Object.keys(cond);
112
+ if (keys.length === 0)
113
+ return true;
114
+ for (const k of keys) {
115
+ const expected = cond[k];
116
+ const kk = bindings ? applyBindingsToPath(k, bindings) : k;
117
+ // If still unresolved selector tokens remain, treat as no match.
118
+ if (kk.includes(".$X1") || kk.includes(".$X2"))
119
+ return false;
120
+ const r = resolvePath(ns, kk, resolverOpts);
121
+ if (!matchesExpected(r.value, expected))
122
+ return false;
123
+ }
124
+ return true;
125
+ }
126
+ function matchesExpected(actual, expected) {
127
+ if (Array.isArray(expected)) {
128
+ return expected.includes(actual);
129
+ }
130
+ return actual === expected;
131
+ }
132
+ function resolveMappings(mappings, ns, resolverOpts, transforms, ctx, bindings) {
133
+ const m2 = bindings ? applyBindingsToMappings(mappings, bindings) : mappings;
134
+ let lastUsed = "";
135
+ for (const m of m2) {
136
+ const path = typeof m === "string" ? m : m.path;
137
+ const transformNames = typeof m === "string" ? undefined : m.transform;
138
+ if (path.includes(".$X1") || path.includes(".$X2"))
139
+ continue;
140
+ const r = resolvePath(ns, path, resolverOpts);
141
+ lastUsed = r.usedPath;
142
+ if (r.value === undefined)
143
+ continue;
144
+ try {
145
+ const v = transforms.apply(r.value, transformNames, ctx);
146
+ return { ok: true, valueFound: true, value: v, usedPath: r.usedPath };
147
+ }
148
+ catch (e) {
149
+ return {
150
+ ok: false,
151
+ error: {
152
+ message: e?.message ?? String(e),
153
+ details: { path, transformNames },
154
+ },
155
+ };
156
+ }
157
+ }
158
+ return { ok: true, valueFound: false, usedPath: lastUsed };
159
+ }
160
+ function sanitizeSelector(bindings) {
161
+ const out = {};
162
+ for (const [k, v] of Object.entries(bindings)) {
163
+ if (typeof v === "number")
164
+ out[k] = v;
165
+ }
166
+ return out;
167
+ }
168
+ //# sourceMappingURL=RuleEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleEngine.js","sourceRoot":"","sources":["../../src/core/RuleEngine.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAmB,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAoB,EACpB,EAAoB,EACpB,EAAyD,EACzD,GAAkB,EAClB,cAAuB,EACvB,SAAyB;IAIzB,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,MAAM,OAAO,GAA4C,EAAE,CAAC;IAE5D,MAAM,QAAQ,GAAY;QACxB,SAAS;QACT,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,OAAO;KACR,CAAC;IAEF,MAAM,YAAY,GAAG;QACnB,cAAc;QACd,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;KAC5B,CAAC;IAEF,MAAM,UAAU,GAAe;QAC7B,OAAO,EAAE,EAAE,CAAC,OAAO;QACnB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,GAAG,EAAE,EAAE,CAAC,GAAG;KACZ,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAExD,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,OAAO,GAA+B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAChE,CAAC,CAAE,OAAsC;YACzC,CAAC,CAAC,CAAC,OAAsB,CAAC,CAAC;QAE7B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAE7D,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YAE1B,4BAA4B;YAC5B,qBAAqB;YACrB,4BAA4B;YAC5B,IAAI,QAAsC,CAAC;YAE3C,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE;gBACjC,EAAE,EAAE,UAAU;gBACd,WAAW,EAAE,YAAY;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAa,GAAG,CACrB,uBAAuB,EACvB,GAAG,CAAC,KAAK,CAAC,OAAO,EACjB,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,EAC3B,SAAS,CACV,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;YACxE,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAChC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjC,CAAC;YAED,4BAA4B;YAC5B,0BAA0B;YAC1B,4BAA4B;YAC5B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAChE,SAAS;YACX,CAAC;YAED,cAAc,GAAG,IAAI,CAAC;YAEtB,4BAA4B;YAC5B,6BAA6B;YAC7B,4BAA4B;YAC5B,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAClD,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE1C,OAAO,CAAC,SAAS,CAAC,GAAG;oBACnB,SAAS,EAAE,CAAC;oBACZ,WAAW,EAAE,SAAS;oBACtB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC5D,CAAC;gBAEF,MAAM,CAAC,6BAA6B;YACtC,CAAC;YAED,4BAA4B;YAC5B,uCAAuC;YACvC,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YAEtC,MAAM,IAAI,GAAG,eAAe,CAC1B,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,UAAU,EACV,GAAG,EACH,QAAQ,CACT,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,GAAa,GAAG,CACrB,iBAAiB,EACjB,IAAI,CAAC,KAAK,CAAC,OAAO,EAClB,IAAI,CAAC,KAAK,CAAC,OAAO,EAClB,SAAS,CACV,CAAC;gBACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;YACxE,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEzC,OAAO,CAAC,SAAS,CAAC,GAAG;oBACnB,SAAS,EAAE,CAAC;oBACZ,WAAW,EAAE,IAAI,CAAC,QAAQ;oBAC1B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC5D,CAAC;gBAEF,MAAM;YACR,CAAC;YAED,4BAA4B;YAC5B,4BAA4B;YAC5B,4BAA4B;YAC5B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,CAAC,GAAa,GAAG,CACrB,wBAAwB,EACxB,mBAAmB,SAAS,kBAAkB,CAAC,yCAAyC,EACxF,EAAE,SAAS,EAAE,QAAQ,EAAE,EACvB,SAAS,CACV,CAAC;gBAEF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;YACxE,CAAC;YAED,wEAAwE;YACxE,OAAO,CAAC,SAAS,CAAC,GAAG;gBACnB,SAAS,EAAE,CAAC;gBACZ,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aAC5D,CAAC;YAEF,MAAM;QACR,CAAC;QAED,4BAA4B;QAC5B,0CAA0C;QAC1C,4BAA4B;QAC5B,IAAI,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,MAAM,CAAC,GAAa,GAAG,CACrB,0BAA0B,EAC1B,mBAAmB,SAAS,gCAAgC,EAC5D,EAAE,SAAS,EAAE,EACb,SAAS,CACV,CAAC;YAEF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CACtB,KAAkB,EAClB,EAAc,EACd,YAGC,EACD,QAA2B;IAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,iEAAiE;QACjE,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE7D,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;IACxD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,MAAW,EAAE,QAAa;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,KAAK,QAAQ,CAAC;AAC7B,CAAC;AAED,SAAS,eAAe,CACtB,QAAkC,EAClC,EAAc,EACd,YAGC,EACD,UAA6B,EAC7B,GAAkB,EAClB,QAA2B;IAI3B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE7E,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAkB,CAAC,IAAI,CAAC;QAClE,MAAM,cAAc,GAClB,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAkB,CAAC,SAAS,CAAC;QAEpE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAE7D,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAC9C,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAEtB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QAEpC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;YACzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC;oBAChC,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;iBAClC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA0B;IAClD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { RuleEntryV1, MappingV1 } from "../types/spec.js";
2
+ import type { Namespaces, ResolveOptions } from "../resolvers/PathResolver.js";
3
+ export type SelectorVar = "$X1" | "$X2";
4
+ export type SelectorBindings = Partial<Record<SelectorVar, number>>;
5
+ export type SelectorOutcome = {
6
+ kind: "none";
7
+ } | {
8
+ kind: "bound";
9
+ bindings: SelectorBindings;
10
+ roots: Partial<Record<SelectorVar, string>>;
11
+ };
12
+ export interface SelectorContext {
13
+ ns: Namespaces;
14
+ resolveOpts: ResolveOptions;
15
+ }
16
+ /**
17
+ * Binds $X1 (outer) then $X2 (nested) using conditions (AND equals-to-constant).
18
+ *
19
+ * Example conditions:
20
+ * - customers.$X1.fleet.id = "fleetId_5"
21
+ * - customers.$X1.devices.$X2.id = "deviceId_1"
22
+ *
23
+ * Binding:
24
+ * - bind $X1 using pure-$X1 conditions
25
+ * - bind $X2 using conditions containing $X2 (after $X1 is bound)
26
+ */
27
+ export declare function bindSelectorsV1(entry: RuleEntryV1, ctx: SelectorContext): {
28
+ ok: true;
29
+ result: SelectorOutcome;
30
+ } | {
31
+ ok: false;
32
+ error: Error;
33
+ };
34
+ export declare function applyBindingsToPath(path: string, bindings: SelectorBindings): string;
35
+ export declare function applyBindingsToMappings(mappings: ReadonlyArray<MappingV1>, bindings: SelectorBindings): MappingV1[];
36
+ //# sourceMappingURL=SelectorEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectorEngine.d.ts","sourceRoot":"","sources":["../../src/core/SelectorEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG/E,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,CAAC;AACxC,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpE,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,UAAU,CAAC;IACf,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,eAAe,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAkFrE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,gBAAgB,GACzB,MAAM,CAaR;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,EAClC,QAAQ,EAAE,gBAAgB,GACzB,SAAS,EAAE,CAMb"}
@@ -0,0 +1,186 @@
1
+ import { resolvePath } from "../resolvers/PathResolver.js";
2
+ /**
3
+ * Binds $X1 (outer) then $X2 (nested) using conditions (AND equals-to-constant).
4
+ *
5
+ * Example conditions:
6
+ * - customers.$X1.fleet.id = "fleetId_5"
7
+ * - customers.$X1.devices.$X2.id = "deviceId_1"
8
+ *
9
+ * Binding:
10
+ * - bind $X1 using pure-$X1 conditions
11
+ * - bind $X2 using conditions containing $X2 (after $X1 is bound)
12
+ */
13
+ export function bindSelectorsV1(entry, ctx) {
14
+ try {
15
+ const conditions = entry.conditions ?? {};
16
+ const keys = Object.keys(conditions);
17
+ const usedVars = detectUsedVars(keys);
18
+ if (usedVars.size === 0)
19
+ return { ok: true, result: { kind: "none" } };
20
+ for (const v of usedVars) {
21
+ if (v !== "$X1" && v !== "$X2")
22
+ throw new Error(`Unsupported selector var in v1: ${v}`);
23
+ }
24
+ const roots = detectRoots(keys);
25
+ const bindings = {};
26
+ // 0) evaluate fixed (no vars) conditions first
27
+ const fixedKeys = keys.filter((k) => !containsVar(k, "$X1") && !containsVar(k, "$X2"));
28
+ for (const k of fixedKeys) {
29
+ const expected = conditions[k];
30
+ const r = resolvePath(ctx.ns, k, ctx.resolveOpts);
31
+ if (!matchesExpected(r.value, expected))
32
+ return { ok: true, result: { kind: "none" } };
33
+ }
34
+ // 1) bind $X1 if used
35
+ if (usedVars.has("$X1")) {
36
+ const x1Root = roots["$X1"];
37
+ if (!x1Root)
38
+ throw new Error("Internal: $X1 used but root not found");
39
+ const x1Keys = keys.filter((k) => containsVar(k, "$X1") && !containsVar(k, "$X2"));
40
+ if (x1Keys.length === 0)
41
+ return { ok: true, result: { kind: "none" } };
42
+ const x1 = bindVarByScanningRoot("$X1", x1Root, x1Keys, conditions, bindings, ctx);
43
+ if (x1 == null)
44
+ return { ok: true, result: { kind: "none" } };
45
+ bindings["$X1"] = x1;
46
+ }
47
+ // 2) bind $X2 if used
48
+ if (usedVars.has("$X2")) {
49
+ const x2RootRaw = roots["$X2"];
50
+ if (!x2RootRaw)
51
+ throw new Error("Internal: $X2 used but root not found");
52
+ const x2Root = applyBindingsToPath(x2RootRaw, bindings);
53
+ const x2Keys = keys.filter((k) => containsVar(k, "$X2"));
54
+ const x2 = bindVarByScanningRoot("$X2", x2Root, x2Keys, conditions, bindings, ctx);
55
+ if (x2 == null)
56
+ return { ok: true, result: { kind: "none" } };
57
+ bindings["$X2"] = x2;
58
+ }
59
+ // 3) final verify: all conditions with bindings applied
60
+ for (const k of keys.filter((k) => containsAnyVar(k))) {
61
+ const expected = conditions[k];
62
+ const kk = applyBindingsToPath(k, bindings);
63
+ const r = resolvePath(ctx.ns, kk, ctx.resolveOpts);
64
+ if (!matchesExpected(r.value, expected))
65
+ return { ok: true, result: { kind: "none" } };
66
+ }
67
+ return { ok: true, result: { kind: "bound", bindings, roots } };
68
+ }
69
+ catch (e) {
70
+ return { ok: false, error: e instanceof Error ? e : new Error(String(e)) };
71
+ }
72
+ }
73
+ export function applyBindingsToPath(path, bindings) {
74
+ let out = path;
75
+ if (bindings["$X1"] !== undefined) {
76
+ out = out
77
+ .replaceAll(".$X1.", `.${bindings["$X1"]}.`)
78
+ .replaceAll(".$X1", `.${bindings["$X1"]}`);
79
+ }
80
+ if (bindings["$X2"] !== undefined) {
81
+ out = out
82
+ .replaceAll(".$X2.", `.${bindings["$X2"]}.`)
83
+ .replaceAll(".$X2", `.${bindings["$X2"]}`);
84
+ }
85
+ return out;
86
+ }
87
+ export function applyBindingsToMappings(mappings, bindings) {
88
+ return mappings.map((m) => {
89
+ if (typeof m === "string")
90
+ return applyBindingsToPath(m, bindings);
91
+ const mm = m;
92
+ return { ...mm, path: applyBindingsToPath(mm.path, bindings) };
93
+ });
94
+ }
95
+ /** ---------- internals ---------- */
96
+ function detectUsedVars(keys) {
97
+ const s = new Set();
98
+ for (const k of keys) {
99
+ if (containsVar(k, "$X1"))
100
+ s.add("$X1");
101
+ if (containsVar(k, "$X2"))
102
+ s.add("$X2");
103
+ }
104
+ return s;
105
+ }
106
+ /**
107
+ * Root per variable:
108
+ * - customers.$X1.fleet.id => $X1 root = "customers"
109
+ * - customers.$X1.devices.$X2.id => $X2 root = "customers.$X1.devices"
110
+ */
111
+ function detectRoots(keys) {
112
+ const roots = {};
113
+ for (const k of keys) {
114
+ const r1 = extractRoot(k, "$X1");
115
+ if (r1)
116
+ roots["$X1"] = mergeRoot("$X1", roots["$X1"], r1);
117
+ const r2 = extractRoot(k, "$X2");
118
+ if (r2)
119
+ roots["$X2"] = mergeRoot("$X2", roots["$X2"], r2);
120
+ }
121
+ const x2r = roots["$X2"];
122
+ if (x2r && containsVar(x2r, "$X1") && !roots["$X1"]) {
123
+ throw new Error(`$X2 root depends on $X1 but no $X1 root found. Root: ${x2r}`);
124
+ }
125
+ return roots;
126
+ }
127
+ function mergeRoot(v, existing, next) {
128
+ if (!existing)
129
+ return next;
130
+ if (existing === next)
131
+ return existing;
132
+ throw new Error(`v1 supports a single root per selector variable. ${v} roots: '${existing}' vs '${next}'`);
133
+ }
134
+ function extractRoot(path, v) {
135
+ const needle = `.${v}.`;
136
+ const i = path.indexOf(needle);
137
+ if (i >= 0)
138
+ return path.slice(0, i);
139
+ const tail = `.${v}`;
140
+ if (path.endsWith(tail))
141
+ return path.slice(0, -tail.length);
142
+ return null;
143
+ }
144
+ function containsVar(path, v) {
145
+ return path.includes(`.${v}.`) || path.endsWith(`.${v}`);
146
+ }
147
+ function containsAnyVar(path) {
148
+ return containsVar(path, "$X1") || containsVar(path, "$X2");
149
+ }
150
+ /**
151
+ * Scan root array to bind varName.
152
+ * Skips conditions that still contain unresolved vars.
153
+ */
154
+ function bindVarByScanningRoot(varName, rootPath, condKeys, conditions, bindingsAlready, ctx) {
155
+ const rootResolved = resolvePath(ctx.ns, rootPath, ctx.resolveOpts);
156
+ const arr = rootResolved.value;
157
+ if (!Array.isArray(arr))
158
+ return null;
159
+ for (let i = 0; i < arr.length; i++) {
160
+ const trialBindings = {
161
+ ...bindingsAlready,
162
+ [varName]: i,
163
+ };
164
+ let ok = true;
165
+ for (const k of condKeys) {
166
+ const expected = conditions[k];
167
+ const kk = applyBindingsToPath(k, trialBindings);
168
+ if (containsAnyVar(kk))
169
+ continue; // unresolved var remains
170
+ const r = resolvePath(ctx.ns, kk, ctx.resolveOpts);
171
+ if (!matchesExpected(r.value, expected)) {
172
+ ok = false;
173
+ break;
174
+ }
175
+ }
176
+ if (ok)
177
+ return i;
178
+ }
179
+ return null;
180
+ }
181
+ function matchesExpected(actual, expected) {
182
+ if (Array.isArray(expected))
183
+ return expected.includes(actual);
184
+ return actual === expected;
185
+ }
186
+ //# sourceMappingURL=SelectorEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectorEngine.js","sourceRoot":"","sources":["../../src/core/SelectorEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RuleDocumentV1 } from "../types/spec.js";
2
+ export declare function asRuleDocumentV1(spec: unknown): RuleDocumentV1;
3
+ //# sourceMappingURL=validateSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSpec.d.ts","sourceRoot":"","sources":["../../src/core/validateSpec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAY9D"}
@@ -0,0 +1,11 @@
1
+ export function asRuleDocumentV1(spec) {
2
+ if (!spec || typeof spec !== "object")
3
+ throw new Error("Spec must be an object");
4
+ const s = spec;
5
+ if (s.version !== "1.0")
6
+ throw new Error(`Unsupported spec version: ${String(s.version)}`);
7
+ if (!s.rules || typeof s.rules !== "object")
8
+ throw new Error("Spec.rules must be an object");
9
+ return s;
10
+ }
11
+ //# sourceMappingURL=validateSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSpec.js","sourceRoot":"","sources":["../../src/core/validateSpec.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAW,CAAC;IACtB,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK;QACrB,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAElD,OAAO,CAAmB,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { createMapper } from "./index.js";
2
+ const spec = {
3
+ version: "1.0",
4
+ rules: {
5
+ "match.customerDevice": [
6
+ {
7
+ conditions: {
8
+ "customers.$X1.fleet.id": "fleetId_5",
9
+ "customers.$X1.devices.$X2.id": "deviceId_10",
10
+ },
11
+ mappings: ["customers.$X1.devices.$X2.serialNum"],
12
+ required: true,
13
+ },
14
+ ],
15
+ },
16
+ };
17
+ const input = {
18
+ customers: [
19
+ { fleet: { id: "fleetId_0" }, devices: [{ id: "deviceId_1" }] },
20
+ {
21
+ fleet: { id: "fleetId_5" },
22
+ devices: [
23
+ { id: "x" },
24
+ { id: "y" },
25
+ { id: "deviceId_10", serialNum: 200 },
26
+ ],
27
+ },
28
+ ],
29
+ };
30
+ const res = await createMapper({ spec }).map(input);
31
+ // console.log(JSON.stringify(res));
32
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,IAAI,GAAG;IACX,OAAO,EAAE,KAAK;IACd,KAAK,EAAE;QACL,sBAAsB,EAAE;YACtB;gBACE,UAAU,EAAE;oBACV,wBAAwB,EAAE,WAAW;oBACrC,8BAA8B,EAAE,aAAa;iBAC9C;gBACD,QAAQ,EAAE,CAAC,qCAAqC,CAAC;gBACjD,QAAQ,EAAE,IAAI;aACf;SACF;KACF;CACO,CAAC;AAEX,MAAM,KAAK,GAAG;IACZ,SAAS,EAAE;QACT,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;QAC/D;YACE,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE;YAC1B,OAAO,EAAE;gBACP,EAAE,EAAE,EAAE,GAAG,EAAE;gBACX,EAAE,EAAE,EAAE,GAAG,EAAE;gBACX,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE;aACtC;SACF;KACF;CACF,CAAC;AAEF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpD,oCAAoC"}
@@ -0,0 +1,8 @@
1
+ export type { RuleDocumentV1, RuleEntryV1, MappingV1, MappingObjV1, PayloadType, } from "./types/spec.js";
2
+ export type { MapResult, MapMeta, MapError, MapWarning, } from "./types/result.js";
3
+ export type { FunctionRegistry, MapperContext } from "./types/functions.js";
4
+ export { Mapper } from "./core/Mapper.js";
5
+ import type { MapperOptions } from "./core/Mapper.js";
6
+ import { Mapper as MapperClass } from "./core/Mapper.js";
7
+ export declare function createMapper(opts: MapperOptions): MapperClass;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzD,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,eAE/C"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { Mapper } from "./core/Mapper.js";
2
+ import { Mapper as MapperClass } from "./core/Mapper.js";
3
+ export function createMapper(opts) {
4
+ return new MapperClass(opts);
5
+ }
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function detectInputType(input: unknown): "json" | "xml";
2
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/parsing/detect.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAM9D"}
@@ -0,0 +1,9 @@
1
+ export function detectInputType(input) {
2
+ if (typeof input === "string") {
3
+ const s = input.trim();
4
+ if (s.startsWith("<") && s.endsWith(">"))
5
+ return "xml";
6
+ }
7
+ return "json";
8
+ }
9
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/parsing/detect.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function normalizePayload(payload: unknown, typeHint?: "json" | "xml" | "auto"): Promise<{
2
+ kind: "json";
3
+ obj: any;
4
+ } | {
5
+ kind: "xml";
6
+ obj: any;
7
+ }>;
8
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/parsing/normalize.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAM,GAAG,KAAK,GAAG,MAAe;;;;;;GAiBlG"}
@@ -0,0 +1,19 @@
1
+ import { detectInputType } from "./detect.js";
2
+ import { parseXmlToObject } from "./xml.js";
3
+ export async function normalizePayload(payload, typeHint = "auto") {
4
+ const kind = typeHint === "auto" ? detectInputType(payload) : typeHint;
5
+ if (kind === "json") {
6
+ if (typeof payload === "string") {
7
+ // JSON string
8
+ return { kind, obj: JSON.parse(payload) };
9
+ }
10
+ return { kind, obj: payload };
11
+ }
12
+ // xml
13
+ if (typeof payload !== "string") {
14
+ throw new Error("XML payload must be a string in v1");
15
+ }
16
+ const obj = parseXmlToObject(payload);
17
+ return { kind, obj };
18
+ }
19
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/parsing/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAgB,EAAE,WAAoC,MAAM;IACjG,MAAM,IAAI,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEvE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,cAAc;YACd,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,MAAM;IACN,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * v1 XML normalization:
3
+ * - repeated tags -> arrays
4
+ * - text nodes flattened
5
+ * - attributes under @
6
+ * - ignore namespaces (strip prefix)
7
+ */
8
+ export declare function parseXmlToObject(xml: string): any;
9
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/parsing/xml.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAiBjD"}
@@ -0,0 +1,25 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ /**
3
+ * v1 XML normalization:
4
+ * - repeated tags -> arrays
5
+ * - text nodes flattened
6
+ * - attributes under @
7
+ * - ignore namespaces (strip prefix)
8
+ */
9
+ export function parseXmlToObject(xml) {
10
+ const parser = new XMLParser({
11
+ ignoreAttributes: false,
12
+ attributeNamePrefix: "@",
13
+ textNodeName: "#text",
14
+ removeNSPrefix: true,
15
+ // flatten text-only nodes:
16
+ alwaysCreateTextNode: false,
17
+ // Make repeated nodes arrays when needed:
18
+ isArray: (name, jpath, isLeafNode, isAttribute) => false,
19
+ });
20
+ const parsed = parser.parse(xml);
21
+ // NOTE: fast-xml-parser already flattens many leaf nodes to string.
22
+ // For strict determinism we may add a post-walk normalization later.
23
+ return parsed;
24
+ }
25
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/parsing/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,GAAG;QACxB,YAAY,EAAE,OAAO;QACrB,cAAc,EAAE,IAAI;QACpB,2BAA2B;QAC3B,oBAAoB,EAAE,KAAK;QAC3B,0CAA0C;QAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK;KACzD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,oEAAoE;IACpE,qEAAqE;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Namespaces, ResolveOptions, ResolveResult } 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 declare function resolveFirst(ns: Namespaces, paths: string[], opts: ResolveOptions): ResolveResult;
7
+ //# sourceMappingURL=AliasResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AliasResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/AliasResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGnF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,aAAa,CAQjG"}