drools-builder 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -616,6 +616,44 @@ ${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
+ ${indent} break;`;
647
+ });
648
+ if (cons.default && cons.default.length > 0) {
649
+ const defBody = cons.default.map((b) => `${indent} ${generateConsequence(b, indent + " ")}`).join("\n");
650
+ caseLines.push(`${indent} default:
651
+ ${defBody}`);
652
+ }
653
+ return `switch (${cons.expression}) {
654
+ ${caseLines.join("\n")}
655
+ ${indent}}`;
656
+ }
619
657
  case "IfConsequence": {
620
658
  const thenLines = cons.then.map((c) => `${indent} ${generateConsequence(c, indent + " ")}`).join("\n");
621
659
  if (cons.else && cons.else.length > 0) {
@@ -997,6 +1035,31 @@ function parseFrom(text, fromIdx) {
997
1035
  expression: text.slice(fromIdx + " from ".length).trim()
998
1036
  };
999
1037
  }
1038
+ function parseSwitchBody(body) {
1039
+ const cases = [];
1040
+ let defaultBody;
1041
+ const markers = [];
1042
+ const caseRe = /\bcase\s+([^:]+):/g;
1043
+ const defRe = /\bdefault\s*:/g;
1044
+ let m;
1045
+ while ((m = caseRe.exec(body)) !== null)
1046
+ markers.push({ index: m.index, headerLen: m[0].length, type: "case", value: m[1].trim() });
1047
+ while ((m = defRe.exec(body)) !== null)
1048
+ markers.push({ index: m.index, headerLen: m[0].length, type: "default" });
1049
+ markers.sort((a, b) => a.index - b.index);
1050
+ for (let i = 0; i < markers.length; i++) {
1051
+ const marker = markers[i];
1052
+ const contentStart = marker.index + marker.headerLen;
1053
+ const contentEnd = i + 1 < markers.length ? markers[i + 1].index : body.length;
1054
+ const raw = body.slice(contentStart, contentEnd).trim();
1055
+ const content = raw.replace(/\s*\bbreak\s*;\s*$/, "").trim();
1056
+ if (marker.type === "case")
1057
+ cases.push({ kind: "CaseConsequence", value: marker.value, body: parseConsequences(content) });
1058
+ else
1059
+ defaultBody = parseConsequences(content);
1060
+ }
1061
+ return { cases, ...defaultBody !== void 0 && { default: defaultBody } };
1062
+ }
1000
1063
  function parseConsequences(then) {
1001
1064
  const consequences = [];
1002
1065
  let remaining = then.trim();
@@ -1011,6 +1074,48 @@ function parseConsequences(then) {
1011
1074
  function parseNextConsequence(text) {
1012
1075
  const t = text.trim();
1013
1076
  if (!t) return null;
1077
+ if (/^while\s*\(/.test(t)) {
1078
+ const condition = extractBalanced(t, "(", ")");
1079
+ const afterCond = t.slice(t.indexOf("(") + condition.length + 2).trim();
1080
+ const body = extractBalanced(afterCond, "{", "}");
1081
+ const endIdx = afterCond.indexOf("{") + body.length + 2;
1082
+ return {
1083
+ consequence: { kind: "WhileConsequence", condition: condition.trim(), body: parseConsequences(body) },
1084
+ rest: afterCond.slice(endIdx)
1085
+ };
1086
+ }
1087
+ if (/^for\s*\(/.test(t)) {
1088
+ const header = extractBalanced(t, "(", ")");
1089
+ const afterHeader = t.slice(t.indexOf("(") + header.length + 2).trim();
1090
+ const body = extractBalanced(afterHeader, "{", "}");
1091
+ const endIdx = afterHeader.indexOf("{") + body.length + 2;
1092
+ const colonIdx = indexAtDepth0(header, ":");
1093
+ if (colonIdx !== -1 && indexAtDepth0(header, ";") === -1) {
1094
+ const parts = header.slice(0, colonIdx).trim().split(/\s+/);
1095
+ const varName = parts.pop();
1096
+ const typeName = parts.join(" ");
1097
+ return {
1098
+ consequence: { kind: "ForEachConsequence", typeName, varName, collection: header.slice(colonIdx + 1).trim(), body: parseConsequences(body) },
1099
+ rest: afterHeader.slice(endIdx)
1100
+ };
1101
+ } else {
1102
+ const parts = splitAtDepth0(header, ";");
1103
+ return {
1104
+ consequence: { kind: "ForConsequence", init: (parts[0] ?? "").trim(), condition: (parts[1] ?? "").trim(), update: (parts[2] ?? "").trim(), body: parseConsequences(body) },
1105
+ rest: afterHeader.slice(endIdx)
1106
+ };
1107
+ }
1108
+ }
1109
+ if (/^switch\s*\(/.test(t)) {
1110
+ const expression = extractBalanced(t, "(", ")");
1111
+ const afterExpr = t.slice(t.indexOf("(") + expression.length + 2).trim();
1112
+ const switchBody = extractBalanced(afterExpr, "{", "}");
1113
+ const endIdx = afterExpr.indexOf("{") + switchBody.length + 2;
1114
+ return {
1115
+ consequence: { kind: "SwitchConsequence", expression: expression.trim(), ...parseSwitchBody(switchBody) },
1116
+ rest: afterExpr.slice(endIdx)
1117
+ };
1118
+ }
1014
1119
  if (/^if\s*\(/.test(t)) {
1015
1120
  const condition = extractBalanced(t, "(", ")");
1016
1121
  const afterCond = t.slice(t.indexOf("(") + condition.length + 2).trim();
@@ -1 +1 @@
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"]}
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'\n\n// ─── CONSTRAINT GENERATION ───────────────────────────────────────────────────\n\nfunction generateConstraint(c: Constraint): string {\n switch (c.kind) {\n case 'FieldConstraint':\n return `${c.binding ? `${c.binding} : ` : ''}${c.field} ${c.operator} ${c.value}`\n case 'BindingConstraint':\n return `${c.binding} : ${c.field}`\n case 'RawConstraint':\n return c.expression\n }\n}\n\n// ─── CONDITION GENERATION ────────────────────────────────────────────────────\n\nfunction generateCondition(cond: Condition, indent = ' '): string {\n switch (cond.kind) {\n\n case 'FactPattern': {\n const binding = cond.binding ? `${cond.binding} : ` : ''\n const constraints = cond.constraints.map(generateConstraint).join(', ')\n return `${binding}${cond.factType}( ${constraints} )`\n }\n\n case 'UnboundPattern': {\n // No binding — used inside not() and forall() where binding is forbidden\n const constraints = cond.constraints.map(generateConstraint).join(', ')\n return `${cond.factType}( ${constraints} )`\n }\n\n case 'And': {\n const parts = cond.conditions.map(c => generateCondition(c, indent + ' '))\n return `( ${parts.join(`\\n${indent} and `)} )`\n }\n\n case 'Or': {\n const parts = cond.conditions.map(c => generateCondition(c, indent + ' '))\n return `( ${parts.join(`\\n${indent} or `)} )`\n }\n\n case 'Not':\n return `not( ${generateCondition(cond.condition, indent)} )`\n\n case 'Exists':\n return `exists( ${generateCondition(cond.condition, indent)} )`\n\n case 'Forall':\n return `forall( ${generateCondition(cond.condition, indent)} )`\n\n case 'Accumulate': {\n const source = generateCondition(cond.source, indent + ' ')\n const fns = cond.functions.map(f => `${f.binding} : ${f.function}( ${f.argument} )`).join(', ')\n const result = cond.resultConstraint ? `;\\n${indent} ${cond.resultConstraint}` : ''\n return `accumulate(\\n${indent} ${source};\\n${indent} ${fns}${result}\\n${indent})`\n }\n\n case 'From':\n return `${generateCondition(cond.pattern, indent)} from ${cond.expression}`\n\n case 'Eval':\n return `eval( ${cond.expression} )`\n\n case 'RawCondition':\n return cond.drl\n }\n}\n\n/**\n * Generates the when block from the top-level condition list.\n * Each condition on its own line (implicit AND).\n * A single AndCondition is unrolled into individual lines.\n */\nfunction generateWhenBlock(conditions: Condition[], indent = ' '): string {\n const flat = conditions.length === 1 && conditions[0].kind === 'And'\n ? (conditions[0] as AndCondition).conditions\n : conditions\n return flat.map(c => `${indent}${generateCondition(c, indent)}`).join('\\n')\n}\n\n// ─── CONSEQUENCE GENERATION ──────────────────────────────────────────────────\n\nfunction generateConsequence(cons: Consequence, indent = ' '): string {\n switch (cons.kind) {\n case 'ModifyConsequence': {\n const mods = cons.modifications\n .map(m => `${m.method}( ${m.args.join(', ')} )`)\n .join(`,\\n${indent} `)\n return `modify( ${cons.binding} ) {\\n${indent} ${mods}\\n${indent}}`\n }\n case 'InsertConsequence':\n return `insert( ${cons.objectExpression} );`\n case 'RetractConsequence':\n return `retract( ${cons.binding} );`\n case 'SetGlobalConsequence':\n return `${cons.expression};`\n case 'RawConsequence':\n return `${cons.code};`\n case 'ReturnConsequence':\n return cons.expression ? `return ${cons.expression};` : 'return;'\n\n case 'WhileConsequence': {\n const body = cons.body.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\n return `while (${cons.condition}) {\\n${body}\\n${indent}}`\n }\n\n case 'ForEachConsequence': {\n const body = cons.body.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\n return `for (${cons.typeName} ${cons.varName} : ${cons.collection}) {\\n${body}\\n${indent}}`\n }\n\n case 'ForConsequence': {\n const body = cons.body.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\n return `for (${cons.init}; ${cons.condition}; ${cons.update}) {\\n${body}\\n${indent}}`\n }\n\n case 'VarDeclConsequence':\n return `${cons.typeName} ${cons.name} = ${cons.value};`\n\n case 'MethodCallConsequence':\n return `${cons.object}.${cons.method}(${cons.args});`\n\n case 'SwitchConsequence': {\n const caseLines = cons.cases.map(c => {\n const body = c.body.map(b => `${indent} ${generateConsequence(b, indent + ' ')}`).join('\\n')\n return `${indent} case ${c.value}:\\n${body}\\n${indent} break;`\n })\n if (cons.default && cons.default.length > 0) {\n const defBody = cons.default.map(b => `${indent} ${generateConsequence(b, indent + ' ')}`).join('\\n')\n caseLines.push(`${indent} default:\\n${defBody}`)\n }\n return `switch (${cons.expression}) {\\n${caseLines.join('\\n')}\\n${indent}}`\n }\n\n case 'IfConsequence': {\n const thenLines = cons.then.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\n if (cons.else && cons.else.length > 0) {\n const elseLines = cons.else.map(c => `${indent} ${generateConsequence(c, indent + ' ')}`).join('\\n')\n return `if (${cons.condition}) {\\n${thenLines}\\n${indent}} else {\\n${elseLines}\\n${indent}}`\n }\n return `if (${cons.condition}) {\\n${thenLines}\\n${indent}}`\n }\n }\n}\n\n// ─── DECLARATION GENERATION ──────────────────────────────────────────────────\n\nfunction generateDeclaration(decl: ClassDeclaration): string {\n const attrs = decl.attributes.map(a => ` ${a.name} : ${a.type}`).join('\\n')\n return `declare ${decl.className}${attrs ? '\\n' + attrs + '\\n' : '\\n'}end`\n}\n\n// ─── FUNCTION GENERATION ─────────────────────────────────────────────────────\n\nfunction generateFunction(fn: FunctionDefinition, indent = ' '): string {\n const body = fn.body.map(c => `${indent}${generateConsequence(c, indent)}`).join('\\n')\n return `function ${fn.returnType} ${fn.name}(${fn.params}) {\\n${body}\\n}`\n}\n\n// ─── RULE GENERATION ─────────────────────────────────────────────────────────\n\nfunction generateRule(rule: Rule): string {\n const lines = [`rule \"${rule.name}\"`]\n if (rule.salience !== undefined) lines.push(` salience ${rule.salience}`)\n if (rule.agendaGroup !== undefined) lines.push(` agenda-group \"${rule.agendaGroup}\"`)\n if (rule.ruleFlowGroup !== undefined) lines.push(` ruleflow-group \"${rule.ruleFlowGroup}\"`)\n if (rule.noLoop) lines.push(' no-loop true')\n if (rule.lockOnActive) lines.push(' lock-on-active true')\n lines.push(' when')\n lines.push(generateWhenBlock(rule.conditions))\n lines.push(' then')\n lines.push(rule.consequences.map(c => ` ${generateConsequence(c)}`).join('\\n'))\n lines.push('end')\n return lines.join('\\n')\n}\n\n// ─── PUBLIC API ───────────────────────────────────────────────────────────────\n\nexport const MetaToDRLTransformer = {\n\n generate(file: DroolsFile): string {\n const sections: string[] = []\n if (file.imports.length > 0)\n sections.push(file.imports.map(i => `import ${i};`).join('\\n'))\n if (file.globals.length > 0)\n sections.push(file.globals.map(g => `global ${g.type} ${g.name};`).join('\\n'))\n if (file.declarations && file.declarations.length > 0)\n sections.push(file.declarations.map(d => generateDeclaration(d)).join('\\n\\n'))\n if (file.functions && file.functions.length > 0)\n sections.push(file.functions.map(fn => generateFunction(fn)).join('\\n\\n'))\n sections.push(file.rules.map(generateRule).join('\\n\\n'))\n return sections.join('\\n\\n')\n },\n\n generateRule(rule: Rule): string {\n return generateRule(rule)\n }\n}\n","import type {\n AccumulateFunction, AccumulatePattern, AndCondition, AttributeDeclaration,\n CaseConsequence, ClassDeclaration, Condition, Consequence, Constraint,\n ConstraintOperator, DroolsFile, FactPattern, FromCondition, FunctionDefinition,\n GlobalDefinition, IfConsequence, Modification, Rule\n // VarDeclConsequence and MethodCallConsequence are build-only — not parsed from DRL\n} from '../metamodel/types'\n\n// ─── LOW-LEVEL UTILITIES ─────────────────────────────────────────────────────\n\n/**\n * Returns the index of the first occurrence of `needle` in `text` that is\n * at parenthesis/brace/bracket depth 0 and not inside a string literal.\n */\nfunction indexAtDepth0(text: string, needle: string): number {\n let depth = 0\n let inString = false\n let quote = ''\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]\n\n if (inString) {\n if (ch === '\\\\') { i++; continue }\n if (ch === quote) inString = false\n continue\n }\n\n if (ch === '\"' || ch === \"'\") { inString = true; quote = ch; continue }\n if (ch === '(' || ch === '{' || ch === '[') { depth++; continue }\n if (ch === ')' || ch === '}' || ch === ']') { depth--; continue }\n\n if (depth === 0 && text.startsWith(needle, i)) return i\n }\n return -1\n}\n\n/**\n * Splits `text` at all depth-0 occurrences of `separator`.\n * Ignores occurrences inside nested parentheses/braces/brackets and string literals.\n */\nfunction splitAtDepth0(text: string, separator: string): string[] {\n const parts: string[] = []\n const sepLen = separator.length\n let depth = 0\n let inString = false\n let quote = ''\n let current = ''\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]\n\n if (inString) {\n if (ch === '\\\\') { current += ch + text[++i]; continue }\n if (ch === quote) inString = false\n current += ch\n continue\n }\n\n if (ch === '\"' || ch === \"'\") { inString = true; quote = ch; current += ch; continue }\n if (ch === '(' || ch === '{' || ch === '[') { depth++; current += ch; continue }\n if (ch === ')' || ch === '}' || ch === ']') { depth--; current += ch; continue }\n\n if (depth === 0 && text.startsWith(separator, i)) {\n parts.push(current.trim())\n current = ''\n i += sepLen - 1\n continue\n }\n\n current += ch\n }\n if (current.trim()) parts.push(current.trim())\n return parts.filter(p => p.length > 0)\n}\n\n/**\n * Extracts the content between the first matching open/close pair.\n * e.g. extractBalanced(\"foo(bar(baz))\", '(', ')') → \"bar(baz)\"\n */\nfunction extractBalanced(text: string, open: string, close: string): string {\n const start = text.indexOf(open)\n if (start === -1) return ''\n let depth = 0\n for (let i = start; i < text.length; i++) {\n if (text[i] === open) depth++\n else if (text[i] === close) {\n depth--\n if (depth === 0) return text.slice(start + 1, i)\n }\n }\n return text.slice(start + 1)\n}\n\n/** Strips single-line (//) and block (/* *\\/) comments from DRL. */\nfunction stripComments(drl: string): string {\n return drl\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replace(/\\/\\/[^\\n]*/g, '')\n}\n\n// ─── FILE-LEVEL PARSING ───────────────────────────────────────────────────────\n\nfunction parseImports(drl: string): string[] {\n const imports: string[] = []\n const re = /^\\s*import\\s+([^\\s;]+)\\s*;?/gm\n let m: RegExpExecArray | null\n while ((m = re.exec(drl)) !== null) imports.push(m[1].trim())\n return imports\n}\n\nfunction parseGlobals(drl: string): GlobalDefinition[] {\n const globals: GlobalDefinition[] = []\n const re = /^\\s*global\\s+(\\S+)\\s+(\\S+?)\\s*;?$/gm\n let m: RegExpExecArray | null\n while ((m = re.exec(drl)) !== null) globals.push({ type: m[1], name: m[2] })\n return globals\n}\n\nfunction extractRuleBlocks(drl: string): string[] {\n const blocks: string[] = []\n const re = /\\brule\\s+(?:\"[^\"]*\"|'[^']*')[\\s\\S]*?\\bend\\b/g\n let m: RegExpExecArray | null\n while ((m = re.exec(drl)) !== null) blocks.push(m[0])\n return blocks\n}\n\nfunction parseFunctions(drl: string): FunctionDefinition[] {\n const results: FunctionDefinition[] = []\n // Matches: function <returnType> <name>(<params>) { <body> }\n // ([^{}]*(?:\\{[^{}]*\\}[^{}]*)*) handles one level of nested braces (e.g. if blocks)\n const re = /\\bfunction\\s+([\\w<>?,\\s\\[\\]]+?)\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*\\{([^{}]*(?:\\{[^{}]*\\}[^{}]*)*)\\}/g\n let m: RegExpExecArray | null\n while ((m = re.exec(drl)) !== null) {\n results.push({\n returnType: m[1].trim(),\n name: m[2].trim(),\n params: m[3].trim(),\n body: parseConsequences(m[4].trim())\n })\n }\n return results\n}\n\nfunction parseDeclarations(drl: string): ClassDeclaration[] {\n const results: ClassDeclaration[] = []\n const re = /\\bdeclare\\s+(\\w+)\\s*([\\s\\S]*?)\\bend\\b/g\n let m: RegExpExecArray | null\n while ((m = re.exec(drl)) !== null) {\n const className = m[1].trim()\n const attributes: AttributeDeclaration[] = []\n const attrRe = /^\\s*(\\w+)\\s*:\\s*(\\S+)/gm\n let a: RegExpExecArray | null\n while ((a = attrRe.exec(m[2])) !== null) {\n attributes.push({ name: a[1].trim(), type: a[2].trim() })\n }\n results.push({ className, attributes })\n }\n return results\n}\n\n// ─── RULE-LEVEL PARSING ──────────────────────────────────────────────────────\n\nfunction parseRuleName(block: string): string {\n const m = block.match(/\\brule\\s+(?:\"([^\"]+)\"|'([^']+)')/)\n return m ? (m[1] ?? m[2]) : 'unknown'\n}\n\nfunction parseRuleAttributes(block: string): Partial<Rule> {\n const attrs: Partial<Rule> = {}\n const m = block.match(/\\brule\\s+(?:\"[^\"]+\"|'[^']+')\\s*([\\s\\S]*?)\\bwhen\\b/)\n if (!m) return attrs\n const attr = m[1]\n const salience = attr.match(/\\bsalience\\s+(-?\\d+)/)\n if (salience) attrs.salience = parseInt(salience[1], 10)\n if (!/\\bno-loop\\s+false\\b/.test(attr) && /\\bno-loop\\b/.test(attr)) attrs.noLoop = true\n if (!/\\block-on-active\\s+false\\b/.test(attr) && /\\block-on-active\\b/.test(attr)) attrs.lockOnActive = true\n const ag = attr.match(/\\bagenda-group\\s+\"([^\"]+)\"/)\n if (ag) attrs.agendaGroup = ag[1]\n const rfg = attr.match(/\\bruleflow-group\\s+\"([^\"]+)\"/)\n if (rfg) attrs.ruleFlowGroup = rfg[1]\n return attrs\n}\n\nfunction extractWhenBlock(block: string): string {\n const m = block.match(/\\bwhen\\b([\\s\\S]*?)\\bthen\\b/)\n return m ? m[1].trim() : ''\n}\n\nfunction extractThenBlock(block: string): string {\n const m = block.match(/\\bthen\\b([\\s\\S]*?)\\bend\\b/)\n return m ? m[1].trim() : ''\n}\n\n// ─── CONDITION PARSING ────────────────────────────────────────────────────────\n\n/**\n * Entry point for the when block. Returns the flat top-level condition list.\n * Top-level conditions are implicitly ANDed — each as a separate element.\n * An explicit top-level OR is wrapped in a single OrCondition element.\n */\nfunction parseConditions(when: string): Condition[] {\n const text = when.trim()\n if (!text) return []\n\n // Top-level OR — split into branches; surrounding spaces prevent word collision\n const orParts = splitAtDepth0(text, ' or ')\n if (orParts.length > 1) {\n return [{ kind: 'Or', conditions: orParts.map(p => parseAndGroup(p.trim())) }]\n }\n\n const result = parseAndGroup(text)\n // Unroll a top-level And so Rule.conditions stays flat\n return result.kind === 'And' ? result.conditions : [result]\n}\n\n/** Parses a group that may contain top-level 'and' or implicit line-break ANDs. */\nfunction parseAndGroup(text: string): Condition {\n const andParts = splitAndConditions(text)\n if (andParts.length === 1) return parseCondition(andParts[0])\n const conditions = andParts.map(parseCondition)\n return conditions.length === 1 ? conditions[0] : { kind: 'And', conditions }\n}\n\n/**\n * Splits a when block into individual condition strings.\n * Handles both explicit 'and' and implicit newline/whitespace separation.\n */\nfunction splitAndConditions(text: string): string[] {\n const byAnd = splitAtDepth0(text, ' and ')\n if (byAnd.length > 1) return byAnd.filter(p => p.trim().length > 0)\n\n // Fall back to newline separation, merging lines with unbalanced parens\n const lines = text.split('\\n').map(l => l.trim()).filter(l => l.length > 0)\n if (lines.length <= 1) return [text.trim()]\n\n const merged: string[] = []\n let current = ''\n let depth = 0\n\n for (const line of lines) {\n for (const ch of line) {\n if (ch === '(' || ch === '{') depth++\n else if (ch === ')' || ch === '}') depth--\n }\n current += (current ? ' ' : '') + line\n if (depth === 0) {\n merged.push(current.trim())\n current = ''\n }\n }\n if (current.trim()) merged.push(current.trim())\n return merged.filter(p => p.length > 0)\n}\n\n/** Routes a single condition string to the appropriate parser. */\nfunction parseCondition(raw: string): Condition {\n const text = raw.trim()\n\n // Parenthesised group — recurse into its contents\n if (text.startsWith('(') && text.endsWith(')')) {\n const inner = text.slice(1, -1).trim()\n const conditions = parseConditions(inner)\n return conditions.length === 1 ? conditions[0] : { kind: 'And', conditions }\n }\n\n if (/^not\\s*\\(/.test(text))\n return { kind: 'Not', condition: parseUnboundCondition(extractBalanced(text, '(', ')')) }\n\n if (/^not\\s+\\w/.test(text))\n return { kind: 'Not', condition: parseUnboundCondition(text.replace(/^not\\s+/, '').trim()) }\n\n if (/^exists\\s*\\(/.test(text))\n return { kind: 'Exists', condition: parseUnboundCondition(extractBalanced(text, '(', ')')) }\n\n if (/^forall\\s*\\(/.test(text))\n return { kind: 'Forall', condition: parseCondition(extractBalanced(text, '(', ')')) }\n\n if (/^accumulate\\s*\\(/.test(text))\n return parseAccumulate(text)\n\n if (/^eval\\s*\\(/.test(text))\n return { kind: 'Eval', expression: extractBalanced(text, '(', ')').trim() }\n\n const fromIdx = indexAtDepth0(text, ' from ')\n if (fromIdx !== -1)\n return parseFrom(text, fromIdx)\n\n if (/^(\\$\\w+\\s*:\\s*)?\\w[\\w.]*\\s*\\(/.test(text))\n return parseFactPattern(text)\n\n return { kind: 'RawCondition', drl: text }\n}\n\nfunction parseFactPattern(text: string): FactPattern {\n const m = text.match(/^(\\$\\w+\\s*:\\s*)?(\\w[\\w.]*)\\s*\\(([\\s\\S]*)\\)\\s*$/)\n if (!m) return { kind: 'FactPattern', factType: text, constraints: [] }\n const binding = m[1] ? m[1].replace(':', '').trim() : undefined\n const constraints = m[3].trim() ? parseConstraints(m[3].trim()) : []\n return { kind: 'FactPattern', factType: m[2].trim(), binding, constraints }\n}\n\n// Parses a condition inside not()/exists() — strips any binding since those\n// contexts forbid variable binding by Drools semantics.\nfunction parseUnboundCondition(text: string): import('../metamodel/types').UnboundPattern | import('../metamodel/types').EvalCondition | import('../metamodel/types').RawCondition {\n const trimmed = text.trim()\n if (/^eval\\s*\\(/.test(trimmed))\n return { kind: 'Eval', expression: extractBalanced(trimmed, '(', ')').trim() }\n const m = trimmed.match(/^(?:\\$\\w+\\s*:\\s*)?(\\w[\\w.]*)\\s*\\(([\\s\\S]*)\\)\\s*$/)\n if (m) {\n const constraints = m[2].trim() ? parseConstraints(m[2].trim()) : []\n return { kind: 'UnboundPattern', factType: m[1].trim(), constraints }\n }\n return { kind: 'RawCondition', drl: trimmed }\n}\n\nfunction parseConstraints(text: string): Constraint[] {\n return splitAtDepth0(text, ',')\n .map(s => s.trim())\n .filter(Boolean)\n .map(parseConstraint)\n}\n\nfunction parseConstraint(text: string): Constraint {\n const s = text.trim()\n\n // Pure binding: $v : field (no operator)\n const bindingOnly = s.match(/^(\\$\\w+)\\s*:\\s*(\\w[\\w.]*)$/)\n if (bindingOnly)\n return { kind: 'BindingConstraint', binding: bindingOnly[1], field: bindingOnly[2] }\n\n // Longest-match operator scan to avoid 'not contains' being split as 'not'+'contains'\n const OPERATORS: ConstraintOperator[] = [\n 'not contains', 'not memberOf', 'not matches',\n 'contains', 'memberOf', 'matches',\n '==', '!=', '>=', '<=', '>', '<'\n ]\n for (const op of OPERATORS) {\n const idx = indexAtDepth0(s, op)\n if (idx === -1) continue\n const lhs = s.slice(0, idx).trim()\n const rhs = s.slice(idx + op.length).trim()\n const lhsMatch = lhs.match(/^(\\$\\w+)\\s*:\\s*(\\w[\\w.]*)$/)\n return {\n kind: 'FieldConstraint',\n field: lhsMatch ? lhsMatch[2] : lhs,\n operator: op,\n value: rhs,\n ...(lhsMatch && { binding: lhsMatch[1] })\n }\n }\n\n return { kind: 'RawConstraint', expression: s }\n}\n\nfunction parseAccumulate(text: string): AccumulatePattern {\n const inner = extractBalanced(text, '(', ')').trim()\n const parts = splitAtDepth0(inner, ';')\n const source: Condition = parts[0]\n ? parseCondition(parts[0].trim())\n : { kind: 'RawCondition', drl: '' }\n const functions: AccumulateFunction[] = []\n let resultConstraint: string | undefined\n\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].trim()\n const candidates = splitAtDepth0(part, ',')\n const parsed: AccumulateFunction[] = []\n let allFunctions = true\n\n for (const candidate of candidates) {\n const fn = candidate.trim().match(/^(\\$\\w+)\\s*:\\s*(\\w+)\\s*\\(([^)]*)\\)$/)\n if (fn) parsed.push({ binding: fn[1], function: fn[2], argument: fn[3].trim() })\n else { allFunctions = false; break }\n }\n\n if (allFunctions && parsed.length > 0) functions.push(...parsed)\n else resultConstraint = part\n }\n\n return { kind: 'Accumulate', source, functions, ...(resultConstraint && { resultConstraint }) }\n}\n\nfunction parseFrom(text: string, fromIdx: number): FromCondition {\n return {\n kind: 'From',\n pattern: parseFactPattern(text.slice(0, fromIdx).trim()),\n expression: text.slice(fromIdx + ' from '.length).trim()\n }\n}\n\n// ─── CONSEQUENCE PARSING ─────────────────────────────────────────────────────\n\nfunction parseSwitchBody(body: string): { cases: CaseConsequence[], default?: Consequence[] } {\n const cases: CaseConsequence[] = []\n let defaultBody: Consequence[] | undefined\n\n // Collect positions of 'case VALUE:' and 'default:'\n const markers: Array<{ index: number; headerLen: number; type: 'case' | 'default'; value?: string }> = []\n const caseRe = /\\bcase\\s+([^:]+):/g\n const defRe = /\\bdefault\\s*:/g\n let m: RegExpExecArray | null\n\n while ((m = caseRe.exec(body)) !== null)\n markers.push({ index: m.index, headerLen: m[0].length, type: 'case', value: m[1].trim() })\n while ((m = defRe.exec(body)) !== null)\n markers.push({ index: m.index, headerLen: m[0].length, type: 'default' })\n\n markers.sort((a, b) => a.index - b.index)\n\n for (let i = 0; i < markers.length; i++) {\n const marker = markers[i]\n const contentStart = marker.index + marker.headerLen\n const contentEnd = i + 1 < markers.length ? markers[i + 1].index : body.length\n const raw = body.slice(contentStart, contentEnd).trim()\n const content = raw.replace(/\\s*\\bbreak\\s*;\\s*$/, '').trim()\n\n if (marker.type === 'case')\n cases.push({ kind: 'CaseConsequence', value: marker.value!, body: parseConsequences(content) })\n else\n defaultBody = parseConsequences(content)\n }\n\n return { cases, ...(defaultBody !== undefined && { default: defaultBody }) }\n}\n\nfunction parseConsequences(then: string): Consequence[] {\n const consequences: Consequence[] = []\n let remaining = then.trim()\n while (remaining.length > 0) {\n const result = parseNextConsequence(remaining)\n if (!result) break\n consequences.push(result.consequence)\n remaining = result.rest.trim()\n }\n return consequences\n}\n\nfunction parseNextConsequence(text: string): { consequence: Consequence; rest: string } | null {\n const t = text.trim()\n if (!t) return null\n\n // while (...) { ... }\n if (/^while\\s*\\(/.test(t)) {\n const condition = extractBalanced(t, '(', ')')\n const afterCond = t.slice(t.indexOf('(') + condition.length + 2).trim()\n const body = extractBalanced(afterCond, '{', '}')\n const endIdx = afterCond.indexOf('{') + body.length + 2\n return {\n consequence: { kind: 'WhileConsequence', condition: condition.trim(), body: parseConsequences(body) },\n rest: afterCond.slice(endIdx)\n }\n }\n\n // for (...) { ... } — enhanced for-each or classic for\n if (/^for\\s*\\(/.test(t)) {\n const header = extractBalanced(t, '(', ')')\n const afterHeader = t.slice(t.indexOf('(') + header.length + 2).trim()\n const body = extractBalanced(afterHeader, '{', '}')\n const endIdx = afterHeader.indexOf('{') + body.length + 2\n const colonIdx = indexAtDepth0(header, ':')\n if (colonIdx !== -1 && indexAtDepth0(header, ';') === -1) {\n // for-each: \"Type varName : collection\"\n const parts = header.slice(0, colonIdx).trim().split(/\\s+/)\n const varName = parts.pop()!\n const typeName = parts.join(' ')\n return {\n consequence: { kind: 'ForEachConsequence', typeName, varName, collection: header.slice(colonIdx + 1).trim(), body: parseConsequences(body) },\n rest: afterHeader.slice(endIdx)\n }\n } else {\n // regular for: \"init; condition; update\"\n const parts = splitAtDepth0(header, ';')\n return {\n consequence: { kind: 'ForConsequence', init: (parts[0] ?? '').trim(), condition: (parts[1] ?? '').trim(), update: (parts[2] ?? '').trim(), body: parseConsequences(body) },\n rest: afterHeader.slice(endIdx)\n }\n }\n }\n\n // switch (...) { case ...: ... default: ... }\n if (/^switch\\s*\\(/.test(t)) {\n const expression = extractBalanced(t, '(', ')')\n const afterExpr = t.slice(t.indexOf('(') + expression.length + 2).trim()\n const switchBody = extractBalanced(afterExpr, '{', '}')\n const endIdx = afterExpr.indexOf('{') + switchBody.length + 2\n return {\n consequence: { kind: 'SwitchConsequence', expression: expression.trim(), ...parseSwitchBody(switchBody) },\n rest: afterExpr.slice(endIdx)\n }\n }\n\n // if (...) { ... } else { ... }\n if (/^if\\s*\\(/.test(t)) {\n const condition = extractBalanced(t, '(', ')')\n const afterCond = t.slice(t.indexOf('(') + condition.length + 2).trim()\n const thenBlock = extractBalanced(afterCond, '{', '}')\n const thenConsequences = parseConsequences(thenBlock)\n let afterThen = afterCond.slice(afterCond.indexOf('{') + thenBlock.length + 2).trim()\n let elseConsequences: IfConsequence['else']\n if (/^else\\s*\\{/.test(afterThen)) {\n const elseBlock = extractBalanced(afterThen, '{', '}')\n elseConsequences = parseConsequences(elseBlock)\n afterThen = afterThen.slice(afterThen.indexOf('{') + elseBlock.length + 2).trim()\n }\n return {\n consequence: { kind: 'IfConsequence', condition: condition.trim(), then: thenConsequences, ...(elseConsequences && { else: elseConsequences }) },\n rest: afterThen\n }\n }\n\n // modify( $binding ) { ... }\n if (/^modify\\s*\\(/.test(t)) {\n const m = t.match(/^modify\\s*\\(\\s*(\\$\\w+)\\s*\\)/)\n if (m) {\n const afterBinding = t.slice(m[0].length).trim()\n const block = extractBalanced(afterBinding, '{', '}')\n const endIdx = afterBinding.indexOf('{') + block.length + 2\n return {\n consequence: { kind: 'ModifyConsequence', binding: m[1], modifications: parseModifications(block) },\n rest: afterBinding.slice(endIdx)\n }\n }\n }\n\n // insert( ... );\n if (/^insert\\s*\\(/.test(t)) {\n const inner = extractBalanced(t, '(', ')')\n const rest = t.slice(t.indexOf('(') + inner.length + 2).replace(/^\\s*;/, '')\n return { consequence: { kind: 'InsertConsequence', objectExpression: inner.trim() }, rest }\n }\n\n // retract( $binding );\n if (/^retract\\s*\\(/.test(t)) {\n const inner = extractBalanced(t, '(', ')')\n const rest = t.slice(t.indexOf('(') + inner.length + 2).replace(/^\\s*;/, '')\n return { consequence: { kind: 'RetractConsequence', binding: inner.trim() }, rest }\n }\n\n // return expression; or bare return;\n if (/^return\\b/.test(t)) {\n const semiIdx = indexAtDepth0(t, ';')\n const expression = t.slice('return'.length, semiIdx !== -1 ? semiIdx : undefined).trim()\n return {\n consequence: { kind: 'ReturnConsequence', expression },\n rest: semiIdx !== -1 ? t.slice(semiIdx + 1) : ''\n }\n }\n\n // Any other statement ending with ;\n const semiIdx = indexAtDepth0(t, ';')\n if (semiIdx !== -1)\n return { consequence: { kind: 'RawConsequence', code: t.slice(0, semiIdx).trim() }, rest: t.slice(semiIdx + 1) }\n\n return { consequence: { kind: 'RawConsequence', code: t }, rest: '' }\n}\n\nfunction parseModifications(block: string): Modification[] {\n return splitAtDepth0(block, ',')\n .map(s => s.trim())\n .filter(Boolean)\n .map(text => {\n const m = text.match(/^(\\w+)\\s*\\(([\\s\\S]*)\\)$/)\n if (!m) return { method: text, args: [] }\n const args = m[2].trim() ? splitAtDepth0(m[2].trim(), ',').map(a => a.trim()) : []\n return { method: m[1], args }\n })\n}\n\n// ─── PUBLIC API ───────────────────────────────────────────────────────────────\n\nexport const DRLToMetaTransformer = {\n\n parse(drl: string): DroolsFile {\n const clean = stripComments(drl)\n return {\n name: 'parsed',\n imports: [...new Set(parseImports(clean))],\n globals: parseGlobals(clean),\n declarations: parseDeclarations(clean),\n functions: parseFunctions(clean),\n rules: extractRuleBlocks(clean).map(block => DRLToMetaTransformer.parseRule(block))\n }\n },\n\n parseRule(block: string): Rule {\n return {\n name: parseRuleName(block),\n ...parseRuleAttributes(block),\n conditions: parseConditions(extractWhenBlock(block)),\n consequences: parseConsequences(extractThenBlock(block))\n }\n }\n}\n"],"mappings":"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","names":["Operator","Aggregate","resolveCondition","semiIdx"]}
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;