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 +151 -8
- package/dist/index.d.cts +44 -1
- package/dist/index.d.ts +44 -1
- package/dist/index.js +151 -8
- package/package.json +45 -45
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
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*\{
|
|
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(
|
|
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*\
|
|
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*\{
|
|
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(
|
|
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*\
|
|
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.
|
|
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
|
+
}
|
package/dist/index.cjs.map
DELETED
|
@@ -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"]}
|