drools-builder 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -616,6 +616,43 @@ ${indent}}`;
616
616
  return `${cons.code};`;
617
617
  case "ReturnConsequence":
618
618
  return cons.expression ? `return ${cons.expression};` : "return;";
619
+ case "WhileConsequence": {
620
+ const body = cons.body.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
621
+ return `while (${cons.condition}) {
622
+ ${body}
623
+ ${indent}}`;
624
+ }
625
+ case "ForEachConsequence": {
626
+ const body = cons.body.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
627
+ return `for (${cons.typeName} ${cons.varName} : ${cons.collection}) {
628
+ ${body}
629
+ ${indent}}`;
630
+ }
631
+ case "ForConsequence": {
632
+ const body = cons.body.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
633
+ return `for (${cons.init}; ${cons.condition}; ${cons.update}) {
634
+ ${body}
635
+ ${indent}}`;
636
+ }
637
+ case "VarDeclConsequence":
638
+ return `${cons.typeName} ${cons.name} = ${cons.value};`;
639
+ case "MethodCallConsequence":
640
+ return `${cons.object}.${cons.method}(${cons.args});`;
641
+ case "SwitchConsequence": {
642
+ const caseLines = cons.cases.map((c) => {
643
+ const body = c.body.map((b) => `${indent} ${generateConsequence(b, indent + " ")}`).join("\n");
644
+ return `${indent} case ${c.value}:
645
+ ${body}`;
646
+ });
647
+ if (cons.default && cons.default.length > 0) {
648
+ const defBody = cons.default.map((b) => `${indent} ${generateConsequence(b, indent + " ")}`).join("\n");
649
+ caseLines.push(`${indent} default:
650
+ ${defBody}`);
651
+ }
652
+ return `switch (${cons.expression}) {
653
+ ${caseLines.join("\n")}
654
+ ${indent}}`;
655
+ }
619
656
  case "IfConsequence": {
620
657
  const thenLines = cons.then.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
621
658
  if (cons.else && cons.else.length > 0) {
@@ -659,6 +696,8 @@ function generateRule(rule) {
659
696
  var MetaToDRLTransformer = {
660
697
  generate(file) {
661
698
  const sections = [];
699
+ if (file.package)
700
+ sections.push(`package ${file.package}`);
662
701
  if (file.imports.length > 0)
663
702
  sections.push(file.imports.map((i) => `import ${i};`).join("\n"));
664
703
  if (file.globals.length > 0)
@@ -768,6 +807,10 @@ function extractBalanced(text, open, close) {
768
807
  function stripComments(drl) {
769
808
  return drl.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/[^\n]*/g, "");
770
809
  }
810
+ function parsePackage(drl) {
811
+ const m = drl.match(/^\s*package\s+([\w.]+)\s*;?/m);
812
+ return m ? m[1].trim() : void 0;
813
+ }
771
814
  function parseImports(drl) {
772
815
  const imports = [];
773
816
  const re = /^\s*import\s+([^\s;]+)\s*;?/gm;
@@ -784,28 +827,30 @@ function parseGlobals(drl) {
784
827
  }
785
828
  function extractRuleBlocks(drl) {
786
829
  const blocks = [];
787
- const re = /\brule\s+(?:"[^"]*"|'[^']*')[\s\S]*?\bend\b/g;
830
+ const re = /\brule\s+(?:"[^"]*"|'[^']*')[\s\S]*?\bend\b(?=\s*(?:\n|$))/g;
788
831
  let m;
789
832
  while ((m = re.exec(drl)) !== null) blocks.push(m[0]);
790
833
  return blocks;
791
834
  }
792
835
  function parseFunctions(drl) {
793
836
  const results = [];
794
- const re = /\bfunction\s+([\w<>?,\s\[\]]+?)\s+(\w+)\s*\(([^)]*)\)\s*\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
837
+ const re = /\bfunction\s+([\w<>?,\s\[\]]+?)\s+(\w+)\s*\(([^)]*)\)\s*\{/g;
795
838
  let m;
796
839
  while ((m = re.exec(drl)) !== null) {
840
+ const fromBrace = drl.slice(m.index + m[0].length - 1);
841
+ const body = extractBalanced(fromBrace, "{", "}");
797
842
  results.push({
798
843
  returnType: m[1].trim(),
799
844
  name: m[2].trim(),
800
845
  params: m[3].trim(),
801
- body: parseConsequences(m[4].trim())
846
+ body: parseConsequences(body.trim())
802
847
  });
803
848
  }
804
849
  return results;
805
850
  }
806
851
  function parseDeclarations(drl) {
807
852
  const results = [];
808
- const re = /\bdeclare\s+(\w+)\s*([\s\S]*?)\bend\b/g;
853
+ const re = /\bdeclare\s+(\w+)\s*([\s\S]*?)\bend\b(?=\s*(?:\n|$))/g;
809
854
  let m;
810
855
  while ((m = re.exec(drl)) !== null) {
811
856
  const className = m[1].trim();
@@ -843,7 +888,7 @@ function extractWhenBlock(block) {
843
888
  return m ? m[1].trim() : "";
844
889
  }
845
890
  function extractThenBlock(block) {
846
- const m = block.match(/\bthen\b([\s\S]*?)\bend\b/);
891
+ const m = block.match(/\bthen\b([\s\S]*?)\bend\b(?=\s*(?:\n|$))/);
847
892
  return m ? m[1].trim() : "";
848
893
  }
849
894
  function parseConditions(when) {
@@ -997,6 +1042,30 @@ function parseFrom(text, fromIdx) {
997
1042
  expression: text.slice(fromIdx + " from ".length).trim()
998
1043
  };
999
1044
  }
1045
+ function parseSwitchBody(body) {
1046
+ const cases = [];
1047
+ let defaultBody;
1048
+ const markers = [];
1049
+ const caseRe = /\bcase\s+([^:]+):/g;
1050
+ const defRe = /\bdefault\s*:/g;
1051
+ let m;
1052
+ while ((m = caseRe.exec(body)) !== null)
1053
+ markers.push({ index: m.index, headerLen: m[0].length, type: "case", value: m[1].trim() });
1054
+ while ((m = defRe.exec(body)) !== null)
1055
+ markers.push({ index: m.index, headerLen: m[0].length, type: "default" });
1056
+ markers.sort((a, b) => a.index - b.index);
1057
+ for (let i = 0; i < markers.length; i++) {
1058
+ const marker = markers[i];
1059
+ const contentStart = marker.index + marker.headerLen;
1060
+ const contentEnd = i + 1 < markers.length ? markers[i + 1].index : body.length;
1061
+ const content = body.slice(contentStart, contentEnd).trim();
1062
+ if (marker.type === "case")
1063
+ cases.push({ kind: "CaseConsequence", value: marker.value, body: parseConsequences(content) });
1064
+ else
1065
+ defaultBody = parseConsequences(content);
1066
+ }
1067
+ return { cases, ...defaultBody !== void 0 && { default: defaultBody } };
1068
+ }
1000
1069
  function parseConsequences(then) {
1001
1070
  const consequences = [];
1002
1071
  let remaining = then.trim();
@@ -1011,6 +1080,48 @@ function parseConsequences(then) {
1011
1080
  function parseNextConsequence(text) {
1012
1081
  const t = text.trim();
1013
1082
  if (!t) return null;
1083
+ if (/^while\s*\(/.test(t)) {
1084
+ const condition = extractBalanced(t, "(", ")");
1085
+ const afterCond = t.slice(t.indexOf("(") + condition.length + 2).trim();
1086
+ const body = extractBalanced(afterCond, "{", "}");
1087
+ const endIdx = afterCond.indexOf("{") + body.length + 2;
1088
+ return {
1089
+ consequence: { kind: "WhileConsequence", condition: condition.trim(), body: parseConsequences(body) },
1090
+ rest: afterCond.slice(endIdx)
1091
+ };
1092
+ }
1093
+ if (/^for\s*\(/.test(t)) {
1094
+ const header = extractBalanced(t, "(", ")");
1095
+ const afterHeader = t.slice(t.indexOf("(") + header.length + 2).trim();
1096
+ const body = extractBalanced(afterHeader, "{", "}");
1097
+ const endIdx = afterHeader.indexOf("{") + body.length + 2;
1098
+ const colonIdx = indexAtDepth0(header, ":");
1099
+ if (colonIdx !== -1 && indexAtDepth0(header, ";") === -1) {
1100
+ const parts = header.slice(0, colonIdx).trim().split(/\s+/);
1101
+ const varName = parts.pop();
1102
+ const typeName = parts.join(" ");
1103
+ return {
1104
+ consequence: { kind: "ForEachConsequence", typeName, varName, collection: header.slice(colonIdx + 1).trim(), body: parseConsequences(body) },
1105
+ rest: afterHeader.slice(endIdx)
1106
+ };
1107
+ } else {
1108
+ const parts = splitAtDepth0(header, ";");
1109
+ return {
1110
+ consequence: { kind: "ForConsequence", init: (parts[0] ?? "").trim(), condition: (parts[1] ?? "").trim(), update: (parts[2] ?? "").trim(), body: parseConsequences(body) },
1111
+ rest: afterHeader.slice(endIdx)
1112
+ };
1113
+ }
1114
+ }
1115
+ if (/^switch\s*\(/.test(t)) {
1116
+ const expression = extractBalanced(t, "(", ")");
1117
+ const afterExpr = t.slice(t.indexOf("(") + expression.length + 2).trim();
1118
+ const switchBody = extractBalanced(afterExpr, "{", "}");
1119
+ const endIdx = afterExpr.indexOf("{") + switchBody.length + 2;
1120
+ return {
1121
+ consequence: { kind: "SwitchConsequence", expression: expression.trim(), ...parseSwitchBody(switchBody) },
1122
+ rest: afterExpr.slice(endIdx)
1123
+ };
1124
+ }
1014
1125
  if (/^if\s*\(/.test(t)) {
1015
1126
  const condition = extractBalanced(t, "(", ")");
1016
1127
  const afterCond = t.slice(t.indexOf("(") + condition.length + 2).trim();
@@ -1018,7 +1129,14 @@ function parseNextConsequence(text) {
1018
1129
  const thenConsequences = parseConsequences(thenBlock);
1019
1130
  let afterThen = afterCond.slice(afterCond.indexOf("{") + thenBlock.length + 2).trim();
1020
1131
  let elseConsequences;
1021
- if (/^else\s*\{/.test(afterThen)) {
1132
+ if (/^else\s+if\s*\(/.test(afterThen)) {
1133
+ const elseIfText = afterThen.slice(afterThen.search(/\bif\s*\(/));
1134
+ const elseIfResult = parseNextConsequence(elseIfText);
1135
+ if (elseIfResult) {
1136
+ elseConsequences = [elseIfResult.consequence];
1137
+ afterThen = elseIfResult.rest.trim();
1138
+ }
1139
+ } else if (/^else\s*\{/.test(afterThen)) {
1022
1140
  const elseBlock = extractBalanced(afterThen, "{", "}");
1023
1141
  elseConsequences = parseConsequences(elseBlock);
1024
1142
  afterThen = afterThen.slice(afterThen.indexOf("{") + elseBlock.length + 2).trim();
@@ -1058,6 +1176,31 @@ function parseNextConsequence(text) {
1058
1176
  rest: semiIdx2 !== -1 ? t.slice(semiIdx2 + 1) : ""
1059
1177
  };
1060
1178
  }
1179
+ const varDeclMatch = t.match(/^((?:[A-Z][\w<>., [\]]*|int|double|float|long|boolean|char|byte|short)\s+)(\w+)\s*=\s*/);
1180
+ if (varDeclMatch) {
1181
+ const typeName = varDeclMatch[1].trim();
1182
+ const name = varDeclMatch[2];
1183
+ const afterDecl = t.slice(varDeclMatch[0].length);
1184
+ const semiIdx2 = indexAtDepth0(afterDecl, ";");
1185
+ if (semiIdx2 !== -1) {
1186
+ return {
1187
+ consequence: { kind: "VarDeclConsequence", typeName, name, value: afterDecl.slice(0, semiIdx2).trim() },
1188
+ rest: afterDecl.slice(semiIdx2 + 1)
1189
+ };
1190
+ }
1191
+ }
1192
+ const methodCallMatch = t.match(/^([a-z]\w*)\.(\w+)\(/);
1193
+ if (methodCallMatch) {
1194
+ const object = methodCallMatch[1];
1195
+ const method = methodCallMatch[2];
1196
+ const afterMethod = t.slice(object.length + 1 + method.length);
1197
+ const args = extractBalanced(afterMethod, "(", ")");
1198
+ const rest = afterMethod.slice(args.length + 2).replace(/^\s*;/, "");
1199
+ return {
1200
+ consequence: { kind: "MethodCallConsequence", object, method, args: args.trim() },
1201
+ rest
1202
+ };
1203
+ }
1061
1204
  const semiIdx = indexAtDepth0(t, ";");
1062
1205
  if (semiIdx !== -1)
1063
1206
  return { consequence: { kind: "RawConsequence", code: t.slice(0, semiIdx).trim() }, rest: t.slice(semiIdx + 1) };
@@ -1065,7 +1208,7 @@ function parseNextConsequence(text) {
1065
1208
  }
1066
1209
  function parseModifications(block) {
1067
1210
  return splitAtDepth0(block, ",").map((s) => s.trim()).filter(Boolean).map((text) => {
1068
- const m = text.match(/^(\w+)\s*\(([\s\S]*)\)$/);
1211
+ const m = text.match(/^(\w+)\s*\(([\s\S]*)\)\s*;?\s*$/);
1069
1212
  if (!m) return { method: text, args: [] };
1070
1213
  const args = m[2].trim() ? splitAtDepth0(m[2].trim(), ",").map((a) => a.trim()) : [];
1071
1214
  return { method: m[1], args };
@@ -1076,6 +1219,7 @@ var DRLToMetaTransformer = {
1076
1219
  const clean = stripComments(drl);
1077
1220
  return {
1078
1221
  name: "parsed",
1222
+ package: parsePackage(clean),
1079
1223
  imports: [...new Set(parseImports(clean))],
1080
1224
  globals: parseGlobals(clean),
1081
1225
  declarations: parseDeclarations(clean),
@@ -1125,4 +1269,3 @@ var DRLToMetaTransformer = {
1125
1269
  setGlobal,
1126
1270
  unbound
1127
1271
  });
1128
- //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -145,11 +145,53 @@ interface IfConsequence {
145
145
  then: Consequence[];
146
146
  else?: Consequence[];
147
147
  }
148
+ interface WhileConsequence {
149
+ kind: 'WhileConsequence';
150
+ condition: string;
151
+ body: Consequence[];
152
+ }
153
+ interface ForEachConsequence {
154
+ kind: 'ForEachConsequence';
155
+ typeName: string;
156
+ varName: string;
157
+ collection: string;
158
+ body: Consequence[];
159
+ }
160
+ interface ForConsequence {
161
+ kind: 'ForConsequence';
162
+ init: string;
163
+ condition: string;
164
+ update: string;
165
+ body: Consequence[];
166
+ }
167
+ interface VarDeclConsequence {
168
+ kind: 'VarDeclConsequence';
169
+ typeName: string;
170
+ name: string;
171
+ value: string;
172
+ }
173
+ interface MethodCallConsequence {
174
+ kind: 'MethodCallConsequence';
175
+ object: string;
176
+ method: string;
177
+ args: string;
178
+ }
179
+ interface CaseConsequence {
180
+ kind: 'CaseConsequence';
181
+ value: string;
182
+ body: Consequence[];
183
+ }
184
+ interface SwitchConsequence {
185
+ kind: 'SwitchConsequence';
186
+ expression: string;
187
+ cases: CaseConsequence[];
188
+ default?: Consequence[];
189
+ }
148
190
  interface ReturnConsequence {
149
191
  kind: 'ReturnConsequence';
150
192
  expression: string;
151
193
  }
152
- type Consequence = ModifyConsequence | InsertConsequence | RetractConsequence | SetGlobalConsequence | RawConsequence | IfConsequence | ReturnConsequence;
194
+ type Consequence = ModifyConsequence | InsertConsequence | RetractConsequence | SetGlobalConsequence | RawConsequence | IfConsequence | ReturnConsequence | SwitchConsequence | WhileConsequence | ForEachConsequence | ForConsequence | VarDeclConsequence | MethodCallConsequence;
153
195
  interface GlobalDefinition {
154
196
  type: string;
155
197
  name: string;
@@ -180,6 +222,7 @@ interface ClassDeclaration {
180
222
  }
181
223
  interface DroolsFile {
182
224
  name: string;
225
+ package?: string;
183
226
  imports: string[];
184
227
  globals: GlobalDefinition[];
185
228
  declarations?: ClassDeclaration[];
package/dist/index.d.ts CHANGED
@@ -145,11 +145,53 @@ interface IfConsequence {
145
145
  then: Consequence[];
146
146
  else?: Consequence[];
147
147
  }
148
+ interface WhileConsequence {
149
+ kind: 'WhileConsequence';
150
+ condition: string;
151
+ body: Consequence[];
152
+ }
153
+ interface ForEachConsequence {
154
+ kind: 'ForEachConsequence';
155
+ typeName: string;
156
+ varName: string;
157
+ collection: string;
158
+ body: Consequence[];
159
+ }
160
+ interface ForConsequence {
161
+ kind: 'ForConsequence';
162
+ init: string;
163
+ condition: string;
164
+ update: string;
165
+ body: Consequence[];
166
+ }
167
+ interface VarDeclConsequence {
168
+ kind: 'VarDeclConsequence';
169
+ typeName: string;
170
+ name: string;
171
+ value: string;
172
+ }
173
+ interface MethodCallConsequence {
174
+ kind: 'MethodCallConsequence';
175
+ object: string;
176
+ method: string;
177
+ args: string;
178
+ }
179
+ interface CaseConsequence {
180
+ kind: 'CaseConsequence';
181
+ value: string;
182
+ body: Consequence[];
183
+ }
184
+ interface SwitchConsequence {
185
+ kind: 'SwitchConsequence';
186
+ expression: string;
187
+ cases: CaseConsequence[];
188
+ default?: Consequence[];
189
+ }
148
190
  interface ReturnConsequence {
149
191
  kind: 'ReturnConsequence';
150
192
  expression: string;
151
193
  }
152
- type Consequence = ModifyConsequence | InsertConsequence | RetractConsequence | SetGlobalConsequence | RawConsequence | IfConsequence | ReturnConsequence;
194
+ type Consequence = ModifyConsequence | InsertConsequence | RetractConsequence | SetGlobalConsequence | RawConsequence | IfConsequence | ReturnConsequence | SwitchConsequence | WhileConsequence | ForEachConsequence | ForConsequence | VarDeclConsequence | MethodCallConsequence;
153
195
  interface GlobalDefinition {
154
196
  type: string;
155
197
  name: string;
@@ -180,6 +222,7 @@ interface ClassDeclaration {
180
222
  }
181
223
  interface DroolsFile {
182
224
  name: string;
225
+ package?: string;
183
226
  imports: string[];
184
227
  globals: GlobalDefinition[];
185
228
  declarations?: ClassDeclaration[];
package/dist/index.js CHANGED
@@ -561,6 +561,43 @@ ${indent}}`;
561
561
  return `${cons.code};`;
562
562
  case "ReturnConsequence":
563
563
  return cons.expression ? `return ${cons.expression};` : "return;";
564
+ case "WhileConsequence": {
565
+ const body = cons.body.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
566
+ return `while (${cons.condition}) {
567
+ ${body}
568
+ ${indent}}`;
569
+ }
570
+ case "ForEachConsequence": {
571
+ const body = cons.body.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
572
+ return `for (${cons.typeName} ${cons.varName} : ${cons.collection}) {
573
+ ${body}
574
+ ${indent}}`;
575
+ }
576
+ case "ForConsequence": {
577
+ const body = cons.body.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
578
+ return `for (${cons.init}; ${cons.condition}; ${cons.update}) {
579
+ ${body}
580
+ ${indent}}`;
581
+ }
582
+ case "VarDeclConsequence":
583
+ return `${cons.typeName} ${cons.name} = ${cons.value};`;
584
+ case "MethodCallConsequence":
585
+ return `${cons.object}.${cons.method}(${cons.args});`;
586
+ case "SwitchConsequence": {
587
+ const caseLines = cons.cases.map((c) => {
588
+ const body = c.body.map((b) => `${indent} ${generateConsequence(b, indent + " ")}`).join("\n");
589
+ return `${indent} case ${c.value}:
590
+ ${body}`;
591
+ });
592
+ if (cons.default && cons.default.length > 0) {
593
+ const defBody = cons.default.map((b) => `${indent} ${generateConsequence(b, indent + " ")}`).join("\n");
594
+ caseLines.push(`${indent} default:
595
+ ${defBody}`);
596
+ }
597
+ return `switch (${cons.expression}) {
598
+ ${caseLines.join("\n")}
599
+ ${indent}}`;
600
+ }
564
601
  case "IfConsequence": {
565
602
  const thenLines = cons.then.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
566
603
  if (cons.else && cons.else.length > 0) {
@@ -604,6 +641,8 @@ function generateRule(rule) {
604
641
  var MetaToDRLTransformer = {
605
642
  generate(file) {
606
643
  const sections = [];
644
+ if (file.package)
645
+ sections.push(`package ${file.package}`);
607
646
  if (file.imports.length > 0)
608
647
  sections.push(file.imports.map((i) => `import ${i};`).join("\n"));
609
648
  if (file.globals.length > 0)
@@ -713,6 +752,10 @@ function extractBalanced(text, open, close) {
713
752
  function stripComments(drl) {
714
753
  return drl.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/[^\n]*/g, "");
715
754
  }
755
+ function parsePackage(drl) {
756
+ const m = drl.match(/^\s*package\s+([\w.]+)\s*;?/m);
757
+ return m ? m[1].trim() : void 0;
758
+ }
716
759
  function parseImports(drl) {
717
760
  const imports = [];
718
761
  const re = /^\s*import\s+([^\s;]+)\s*;?/gm;
@@ -729,28 +772,30 @@ function parseGlobals(drl) {
729
772
  }
730
773
  function extractRuleBlocks(drl) {
731
774
  const blocks = [];
732
- const re = /\brule\s+(?:"[^"]*"|'[^']*')[\s\S]*?\bend\b/g;
775
+ const re = /\brule\s+(?:"[^"]*"|'[^']*')[\s\S]*?\bend\b(?=\s*(?:\n|$))/g;
733
776
  let m;
734
777
  while ((m = re.exec(drl)) !== null) blocks.push(m[0]);
735
778
  return blocks;
736
779
  }
737
780
  function parseFunctions(drl) {
738
781
  const results = [];
739
- const re = /\bfunction\s+([\w<>?,\s\[\]]+?)\s+(\w+)\s*\(([^)]*)\)\s*\{([^{}]*(?:\{[^{}]*\}[^{}]*)*)\}/g;
782
+ const re = /\bfunction\s+([\w<>?,\s\[\]]+?)\s+(\w+)\s*\(([^)]*)\)\s*\{/g;
740
783
  let m;
741
784
  while ((m = re.exec(drl)) !== null) {
785
+ const fromBrace = drl.slice(m.index + m[0].length - 1);
786
+ const body = extractBalanced(fromBrace, "{", "}");
742
787
  results.push({
743
788
  returnType: m[1].trim(),
744
789
  name: m[2].trim(),
745
790
  params: m[3].trim(),
746
- body: parseConsequences(m[4].trim())
791
+ body: parseConsequences(body.trim())
747
792
  });
748
793
  }
749
794
  return results;
750
795
  }
751
796
  function parseDeclarations(drl) {
752
797
  const results = [];
753
- const re = /\bdeclare\s+(\w+)\s*([\s\S]*?)\bend\b/g;
798
+ const re = /\bdeclare\s+(\w+)\s*([\s\S]*?)\bend\b(?=\s*(?:\n|$))/g;
754
799
  let m;
755
800
  while ((m = re.exec(drl)) !== null) {
756
801
  const className = m[1].trim();
@@ -788,7 +833,7 @@ function extractWhenBlock(block) {
788
833
  return m ? m[1].trim() : "";
789
834
  }
790
835
  function extractThenBlock(block) {
791
- const m = block.match(/\bthen\b([\s\S]*?)\bend\b/);
836
+ const m = block.match(/\bthen\b([\s\S]*?)\bend\b(?=\s*(?:\n|$))/);
792
837
  return m ? m[1].trim() : "";
793
838
  }
794
839
  function parseConditions(when) {
@@ -942,6 +987,30 @@ function parseFrom(text, fromIdx) {
942
987
  expression: text.slice(fromIdx + " from ".length).trim()
943
988
  };
944
989
  }
990
+ function parseSwitchBody(body) {
991
+ const cases = [];
992
+ let defaultBody;
993
+ const markers = [];
994
+ const caseRe = /\bcase\s+([^:]+):/g;
995
+ const defRe = /\bdefault\s*:/g;
996
+ let m;
997
+ while ((m = caseRe.exec(body)) !== null)
998
+ markers.push({ index: m.index, headerLen: m[0].length, type: "case", value: m[1].trim() });
999
+ while ((m = defRe.exec(body)) !== null)
1000
+ markers.push({ index: m.index, headerLen: m[0].length, type: "default" });
1001
+ markers.sort((a, b) => a.index - b.index);
1002
+ for (let i = 0; i < markers.length; i++) {
1003
+ const marker = markers[i];
1004
+ const contentStart = marker.index + marker.headerLen;
1005
+ const contentEnd = i + 1 < markers.length ? markers[i + 1].index : body.length;
1006
+ const content = body.slice(contentStart, contentEnd).trim();
1007
+ if (marker.type === "case")
1008
+ cases.push({ kind: "CaseConsequence", value: marker.value, body: parseConsequences(content) });
1009
+ else
1010
+ defaultBody = parseConsequences(content);
1011
+ }
1012
+ return { cases, ...defaultBody !== void 0 && { default: defaultBody } };
1013
+ }
945
1014
  function parseConsequences(then) {
946
1015
  const consequences = [];
947
1016
  let remaining = then.trim();
@@ -956,6 +1025,48 @@ function parseConsequences(then) {
956
1025
  function parseNextConsequence(text) {
957
1026
  const t = text.trim();
958
1027
  if (!t) return null;
1028
+ if (/^while\s*\(/.test(t)) {
1029
+ const condition = extractBalanced(t, "(", ")");
1030
+ const afterCond = t.slice(t.indexOf("(") + condition.length + 2).trim();
1031
+ const body = extractBalanced(afterCond, "{", "}");
1032
+ const endIdx = afterCond.indexOf("{") + body.length + 2;
1033
+ return {
1034
+ consequence: { kind: "WhileConsequence", condition: condition.trim(), body: parseConsequences(body) },
1035
+ rest: afterCond.slice(endIdx)
1036
+ };
1037
+ }
1038
+ if (/^for\s*\(/.test(t)) {
1039
+ const header = extractBalanced(t, "(", ")");
1040
+ const afterHeader = t.slice(t.indexOf("(") + header.length + 2).trim();
1041
+ const body = extractBalanced(afterHeader, "{", "}");
1042
+ const endIdx = afterHeader.indexOf("{") + body.length + 2;
1043
+ const colonIdx = indexAtDepth0(header, ":");
1044
+ if (colonIdx !== -1 && indexAtDepth0(header, ";") === -1) {
1045
+ const parts = header.slice(0, colonIdx).trim().split(/\s+/);
1046
+ const varName = parts.pop();
1047
+ const typeName = parts.join(" ");
1048
+ return {
1049
+ consequence: { kind: "ForEachConsequence", typeName, varName, collection: header.slice(colonIdx + 1).trim(), body: parseConsequences(body) },
1050
+ rest: afterHeader.slice(endIdx)
1051
+ };
1052
+ } else {
1053
+ const parts = splitAtDepth0(header, ";");
1054
+ return {
1055
+ consequence: { kind: "ForConsequence", init: (parts[0] ?? "").trim(), condition: (parts[1] ?? "").trim(), update: (parts[2] ?? "").trim(), body: parseConsequences(body) },
1056
+ rest: afterHeader.slice(endIdx)
1057
+ };
1058
+ }
1059
+ }
1060
+ if (/^switch\s*\(/.test(t)) {
1061
+ const expression = extractBalanced(t, "(", ")");
1062
+ const afterExpr = t.slice(t.indexOf("(") + expression.length + 2).trim();
1063
+ const switchBody = extractBalanced(afterExpr, "{", "}");
1064
+ const endIdx = afterExpr.indexOf("{") + switchBody.length + 2;
1065
+ return {
1066
+ consequence: { kind: "SwitchConsequence", expression: expression.trim(), ...parseSwitchBody(switchBody) },
1067
+ rest: afterExpr.slice(endIdx)
1068
+ };
1069
+ }
959
1070
  if (/^if\s*\(/.test(t)) {
960
1071
  const condition = extractBalanced(t, "(", ")");
961
1072
  const afterCond = t.slice(t.indexOf("(") + condition.length + 2).trim();
@@ -963,7 +1074,14 @@ function parseNextConsequence(text) {
963
1074
  const thenConsequences = parseConsequences(thenBlock);
964
1075
  let afterThen = afterCond.slice(afterCond.indexOf("{") + thenBlock.length + 2).trim();
965
1076
  let elseConsequences;
966
- if (/^else\s*\{/.test(afterThen)) {
1077
+ if (/^else\s+if\s*\(/.test(afterThen)) {
1078
+ const elseIfText = afterThen.slice(afterThen.search(/\bif\s*\(/));
1079
+ const elseIfResult = parseNextConsequence(elseIfText);
1080
+ if (elseIfResult) {
1081
+ elseConsequences = [elseIfResult.consequence];
1082
+ afterThen = elseIfResult.rest.trim();
1083
+ }
1084
+ } else if (/^else\s*\{/.test(afterThen)) {
967
1085
  const elseBlock = extractBalanced(afterThen, "{", "}");
968
1086
  elseConsequences = parseConsequences(elseBlock);
969
1087
  afterThen = afterThen.slice(afterThen.indexOf("{") + elseBlock.length + 2).trim();
@@ -1003,6 +1121,31 @@ function parseNextConsequence(text) {
1003
1121
  rest: semiIdx2 !== -1 ? t.slice(semiIdx2 + 1) : ""
1004
1122
  };
1005
1123
  }
1124
+ const varDeclMatch = t.match(/^((?:[A-Z][\w<>., [\]]*|int|double|float|long|boolean|char|byte|short)\s+)(\w+)\s*=\s*/);
1125
+ if (varDeclMatch) {
1126
+ const typeName = varDeclMatch[1].trim();
1127
+ const name = varDeclMatch[2];
1128
+ const afterDecl = t.slice(varDeclMatch[0].length);
1129
+ const semiIdx2 = indexAtDepth0(afterDecl, ";");
1130
+ if (semiIdx2 !== -1) {
1131
+ return {
1132
+ consequence: { kind: "VarDeclConsequence", typeName, name, value: afterDecl.slice(0, semiIdx2).trim() },
1133
+ rest: afterDecl.slice(semiIdx2 + 1)
1134
+ };
1135
+ }
1136
+ }
1137
+ const methodCallMatch = t.match(/^([a-z]\w*)\.(\w+)\(/);
1138
+ if (methodCallMatch) {
1139
+ const object = methodCallMatch[1];
1140
+ const method = methodCallMatch[2];
1141
+ const afterMethod = t.slice(object.length + 1 + method.length);
1142
+ const args = extractBalanced(afterMethod, "(", ")");
1143
+ const rest = afterMethod.slice(args.length + 2).replace(/^\s*;/, "");
1144
+ return {
1145
+ consequence: { kind: "MethodCallConsequence", object, method, args: args.trim() },
1146
+ rest
1147
+ };
1148
+ }
1006
1149
  const semiIdx = indexAtDepth0(t, ";");
1007
1150
  if (semiIdx !== -1)
1008
1151
  return { consequence: { kind: "RawConsequence", code: t.slice(0, semiIdx).trim() }, rest: t.slice(semiIdx + 1) };
@@ -1010,7 +1153,7 @@ function parseNextConsequence(text) {
1010
1153
  }
1011
1154
  function parseModifications(block) {
1012
1155
  return splitAtDepth0(block, ",").map((s) => s.trim()).filter(Boolean).map((text) => {
1013
- const m = text.match(/^(\w+)\s*\(([\s\S]*)\)$/);
1156
+ const m = text.match(/^(\w+)\s*\(([\s\S]*)\)\s*;?\s*$/);
1014
1157
  if (!m) return { method: text, args: [] };
1015
1158
  const args = m[2].trim() ? splitAtDepth0(m[2].trim(), ",").map((a) => a.trim()) : [];
1016
1159
  return { method: m[1], args };
@@ -1021,6 +1164,7 @@ var DRLToMetaTransformer = {
1021
1164
  const clean = stripComments(drl);
1022
1165
  return {
1023
1166
  name: "parsed",
1167
+ package: parsePackage(clean),
1024
1168
  imports: [...new Set(parseImports(clean))],
1025
1169
  globals: parseGlobals(clean),
1026
1170
  declarations: parseDeclarations(clean),
@@ -1069,4 +1213,3 @@ export {
1069
1213
  setGlobal,
1070
1214
  unbound
1071
1215
  };
1072
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
- {
2
- "name": "drools-builder",
3
- "version": "1.0.0",
4
- "description": "TypeScript library for building Drools rules programmatically",
5
- "repository": {
6
- "type": "git",
7
- "url": "git+https://github.com/LucaFraMacera/drools-builder.git"
8
- },
9
- "license": "MIT",
10
- "type": "module",
11
- "main": "./dist/index.cjs",
12
- "module": "./dist/index.js",
13
- "types": "./dist/index.d.ts",
14
- "exports": {
15
- ".": {
16
- "import": {
17
- "types": "./dist/index.d.ts",
18
- "default": "./dist/index.js"
19
- },
20
- "require": {
21
- "types": "./dist/index.d.cts",
22
- "default": "./dist/index.cjs"
23
- }
24
- }
25
- },
26
- "files": [
27
- "dist"
28
- ],
29
- "scripts": {
30
- "prebuild": "vitest run",
31
- "build": "tsup",
32
- "dev": "tsup --watch",
33
- "test": "vitest run",
34
- "test:watch": "vitest",
35
- "test:coverage": "vitest run --coverage",
36
- "typecheck": "tsc --noEmit",
37
- "prepublishOnly": "npm run build"
38
- },
39
- "devDependencies": {
40
- "@vitest/coverage-v8": "^3.1.1",
41
- "tsup": "^8.4.0",
42
- "typescript": "^5.8.3",
43
- "vitest": "^3.1.1"
44
- }
45
- }
1
+ {
2
+ "name": "drools-builder",
3
+ "version": "1.2.0",
4
+ "description": "TypeScript library for building Drools rules programmatically",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/LucaFraMacera/drools-builder.git"
8
+ },
9
+ "license": "MIT",
10
+ "type": "module",
11
+ "main": "./dist/index.cjs",
12
+ "module": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "import": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "require": {
21
+ "types": "./dist/index.d.cts",
22
+ "default": "./dist/index.cjs"
23
+ }
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "scripts": {
30
+ "prebuild": "vitest run",
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "test:coverage": "vitest run --coverage",
36
+ "typecheck": "tsc --noEmit",
37
+ "prepublishOnly": "npm run build"
38
+ },
39
+ "devDependencies": {
40
+ "@vitest/coverage-v8": "^3.1.1",
41
+ "tsup": "^8.4.0",
42
+ "typescript": "^5.8.3",
43
+ "vitest": "^3.1.1"
44
+ }
45
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/rule-builder/builders/enums.ts","../src/rule-builder/builders/PatternBuilder.ts","../src/rule-builder/builders/AccumulateBuilder.ts","../src/rule-builder/builders/ModifyBuilder.ts","../src/rule-builder/builders/LHSBuilder.ts","../src/rule-builder/builders/RHSBuilder.ts","../src/rule-builder/builders/RuleBuilder.ts","../src/rule-builder/builders/DroolsFileBuilder.ts","../src/rule-builder/builders/index.ts","../src/rule-builder/parser/MetaToDRLTransformer.ts","../src/rule-builder/parser/DRLToMetaTransformer.ts"],"sourcesContent":["export * from './rule-builder/builders/index'\nexport { MetaToDRLTransformer } from './rule-builder/parser/MetaToDRLTransformer'\nexport { DRLToMetaTransformer } from './rule-builder/parser/DRLToMetaTransformer'\n","/**\n * Typed enum for every constraint operator supported by Drools.\n * Values are the exact DRL tokens, so an Operator member is directly\n * assignable to the ConstraintOperator string-literal union in types.ts.\n *\n * @example\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport enum Operator {\n Eq = '==',\n Neq = '!=',\n Gt = '>',\n Lt = '<',\n Gte = '>=',\n Lte = '<=',\n Contains = 'contains',\n NotContains = 'not contains',\n MemberOf = 'memberOf',\n NotMemberOf = 'not memberOf',\n Matches = 'matches',\n NotMatches = 'not matches',\n}\n\n/**\n * Typed enum for the built-in Drools accumulate functions.\n * Use these as the second argument to AccumulateBuilder.fn().\n *\n * @example\n * accumulate(fact('Transaction', '$tx'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n */\nexport enum Aggregate {\n Sum = 'sum',\n Count = 'count',\n Min = 'min',\n Max = 'max',\n Average = 'average',\n CollectList = 'collectList',\n CollectSet = 'collectSet',\n CountDistinct = 'countDistinct',\n}\n","import type { FactPattern, UnboundPattern, Constraint, ConstraintOperator } from '../metamodel/types'\n\n// ─── FactPattern builder ──────────────────────────────────────────────────────\n\n/**\n * Chainable builder for a FactPattern (a bound or unbound pattern in the LHS).\n *\n * Create via the fact() factory function:\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport class PatternBuilder {\n private readonly _factType: string\n private readonly _binding: string | undefined\n private readonly _constraints: Constraint[] = []\n\n constructor(factType: string, binding?: string) {\n this._factType = factType\n this._binding = binding\n }\n\n /**\n * Add a field constraint: field operator value.\n * Optionally binds the result to a variable: $v : field op value.\n */\n field(field: string, operator: ConstraintOperator, value: string, binding?: string): this {\n const constraint: Constraint = binding\n ? { kind: 'FieldConstraint', field, operator, value, binding }\n : { kind: 'FieldConstraint', field, operator, value }\n this._constraints.push(constraint)\n return this\n }\n\n /** Bind a field to a variable: $binding : field */\n bind(binding: string, field: string): this {\n this._constraints.push({ kind: 'BindingConstraint', binding, field })\n return this\n }\n\n /** Emit a verbatim DRL constraint expression. */\n raw(expression: string): this {\n this._constraints.push({ kind: 'RawConstraint', expression })\n return this\n }\n\n build(): FactPattern {\n return {\n kind: 'FactPattern',\n factType: this._factType,\n ...(this._binding !== undefined ? { binding: this._binding } : {}),\n constraints: [...this._constraints],\n }\n }\n}\n\n// ─── UnboundPattern builder ───────────────────────────────────────────────────\n\n/**\n * Chainable builder for an UnboundPattern (used inside not() and exists()\n * where Drools forbids variable bindings).\n *\n * Create via the unbound() factory function:\n * not(unbound('FraudAlert').field('status', Operator.Eq, '\"UNRESOLVED\"'))\n */\nexport class UnboundPatternBuilder {\n private readonly _factType: string\n private readonly _constraints: Constraint[] = []\n\n constructor(factType: string) {\n this._factType = factType\n }\n\n field(field: string, operator: ConstraintOperator, value: string): this {\n this._constraints.push({ kind: 'FieldConstraint', field, operator, value })\n return this\n }\n\n raw(expression: string): this {\n this._constraints.push({ kind: 'RawConstraint', expression })\n return this\n }\n\n build(): UnboundPattern {\n return {\n kind: 'UnboundPattern',\n factType: this._factType,\n constraints: [...this._constraints],\n }\n }\n}\n","import type { AccumulatePattern, AccumulateFunction, Condition } from '../metamodel/types'\nimport type { Aggregate } from './enums'\n\n/**\n * Chainable builder for an AccumulatePattern.\n *\n * Create via the accumulate() factory function:\n *\n * accumulate(fact('Transaction', '$tx').field('amount', Operator.Gt, '0'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n * .resultConstraint('$total > 1000')\n */\nexport class AccumulateBuilder {\n private readonly _source: Condition\n private readonly _functions: AccumulateFunction[] = []\n private _resultConstraint?: string\n\n constructor(source: Condition) {\n this._source = source\n }\n\n /**\n * Register an accumulate function.\n * @param binding - the variable the result is bound to, e.g. '$total'\n * @param func - function name or Aggregate enum, e.g. Aggregate.Sum / 'collectList'\n * @param argument - the argument expression, e.g. '$tx.amount'\n */\n fn(binding: string, func: Aggregate | string, argument: string): this {\n this._functions.push({ binding, function: func, argument })\n return this\n }\n\n /** Optional result constraint applied to the accumulated value, e.g. '$total > 50' */\n resultConstraint(expression: string): this {\n this._resultConstraint = expression\n return this\n }\n\n build(): AccumulatePattern {\n return {\n kind: 'Accumulate',\n source: this._source,\n functions: [...this._functions],\n ...(this._resultConstraint !== undefined\n ? { resultConstraint: this._resultConstraint }\n : {}),\n }\n }\n}\n","import type { ModifyConsequence, Modification } from '../metamodel/types'\n\n/**\n * Chainable builder for a ModifyConsequence.\n *\n * Create via the modify() factory function:\n *\n * modify('$account')\n * .call('setStatus', 'Account.Status.FROZEN')\n * .call('setRemarks', '\"Frozen by rule\"')\n */\nexport class ModifyBuilder {\n private readonly _binding: string\n private readonly _modifications: Modification[] = []\n\n constructor(binding: string) {\n this._binding = binding\n }\n\n /** Call a setter/method on the bound fact with the given arguments. */\n call(method: string, ...args: string[]): this {\n this._modifications.push({ method, args })\n return this\n }\n\n build(): ModifyConsequence {\n return {\n kind: 'ModifyConsequence',\n binding: this._binding,\n modifications: [...this._modifications],\n }\n }\n}\n","import type {\n Condition,\n UnboundPattern,\n EvalCondition,\n RawCondition,\n} from '../metamodel/types'\nimport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nimport { AccumulateBuilder } from './AccumulateBuilder'\n\n// ─── Internal helper ──────────────────────────────────────────────────────────\n\n/**\n * Restricted builder for the inner condition of not() and exists().\n * Drools only allows UnboundPattern, eval(), or raw DRL inside these wrappers.\n */\nclass InnerPatternBuilder {\n private _inner?: UnboundPattern | EvalCondition | RawCondition\n\n fact(factType: string, fn?: (p: UnboundPatternBuilder) => void): this {\n const b = new UnboundPatternBuilder(factType)\n fn?.(b)\n this._inner = b.build()\n return this\n }\n\n eval(expression: string): this {\n this._inner = { kind: 'Eval', expression }\n return this\n }\n\n raw(drl: string): this {\n this._inner = { kind: 'RawCondition', drl }\n return this\n }\n\n /** @internal */\n _build(): UnboundPattern | EvalCondition | RawCondition {\n if (!this._inner) throw new Error('not() / exists() block requires at least one condition')\n return this._inner\n }\n}\n\n// ─── LHSBuilder ───────────────────────────────────────────────────────────────\n\n/**\n * Imperative builder for the when-block of a rule.\n * Obtained via RuleBuilder.when(lhs => { ... }).\n *\n * Every method returns `this` for optional chaining.\n */\nexport class LHSBuilder {\n /** @internal collected conditions — consumed by RuleBuilder */\n readonly _conditions: Condition[] = []\n\n // ── Fact patterns ──────────────────────────────────────────────────────────\n\n /** Add a FactPattern with an optional variable binding. */\n fact(factType: string, binding: string, fn?: (p: PatternBuilder) => void): this\n fact(factType: string, fn?: (p: PatternBuilder) => void): this\n fact(\n factType: string,\n bindingOrFn?: string | ((p: PatternBuilder) => void),\n fn?: (p: PatternBuilder) => void,\n ): this {\n let binding: string | undefined\n let configureFn: ((p: PatternBuilder) => void) | undefined\n\n if (typeof bindingOrFn === 'string') {\n binding = bindingOrFn\n configureFn = fn\n } else {\n configureFn = bindingOrFn\n }\n\n const builder = new PatternBuilder(factType, binding)\n configureFn?.(builder)\n this._conditions.push(builder.build())\n return this\n }\n\n // ── Logical wrappers ───────────────────────────────────────────────────────\n\n /** Add a not() wrapper. Inner condition must be unbound (no variable binding). */\n not(fn: (b: InnerPatternBuilder) => void): this {\n const b = new InnerPatternBuilder()\n fn(b)\n this._conditions.push({ kind: 'Not', condition: b._build() })\n return this\n }\n\n /** Add an exists() wrapper. Inner condition must be unbound. */\n exists(fn: (b: InnerPatternBuilder) => void): this {\n const b = new InnerPatternBuilder()\n fn(b)\n this._conditions.push({ kind: 'Exists', condition: b._build() })\n return this\n }\n\n /** Add an or() group. Each child is added via the nested LHSBuilder. */\n or(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n this._conditions.push({ kind: 'Or', conditions: inner._conditions })\n return this\n }\n\n /** Add an and() group. Useful when composing nested boolean logic. */\n and(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n this._conditions.push({ kind: 'And', conditions: inner._conditions })\n return this\n }\n\n /** Add a forall() wrapper. */\n forall(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n const condition: Condition =\n inner._conditions.length === 1\n ? inner._conditions[0]\n : { kind: 'And', conditions: inner._conditions }\n this._conditions.push({ kind: 'Forall', condition })\n return this\n }\n\n // ── Accumulate ─────────────────────────────────────────────────────────────\n\n /**\n * Add an accumulate pattern.\n * @param sourceFn - builds the source condition (the pattern being accumulated)\n * @param fn - configures the accumulate functions and result constraint\n */\n accumulate(\n sourceFn: (lhs: LHSBuilder) => void,\n fn: (acc: AccumulateBuilder) => void,\n ): this {\n const sourceLhs = new LHSBuilder()\n sourceFn(sourceLhs)\n const source: Condition =\n sourceLhs._conditions.length === 1\n ? sourceLhs._conditions[0]\n : { kind: 'And', conditions: sourceLhs._conditions }\n const acc = new AccumulateBuilder(source)\n fn(acc)\n this._conditions.push(acc.build())\n return this\n }\n\n // ── From ───────────────────────────────────────────────────────────────────\n\n /**\n * Add a from condition: FactType( constraints ) from expression\n * @param factType - the type to match\n * @param binding - variable binding for the matched fact\n * @param expression - the source expression (collection, method call, etc.)\n * @param fn - optional constraint configuration\n */\n from(\n factType: string,\n binding: string,\n expression: string,\n fn?: (p: PatternBuilder) => void,\n ): this {\n const builder = new PatternBuilder(factType, binding)\n fn?.(builder)\n this._conditions.push({ kind: 'From', pattern: builder.build(), expression })\n return this\n }\n\n // ── Primitives ─────────────────────────────────────────────────────────────\n\n /** Add an eval() condition with a raw boolean expression. */\n eval(expression: string): this {\n this._conditions.push({ kind: 'Eval', expression })\n return this\n }\n\n /** Add a verbatim DRL condition, emitted as-is. */\n raw(drl: string): this {\n this._conditions.push({ kind: 'RawCondition', drl })\n return this\n }\n}\n","import type { Consequence } from '../metamodel/types'\nimport { ModifyBuilder } from './ModifyBuilder'\n\n/**\n * Imperative builder for the then-block of a rule.\n * Obtained via RuleBuilder.then(rhs => { ... }).\n */\nexport class RHSBuilder {\n /** @internal collected consequences — consumed by RuleBuilder */\n readonly _consequences: Consequence[] = []\n\n /** modify($binding) { ... } — calls setters on an existing fact. */\n modify(binding: string, fn: (m: ModifyBuilder) => void): this {\n const builder = new ModifyBuilder(binding)\n fn(builder)\n this._consequences.push(builder.build())\n return this\n }\n\n /** insert(objectExpression) — inserts a new fact into working memory. */\n insert(objectExpression: string): this {\n this._consequences.push({ kind: 'InsertConsequence', objectExpression })\n return this\n }\n\n /** retract($binding) — removes a fact from working memory. */\n retract(binding: string): this {\n this._consequences.push({ kind: 'RetractConsequence', binding })\n return this\n }\n\n /** Assign a value to a global variable. */\n global(expression: string): this {\n this._consequences.push({ kind: 'SetGlobalConsequence', expression })\n return this\n }\n\n /** Emit a verbatim DRL statement, emitted as-is. */\n raw(code: string): this {\n this._consequences.push({ kind: 'RawConsequence', code })\n return this\n }\n}\n","import type { Rule, Condition, Consequence } from '../metamodel/types'\nimport { LHSBuilder } from './LHSBuilder'\nimport { RHSBuilder } from './RHSBuilder'\n\ninterface Buildable<T> {\n build(): T\n}\n\nfunction resolveCondition(input: Condition | Buildable<Condition>): Condition {\n return typeof (input as Buildable<Condition>).build === 'function'\n ? (input as Buildable<Condition>).build()\n : (input as Condition)\n}\n\nfunction resolveConsequence(input: Consequence | Buildable<Consequence>): Consequence {\n return typeof (input as Buildable<Consequence>).build === 'function'\n ? (input as Buildable<Consequence>).build()\n : (input as Consequence)\n}\n\n/**\n * Fluent builder for a Drools Rule.\n *\n * Entry point: createRule(name)\n *\n * Two usage styles are supported and can be freely mixed:\n *\n * Style 1 — factory functions (composable, works well for complex rules):\n * createRule('Award Badge')\n * .salience(10)\n * .addCondition(fact('Player', '$p').field('score', Operator.Gte, '100'))\n * .addConsequence(modify('$p').call('awardBadge', '\"gold\"'))\n * .build()\n *\n * Style 2 — callback blocks (mirrors DRL when/then structure):\n * createRule('Award Badge')\n * .salience(10)\n * .when(lhs => {\n * lhs.fact('Player', '$p', p => p.field('score', Operator.Gte, '100'))\n * })\n * .then(rhs => {\n * rhs.modify('$p', m => m.call('awardBadge', '\"gold\"'))\n * })\n * .build()\n *\n * Plain metamodel objects are also accepted everywhere a builder is expected,\n * so hand-crafted conditions/consequences can be mixed freely with builders.\n */\nexport class RuleBuilder {\n private readonly _rule: Rule\n\n constructor(name: string) {\n this._rule = { name, conditions: [], consequences: [] }\n }\n\n // ── Rule attributes ────────────────────────────────────────────────────────\n\n salience(value: number): this {\n this._rule.salience = value\n return this\n }\n\n agendaGroup(value: string): this {\n this._rule.agendaGroup = value\n return this\n }\n\n /** Defaults to true when called without an argument. */\n noLoop(value = true): this {\n this._rule.noLoop = value\n return this\n }\n\n /** Defaults to true when called without an argument. */\n lockOnActive(value = true): this {\n this._rule.lockOnActive = value\n return this\n }\n\n ruleFlowGroup(value: string): this {\n this._rule.ruleFlowGroup = value\n return this\n }\n\n // ── Step-by-step style ─────────────────────────────────────────────────────\n\n /**\n * Append a single condition.\n * Accepts a plain Condition object or any builder that exposes build().\n */\n addCondition(condition: Condition | Buildable<Condition>): this {\n this._rule.conditions.push(resolveCondition(condition))\n return this\n }\n\n /**\n * Append a single consequence.\n * Accepts a plain Consequence object or any builder that exposes build().\n */\n addConsequence(consequence: Consequence | Buildable<Consequence>): this {\n this._rule.consequences.push(resolveConsequence(consequence))\n return this\n }\n\n // ── Callback block style ───────────────────────────────────────────────────\n\n /** Configure the when-block using an LHSBuilder. Appends to existing conditions. */\n when(fn: (lhs: LHSBuilder) => void): this {\n const lhs = new LHSBuilder()\n fn(lhs)\n this._rule.conditions.push(...lhs._conditions)\n return this\n }\n\n /** Configure the then-block using an RHSBuilder. Appends to existing consequences. */\n then(fn: (rhs: RHSBuilder) => void): this {\n const rhs = new RHSBuilder()\n fn(rhs)\n this._rule.consequences.push(...rhs._consequences)\n return this\n }\n\n // ── Terminal ───────────────────────────────────────────────────────────────\n\n build(): Rule {\n return {\n ...this._rule,\n conditions: [...this._rule.conditions],\n consequences: [...this._rule.consequences],\n }\n }\n}\n\n/** Create a new RuleBuilder for a rule with the given name. */\nexport function createRule(name: string): RuleBuilder {\n return new RuleBuilder(name)\n}\n","import type { DroolsFile, GlobalDefinition, Rule } from '../metamodel/types'\nimport { RuleBuilder } from './RuleBuilder'\n\ninterface Buildable<T> { build(): T }\n\nfunction resolveRule(input: Rule | Buildable<Rule>): Rule {\n return typeof (input as Buildable<Rule>).build === 'function'\n ? (input as Buildable<Rule>).build()\n : (input as Rule)\n}\n\n/**\n * Chainable builder for a DroolsFile (a collection of rules with shared imports).\n *\n * Create via the createFile() factory:\n *\n * createFile('fraud-rules')\n * .import('com.example.model.Account')\n * .import('com.example.model.FraudAlert')\n * .addRule(\n * createRule('Detect Fraud').when(...).then(...),\n * )\n * .build()\n */\nexport class DroolsFileBuilder {\n private readonly _name: string\n private readonly _imports: string[] = []\n private readonly _globals: GlobalDefinition[] = []\n private readonly _rules: Rule[] = []\n\n constructor(name: string) {\n this._name = name\n }\n\n /**\n * Add a fully-qualified Java class import.\n * Can be called multiple times — order is preserved.\n *\n * @example\n * .import('com.example.model.Player')\n */\n import(className: string): this {\n this._imports.push(className)\n return this\n }\n\n /**\n * Declare a global variable available to all rules in this file.\n * Emits `global type name;` in the DRL header.\n *\n * @example\n * .global('com.example.AlertService', 'alertService')\n */\n global(type: string, name: string): this {\n this._globals.push({ type, name })\n return this\n }\n\n /**\n * Add a rule to the file.\n * Accepts a plain Rule object or a RuleBuilder (auto-resolved via .build()).\n *\n * @example\n * .addRule(createRule('My Rule').when(...).then(...))\n * .addRule({ name: 'My Rule', conditions: [], consequences: [] })\n */\n addRule(rule: Rule | RuleBuilder): this {\n this._rules.push(resolveRule(rule))\n return this\n }\n\n build(): DroolsFile {\n return {\n name: this._name,\n imports: [...this._imports],\n globals: [...this._globals],\n rules: [...this._rules],\n }\n }\n}\n\n/** Create a new DroolsFileBuilder with the given file name. */\nexport function createFile(name: string): DroolsFileBuilder {\n return new DroolsFileBuilder(name)\n}\n","/**\n * drools-builder — public API\n *\n * Import from this module to access both the metamodel types and the builder API.\n */\n\n// ─── Enums ────────────────────────────────────────────────────────────────────\nexport { Operator, Aggregate } from './enums'\n\n// ─── Builder classes (for advanced use / extension) ───────────────────────────\nexport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nexport { AccumulateBuilder } from './AccumulateBuilder'\nexport { ModifyBuilder } from './ModifyBuilder'\nexport { LHSBuilder } from './LHSBuilder'\nexport { RHSBuilder } from './RHSBuilder'\nexport { RuleBuilder, createRule } from './RuleBuilder'\nexport { DroolsFileBuilder, createFile } from './DroolsFileBuilder'\n\n// ─── Metamodel types (re-exported for convenience) ───────────────────────────\nexport type {\n ConstraintOperator,\n Constraint,\n FieldConstraint,\n BindingConstraint,\n RawConstraint,\n FactType,\n FactPattern,\n UnboundPattern,\n AndCondition,\n OrCondition,\n NotCondition,\n ExistsCondition,\n ForallCondition,\n AccumulateFunction,\n AccumulatePattern,\n FromCondition,\n EvalCondition,\n RawCondition,\n Condition,\n Modification,\n ModifyConsequence,\n InsertConsequence,\n RetractConsequence,\n SetGlobalConsequence,\n RawConsequence,\n Consequence,\n GlobalDefinition,\n Rule,\n DroolsFile,\n} from '../metamodel/types'\n\n// ─── Internal imports for factory implementations ─────────────────────────────\nimport type {\n Condition,\n UnboundPattern,\n EvalCondition,\n RawCondition,\n NotCondition,\n ExistsCondition,\n OrCondition,\n AndCondition,\n ForallCondition,\n AccumulatePattern,\n FromCondition,\n InsertConsequence,\n RetractConsequence,\n SetGlobalConsequence,\n RawConsequence,\n} from '../metamodel/types'\nimport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nimport { AccumulateBuilder } from './AccumulateBuilder'\nimport { ModifyBuilder } from './ModifyBuilder'\n\n// ─── Shared resolver ──────────────────────────────────────────────────────────\n\ninterface Buildable<T> { build(): T }\n\nfunction resolveCondition(\n input: Condition | Buildable<Condition>,\n): Condition {\n return typeof (input as Buildable<Condition>).build === 'function'\n ? (input as Buildable<Condition>).build()\n : (input as Condition)\n}\n\ntype NotExistsInput =\n | UnboundPattern\n | EvalCondition\n | RawCondition\n | Buildable<UnboundPattern>\n\nfunction resolveNotExists(\n input: NotExistsInput,\n): UnboundPattern | EvalCondition | RawCondition {\n return typeof (input as Buildable<UnboundPattern>).build === 'function'\n ? (input as Buildable<UnboundPattern>).build()\n : (input as UnboundPattern | EvalCondition | RawCondition)\n}\n\n// ─── Condition factories ──────────────────────────────────────────────────────\n\n/**\n * Start building a FactPattern.\n *\n * @param factType - the Java class name to match (e.g. 'Player')\n * @param binding - optional variable binding (e.g. '$p')\n *\n * @example\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport function fact(factType: string, binding?: string): PatternBuilder {\n return new PatternBuilder(factType, binding)\n}\n\n/**\n * Start building an UnboundPattern for use inside not() or exists().\n *\n * @example\n * not(unbound('FraudAlert').field('status', Operator.Eq, '\"UNRESOLVED\"'))\n */\nexport function unbound(factType: string): UnboundPatternBuilder {\n return new UnboundPatternBuilder(factType)\n}\n\n/**\n * Wrap a condition in a Drools not().\n * The inner condition must be unbound (UnboundPatternBuilder / UnboundPattern),\n * an eval(), or a raw condition.\n */\nexport function not(condition: NotExistsInput): NotCondition {\n return { kind: 'Not', condition: resolveNotExists(condition) }\n}\n\n/**\n * Wrap a condition in a Drools exists().\n * Same constraints as not().\n */\nexport function exists(condition: NotExistsInput): ExistsCondition {\n return { kind: 'Exists', condition: resolveNotExists(condition) }\n}\n\n/**\n * Group conditions with OR semantics.\n *\n * @example\n * or(fact('A').field('x', Operator.Eq, '1'), fact('B').field('y', Operator.Eq, '2'))\n */\nexport function or(...conditions: Array<Condition | Buildable<Condition>>): OrCondition {\n return { kind: 'Or', conditions: conditions.map(resolveCondition) }\n}\n\n/**\n * Group conditions with AND semantics.\n * Mostly used when building nested boolean logic inside or().\n */\nexport function and(...conditions: Array<Condition | Buildable<Condition>>): AndCondition {\n return { kind: 'And', conditions: conditions.map(resolveCondition) }\n}\n\n/**\n * Wrap a condition in a Drools forall().\n *\n * @example\n * forall(fact('Transaction', '$tx').field('validated', Operator.Eq, 'true'))\n */\nexport function forall(condition: Condition | Buildable<Condition>): ForallCondition {\n return { kind: 'Forall', condition: resolveCondition(condition) }\n}\n\n/**\n * Start building an AccumulatePattern.\n *\n * @example\n * accumulate(fact('Transaction', '$tx').field('amount', Operator.Gt, '0'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n * .resultConstraint('$total > 1000')\n */\nexport function accumulate(\n source: Condition | Buildable<Condition>,\n): AccumulateBuilder {\n return new AccumulateBuilder(resolveCondition(source))\n}\n\n/**\n * Build a FromCondition: pattern from expression.\n *\n * @example\n * from_(fact('Transaction', '$tx'), '$recentTxs')\n */\nexport function from_(\n pattern: PatternBuilder,\n expression: string,\n): FromCondition {\n return { kind: 'From', pattern: pattern.build(), expression }\n}\n\n/**\n * Build an EvalCondition with a raw boolean expression.\n *\n * @example\n * eval_('$p.getScore() > threshold')\n */\nexport function eval_(expression: string): EvalCondition {\n return { kind: 'Eval', expression }\n}\n\n/**\n * Build a RawCondition — verbatim DRL, emitted as-is.\n * Use as an escape hatch for constructs not covered by the builder.\n */\nexport function rawCondition(drl: string): RawCondition {\n return { kind: 'RawCondition', drl }\n}\n\n// ─── Consequence factories ────────────────────────────────────────────────────\n\n/**\n * Start building a ModifyConsequence.\n *\n * @example\n * modify('$account').call('setStatus', 'Account.Status.FROZEN')\n */\nexport function modify(binding: string): ModifyBuilder {\n return new ModifyBuilder(binding)\n}\n\n/**\n * Build an InsertConsequence — inserts a new fact into working memory.\n *\n * @example\n * insert('new FraudAlert()')\n */\nexport function insert(objectExpression: string): InsertConsequence {\n return { kind: 'InsertConsequence', objectExpression }\n}\n\n/**\n * Build a RetractConsequence — removes a fact from working memory.\n *\n * @example\n * retract('$obsoleteAlert')\n */\nexport function retract(binding: string): RetractConsequence {\n return { kind: 'RetractConsequence', binding }\n}\n\n/**\n * Build a SetGlobalConsequence — assign a value to a global variable.\n *\n * @example\n * setGlobal('alertService.notify($account)')\n */\nexport function setGlobal(expression: string): SetGlobalConsequence {\n return { kind: 'SetGlobalConsequence', expression }\n}\n\n/**\n * Build a RawConsequence — verbatim Java/DRL code, emitted as-is.\n * Use as an escape hatch for logic not covered by the builder.\n */\nexport function rawConsequence(code: string): RawConsequence {\n return { kind: 'RawConsequence', code }\n}\n","import type { AndCondition, ClassDeclaration, Condition, Consequence, Constraint, DroolsFile, FunctionDefinition, Rule } from '../metamodel/types'\r\n\r\n// ─── CONSTRAINT GENERATION ───────────────────────────────────────────────────\r\n\r\nfunction generateConstraint(c: Constraint): string {\r\n switch (c.kind) {\r\n case 'FieldConstraint':\r\n return `${c.binding ? `${c.binding} : ` : ''}${c.field} ${c.operator} ${c.value}`\r\n case 'BindingConstraint':\r\n return `${c.binding} : ${c.field}`\r\n case 'RawConstraint':\r\n return c.expression\r\n }\r\n}\r\n\r\n// ─── CONDITION GENERATION ────────────────────────────────────────────────────\r\n\r\nfunction generateCondition(cond: Condition, indent = ' '): string {\r\n switch (cond.kind) {\r\n\r\n case 'FactPattern': {\r\n const binding = cond.binding ? `${cond.binding} : ` : ''\r\n const constraints = cond.constraints.map(generateConstraint).join(', ')\r\n return `${binding}${cond.factType}( ${constraints} )`\r\n }\r\n\r\n case 'UnboundPattern': {\r\n // No binding — used inside not() and forall() where binding is forbidden\r\n const constraints = cond.constraints.map(generateConstraint).join(', ')\r\n return `${cond.factType}( ${constraints} )`\r\n }\r\n\r\n case 'And': {\r\n const parts = cond.conditions.map(c => generateCondition(c, indent + ' '))\r\n return `( ${parts.join(`\\n${indent} and `)} )`\r\n }\r\n\r\n case 'Or': {\r\n const parts = cond.conditions.map(c => generateCondition(c, indent + ' '))\r\n return `( ${parts.join(`\\n${indent} or `)} )`\r\n }\r\n\r\n case 'Not':\r\n return `not( ${generateCondition(cond.condition, indent)} )`\r\n\r\n case 'Exists':\r\n return `exists( ${generateCondition(cond.condition, indent)} )`\r\n\r\n case 'Forall':\r\n return `forall( ${generateCondition(cond.condition, indent)} )`\r\n\r\n case 'Accumulate': {\r\n const source = generateCondition(cond.source, indent + ' ')\r\n const fns = cond.functions.map(f => `${f.binding} : ${f.function}( ${f.argument} )`).join(', ')\r\n const result = cond.resultConstraint ? `;\\n${indent} ${cond.resultConstraint}` : ''\r\n return `accumulate(\\n${indent} ${source};\\n${indent} ${fns}${result}\\n${indent})`\r\n }\r\n\r\n case 'From':\r\n return `${generateCondition(cond.pattern, indent)} from ${cond.expression}`\r\n\r\n case 'Eval':\r\n return `eval( ${cond.expression} )`\r\n\r\n case 'RawCondition':\r\n return cond.drl\r\n }\r\n}\r\n\r\n/**\r\n * Generates the when block from the top-level condition list.\r\n * Each condition on its own line (implicit AND).\r\n * A single AndCondition is unrolled into individual lines.\r\n */\r\nfunction generateWhenBlock(conditions: Condition[], indent = ' '): string {\r\n const flat = conditions.length === 1 && conditions[0].kind === 'And'\r\n ? (conditions[0] as AndCondition).conditions\r\n : conditions\r\n return flat.map(c => `${indent}${generateCondition(c, indent)}`).join('\\n')\r\n}\r\n\r\n// ─── CONSEQUENCE GENERATION ──────────────────────────────────────────────────\r\n\r\nfunction generateConsequence(cons: Consequence, indent = ' '): string {\r\n switch (cons.kind) {\r\n case 'ModifyConsequence': {\r\n const mods = cons.modifications\r\n .map(m => `${m.method}( ${m.args.join(', ')} )`)\r\n .join(`,\\n${indent} `)\r\n return `modify( ${cons.binding} ) {\\n${indent} ${mods}\\n${indent}}`\r\n }\r\n case 'InsertConsequence':\r\n return `insert( ${cons.objectExpression} );`\r\n case 'RetractConsequence':\r\n return `retract( ${cons.binding} );`\r\n case 'SetGlobalConsequence':\r\n return `${cons.expression};`\r\n case 'RawConsequence':\r\n return `${cons.code};`\r\n case 'ReturnConsequence':\r\n return cons.expression ? `return ${cons.expression};` : 'return;'\r\n\r\n case 'IfConsequence': {\r\n const thenLines = cons.then.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\r\n if (cons.else && cons.else.length > 0) {\r\n const elseLines = cons.else.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\r\n return `if (${cons.condition}) {\\n${thenLines}\\n${indent}} else {\\n${elseLines}\\n${indent}}`\r\n }\r\n return `if (${cons.condition}) {\\n${thenLines}\\n${indent}}`\r\n }\r\n }\r\n}\r\n\r\n// ─── DECLARATION GENERATION ──────────────────────────────────────────────────\r\n\r\nfunction generateDeclaration(decl: ClassDeclaration): string {\r\n const attrs = decl.attributes.map(a => ` ${a.name} : ${a.type}`).join('\\n')\r\n return `declare ${decl.className}${attrs ? '\\n' + attrs + '\\n' : '\\n'}end`\r\n}\r\n\r\n// ─── FUNCTION GENERATION ─────────────────────────────────────────────────────\r\n\r\nfunction generateFunction(fn: FunctionDefinition, indent = ' '): string {\r\n const body = fn.body.map(c => `${indent}${generateConsequence(c, indent)}`).join('\\n')\r\n return `function ${fn.returnType} ${fn.name}(${fn.params}) {\\n${body}\\n}`\r\n}\r\n\r\n// ─── RULE GENERATION ─────────────────────────────────────────────────────────\r\n\r\nfunction generateRule(rule: Rule): string {\r\n const lines = [`rule \"${rule.name}\"`]\r\n if (rule.salience !== undefined) lines.push(` salience ${rule.salience}`)\r\n if (rule.agendaGroup !== undefined) lines.push(` agenda-group \"${rule.agendaGroup}\"`)\r\n if (rule.ruleFlowGroup !== undefined) lines.push(` ruleflow-group \"${rule.ruleFlowGroup}\"`)\r\n if (rule.noLoop) lines.push(' no-loop true')\r\n if (rule.lockOnActive) lines.push(' lock-on-active true')\r\n lines.push(' when')\r\n lines.push(generateWhenBlock(rule.conditions))\r\n lines.push(' then')\r\n lines.push(rule.consequences.map(c => ` ${generateConsequence(c)}`).join('\\n'))\r\n lines.push('end')\r\n return lines.join('\\n')\r\n}\r\n\r\n// ─── PUBLIC API ───────────────────────────────────────────────────────────────\r\n\r\nexport const MetaToDRLTransformer = {\r\n\r\n generate(file: DroolsFile): string {\r\n const sections: string[] = []\r\n if (file.imports.length > 0)\r\n sections.push(file.imports.map(i => `import ${i};`).join('\\n'))\r\n if (file.globals.length > 0)\r\n sections.push(file.globals.map(g => `global ${g.type} ${g.name};`).join('\\n'))\r\n if (file.declarations && file.declarations.length > 0)\r\n sections.push(file.declarations.map(d => generateDeclaration(d)).join('\\n\\n'))\r\n if (file.functions && file.functions.length > 0)\r\n sections.push(file.functions.map(fn => generateFunction(fn)).join('\\n\\n'))\r\n sections.push(file.rules.map(generateRule).join('\\n\\n'))\r\n return sections.join('\\n\\n')\r\n },\r\n\r\n generateRule(rule: Rule): string {\r\n return generateRule(rule)\r\n }\r\n}\r\n","import type {\r\n AccumulateFunction, AccumulatePattern, AndCondition, AttributeDeclaration,\r\n ClassDeclaration, Condition, Consequence, Constraint, ConstraintOperator,\r\n DroolsFile, FactPattern, FromCondition, FunctionDefinition, GlobalDefinition,\r\n IfConsequence, Modification, Rule\r\n} from '../metamodel/types'\r\n\r\n// ─── LOW-LEVEL UTILITIES ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Returns the index of the first occurrence of `needle` in `text` that is\r\n * at parenthesis/brace/bracket depth 0 and not inside a string literal.\r\n */\r\nfunction indexAtDepth0(text: string, needle: string): number {\r\n let depth = 0\r\n let inString = false\r\n let quote = ''\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i]\r\n\r\n if (inString) {\r\n if (ch === '\\\\') { i++; continue }\r\n if (ch === quote) inString = false\r\n continue\r\n }\r\n\r\n if (ch === '\"' || ch === \"'\") { inString = true; quote = ch; continue }\r\n if (ch === '(' || ch === '{' || ch === '[') { depth++; continue }\r\n if (ch === ')' || ch === '}' || ch === ']') { depth--; continue }\r\n\r\n if (depth === 0 && text.startsWith(needle, i)) return i\r\n }\r\n return -1\r\n}\r\n\r\n/**\r\n * Splits `text` at all depth-0 occurrences of `separator`.\r\n * Ignores occurrences inside nested parentheses/braces/brackets and string literals.\r\n */\r\nfunction splitAtDepth0(text: string, separator: string): string[] {\r\n const parts: string[] = []\r\n const sepLen = separator.length\r\n let depth = 0\r\n let inString = false\r\n let quote = ''\r\n let current = ''\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i]\r\n\r\n if (inString) {\r\n if (ch === '\\\\') { current += ch + text[++i]; continue }\r\n if (ch === quote) inString = false\r\n current += ch\r\n continue\r\n }\r\n\r\n if (ch === '\"' || ch === \"'\") { inString = true; quote = ch; current += ch; continue }\r\n if (ch === '(' || ch === '{' || ch === '[') { depth++; current += ch; continue }\r\n if (ch === ')' || ch === '}' || ch === ']') { depth--; current += ch; continue }\r\n\r\n if (depth === 0 && text.startsWith(separator, i)) {\r\n parts.push(current.trim())\r\n current = ''\r\n i += sepLen - 1\r\n continue\r\n }\r\n\r\n current += ch\r\n }\r\n if (current.trim()) parts.push(current.trim())\r\n return parts.filter(p => p.length > 0)\r\n}\r\n\r\n/**\r\n * Extracts the content between the first matching open/close pair.\r\n * e.g. extractBalanced(\"foo(bar(baz))\", '(', ')') → \"bar(baz)\"\r\n */\r\nfunction extractBalanced(text: string, open: string, close: string): string {\r\n const start = text.indexOf(open)\r\n if (start === -1) return ''\r\n let depth = 0\r\n for (let i = start; i < text.length; i++) {\r\n if (text[i] === open) depth++\r\n else if (text[i] === close) {\r\n depth--\r\n if (depth === 0) return text.slice(start + 1, i)\r\n }\r\n }\r\n return text.slice(start + 1)\r\n}\r\n\r\n/** Strips single-line (//) and block (/* *\\/) comments from DRL. */\r\nfunction stripComments(drl: string): string {\r\n return drl\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\r\n .replace(/\\/\\/[^\\n]*/g, '')\r\n}\r\n\r\n// ─── FILE-LEVEL PARSING ───────────────────────────────────────────────────────\r\n\r\nfunction parseImports(drl: string): string[] {\r\n const imports: string[] = []\r\n const re = /^\\s*import\\s+([^\\s;]+)\\s*;?/gm\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) imports.push(m[1].trim())\r\n return imports\r\n}\r\n\r\nfunction parseGlobals(drl: string): GlobalDefinition[] {\r\n const globals: GlobalDefinition[] = []\r\n const re = /^\\s*global\\s+(\\S+)\\s+(\\S+?)\\s*;?$/gm\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) globals.push({ type: m[1], name: m[2] })\r\n return globals\r\n}\r\n\r\nfunction extractRuleBlocks(drl: string): string[] {\r\n const blocks: string[] = []\r\n const re = /\\brule\\s+(?:\"[^\"]*\"|'[^']*')[\\s\\S]*?\\bend\\b/g\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) blocks.push(m[0])\r\n return blocks\r\n}\r\n\r\nfunction parseFunctions(drl: string): FunctionDefinition[] {\r\n const results: FunctionDefinition[] = []\r\n // Matches: function <returnType> <name>(<params>) { <body> }\r\n // ([^{}]*(?:\\{[^{}]*\\}[^{}]*)*) handles one level of nested braces (e.g. if blocks)\r\n const re = /\\bfunction\\s+([\\w<>?,\\s\\[\\]]+?)\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*\\{([^{}]*(?:\\{[^{}]*\\}[^{}]*)*)\\}/g\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) {\r\n results.push({\r\n returnType: m[1].trim(),\r\n name: m[2].trim(),\r\n params: m[3].trim(),\r\n body: parseConsequences(m[4].trim())\r\n })\r\n }\r\n return results\r\n}\r\n\r\nfunction parseDeclarations(drl: string): ClassDeclaration[] {\r\n const results: ClassDeclaration[] = []\r\n const re = /\\bdeclare\\s+(\\w+)\\s*([\\s\\S]*?)\\bend\\b/g\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) {\r\n const className = m[1].trim()\r\n const attributes: AttributeDeclaration[] = []\r\n const attrRe = /^\\s*(\\w+)\\s*:\\s*(\\S+)/gm\r\n let a: RegExpExecArray | null\r\n while ((a = attrRe.exec(m[2])) !== null) {\r\n attributes.push({ name: a[1].trim(), type: a[2].trim() })\r\n }\r\n results.push({ className, attributes })\r\n }\r\n return results\r\n}\r\n\r\n// ─── RULE-LEVEL PARSING ──────────────────────────────────────────────────────\r\n\r\nfunction parseRuleName(block: string): string {\r\n const m = block.match(/\\brule\\s+(?:\"([^\"]+)\"|'([^']+)')/)\r\n return m ? (m[1] ?? m[2]) : 'unknown'\r\n}\r\n\r\nfunction parseRuleAttributes(block: string): Partial<Rule> {\r\n const attrs: Partial<Rule> = {}\r\n const m = block.match(/\\brule\\s+(?:\"[^\"]+\"|'[^']+')\\s*([\\s\\S]*?)\\bwhen\\b/)\r\n if (!m) return attrs\r\n const attr = m[1]\r\n const salience = attr.match(/\\bsalience\\s+(-?\\d+)/)\r\n if (salience) attrs.salience = parseInt(salience[1], 10)\r\n if (!/\\bno-loop\\s+false\\b/.test(attr) && /\\bno-loop\\b/.test(attr)) attrs.noLoop = true\r\n if (!/\\block-on-active\\s+false\\b/.test(attr) && /\\block-on-active\\b/.test(attr)) attrs.lockOnActive = true\r\n const ag = attr.match(/\\bagenda-group\\s+\"([^\"]+)\"/)\r\n if (ag) attrs.agendaGroup = ag[1]\r\n const rfg = attr.match(/\\bruleflow-group\\s+\"([^\"]+)\"/)\r\n if (rfg) attrs.ruleFlowGroup = rfg[1]\r\n return attrs\r\n}\r\n\r\nfunction extractWhenBlock(block: string): string {\r\n const m = block.match(/\\bwhen\\b([\\s\\S]*?)\\bthen\\b/)\r\n return m ? m[1].trim() : ''\r\n}\r\n\r\nfunction extractThenBlock(block: string): string {\r\n const m = block.match(/\\bthen\\b([\\s\\S]*?)\\bend\\b/)\r\n return m ? m[1].trim() : ''\r\n}\r\n\r\n// ─── CONDITION PARSING ────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Entry point for the when block. Returns the flat top-level condition list.\r\n * Top-level conditions are implicitly ANDed — each as a separate element.\r\n * An explicit top-level OR is wrapped in a single OrCondition element.\r\n */\r\nfunction parseConditions(when: string): Condition[] {\r\n const text = when.trim()\r\n if (!text) return []\r\n\r\n // Top-level OR — split into branches; surrounding spaces prevent word collision\r\n const orParts = splitAtDepth0(text, ' or ')\r\n if (orParts.length > 1) {\r\n return [{ kind: 'Or', conditions: orParts.map(p => parseAndGroup(p.trim())) }]\r\n }\r\n\r\n const result = parseAndGroup(text)\r\n // Unroll a top-level And so Rule.conditions stays flat\r\n return result.kind === 'And' ? result.conditions : [result]\r\n}\r\n\r\n/** Parses a group that may contain top-level 'and' or implicit line-break ANDs. */\r\nfunction parseAndGroup(text: string): Condition {\r\n const andParts = splitAndConditions(text)\r\n if (andParts.length === 1) return parseCondition(andParts[0])\r\n const conditions = andParts.map(parseCondition)\r\n return conditions.length === 1 ? conditions[0] : { kind: 'And', conditions }\r\n}\r\n\r\n/**\r\n * Splits a when block into individual condition strings.\r\n * Handles both explicit 'and' and implicit newline/whitespace separation.\r\n */\r\nfunction splitAndConditions(text: string): string[] {\r\n const byAnd = splitAtDepth0(text, ' and ')\r\n if (byAnd.length > 1) return byAnd.filter(p => p.trim().length > 0)\r\n\r\n // Fall back to newline separation, merging lines with unbalanced parens\r\n const lines = text.split('\\n').map(l => l.trim()).filter(l => l.length > 0)\r\n if (lines.length <= 1) return [text.trim()]\r\n\r\n const merged: string[] = []\r\n let current = ''\r\n let depth = 0\r\n\r\n for (const line of lines) {\r\n for (const ch of line) {\r\n if (ch === '(' || ch === '{') depth++\r\n else if (ch === ')' || ch === '}') depth--\r\n }\r\n current += (current ? ' ' : '') + line\r\n if (depth === 0) {\r\n merged.push(current.trim())\r\n current = ''\r\n }\r\n }\r\n if (current.trim()) merged.push(current.trim())\r\n return merged.filter(p => p.length > 0)\r\n}\r\n\r\n/** Routes a single condition string to the appropriate parser. */\r\nfunction parseCondition(raw: string): Condition {\r\n const text = raw.trim()\r\n\r\n // Parenthesised group — recurse into its contents\r\n if (text.startsWith('(') && text.endsWith(')')) {\r\n const inner = text.slice(1, -1).trim()\r\n const conditions = parseConditions(inner)\r\n return conditions.length === 1 ? conditions[0] : { kind: 'And', conditions }\r\n }\r\n\r\n if (/^not\\s*\\(/.test(text))\r\n return { kind: 'Not', condition: parseUnboundCondition(extractBalanced(text, '(', ')')) }\r\n\r\n if (/^not\\s+\\w/.test(text))\r\n return { kind: 'Not', condition: parseUnboundCondition(text.replace(/^not\\s+/, '').trim()) }\r\n\r\n if (/^exists\\s*\\(/.test(text))\r\n return { kind: 'Exists', condition: parseUnboundCondition(extractBalanced(text, '(', ')')) }\r\n\r\n if (/^forall\\s*\\(/.test(text))\r\n return { kind: 'Forall', condition: parseCondition(extractBalanced(text, '(', ')')) }\r\n\r\n if (/^accumulate\\s*\\(/.test(text))\r\n return parseAccumulate(text)\r\n\r\n if (/^eval\\s*\\(/.test(text))\r\n return { kind: 'Eval', expression: extractBalanced(text, '(', ')').trim() }\r\n\r\n const fromIdx = indexAtDepth0(text, ' from ')\r\n if (fromIdx !== -1)\r\n return parseFrom(text, fromIdx)\r\n\r\n if (/^(\\$\\w+\\s*:\\s*)?\\w[\\w.]*\\s*\\(/.test(text))\r\n return parseFactPattern(text)\r\n\r\n return { kind: 'RawCondition', drl: text }\r\n}\r\n\r\nfunction parseFactPattern(text: string): FactPattern {\r\n const m = text.match(/^(\\$\\w+\\s*:\\s*)?(\\w[\\w.]*)\\s*\\(([\\s\\S]*)\\)\\s*$/)\r\n if (!m) return { kind: 'FactPattern', factType: text, constraints: [] }\r\n const binding = m[1] ? m[1].replace(':', '').trim() : undefined\r\n const constraints = m[3].trim() ? parseConstraints(m[3].trim()) : []\r\n return { kind: 'FactPattern', factType: m[2].trim(), binding, constraints }\r\n}\r\n\r\n// Parses a condition inside not()/exists() — strips any binding since those\r\n// contexts forbid variable binding by Drools semantics.\r\nfunction parseUnboundCondition(text: string): import('../metamodel/types').UnboundPattern | import('../metamodel/types').EvalCondition | import('../metamodel/types').RawCondition {\r\n const trimmed = text.trim()\r\n if (/^eval\\s*\\(/.test(trimmed))\r\n return { kind: 'Eval', expression: extractBalanced(trimmed, '(', ')').trim() }\r\n const m = trimmed.match(/^(?:\\$\\w+\\s*:\\s*)?(\\w[\\w.]*)\\s*\\(([\\s\\S]*)\\)\\s*$/)\r\n if (m) {\r\n const constraints = m[2].trim() ? parseConstraints(m[2].trim()) : []\r\n return { kind: 'UnboundPattern', factType: m[1].trim(), constraints }\r\n }\r\n return { kind: 'RawCondition', drl: trimmed }\r\n}\r\n\r\nfunction parseConstraints(text: string): Constraint[] {\r\n return splitAtDepth0(text, ',')\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .map(parseConstraint)\r\n}\r\n\r\nfunction parseConstraint(text: string): Constraint {\r\n const s = text.trim()\r\n\r\n // Pure binding: $v : field (no operator)\r\n const bindingOnly = s.match(/^(\\$\\w+)\\s*:\\s*(\\w[\\w.]*)$/)\r\n if (bindingOnly)\r\n return { kind: 'BindingConstraint', binding: bindingOnly[1], field: bindingOnly[2] }\r\n\r\n // Longest-match operator scan to avoid 'not contains' being split as 'not'+'contains'\r\n const OPERATORS: ConstraintOperator[] = [\r\n 'not contains', 'not memberOf', 'not matches',\r\n 'contains', 'memberOf', 'matches',\r\n '==', '!=', '>=', '<=', '>', '<'\r\n ]\r\n for (const op of OPERATORS) {\r\n const idx = indexAtDepth0(s, op)\r\n if (idx === -1) continue\r\n const lhs = s.slice(0, idx).trim()\r\n const rhs = s.slice(idx + op.length).trim()\r\n const lhsMatch = lhs.match(/^(\\$\\w+)\\s*:\\s*(\\w[\\w.]*)$/)\r\n return {\r\n kind: 'FieldConstraint',\r\n field: lhsMatch ? lhsMatch[2] : lhs,\r\n operator: op,\r\n value: rhs,\r\n ...(lhsMatch && { binding: lhsMatch[1] })\r\n }\r\n }\r\n\r\n return { kind: 'RawConstraint', expression: s }\r\n}\r\n\r\nfunction parseAccumulate(text: string): AccumulatePattern {\r\n const inner = extractBalanced(text, '(', ')').trim()\r\n const parts = splitAtDepth0(inner, ';')\r\n const source: Condition = parts[0]\r\n ? parseCondition(parts[0].trim())\r\n : { kind: 'RawCondition', drl: '' }\r\n const functions: AccumulateFunction[] = []\r\n let resultConstraint: string | undefined\r\n\r\n for (let i = 1; i < parts.length; i++) {\r\n const part = parts[i].trim()\r\n const candidates = splitAtDepth0(part, ',')\r\n const parsed: AccumulateFunction[] = []\r\n let allFunctions = true\r\n\r\n for (const candidate of candidates) {\r\n const fn = candidate.trim().match(/^(\\$\\w+)\\s*:\\s*(\\w+)\\s*\\(([^)]*)\\)$/)\r\n if (fn) parsed.push({ binding: fn[1], function: fn[2], argument: fn[3].trim() })\r\n else { allFunctions = false; break }\r\n }\r\n\r\n if (allFunctions && parsed.length > 0) functions.push(...parsed)\r\n else resultConstraint = part\r\n }\r\n\r\n return { kind: 'Accumulate', source, functions, ...(resultConstraint && { resultConstraint }) }\r\n}\r\n\r\nfunction parseFrom(text: string, fromIdx: number): FromCondition {\r\n return {\r\n kind: 'From',\r\n pattern: parseFactPattern(text.slice(0, fromIdx).trim()),\r\n expression: text.slice(fromIdx + ' from '.length).trim()\r\n }\r\n}\r\n\r\n// ─── CONSEQUENCE PARSING ─────────────────────────────────────────────────────\r\n\r\nfunction parseConsequences(then: string): Consequence[] {\r\n const consequences: Consequence[] = []\r\n let remaining = then.trim()\r\n while (remaining.length > 0) {\r\n const result = parseNextConsequence(remaining)\r\n if (!result) break\r\n consequences.push(result.consequence)\r\n remaining = result.rest.trim()\r\n }\r\n return consequences\r\n}\r\n\r\nfunction parseNextConsequence(text: string): { consequence: Consequence; rest: string } | null {\r\n const t = text.trim()\r\n if (!t) return null\r\n\r\n // if (...) { ... } else { ... }\r\n if (/^if\\s*\\(/.test(t)) {\r\n const condition = extractBalanced(t, '(', ')')\r\n const afterCond = t.slice(t.indexOf('(') + condition.length + 2).trim()\r\n const thenBlock = extractBalanced(afterCond, '{', '}')\r\n const thenConsequences = parseConsequences(thenBlock)\r\n let afterThen = afterCond.slice(afterCond.indexOf('{') + thenBlock.length + 2).trim()\r\n let elseConsequences: IfConsequence['else']\r\n if (/^else\\s*\\{/.test(afterThen)) {\r\n const elseBlock = extractBalanced(afterThen, '{', '}')\r\n elseConsequences = parseConsequences(elseBlock)\r\n afterThen = afterThen.slice(afterThen.indexOf('{') + elseBlock.length + 2).trim()\r\n }\r\n return {\r\n consequence: { kind: 'IfConsequence', condition: condition.trim(), then: thenConsequences, ...(elseConsequences && { else: elseConsequences }) },\r\n rest: afterThen\r\n }\r\n }\r\n\r\n // modify( $binding ) { ... }\r\n if (/^modify\\s*\\(/.test(t)) {\r\n const m = t.match(/^modify\\s*\\(\\s*(\\$\\w+)\\s*\\)/)\r\n if (m) {\r\n const afterBinding = t.slice(m[0].length).trim()\r\n const block = extractBalanced(afterBinding, '{', '}')\r\n const endIdx = afterBinding.indexOf('{') + block.length + 2\r\n return {\r\n consequence: { kind: 'ModifyConsequence', binding: m[1], modifications: parseModifications(block) },\r\n rest: afterBinding.slice(endIdx)\r\n }\r\n }\r\n }\r\n\r\n // insert( ... );\r\n if (/^insert\\s*\\(/.test(t)) {\r\n const inner = extractBalanced(t, '(', ')')\r\n const rest = t.slice(t.indexOf('(') + inner.length + 2).replace(/^\\s*;/, '')\r\n return { consequence: { kind: 'InsertConsequence', objectExpression: inner.trim() }, rest }\r\n }\r\n\r\n // retract( $binding );\r\n if (/^retract\\s*\\(/.test(t)) {\r\n const inner = extractBalanced(t, '(', ')')\r\n const rest = t.slice(t.indexOf('(') + inner.length + 2).replace(/^\\s*;/, '')\r\n return { consequence: { kind: 'RetractConsequence', binding: inner.trim() }, rest }\r\n }\r\n\r\n // return expression; or bare return;\r\n if (/^return\\b/.test(t)) {\r\n const semiIdx = indexAtDepth0(t, ';')\r\n const expression = t.slice('return'.length, semiIdx !== -1 ? semiIdx : undefined).trim()\r\n return {\r\n consequence: { kind: 'ReturnConsequence', expression },\r\n rest: semiIdx !== -1 ? t.slice(semiIdx + 1) : ''\r\n }\r\n }\r\n\r\n // Any other statement ending with ;\r\n const semiIdx = indexAtDepth0(t, ';')\r\n if (semiIdx !== -1)\r\n return { consequence: { kind: 'RawConsequence', code: t.slice(0, semiIdx).trim() }, rest: t.slice(semiIdx + 1) }\r\n\r\n return { consequence: { kind: 'RawConsequence', code: t }, rest: '' }\r\n}\r\n\r\nfunction parseModifications(block: string): Modification[] {\r\n return splitAtDepth0(block, ',')\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .map(text => {\r\n const m = text.match(/^(\\w+)\\s*\\(([\\s\\S]*)\\)$/)\r\n if (!m) return { method: text, args: [] }\r\n const args = m[2].trim() ? splitAtDepth0(m[2].trim(), ',').map(a => a.trim()) : []\r\n return { method: m[1], args }\r\n })\r\n}\r\n\r\n// ─── PUBLIC API ───────────────────────────────────────────────────────────────\r\n\r\nexport const DRLToMetaTransformer = {\r\n\r\n parse(drl: string): DroolsFile {\r\n const clean = stripComments(drl)\r\n return {\r\n name: 'parsed',\r\n imports: [...new Set(parseImports(clean))],\r\n globals: parseGlobals(clean),\r\n declarations: parseDeclarations(clean),\r\n functions: parseFunctions(clean),\r\n rules: extractRuleBlocks(clean).map(block => DRLToMetaTransformer.parseRule(block))\r\n }\r\n },\r\n\r\n parseRule(block: string): Rule {\r\n return {\r\n name: parseRuleName(block),\r\n ...parseRuleAttributes(block),\r\n conditions: parseConditions(extractWhenBlock(block)),\r\n consequences: parseConsequences(extractThenBlock(block))\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["Operator","Aggregate","resolveCondition","semiIdx"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rule-builder/builders/enums.ts","../src/rule-builder/builders/PatternBuilder.ts","../src/rule-builder/builders/AccumulateBuilder.ts","../src/rule-builder/builders/ModifyBuilder.ts","../src/rule-builder/builders/LHSBuilder.ts","../src/rule-builder/builders/RHSBuilder.ts","../src/rule-builder/builders/RuleBuilder.ts","../src/rule-builder/builders/DroolsFileBuilder.ts","../src/rule-builder/builders/index.ts","../src/rule-builder/parser/MetaToDRLTransformer.ts","../src/rule-builder/parser/DRLToMetaTransformer.ts"],"sourcesContent":["/**\n * Typed enum for every constraint operator supported by Drools.\n * Values are the exact DRL tokens, so an Operator member is directly\n * assignable to the ConstraintOperator string-literal union in types.ts.\n *\n * @example\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport enum Operator {\n Eq = '==',\n Neq = '!=',\n Gt = '>',\n Lt = '<',\n Gte = '>=',\n Lte = '<=',\n Contains = 'contains',\n NotContains = 'not contains',\n MemberOf = 'memberOf',\n NotMemberOf = 'not memberOf',\n Matches = 'matches',\n NotMatches = 'not matches',\n}\n\n/**\n * Typed enum for the built-in Drools accumulate functions.\n * Use these as the second argument to AccumulateBuilder.fn().\n *\n * @example\n * accumulate(fact('Transaction', '$tx'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n */\nexport enum Aggregate {\n Sum = 'sum',\n Count = 'count',\n Min = 'min',\n Max = 'max',\n Average = 'average',\n CollectList = 'collectList',\n CollectSet = 'collectSet',\n CountDistinct = 'countDistinct',\n}\n","import type { FactPattern, UnboundPattern, Constraint, ConstraintOperator } from '../metamodel/types'\n\n// ─── FactPattern builder ──────────────────────────────────────────────────────\n\n/**\n * Chainable builder for a FactPattern (a bound or unbound pattern in the LHS).\n *\n * Create via the fact() factory function:\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport class PatternBuilder {\n private readonly _factType: string\n private readonly _binding: string | undefined\n private readonly _constraints: Constraint[] = []\n\n constructor(factType: string, binding?: string) {\n this._factType = factType\n this._binding = binding\n }\n\n /**\n * Add a field constraint: field operator value.\n * Optionally binds the result to a variable: $v : field op value.\n */\n field(field: string, operator: ConstraintOperator, value: string, binding?: string): this {\n const constraint: Constraint = binding\n ? { kind: 'FieldConstraint', field, operator, value, binding }\n : { kind: 'FieldConstraint', field, operator, value }\n this._constraints.push(constraint)\n return this\n }\n\n /** Bind a field to a variable: $binding : field */\n bind(binding: string, field: string): this {\n this._constraints.push({ kind: 'BindingConstraint', binding, field })\n return this\n }\n\n /** Emit a verbatim DRL constraint expression. */\n raw(expression: string): this {\n this._constraints.push({ kind: 'RawConstraint', expression })\n return this\n }\n\n build(): FactPattern {\n return {\n kind: 'FactPattern',\n factType: this._factType,\n ...(this._binding !== undefined ? { binding: this._binding } : {}),\n constraints: [...this._constraints],\n }\n }\n}\n\n// ─── UnboundPattern builder ───────────────────────────────────────────────────\n\n/**\n * Chainable builder for an UnboundPattern (used inside not() and exists()\n * where Drools forbids variable bindings).\n *\n * Create via the unbound() factory function:\n * not(unbound('FraudAlert').field('status', Operator.Eq, '\"UNRESOLVED\"'))\n */\nexport class UnboundPatternBuilder {\n private readonly _factType: string\n private readonly _constraints: Constraint[] = []\n\n constructor(factType: string) {\n this._factType = factType\n }\n\n field(field: string, operator: ConstraintOperator, value: string): this {\n this._constraints.push({ kind: 'FieldConstraint', field, operator, value })\n return this\n }\n\n raw(expression: string): this {\n this._constraints.push({ kind: 'RawConstraint', expression })\n return this\n }\n\n build(): UnboundPattern {\n return {\n kind: 'UnboundPattern',\n factType: this._factType,\n constraints: [...this._constraints],\n }\n }\n}\n","import type { AccumulatePattern, AccumulateFunction, Condition } from '../metamodel/types'\nimport type { Aggregate } from './enums'\n\n/**\n * Chainable builder for an AccumulatePattern.\n *\n * Create via the accumulate() factory function:\n *\n * accumulate(fact('Transaction', '$tx').field('amount', Operator.Gt, '0'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n * .resultConstraint('$total > 1000')\n */\nexport class AccumulateBuilder {\n private readonly _source: Condition\n private readonly _functions: AccumulateFunction[] = []\n private _resultConstraint?: string\n\n constructor(source: Condition) {\n this._source = source\n }\n\n /**\n * Register an accumulate function.\n * @param binding - the variable the result is bound to, e.g. '$total'\n * @param func - function name or Aggregate enum, e.g. Aggregate.Sum / 'collectList'\n * @param argument - the argument expression, e.g. '$tx.amount'\n */\n fn(binding: string, func: Aggregate | string, argument: string): this {\n this._functions.push({ binding, function: func, argument })\n return this\n }\n\n /** Optional result constraint applied to the accumulated value, e.g. '$total > 50' */\n resultConstraint(expression: string): this {\n this._resultConstraint = expression\n return this\n }\n\n build(): AccumulatePattern {\n return {\n kind: 'Accumulate',\n source: this._source,\n functions: [...this._functions],\n ...(this._resultConstraint !== undefined\n ? { resultConstraint: this._resultConstraint }\n : {}),\n }\n }\n}\n","import type { ModifyConsequence, Modification } from '../metamodel/types'\n\n/**\n * Chainable builder for a ModifyConsequence.\n *\n * Create via the modify() factory function:\n *\n * modify('$account')\n * .call('setStatus', 'Account.Status.FROZEN')\n * .call('setRemarks', '\"Frozen by rule\"')\n */\nexport class ModifyBuilder {\n private readonly _binding: string\n private readonly _modifications: Modification[] = []\n\n constructor(binding: string) {\n this._binding = binding\n }\n\n /** Call a setter/method on the bound fact with the given arguments. */\n call(method: string, ...args: string[]): this {\n this._modifications.push({ method, args })\n return this\n }\n\n build(): ModifyConsequence {\n return {\n kind: 'ModifyConsequence',\n binding: this._binding,\n modifications: [...this._modifications],\n }\n }\n}\n","import type {\n Condition,\n UnboundPattern,\n EvalCondition,\n RawCondition,\n} from '../metamodel/types'\nimport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nimport { AccumulateBuilder } from './AccumulateBuilder'\n\n// ─── Internal helper ──────────────────────────────────────────────────────────\n\n/**\n * Restricted builder for the inner condition of not() and exists().\n * Drools only allows UnboundPattern, eval(), or raw DRL inside these wrappers.\n */\nclass InnerPatternBuilder {\n private _inner?: UnboundPattern | EvalCondition | RawCondition\n\n fact(factType: string, fn?: (p: UnboundPatternBuilder) => void): this {\n const b = new UnboundPatternBuilder(factType)\n fn?.(b)\n this._inner = b.build()\n return this\n }\n\n eval(expression: string): this {\n this._inner = { kind: 'Eval', expression }\n return this\n }\n\n raw(drl: string): this {\n this._inner = { kind: 'RawCondition', drl }\n return this\n }\n\n /** @internal */\n _build(): UnboundPattern | EvalCondition | RawCondition {\n if (!this._inner) throw new Error('not() / exists() block requires at least one condition')\n return this._inner\n }\n}\n\n// ─── LHSBuilder ───────────────────────────────────────────────────────────────\n\n/**\n * Imperative builder for the when-block of a rule.\n * Obtained via RuleBuilder.when(lhs => { ... }).\n *\n * Every method returns `this` for optional chaining.\n */\nexport class LHSBuilder {\n /** @internal collected conditions — consumed by RuleBuilder */\n readonly _conditions: Condition[] = []\n\n // ── Fact patterns ──────────────────────────────────────────────────────────\n\n /** Add a FactPattern with an optional variable binding. */\n fact(factType: string, binding: string, fn?: (p: PatternBuilder) => void): this\n fact(factType: string, fn?: (p: PatternBuilder) => void): this\n fact(\n factType: string,\n bindingOrFn?: string | ((p: PatternBuilder) => void),\n fn?: (p: PatternBuilder) => void,\n ): this {\n let binding: string | undefined\n let configureFn: ((p: PatternBuilder) => void) | undefined\n\n if (typeof bindingOrFn === 'string') {\n binding = bindingOrFn\n configureFn = fn\n } else {\n configureFn = bindingOrFn\n }\n\n const builder = new PatternBuilder(factType, binding)\n configureFn?.(builder)\n this._conditions.push(builder.build())\n return this\n }\n\n // ── Logical wrappers ───────────────────────────────────────────────────────\n\n /** Add a not() wrapper. Inner condition must be unbound (no variable binding). */\n not(fn: (b: InnerPatternBuilder) => void): this {\n const b = new InnerPatternBuilder()\n fn(b)\n this._conditions.push({ kind: 'Not', condition: b._build() })\n return this\n }\n\n /** Add an exists() wrapper. Inner condition must be unbound. */\n exists(fn: (b: InnerPatternBuilder) => void): this {\n const b = new InnerPatternBuilder()\n fn(b)\n this._conditions.push({ kind: 'Exists', condition: b._build() })\n return this\n }\n\n /** Add an or() group. Each child is added via the nested LHSBuilder. */\n or(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n this._conditions.push({ kind: 'Or', conditions: inner._conditions })\n return this\n }\n\n /** Add an and() group. Useful when composing nested boolean logic. */\n and(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n this._conditions.push({ kind: 'And', conditions: inner._conditions })\n return this\n }\n\n /** Add a forall() wrapper. */\n forall(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n const condition: Condition =\n inner._conditions.length === 1\n ? inner._conditions[0]\n : { kind: 'And', conditions: inner._conditions }\n this._conditions.push({ kind: 'Forall', condition })\n return this\n }\n\n // ── Accumulate ─────────────────────────────────────────────────────────────\n\n /**\n * Add an accumulate pattern.\n * @param sourceFn - builds the source condition (the pattern being accumulated)\n * @param fn - configures the accumulate functions and result constraint\n */\n accumulate(\n sourceFn: (lhs: LHSBuilder) => void,\n fn: (acc: AccumulateBuilder) => void,\n ): this {\n const sourceLhs = new LHSBuilder()\n sourceFn(sourceLhs)\n const source: Condition =\n sourceLhs._conditions.length === 1\n ? sourceLhs._conditions[0]\n : { kind: 'And', conditions: sourceLhs._conditions }\n const acc = new AccumulateBuilder(source)\n fn(acc)\n this._conditions.push(acc.build())\n return this\n }\n\n // ── From ───────────────────────────────────────────────────────────────────\n\n /**\n * Add a from condition: FactType( constraints ) from expression\n * @param factType - the type to match\n * @param binding - variable binding for the matched fact\n * @param expression - the source expression (collection, method call, etc.)\n * @param fn - optional constraint configuration\n */\n from(\n factType: string,\n binding: string,\n expression: string,\n fn?: (p: PatternBuilder) => void,\n ): this {\n const builder = new PatternBuilder(factType, binding)\n fn?.(builder)\n this._conditions.push({ kind: 'From', pattern: builder.build(), expression })\n return this\n }\n\n // ── Primitives ─────────────────────────────────────────────────────────────\n\n /** Add an eval() condition with a raw boolean expression. */\n eval(expression: string): this {\n this._conditions.push({ kind: 'Eval', expression })\n return this\n }\n\n /** Add a verbatim DRL condition, emitted as-is. */\n raw(drl: string): this {\n this._conditions.push({ kind: 'RawCondition', drl })\n return this\n }\n}\n","import type { Consequence } from '../metamodel/types'\nimport { ModifyBuilder } from './ModifyBuilder'\n\n/**\n * Imperative builder for the then-block of a rule.\n * Obtained via RuleBuilder.then(rhs => { ... }).\n */\nexport class RHSBuilder {\n /** @internal collected consequences — consumed by RuleBuilder */\n readonly _consequences: Consequence[] = []\n\n /** modify($binding) { ... } — calls setters on an existing fact. */\n modify(binding: string, fn: (m: ModifyBuilder) => void): this {\n const builder = new ModifyBuilder(binding)\n fn(builder)\n this._consequences.push(builder.build())\n return this\n }\n\n /** insert(objectExpression) — inserts a new fact into working memory. */\n insert(objectExpression: string): this {\n this._consequences.push({ kind: 'InsertConsequence', objectExpression })\n return this\n }\n\n /** retract($binding) — removes a fact from working memory. */\n retract(binding: string): this {\n this._consequences.push({ kind: 'RetractConsequence', binding })\n return this\n }\n\n /** Assign a value to a global variable. */\n global(expression: string): this {\n this._consequences.push({ kind: 'SetGlobalConsequence', expression })\n return this\n }\n\n /** Emit a verbatim DRL statement, emitted as-is. */\n raw(code: string): this {\n this._consequences.push({ kind: 'RawConsequence', code })\n return this\n }\n}\n","import type { Rule, Condition, Consequence } from '../metamodel/types'\nimport { LHSBuilder } from './LHSBuilder'\nimport { RHSBuilder } from './RHSBuilder'\n\ninterface Buildable<T> {\n build(): T\n}\n\nfunction resolveCondition(input: Condition | Buildable<Condition>): Condition {\n return typeof (input as Buildable<Condition>).build === 'function'\n ? (input as Buildable<Condition>).build()\n : (input as Condition)\n}\n\nfunction resolveConsequence(input: Consequence | Buildable<Consequence>): Consequence {\n return typeof (input as Buildable<Consequence>).build === 'function'\n ? (input as Buildable<Consequence>).build()\n : (input as Consequence)\n}\n\n/**\n * Fluent builder for a Drools Rule.\n *\n * Entry point: createRule(name)\n *\n * Two usage styles are supported and can be freely mixed:\n *\n * Style 1 — factory functions (composable, works well for complex rules):\n * createRule('Award Badge')\n * .salience(10)\n * .addCondition(fact('Player', '$p').field('score', Operator.Gte, '100'))\n * .addConsequence(modify('$p').call('awardBadge', '\"gold\"'))\n * .build()\n *\n * Style 2 — callback blocks (mirrors DRL when/then structure):\n * createRule('Award Badge')\n * .salience(10)\n * .when(lhs => {\n * lhs.fact('Player', '$p', p => p.field('score', Operator.Gte, '100'))\n * })\n * .then(rhs => {\n * rhs.modify('$p', m => m.call('awardBadge', '\"gold\"'))\n * })\n * .build()\n *\n * Plain metamodel objects are also accepted everywhere a builder is expected,\n * so hand-crafted conditions/consequences can be mixed freely with builders.\n */\nexport class RuleBuilder {\n private readonly _rule: Rule\n\n constructor(name: string) {\n this._rule = { name, conditions: [], consequences: [] }\n }\n\n // ── Rule attributes ────────────────────────────────────────────────────────\n\n salience(value: number): this {\n this._rule.salience = value\n return this\n }\n\n agendaGroup(value: string): this {\n this._rule.agendaGroup = value\n return this\n }\n\n /** Defaults to true when called without an argument. */\n noLoop(value = true): this {\n this._rule.noLoop = value\n return this\n }\n\n /** Defaults to true when called without an argument. */\n lockOnActive(value = true): this {\n this._rule.lockOnActive = value\n return this\n }\n\n ruleFlowGroup(value: string): this {\n this._rule.ruleFlowGroup = value\n return this\n }\n\n // ── Step-by-step style ─────────────────────────────────────────────────────\n\n /**\n * Append a single condition.\n * Accepts a plain Condition object or any builder that exposes build().\n */\n addCondition(condition: Condition | Buildable<Condition>): this {\n this._rule.conditions.push(resolveCondition(condition))\n return this\n }\n\n /**\n * Append a single consequence.\n * Accepts a plain Consequence object or any builder that exposes build().\n */\n addConsequence(consequence: Consequence | Buildable<Consequence>): this {\n this._rule.consequences.push(resolveConsequence(consequence))\n return this\n }\n\n // ── Callback block style ───────────────────────────────────────────────────\n\n /** Configure the when-block using an LHSBuilder. Appends to existing conditions. */\n when(fn: (lhs: LHSBuilder) => void): this {\n const lhs = new LHSBuilder()\n fn(lhs)\n this._rule.conditions.push(...lhs._conditions)\n return this\n }\n\n /** Configure the then-block using an RHSBuilder. Appends to existing consequences. */\n then(fn: (rhs: RHSBuilder) => void): this {\n const rhs = new RHSBuilder()\n fn(rhs)\n this._rule.consequences.push(...rhs._consequences)\n return this\n }\n\n // ── Terminal ───────────────────────────────────────────────────────────────\n\n build(): Rule {\n return {\n ...this._rule,\n conditions: [...this._rule.conditions],\n consequences: [...this._rule.consequences],\n }\n }\n}\n\n/** Create a new RuleBuilder for a rule with the given name. */\nexport function createRule(name: string): RuleBuilder {\n return new RuleBuilder(name)\n}\n","import type { DroolsFile, GlobalDefinition, Rule } from '../metamodel/types'\nimport { RuleBuilder } from './RuleBuilder'\n\ninterface Buildable<T> { build(): T }\n\nfunction resolveRule(input: Rule | Buildable<Rule>): Rule {\n return typeof (input as Buildable<Rule>).build === 'function'\n ? (input as Buildable<Rule>).build()\n : (input as Rule)\n}\n\n/**\n * Chainable builder for a DroolsFile (a collection of rules with shared imports).\n *\n * Create via the createFile() factory:\n *\n * createFile('fraud-rules')\n * .import('com.example.model.Account')\n * .import('com.example.model.FraudAlert')\n * .addRule(\n * createRule('Detect Fraud').when(...).then(...),\n * )\n * .build()\n */\nexport class DroolsFileBuilder {\n private readonly _name: string\n private readonly _imports: string[] = []\n private readonly _globals: GlobalDefinition[] = []\n private readonly _rules: Rule[] = []\n\n constructor(name: string) {\n this._name = name\n }\n\n /**\n * Add a fully-qualified Java class import.\n * Can be called multiple times — order is preserved.\n *\n * @example\n * .import('com.example.model.Player')\n */\n import(className: string): this {\n this._imports.push(className)\n return this\n }\n\n /**\n * Declare a global variable available to all rules in this file.\n * Emits `global type name;` in the DRL header.\n *\n * @example\n * .global('com.example.AlertService', 'alertService')\n */\n global(type: string, name: string): this {\n this._globals.push({ type, name })\n return this\n }\n\n /**\n * Add a rule to the file.\n * Accepts a plain Rule object or a RuleBuilder (auto-resolved via .build()).\n *\n * @example\n * .addRule(createRule('My Rule').when(...).then(...))\n * .addRule({ name: 'My Rule', conditions: [], consequences: [] })\n */\n addRule(rule: Rule | RuleBuilder): this {\n this._rules.push(resolveRule(rule))\n return this\n }\n\n build(): DroolsFile {\n return {\n name: this._name,\n imports: [...this._imports],\n globals: [...this._globals],\n rules: [...this._rules],\n }\n }\n}\n\n/** Create a new DroolsFileBuilder with the given file name. */\nexport function createFile(name: string): DroolsFileBuilder {\n return new DroolsFileBuilder(name)\n}\n","/**\n * drools-builder — public API\n *\n * Import from this module to access both the metamodel types and the builder API.\n */\n\n// ─── Enums ────────────────────────────────────────────────────────────────────\nexport { Operator, Aggregate } from './enums'\n\n// ─── Builder classes (for advanced use / extension) ───────────────────────────\nexport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nexport { AccumulateBuilder } from './AccumulateBuilder'\nexport { ModifyBuilder } from './ModifyBuilder'\nexport { LHSBuilder } from './LHSBuilder'\nexport { RHSBuilder } from './RHSBuilder'\nexport { RuleBuilder, createRule } from './RuleBuilder'\nexport { DroolsFileBuilder, createFile } from './DroolsFileBuilder'\n\n// ─── Metamodel types (re-exported for convenience) ───────────────────────────\nexport type {\n ConstraintOperator,\n Constraint,\n FieldConstraint,\n BindingConstraint,\n RawConstraint,\n FactType,\n FactPattern,\n UnboundPattern,\n AndCondition,\n OrCondition,\n NotCondition,\n ExistsCondition,\n ForallCondition,\n AccumulateFunction,\n AccumulatePattern,\n FromCondition,\n EvalCondition,\n RawCondition,\n Condition,\n Modification,\n ModifyConsequence,\n InsertConsequence,\n RetractConsequence,\n SetGlobalConsequence,\n RawConsequence,\n Consequence,\n GlobalDefinition,\n Rule,\n DroolsFile,\n} from '../metamodel/types'\n\n// ─── Internal imports for factory implementations ─────────────────────────────\nimport type {\n Condition,\n UnboundPattern,\n EvalCondition,\n RawCondition,\n NotCondition,\n ExistsCondition,\n OrCondition,\n AndCondition,\n ForallCondition,\n AccumulatePattern,\n FromCondition,\n InsertConsequence,\n RetractConsequence,\n SetGlobalConsequence,\n RawConsequence,\n} from '../metamodel/types'\nimport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nimport { AccumulateBuilder } from './AccumulateBuilder'\nimport { ModifyBuilder } from './ModifyBuilder'\n\n// ─── Shared resolver ──────────────────────────────────────────────────────────\n\ninterface Buildable<T> { build(): T }\n\nfunction resolveCondition(\n input: Condition | Buildable<Condition>,\n): Condition {\n return typeof (input as Buildable<Condition>).build === 'function'\n ? (input as Buildable<Condition>).build()\n : (input as Condition)\n}\n\ntype NotExistsInput =\n | UnboundPattern\n | EvalCondition\n | RawCondition\n | Buildable<UnboundPattern>\n\nfunction resolveNotExists(\n input: NotExistsInput,\n): UnboundPattern | EvalCondition | RawCondition {\n return typeof (input as Buildable<UnboundPattern>).build === 'function'\n ? (input as Buildable<UnboundPattern>).build()\n : (input as UnboundPattern | EvalCondition | RawCondition)\n}\n\n// ─── Condition factories ──────────────────────────────────────────────────────\n\n/**\n * Start building a FactPattern.\n *\n * @param factType - the Java class name to match (e.g. 'Player')\n * @param binding - optional variable binding (e.g. '$p')\n *\n * @example\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport function fact(factType: string, binding?: string): PatternBuilder {\n return new PatternBuilder(factType, binding)\n}\n\n/**\n * Start building an UnboundPattern for use inside not() or exists().\n *\n * @example\n * not(unbound('FraudAlert').field('status', Operator.Eq, '\"UNRESOLVED\"'))\n */\nexport function unbound(factType: string): UnboundPatternBuilder {\n return new UnboundPatternBuilder(factType)\n}\n\n/**\n * Wrap a condition in a Drools not().\n * The inner condition must be unbound (UnboundPatternBuilder / UnboundPattern),\n * an eval(), or a raw condition.\n */\nexport function not(condition: NotExistsInput): NotCondition {\n return { kind: 'Not', condition: resolveNotExists(condition) }\n}\n\n/**\n * Wrap a condition in a Drools exists().\n * Same constraints as not().\n */\nexport function exists(condition: NotExistsInput): ExistsCondition {\n return { kind: 'Exists', condition: resolveNotExists(condition) }\n}\n\n/**\n * Group conditions with OR semantics.\n *\n * @example\n * or(fact('A').field('x', Operator.Eq, '1'), fact('B').field('y', Operator.Eq, '2'))\n */\nexport function or(...conditions: Array<Condition | Buildable<Condition>>): OrCondition {\n return { kind: 'Or', conditions: conditions.map(resolveCondition) }\n}\n\n/**\n * Group conditions with AND semantics.\n * Mostly used when building nested boolean logic inside or().\n */\nexport function and(...conditions: Array<Condition | Buildable<Condition>>): AndCondition {\n return { kind: 'And', conditions: conditions.map(resolveCondition) }\n}\n\n/**\n * Wrap a condition in a Drools forall().\n *\n * @example\n * forall(fact('Transaction', '$tx').field('validated', Operator.Eq, 'true'))\n */\nexport function forall(condition: Condition | Buildable<Condition>): ForallCondition {\n return { kind: 'Forall', condition: resolveCondition(condition) }\n}\n\n/**\n * Start building an AccumulatePattern.\n *\n * @example\n * accumulate(fact('Transaction', '$tx').field('amount', Operator.Gt, '0'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n * .resultConstraint('$total > 1000')\n */\nexport function accumulate(\n source: Condition | Buildable<Condition>,\n): AccumulateBuilder {\n return new AccumulateBuilder(resolveCondition(source))\n}\n\n/**\n * Build a FromCondition: pattern from expression.\n *\n * @example\n * from_(fact('Transaction', '$tx'), '$recentTxs')\n */\nexport function from_(\n pattern: PatternBuilder,\n expression: string,\n): FromCondition {\n return { kind: 'From', pattern: pattern.build(), expression }\n}\n\n/**\n * Build an EvalCondition with a raw boolean expression.\n *\n * @example\n * eval_('$p.getScore() > threshold')\n */\nexport function eval_(expression: string): EvalCondition {\n return { kind: 'Eval', expression }\n}\n\n/**\n * Build a RawCondition — verbatim DRL, emitted as-is.\n * Use as an escape hatch for constructs not covered by the builder.\n */\nexport function rawCondition(drl: string): RawCondition {\n return { kind: 'RawCondition', drl }\n}\n\n// ─── Consequence factories ────────────────────────────────────────────────────\n\n/**\n * Start building a ModifyConsequence.\n *\n * @example\n * modify('$account').call('setStatus', 'Account.Status.FROZEN')\n */\nexport function modify(binding: string): ModifyBuilder {\n return new ModifyBuilder(binding)\n}\n\n/**\n * Build an InsertConsequence — inserts a new fact into working memory.\n *\n * @example\n * insert('new FraudAlert()')\n */\nexport function insert(objectExpression: string): InsertConsequence {\n return { kind: 'InsertConsequence', objectExpression }\n}\n\n/**\n * Build a RetractConsequence — removes a fact from working memory.\n *\n * @example\n * retract('$obsoleteAlert')\n */\nexport function retract(binding: string): RetractConsequence {\n return { kind: 'RetractConsequence', binding }\n}\n\n/**\n * Build a SetGlobalConsequence — assign a value to a global variable.\n *\n * @example\n * setGlobal('alertService.notify($account)')\n */\nexport function setGlobal(expression: string): SetGlobalConsequence {\n return { kind: 'SetGlobalConsequence', expression }\n}\n\n/**\n * Build a RawConsequence — verbatim Java/DRL code, emitted as-is.\n * Use as an escape hatch for logic not covered by the builder.\n */\nexport function rawConsequence(code: string): RawConsequence {\n return { kind: 'RawConsequence', code }\n}\n","import type { AndCondition, ClassDeclaration, Condition, Consequence, Constraint, DroolsFile, FunctionDefinition, Rule } from '../metamodel/types'\r\n\r\n// ─── CONSTRAINT GENERATION ───────────────────────────────────────────────────\r\n\r\nfunction generateConstraint(c: Constraint): string {\r\n switch (c.kind) {\r\n case 'FieldConstraint':\r\n return `${c.binding ? `${c.binding} : ` : ''}${c.field} ${c.operator} ${c.value}`\r\n case 'BindingConstraint':\r\n return `${c.binding} : ${c.field}`\r\n case 'RawConstraint':\r\n return c.expression\r\n }\r\n}\r\n\r\n// ─── CONDITION GENERATION ────────────────────────────────────────────────────\r\n\r\nfunction generateCondition(cond: Condition, indent = ' '): string {\r\n switch (cond.kind) {\r\n\r\n case 'FactPattern': {\r\n const binding = cond.binding ? `${cond.binding} : ` : ''\r\n const constraints = cond.constraints.map(generateConstraint).join(', ')\r\n return `${binding}${cond.factType}( ${constraints} )`\r\n }\r\n\r\n case 'UnboundPattern': {\r\n // No binding — used inside not() and forall() where binding is forbidden\r\n const constraints = cond.constraints.map(generateConstraint).join(', ')\r\n return `${cond.factType}( ${constraints} )`\r\n }\r\n\r\n case 'And': {\r\n const parts = cond.conditions.map(c => generateCondition(c, indent + ' '))\r\n return `( ${parts.join(`\\n${indent} and `)} )`\r\n }\r\n\r\n case 'Or': {\r\n const parts = cond.conditions.map(c => generateCondition(c, indent + ' '))\r\n return `( ${parts.join(`\\n${indent} or `)} )`\r\n }\r\n\r\n case 'Not':\r\n return `not( ${generateCondition(cond.condition, indent)} )`\r\n\r\n case 'Exists':\r\n return `exists( ${generateCondition(cond.condition, indent)} )`\r\n\r\n case 'Forall':\r\n return `forall( ${generateCondition(cond.condition, indent)} )`\r\n\r\n case 'Accumulate': {\r\n const source = generateCondition(cond.source, indent + ' ')\r\n const fns = cond.functions.map(f => `${f.binding} : ${f.function}( ${f.argument} )`).join(', ')\r\n const result = cond.resultConstraint ? `;\\n${indent} ${cond.resultConstraint}` : ''\r\n return `accumulate(\\n${indent} ${source};\\n${indent} ${fns}${result}\\n${indent})`\r\n }\r\n\r\n case 'From':\r\n return `${generateCondition(cond.pattern, indent)} from ${cond.expression}`\r\n\r\n case 'Eval':\r\n return `eval( ${cond.expression} )`\r\n\r\n case 'RawCondition':\r\n return cond.drl\r\n }\r\n}\r\n\r\n/**\r\n * Generates the when block from the top-level condition list.\r\n * Each condition on its own line (implicit AND).\r\n * A single AndCondition is unrolled into individual lines.\r\n */\r\nfunction generateWhenBlock(conditions: Condition[], indent = ' '): string {\r\n const flat = conditions.length === 1 && conditions[0].kind === 'And'\r\n ? (conditions[0] as AndCondition).conditions\r\n : conditions\r\n return flat.map(c => `${indent}${generateCondition(c, indent)}`).join('\\n')\r\n}\r\n\r\n// ─── CONSEQUENCE GENERATION ──────────────────────────────────────────────────\r\n\r\nfunction generateConsequence(cons: Consequence, indent = ' '): string {\r\n switch (cons.kind) {\r\n case 'ModifyConsequence': {\r\n const mods = cons.modifications\r\n .map(m => `${m.method}( ${m.args.join(', ')} )`)\r\n .join(`,\\n${indent} `)\r\n return `modify( ${cons.binding} ) {\\n${indent} ${mods}\\n${indent}}`\r\n }\r\n case 'InsertConsequence':\r\n return `insert( ${cons.objectExpression} );`\r\n case 'RetractConsequence':\r\n return `retract( ${cons.binding} );`\r\n case 'SetGlobalConsequence':\r\n return `${cons.expression};`\r\n case 'RawConsequence':\r\n return `${cons.code};`\r\n case 'ReturnConsequence':\r\n return cons.expression ? `return ${cons.expression};` : 'return;'\r\n\r\n case 'IfConsequence': {\r\n const thenLines = cons.then.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\r\n if (cons.else && cons.else.length > 0) {\r\n const elseLines = cons.else.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\r\n return `if (${cons.condition}) {\\n${thenLines}\\n${indent}} else {\\n${elseLines}\\n${indent}}`\r\n }\r\n return `if (${cons.condition}) {\\n${thenLines}\\n${indent}}`\r\n }\r\n }\r\n}\r\n\r\n// ─── DECLARATION GENERATION ──────────────────────────────────────────────────\r\n\r\nfunction generateDeclaration(decl: ClassDeclaration): string {\r\n const attrs = decl.attributes.map(a => ` ${a.name} : ${a.type}`).join('\\n')\r\n return `declare ${decl.className}${attrs ? '\\n' + attrs + '\\n' : '\\n'}end`\r\n}\r\n\r\n// ─── FUNCTION GENERATION ─────────────────────────────────────────────────────\r\n\r\nfunction generateFunction(fn: FunctionDefinition, indent = ' '): string {\r\n const body = fn.body.map(c => `${indent}${generateConsequence(c, indent)}`).join('\\n')\r\n return `function ${fn.returnType} ${fn.name}(${fn.params}) {\\n${body}\\n}`\r\n}\r\n\r\n// ─── RULE GENERATION ─────────────────────────────────────────────────────────\r\n\r\nfunction generateRule(rule: Rule): string {\r\n const lines = [`rule \"${rule.name}\"`]\r\n if (rule.salience !== undefined) lines.push(` salience ${rule.salience}`)\r\n if (rule.agendaGroup !== undefined) lines.push(` agenda-group \"${rule.agendaGroup}\"`)\r\n if (rule.ruleFlowGroup !== undefined) lines.push(` ruleflow-group \"${rule.ruleFlowGroup}\"`)\r\n if (rule.noLoop) lines.push(' no-loop true')\r\n if (rule.lockOnActive) lines.push(' lock-on-active true')\r\n lines.push(' when')\r\n lines.push(generateWhenBlock(rule.conditions))\r\n lines.push(' then')\r\n lines.push(rule.consequences.map(c => ` ${generateConsequence(c)}`).join('\\n'))\r\n lines.push('end')\r\n return lines.join('\\n')\r\n}\r\n\r\n// ─── PUBLIC API ───────────────────────────────────────────────────────────────\r\n\r\nexport const MetaToDRLTransformer = {\r\n\r\n generate(file: DroolsFile): string {\r\n const sections: string[] = []\r\n if (file.imports.length > 0)\r\n sections.push(file.imports.map(i => `import ${i};`).join('\\n'))\r\n if (file.globals.length > 0)\r\n sections.push(file.globals.map(g => `global ${g.type} ${g.name};`).join('\\n'))\r\n if (file.declarations && file.declarations.length > 0)\r\n sections.push(file.declarations.map(d => generateDeclaration(d)).join('\\n\\n'))\r\n if (file.functions && file.functions.length > 0)\r\n sections.push(file.functions.map(fn => generateFunction(fn)).join('\\n\\n'))\r\n sections.push(file.rules.map(generateRule).join('\\n\\n'))\r\n return sections.join('\\n\\n')\r\n },\r\n\r\n generateRule(rule: Rule): string {\r\n return generateRule(rule)\r\n }\r\n}\r\n","import type {\r\n AccumulateFunction, AccumulatePattern, AndCondition, AttributeDeclaration,\r\n ClassDeclaration, Condition, Consequence, Constraint, ConstraintOperator,\r\n DroolsFile, FactPattern, FromCondition, FunctionDefinition, GlobalDefinition,\r\n IfConsequence, Modification, Rule\r\n} from '../metamodel/types'\r\n\r\n// ─── LOW-LEVEL UTILITIES ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Returns the index of the first occurrence of `needle` in `text` that is\r\n * at parenthesis/brace/bracket depth 0 and not inside a string literal.\r\n */\r\nfunction indexAtDepth0(text: string, needle: string): number {\r\n let depth = 0\r\n let inString = false\r\n let quote = ''\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i]\r\n\r\n if (inString) {\r\n if (ch === '\\\\') { i++; continue }\r\n if (ch === quote) inString = false\r\n continue\r\n }\r\n\r\n if (ch === '\"' || ch === \"'\") { inString = true; quote = ch; continue }\r\n if (ch === '(' || ch === '{' || ch === '[') { depth++; continue }\r\n if (ch === ')' || ch === '}' || ch === ']') { depth--; continue }\r\n\r\n if (depth === 0 && text.startsWith(needle, i)) return i\r\n }\r\n return -1\r\n}\r\n\r\n/**\r\n * Splits `text` at all depth-0 occurrences of `separator`.\r\n * Ignores occurrences inside nested parentheses/braces/brackets and string literals.\r\n */\r\nfunction splitAtDepth0(text: string, separator: string): string[] {\r\n const parts: string[] = []\r\n const sepLen = separator.length\r\n let depth = 0\r\n let inString = false\r\n let quote = ''\r\n let current = ''\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i]\r\n\r\n if (inString) {\r\n if (ch === '\\\\') { current += ch + text[++i]; continue }\r\n if (ch === quote) inString = false\r\n current += ch\r\n continue\r\n }\r\n\r\n if (ch === '\"' || ch === \"'\") { inString = true; quote = ch; current += ch; continue }\r\n if (ch === '(' || ch === '{' || ch === '[') { depth++; current += ch; continue }\r\n if (ch === ')' || ch === '}' || ch === ']') { depth--; current += ch; continue }\r\n\r\n if (depth === 0 && text.startsWith(separator, i)) {\r\n parts.push(current.trim())\r\n current = ''\r\n i += sepLen - 1\r\n continue\r\n }\r\n\r\n current += ch\r\n }\r\n if (current.trim()) parts.push(current.trim())\r\n return parts.filter(p => p.length > 0)\r\n}\r\n\r\n/**\r\n * Extracts the content between the first matching open/close pair.\r\n * e.g. extractBalanced(\"foo(bar(baz))\", '(', ')') → \"bar(baz)\"\r\n */\r\nfunction extractBalanced(text: string, open: string, close: string): string {\r\n const start = text.indexOf(open)\r\n if (start === -1) return ''\r\n let depth = 0\r\n for (let i = start; i < text.length; i++) {\r\n if (text[i] === open) depth++\r\n else if (text[i] === close) {\r\n depth--\r\n if (depth === 0) return text.slice(start + 1, i)\r\n }\r\n }\r\n return text.slice(start + 1)\r\n}\r\n\r\n/** Strips single-line (//) and block (/* *\\/) comments from DRL. */\r\nfunction stripComments(drl: string): string {\r\n return drl\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\r\n .replace(/\\/\\/[^\\n]*/g, '')\r\n}\r\n\r\n// ─── FILE-LEVEL PARSING ───────────────────────────────────────────────────────\r\n\r\nfunction parseImports(drl: string): string[] {\r\n const imports: string[] = []\r\n const re = /^\\s*import\\s+([^\\s;]+)\\s*;?/gm\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) imports.push(m[1].trim())\r\n return imports\r\n}\r\n\r\nfunction parseGlobals(drl: string): GlobalDefinition[] {\r\n const globals: GlobalDefinition[] = []\r\n const re = /^\\s*global\\s+(\\S+)\\s+(\\S+?)\\s*;?$/gm\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) globals.push({ type: m[1], name: m[2] })\r\n return globals\r\n}\r\n\r\nfunction extractRuleBlocks(drl: string): string[] {\r\n const blocks: string[] = []\r\n const re = /\\brule\\s+(?:\"[^\"]*\"|'[^']*')[\\s\\S]*?\\bend\\b/g\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) blocks.push(m[0])\r\n return blocks\r\n}\r\n\r\nfunction parseFunctions(drl: string): FunctionDefinition[] {\r\n const results: FunctionDefinition[] = []\r\n // Matches: function <returnType> <name>(<params>) { <body> }\r\n // ([^{}]*(?:\\{[^{}]*\\}[^{}]*)*) handles one level of nested braces (e.g. if blocks)\r\n const re = /\\bfunction\\s+([\\w<>?,\\s\\[\\]]+?)\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*\\{([^{}]*(?:\\{[^{}]*\\}[^{}]*)*)\\}/g\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) {\r\n results.push({\r\n returnType: m[1].trim(),\r\n name: m[2].trim(),\r\n params: m[3].trim(),\r\n body: parseConsequences(m[4].trim())\r\n })\r\n }\r\n return results\r\n}\r\n\r\nfunction parseDeclarations(drl: string): ClassDeclaration[] {\r\n const results: ClassDeclaration[] = []\r\n const re = /\\bdeclare\\s+(\\w+)\\s*([\\s\\S]*?)\\bend\\b/g\r\n let m: RegExpExecArray | null\r\n while ((m = re.exec(drl)) !== null) {\r\n const className = m[1].trim()\r\n const attributes: AttributeDeclaration[] = []\r\n const attrRe = /^\\s*(\\w+)\\s*:\\s*(\\S+)/gm\r\n let a: RegExpExecArray | null\r\n while ((a = attrRe.exec(m[2])) !== null) {\r\n attributes.push({ name: a[1].trim(), type: a[2].trim() })\r\n }\r\n results.push({ className, attributes })\r\n }\r\n return results\r\n}\r\n\r\n// ─── RULE-LEVEL PARSING ──────────────────────────────────────────────────────\r\n\r\nfunction parseRuleName(block: string): string {\r\n const m = block.match(/\\brule\\s+(?:\"([^\"]+)\"|'([^']+)')/)\r\n return m ? (m[1] ?? m[2]) : 'unknown'\r\n}\r\n\r\nfunction parseRuleAttributes(block: string): Partial<Rule> {\r\n const attrs: Partial<Rule> = {}\r\n const m = block.match(/\\brule\\s+(?:\"[^\"]+\"|'[^']+')\\s*([\\s\\S]*?)\\bwhen\\b/)\r\n if (!m) return attrs\r\n const attr = m[1]\r\n const salience = attr.match(/\\bsalience\\s+(-?\\d+)/)\r\n if (salience) attrs.salience = parseInt(salience[1], 10)\r\n if (!/\\bno-loop\\s+false\\b/.test(attr) && /\\bno-loop\\b/.test(attr)) attrs.noLoop = true\r\n if (!/\\block-on-active\\s+false\\b/.test(attr) && /\\block-on-active\\b/.test(attr)) attrs.lockOnActive = true\r\n const ag = attr.match(/\\bagenda-group\\s+\"([^\"]+)\"/)\r\n if (ag) attrs.agendaGroup = ag[1]\r\n const rfg = attr.match(/\\bruleflow-group\\s+\"([^\"]+)\"/)\r\n if (rfg) attrs.ruleFlowGroup = rfg[1]\r\n return attrs\r\n}\r\n\r\nfunction extractWhenBlock(block: string): string {\r\n const m = block.match(/\\bwhen\\b([\\s\\S]*?)\\bthen\\b/)\r\n return m ? m[1].trim() : ''\r\n}\r\n\r\nfunction extractThenBlock(block: string): string {\r\n const m = block.match(/\\bthen\\b([\\s\\S]*?)\\bend\\b/)\r\n return m ? m[1].trim() : ''\r\n}\r\n\r\n// ─── CONDITION PARSING ────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Entry point for the when block. Returns the flat top-level condition list.\r\n * Top-level conditions are implicitly ANDed — each as a separate element.\r\n * An explicit top-level OR is wrapped in a single OrCondition element.\r\n */\r\nfunction parseConditions(when: string): Condition[] {\r\n const text = when.trim()\r\n if (!text) return []\r\n\r\n // Top-level OR — split into branches; surrounding spaces prevent word collision\r\n const orParts = splitAtDepth0(text, ' or ')\r\n if (orParts.length > 1) {\r\n return [{ kind: 'Or', conditions: orParts.map(p => parseAndGroup(p.trim())) }]\r\n }\r\n\r\n const result = parseAndGroup(text)\r\n // Unroll a top-level And so Rule.conditions stays flat\r\n return result.kind === 'And' ? result.conditions : [result]\r\n}\r\n\r\n/** Parses a group that may contain top-level 'and' or implicit line-break ANDs. */\r\nfunction parseAndGroup(text: string): Condition {\r\n const andParts = splitAndConditions(text)\r\n if (andParts.length === 1) return parseCondition(andParts[0])\r\n const conditions = andParts.map(parseCondition)\r\n return conditions.length === 1 ? conditions[0] : { kind: 'And', conditions }\r\n}\r\n\r\n/**\r\n * Splits a when block into individual condition strings.\r\n * Handles both explicit 'and' and implicit newline/whitespace separation.\r\n */\r\nfunction splitAndConditions(text: string): string[] {\r\n const byAnd = splitAtDepth0(text, ' and ')\r\n if (byAnd.length > 1) return byAnd.filter(p => p.trim().length > 0)\r\n\r\n // Fall back to newline separation, merging lines with unbalanced parens\r\n const lines = text.split('\\n').map(l => l.trim()).filter(l => l.length > 0)\r\n if (lines.length <= 1) return [text.trim()]\r\n\r\n const merged: string[] = []\r\n let current = ''\r\n let depth = 0\r\n\r\n for (const line of lines) {\r\n for (const ch of line) {\r\n if (ch === '(' || ch === '{') depth++\r\n else if (ch === ')' || ch === '}') depth--\r\n }\r\n current += (current ? ' ' : '') + line\r\n if (depth === 0) {\r\n merged.push(current.trim())\r\n current = ''\r\n }\r\n }\r\n if (current.trim()) merged.push(current.trim())\r\n return merged.filter(p => p.length > 0)\r\n}\r\n\r\n/** Routes a single condition string to the appropriate parser. */\r\nfunction parseCondition(raw: string): Condition {\r\n const text = raw.trim()\r\n\r\n // Parenthesised group — recurse into its contents\r\n if (text.startsWith('(') && text.endsWith(')')) {\r\n const inner = text.slice(1, -1).trim()\r\n const conditions = parseConditions(inner)\r\n return conditions.length === 1 ? conditions[0] : { kind: 'And', conditions }\r\n }\r\n\r\n if (/^not\\s*\\(/.test(text))\r\n return { kind: 'Not', condition: parseUnboundCondition(extractBalanced(text, '(', ')')) }\r\n\r\n if (/^not\\s+\\w/.test(text))\r\n return { kind: 'Not', condition: parseUnboundCondition(text.replace(/^not\\s+/, '').trim()) }\r\n\r\n if (/^exists\\s*\\(/.test(text))\r\n return { kind: 'Exists', condition: parseUnboundCondition(extractBalanced(text, '(', ')')) }\r\n\r\n if (/^forall\\s*\\(/.test(text))\r\n return { kind: 'Forall', condition: parseCondition(extractBalanced(text, '(', ')')) }\r\n\r\n if (/^accumulate\\s*\\(/.test(text))\r\n return parseAccumulate(text)\r\n\r\n if (/^eval\\s*\\(/.test(text))\r\n return { kind: 'Eval', expression: extractBalanced(text, '(', ')').trim() }\r\n\r\n const fromIdx = indexAtDepth0(text, ' from ')\r\n if (fromIdx !== -1)\r\n return parseFrom(text, fromIdx)\r\n\r\n if (/^(\\$\\w+\\s*:\\s*)?\\w[\\w.]*\\s*\\(/.test(text))\r\n return parseFactPattern(text)\r\n\r\n return { kind: 'RawCondition', drl: text }\r\n}\r\n\r\nfunction parseFactPattern(text: string): FactPattern {\r\n const m = text.match(/^(\\$\\w+\\s*:\\s*)?(\\w[\\w.]*)\\s*\\(([\\s\\S]*)\\)\\s*$/)\r\n if (!m) return { kind: 'FactPattern', factType: text, constraints: [] }\r\n const binding = m[1] ? m[1].replace(':', '').trim() : undefined\r\n const constraints = m[3].trim() ? parseConstraints(m[3].trim()) : []\r\n return { kind: 'FactPattern', factType: m[2].trim(), binding, constraints }\r\n}\r\n\r\n// Parses a condition inside not()/exists() — strips any binding since those\r\n// contexts forbid variable binding by Drools semantics.\r\nfunction parseUnboundCondition(text: string): import('../metamodel/types').UnboundPattern | import('../metamodel/types').EvalCondition | import('../metamodel/types').RawCondition {\r\n const trimmed = text.trim()\r\n if (/^eval\\s*\\(/.test(trimmed))\r\n return { kind: 'Eval', expression: extractBalanced(trimmed, '(', ')').trim() }\r\n const m = trimmed.match(/^(?:\\$\\w+\\s*:\\s*)?(\\w[\\w.]*)\\s*\\(([\\s\\S]*)\\)\\s*$/)\r\n if (m) {\r\n const constraints = m[2].trim() ? parseConstraints(m[2].trim()) : []\r\n return { kind: 'UnboundPattern', factType: m[1].trim(), constraints }\r\n }\r\n return { kind: 'RawCondition', drl: trimmed }\r\n}\r\n\r\nfunction parseConstraints(text: string): Constraint[] {\r\n return splitAtDepth0(text, ',')\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .map(parseConstraint)\r\n}\r\n\r\nfunction parseConstraint(text: string): Constraint {\r\n const s = text.trim()\r\n\r\n // Pure binding: $v : field (no operator)\r\n const bindingOnly = s.match(/^(\\$\\w+)\\s*:\\s*(\\w[\\w.]*)$/)\r\n if (bindingOnly)\r\n return { kind: 'BindingConstraint', binding: bindingOnly[1], field: bindingOnly[2] }\r\n\r\n // Longest-match operator scan to avoid 'not contains' being split as 'not'+'contains'\r\n const OPERATORS: ConstraintOperator[] = [\r\n 'not contains', 'not memberOf', 'not matches',\r\n 'contains', 'memberOf', 'matches',\r\n '==', '!=', '>=', '<=', '>', '<'\r\n ]\r\n for (const op of OPERATORS) {\r\n const idx = indexAtDepth0(s, op)\r\n if (idx === -1) continue\r\n const lhs = s.slice(0, idx).trim()\r\n const rhs = s.slice(idx + op.length).trim()\r\n const lhsMatch = lhs.match(/^(\\$\\w+)\\s*:\\s*(\\w[\\w.]*)$/)\r\n return {\r\n kind: 'FieldConstraint',\r\n field: lhsMatch ? lhsMatch[2] : lhs,\r\n operator: op,\r\n value: rhs,\r\n ...(lhsMatch && { binding: lhsMatch[1] })\r\n }\r\n }\r\n\r\n return { kind: 'RawConstraint', expression: s }\r\n}\r\n\r\nfunction parseAccumulate(text: string): AccumulatePattern {\r\n const inner = extractBalanced(text, '(', ')').trim()\r\n const parts = splitAtDepth0(inner, ';')\r\n const source: Condition = parts[0]\r\n ? parseCondition(parts[0].trim())\r\n : { kind: 'RawCondition', drl: '' }\r\n const functions: AccumulateFunction[] = []\r\n let resultConstraint: string | undefined\r\n\r\n for (let i = 1; i < parts.length; i++) {\r\n const part = parts[i].trim()\r\n const candidates = splitAtDepth0(part, ',')\r\n const parsed: AccumulateFunction[] = []\r\n let allFunctions = true\r\n\r\n for (const candidate of candidates) {\r\n const fn = candidate.trim().match(/^(\\$\\w+)\\s*:\\s*(\\w+)\\s*\\(([^)]*)\\)$/)\r\n if (fn) parsed.push({ binding: fn[1], function: fn[2], argument: fn[3].trim() })\r\n else { allFunctions = false; break }\r\n }\r\n\r\n if (allFunctions && parsed.length > 0) functions.push(...parsed)\r\n else resultConstraint = part\r\n }\r\n\r\n return { kind: 'Accumulate', source, functions, ...(resultConstraint && { resultConstraint }) }\r\n}\r\n\r\nfunction parseFrom(text: string, fromIdx: number): FromCondition {\r\n return {\r\n kind: 'From',\r\n pattern: parseFactPattern(text.slice(0, fromIdx).trim()),\r\n expression: text.slice(fromIdx + ' from '.length).trim()\r\n }\r\n}\r\n\r\n// ─── CONSEQUENCE PARSING ─────────────────────────────────────────────────────\r\n\r\nfunction parseConsequences(then: string): Consequence[] {\r\n const consequences: Consequence[] = []\r\n let remaining = then.trim()\r\n while (remaining.length > 0) {\r\n const result = parseNextConsequence(remaining)\r\n if (!result) break\r\n consequences.push(result.consequence)\r\n remaining = result.rest.trim()\r\n }\r\n return consequences\r\n}\r\n\r\nfunction parseNextConsequence(text: string): { consequence: Consequence; rest: string } | null {\r\n const t = text.trim()\r\n if (!t) return null\r\n\r\n // if (...) { ... } else { ... }\r\n if (/^if\\s*\\(/.test(t)) {\r\n const condition = extractBalanced(t, '(', ')')\r\n const afterCond = t.slice(t.indexOf('(') + condition.length + 2).trim()\r\n const thenBlock = extractBalanced(afterCond, '{', '}')\r\n const thenConsequences = parseConsequences(thenBlock)\r\n let afterThen = afterCond.slice(afterCond.indexOf('{') + thenBlock.length + 2).trim()\r\n let elseConsequences: IfConsequence['else']\r\n if (/^else\\s*\\{/.test(afterThen)) {\r\n const elseBlock = extractBalanced(afterThen, '{', '}')\r\n elseConsequences = parseConsequences(elseBlock)\r\n afterThen = afterThen.slice(afterThen.indexOf('{') + elseBlock.length + 2).trim()\r\n }\r\n return {\r\n consequence: { kind: 'IfConsequence', condition: condition.trim(), then: thenConsequences, ...(elseConsequences && { else: elseConsequences }) },\r\n rest: afterThen\r\n }\r\n }\r\n\r\n // modify( $binding ) { ... }\r\n if (/^modify\\s*\\(/.test(t)) {\r\n const m = t.match(/^modify\\s*\\(\\s*(\\$\\w+)\\s*\\)/)\r\n if (m) {\r\n const afterBinding = t.slice(m[0].length).trim()\r\n const block = extractBalanced(afterBinding, '{', '}')\r\n const endIdx = afterBinding.indexOf('{') + block.length + 2\r\n return {\r\n consequence: { kind: 'ModifyConsequence', binding: m[1], modifications: parseModifications(block) },\r\n rest: afterBinding.slice(endIdx)\r\n }\r\n }\r\n }\r\n\r\n // insert( ... );\r\n if (/^insert\\s*\\(/.test(t)) {\r\n const inner = extractBalanced(t, '(', ')')\r\n const rest = t.slice(t.indexOf('(') + inner.length + 2).replace(/^\\s*;/, '')\r\n return { consequence: { kind: 'InsertConsequence', objectExpression: inner.trim() }, rest }\r\n }\r\n\r\n // retract( $binding );\r\n if (/^retract\\s*\\(/.test(t)) {\r\n const inner = extractBalanced(t, '(', ')')\r\n const rest = t.slice(t.indexOf('(') + inner.length + 2).replace(/^\\s*;/, '')\r\n return { consequence: { kind: 'RetractConsequence', binding: inner.trim() }, rest }\r\n }\r\n\r\n // return expression; or bare return;\r\n if (/^return\\b/.test(t)) {\r\n const semiIdx = indexAtDepth0(t, ';')\r\n const expression = t.slice('return'.length, semiIdx !== -1 ? semiIdx : undefined).trim()\r\n return {\r\n consequence: { kind: 'ReturnConsequence', expression },\r\n rest: semiIdx !== -1 ? t.slice(semiIdx + 1) : ''\r\n }\r\n }\r\n\r\n // Any other statement ending with ;\r\n const semiIdx = indexAtDepth0(t, ';')\r\n if (semiIdx !== -1)\r\n return { consequence: { kind: 'RawConsequence', code: t.slice(0, semiIdx).trim() }, rest: t.slice(semiIdx + 1) }\r\n\r\n return { consequence: { kind: 'RawConsequence', code: t }, rest: '' }\r\n}\r\n\r\nfunction parseModifications(block: string): Modification[] {\r\n return splitAtDepth0(block, ',')\r\n .map(s => s.trim())\r\n .filter(Boolean)\r\n .map(text => {\r\n const m = text.match(/^(\\w+)\\s*\\(([\\s\\S]*)\\)$/)\r\n if (!m) return { method: text, args: [] }\r\n const args = m[2].trim() ? splitAtDepth0(m[2].trim(), ',').map(a => a.trim()) : []\r\n return { method: m[1], args }\r\n })\r\n}\r\n\r\n// ─── PUBLIC API ───────────────────────────────────────────────────────────────\r\n\r\nexport const DRLToMetaTransformer = {\r\n\r\n parse(drl: string): DroolsFile {\r\n const clean = stripComments(drl)\r\n return {\r\n name: 'parsed',\r\n imports: [...new Set(parseImports(clean))],\r\n globals: parseGlobals(clean),\r\n declarations: parseDeclarations(clean),\r\n functions: parseFunctions(clean),\r\n rules: extractRuleBlocks(clean).map(block => DRLToMetaTransformer.parseRule(block))\r\n }\r\n },\r\n\r\n parseRule(block: string): Rule {\r\n return {\r\n name: parseRuleName(block),\r\n ...parseRuleAttributes(block),\r\n conditions: parseConditions(extractWhenBlock(block)),\r\n consequences: parseConsequences(extractThenBlock(block))\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["Operator","Aggregate","resolveCondition","semiIdx"]}