drools-builder 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/index.cjs +1018 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +543 -0
- package/dist/index.d.ts +543 -0
- package/dist/index.js +962 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rule-builder/builders/enums.ts","../src/rule-builder/builders/PatternBuilder.ts","../src/rule-builder/builders/AccumulateBuilder.ts","../src/rule-builder/builders/ModifyBuilder.ts","../src/rule-builder/builders/LHSBuilder.ts","../src/rule-builder/builders/RHSBuilder.ts","../src/rule-builder/builders/RuleBuilder.ts","../src/rule-builder/builders/DroolsFileBuilder.ts","../src/rule-builder/builders/index.ts","../src/rule-builder/parser/DRLToMetaTransformer.ts","../src/rule-builder/parser/MetaToDRLTransformer.ts"],"sourcesContent":["/**\n * Typed enum for every constraint operator supported by Drools.\n * Values are the exact DRL tokens, so an Operator member is directly\n * assignable to the ConstraintOperator string-literal union in types.ts.\n *\n * @example\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport enum Operator {\n Eq = '==',\n Neq = '!=',\n Gt = '>',\n Lt = '<',\n Gte = '>=',\n Lte = '<=',\n Contains = 'contains',\n NotContains = 'not contains',\n MemberOf = 'memberOf',\n NotMemberOf = 'not memberOf',\n Matches = 'matches',\n NotMatches = 'not matches',\n}\n\n/**\n * Typed enum for the built-in Drools accumulate functions.\n * Use these as the second argument to AccumulateBuilder.fn().\n *\n * @example\n * accumulate(fact('Transaction', '$tx'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n */\nexport enum Aggregate {\n Sum = 'sum',\n Count = 'count',\n Min = 'min',\n Max = 'max',\n Average = 'average',\n CollectList = 'collectList',\n CollectSet = 'collectSet',\n CountDistinct = 'countDistinct',\n}\n","import type { FactPattern, UnboundPattern, Constraint, ConstraintOperator } from '../metamodel/types'\n\n// ─── FactPattern builder ──────────────────────────────────────────────────────\n\n/**\n * Chainable builder for a FactPattern (a bound or unbound pattern in the LHS).\n *\n * Create via the fact() factory function:\n * fact('Player', '$p').field('score', Operator.Gte, '100')\n */\nexport class PatternBuilder {\n private readonly _factType: string\n private readonly _binding: string | undefined\n private readonly _constraints: Constraint[] = []\n\n constructor(factType: string, binding?: string) {\n this._factType = factType\n this._binding = binding\n }\n\n /**\n * Add a field constraint: field operator value.\n * Optionally binds the result to a variable: $v : field op value.\n */\n field(field: string, operator: ConstraintOperator, value: string, binding?: string): this {\n const constraint: Constraint = binding\n ? { kind: 'FieldConstraint', field, operator, value, binding }\n : { kind: 'FieldConstraint', field, operator, value }\n this._constraints.push(constraint)\n return this\n }\n\n /** Bind a field to a variable: $binding : field */\n bind(binding: string, field: string): this {\n this._constraints.push({ kind: 'BindingConstraint', binding, field })\n return this\n }\n\n /** Emit a verbatim DRL constraint expression. */\n raw(expression: string): this {\n this._constraints.push({ kind: 'RawConstraint', expression })\n return this\n }\n\n build(): FactPattern {\n return {\n kind: 'FactPattern',\n factType: this._factType,\n ...(this._binding !== undefined ? { binding: this._binding } : {}),\n constraints: [...this._constraints],\n }\n }\n}\n\n// ─── UnboundPattern builder ───────────────────────────────────────────────────\n\n/**\n * Chainable builder for an UnboundPattern (used inside not() and exists()\n * where Drools forbids variable bindings).\n *\n * Create via the unbound() factory function:\n * not(unbound('FraudAlert').field('status', Operator.Eq, '\"UNRESOLVED\"'))\n */\nexport class UnboundPatternBuilder {\n private readonly _factType: string\n private readonly _constraints: Constraint[] = []\n\n constructor(factType: string) {\n this._factType = factType\n }\n\n field(field: string, operator: ConstraintOperator, value: string): this {\n this._constraints.push({ kind: 'FieldConstraint', field, operator, value })\n return this\n }\n\n raw(expression: string): this {\n this._constraints.push({ kind: 'RawConstraint', expression })\n return this\n }\n\n build(): UnboundPattern {\n return {\n kind: 'UnboundPattern',\n factType: this._factType,\n constraints: [...this._constraints],\n }\n }\n}\n","import type { AccumulatePattern, AccumulateFunction, Condition } from '../metamodel/types'\nimport type { Aggregate } from './enums'\n\n/**\n * Chainable builder for an AccumulatePattern.\n *\n * Create via the accumulate() factory function:\n *\n * accumulate(fact('Transaction', '$tx').field('amount', Operator.Gt, '0'))\n * .fn('$total', Aggregate.Sum, '$tx.amount')\n * .resultConstraint('$total > 1000')\n */\nexport class AccumulateBuilder {\n private readonly _source: Condition\n private readonly _functions: AccumulateFunction[] = []\n private _resultConstraint?: string\n\n constructor(source: Condition) {\n this._source = source\n }\n\n /**\n * Register an accumulate function.\n * @param binding - the variable the result is bound to, e.g. '$total'\n * @param func - function name or Aggregate enum, e.g. Aggregate.Sum / 'collectList'\n * @param argument - the argument expression, e.g. '$tx.amount'\n */\n fn(binding: string, func: Aggregate | string, argument: string): this {\n this._functions.push({ binding, function: func, argument })\n return this\n }\n\n /** Optional result constraint applied to the accumulated value, e.g. '$total > 50' */\n resultConstraint(expression: string): this {\n this._resultConstraint = expression\n return this\n }\n\n build(): AccumulatePattern {\n return {\n kind: 'Accumulate',\n source: this._source,\n functions: [...this._functions],\n ...(this._resultConstraint !== undefined\n ? { resultConstraint: this._resultConstraint }\n : {}),\n }\n }\n}\n","import type { ModifyConsequence, Modification } from '../metamodel/types'\n\n/**\n * Chainable builder for a ModifyConsequence.\n *\n * Create via the modify() factory function:\n *\n * modify('$account')\n * .call('setStatus', 'Account.Status.FROZEN')\n * .call('setRemarks', '\"Frozen by rule\"')\n */\nexport class ModifyBuilder {\n private readonly _binding: string\n private readonly _modifications: Modification[] = []\n\n constructor(binding: string) {\n this._binding = binding\n }\n\n /** Call a setter/method on the bound fact with the given arguments. */\n call(method: string, ...args: string[]): this {\n this._modifications.push({ method, args })\n return this\n }\n\n build(): ModifyConsequence {\n return {\n kind: 'ModifyConsequence',\n binding: this._binding,\n modifications: [...this._modifications],\n }\n }\n}\n","import type {\n Condition,\n UnboundPattern,\n EvalCondition,\n RawCondition,\n} from '../metamodel/types'\nimport { PatternBuilder, UnboundPatternBuilder } from './PatternBuilder'\nimport { AccumulateBuilder } from './AccumulateBuilder'\n\n// ─── Internal helper ──────────────────────────────────────────────────────────\n\n/**\n * Restricted builder for the inner condition of not() and exists().\n * Drools only allows UnboundPattern, eval(), or raw DRL inside these wrappers.\n */\nclass InnerPatternBuilder {\n private _inner?: UnboundPattern | EvalCondition | RawCondition\n\n fact(factType: string, fn?: (p: UnboundPatternBuilder) => void): this {\n const b = new UnboundPatternBuilder(factType)\n fn?.(b)\n this._inner = b.build()\n return this\n }\n\n eval(expression: string): this {\n this._inner = { kind: 'Eval', expression }\n return this\n }\n\n raw(drl: string): this {\n this._inner = { kind: 'RawCondition', drl }\n return this\n }\n\n /** @internal */\n _build(): UnboundPattern | EvalCondition | RawCondition {\n if (!this._inner) throw new Error('not() / exists() block requires at least one condition')\n return this._inner\n }\n}\n\n// ─── LHSBuilder ───────────────────────────────────────────────────────────────\n\n/**\n * Imperative builder for the when-block of a rule.\n * Obtained via RuleBuilder.when(lhs => { ... }).\n *\n * Every method returns `this` for optional chaining.\n */\nexport class LHSBuilder {\n /** @internal collected conditions — consumed by RuleBuilder */\n readonly _conditions: Condition[] = []\n\n // ── Fact patterns ──────────────────────────────────────────────────────────\n\n /** Add a FactPattern with an optional variable binding. */\n fact(factType: string, binding: string, fn?: (p: PatternBuilder) => void): this\n fact(factType: string, fn?: (p: PatternBuilder) => void): this\n fact(\n factType: string,\n bindingOrFn?: string | ((p: PatternBuilder) => void),\n fn?: (p: PatternBuilder) => void,\n ): this {\n let binding: string | undefined\n let configureFn: ((p: PatternBuilder) => void) | undefined\n\n if (typeof bindingOrFn === 'string') {\n binding = bindingOrFn\n configureFn = fn\n } else {\n configureFn = bindingOrFn\n }\n\n const builder = new PatternBuilder(factType, binding)\n configureFn?.(builder)\n this._conditions.push(builder.build())\n return this\n }\n\n // ── Logical wrappers ───────────────────────────────────────────────────────\n\n /** Add a not() wrapper. Inner condition must be unbound (no variable binding). */\n not(fn: (b: InnerPatternBuilder) => void): this {\n const b = new InnerPatternBuilder()\n fn(b)\n this._conditions.push({ kind: 'Not', condition: b._build() })\n return this\n }\n\n /** Add an exists() wrapper. Inner condition must be unbound. */\n exists(fn: (b: InnerPatternBuilder) => void): this {\n const b = new InnerPatternBuilder()\n fn(b)\n this._conditions.push({ kind: 'Exists', condition: b._build() })\n return this\n }\n\n /** Add an or() group. Each child is added via the nested LHSBuilder. */\n or(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n this._conditions.push({ kind: 'Or', conditions: inner._conditions })\n return this\n }\n\n /** Add an and() group. Useful when composing nested boolean logic. */\n and(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n this._conditions.push({ kind: 'And', conditions: inner._conditions })\n return this\n }\n\n /** Add a forall() wrapper. */\n forall(fn: (lhs: LHSBuilder) => void): this {\n const inner = new LHSBuilder()\n fn(inner)\n const condition: Condition =\n inner._conditions.length === 1\n ? inner._conditions[0]\n : { kind: 'And', conditions: inner._conditions }\n this._conditions.push({ kind: 'Forall', condition })\n return this\n }\n\n // ── Accumulate ─────────────────────────────────────────────────────────────\n\n /**\n * Add an accumulate pattern.\n * @param sourceFn - builds the source condition (the pattern being accumulated)\n * @param fn - configures the accumulate functions and result constraint\n */\n accumulate(\n sourceFn: (lhs: LHSBuilder) => void,\n fn: (acc: AccumulateBuilder) => void,\n ): this {\n const sourceLhs = new LHSBuilder()\n sourceFn(sourceLhs)\n const source: Condition =\n sourceLhs._conditions.length === 1\n ? sourceLhs._conditions[0]\n : { kind: 'And', conditions: sourceLhs._conditions }\n const acc = new AccumulateBuilder(source)\n fn(acc)\n this._conditions.push(acc.build())\n return this\n }\n\n // ── From ───────────────────────────────────────────────────────────────────\n\n /**\n * Add a from condition: FactType( constraints ) from expression\n * @param factType - the type to match\n * @param binding - variable binding for the matched fact\n * @param expression - the source expression (collection, method call, etc.)\n * @param fn - optional constraint configuration\n */\n from(\n factType: string,\n binding: string,\n expression: string,\n fn?: (p: PatternBuilder) => void,\n ): this {\n const builder = new PatternBuilder(factType, binding)\n fn?.(builder)\n this._conditions.push({ kind: 'From', pattern: builder.build(), expression })\n return this\n }\n\n // ── Primitives ─────────────────────────────────────────────────────────────\n\n /** Add an eval() condition with a raw boolean expression. */\n eval(expression: string): this {\n this._conditions.push({ kind: 'Eval', expression })\n return this\n }\n\n /** Add a verbatim DRL condition, emitted as-is. */\n raw(drl: string): this {\n this._conditions.push({ kind: 'RawCondition', drl })\n return this\n }\n}\n","import type { Consequence } from '../metamodel/types'\nimport { ModifyBuilder } from './ModifyBuilder'\n\n/**\n * Imperative builder for the then-block of a rule.\n * Obtained via RuleBuilder.then(rhs => { ... }).\n */\nexport class RHSBuilder {\n /** @internal collected consequences — consumed by RuleBuilder */\n readonly _consequences: Consequence[] = []\n\n /** modify($binding) { ... } — calls setters on an existing fact. */\n modify(binding: string, fn: (m: ModifyBuilder) => void): this {\n const builder = new ModifyBuilder(binding)\n fn(builder)\n this._consequences.push(builder.build())\n return this\n }\n\n /** insert(objectExpression) — inserts a new fact into working memory. */\n insert(objectExpression: string): this {\n this._consequences.push({ kind: 'InsertConsequence', objectExpression })\n return this\n }\n\n /** retract($binding) — removes a fact from working memory. */\n retract(binding: string): this {\n this._consequences.push({ kind: 'RetractConsequence', binding })\n return this\n }\n\n /** Assign a value to a global variable. */\n global(expression: string): this {\n this._consequences.push({ kind: 'SetGlobalConsequence', expression })\n return this\n }\n\n /** Emit a verbatim DRL statement, emitted as-is. */\n raw(code: string): this {\n this._consequences.push({ kind: 'RawConsequence', code })\n return this\n }\n}\n","import type { Rule, Condition, Consequence } from '../metamodel/types'\nimport { LHSBuilder } from './LHSBuilder'\nimport { RHSBuilder } from './RHSBuilder'\n\ninterface Buildable<T> {\n build(): T\n}\n\nfunction resolveCondition(input: Condition | Buildable<Condition>): Condition {\n return typeof (input as Buildable<Condition>).build === 'function'\n ? (input as Buildable<Condition>).build()\n : (input as Condition)\n}\n\nfunction resolveConsequence(input: Consequence | Buildable<Consequence>): Consequence {\n return typeof (input as Buildable<Consequence>).build === 'function'\n ? (input as Buildable<Consequence>).build()\n : (input as Consequence)\n}\n\n/**\n * Fluent builder for a Drools Rule.\n *\n * Entry point: createRule(name)\n *\n * Two usage styles are supported and can be freely mixed:\n *\n * Style 1 — factory functions (composable, works well for complex rules):\n * createRule('Award Badge')\n * .salience(10)\n * .addCondition(fact('Player', '$p').field('score', Operator.Gte, '100'))\n * .addConsequence(modify('$p').call('awardBadge', '\"gold\"'))\n * .build()\n *\n * Style 2 — callback blocks (mirrors DRL when/then structure):\n * createRule('Award Badge')\n * .salience(10)\n * .when(lhs => {\n * lhs.fact('Player', '$p', p => p.field('score', Operator.Gte, '100'))\n * })\n * .then(rhs => {\n * rhs.modify('$p', m => m.call('awardBadge', '\"gold\"'))\n * })\n * .build()\n *\n * Plain metamodel objects are also accepted everywhere a builder is expected,\n * so hand-crafted conditions/consequences can be mixed freely with builders.\n */\nexport class RuleBuilder {\n private readonly _rule: Rule\n\n constructor(name: string) {\n this._rule = { name, conditions: [], consequences: [] }\n }\n\n // ── Rule attributes ────────────────────────────────────────────────────────\n\n salience(value: number): this {\n this._rule.salience = value\n return this\n }\n\n agendaGroup(value: string): this {\n this._rule.agendaGroup = value\n return this\n }\n\n /** Defaults to true when called without an argument. */\n noLoop(value = true): this {\n this._rule.noLoop = value\n return this\n }\n\n /** Defaults to true when called without an argument. */\n lockOnActive(value = true): this {\n this._rule.lockOnActive = value\n return this\n }\n\n ruleFlowGroup(value: string): this {\n this._rule.ruleFlowGroup = value\n return this\n }\n\n // ── Step-by-step style ─────────────────────────────────────────────────────\n\n /**\n * Append a single condition.\n * Accepts a plain Condition object or any builder that exposes build().\n */\n addCondition(condition: Condition | Buildable<Condition>): this {\n this._rule.conditions.push(resolveCondition(condition))\n return this\n }\n\n /**\n * Append a single consequence.\n * Accepts a plain Consequence object or any builder that exposes build().\n */\n addConsequence(consequence: Consequence | Buildable<Consequence>): this {\n this._rule.consequences.push(resolveConsequence(consequence))\n return this\n }\n\n // ── Callback block style ───────────────────────────────────────────────────\n\n /** Configure the when-block using an LHSBuilder. Appends to existing conditions. */\n when(fn: (lhs: LHSBuilder) => void): this {\n const lhs = new LHSBuilder()\n fn(lhs)\n this._rule.conditions.push(...lhs._conditions)\n return this\n }\n\n /** Configure the then-block using an RHSBuilder. Appends to existing consequences. */\n then(fn: (rhs: RHSBuilder) => void): this {\n const rhs = new RHSBuilder()\n fn(rhs)\n this._rule.consequences.push(...rhs._consequences)\n return this\n }\n\n // ── Terminal ───────────────────────────────────────────────────────────────\n\n build(): Rule {\n return {\n ...this._rule,\n conditions: [...this._rule.conditions],\n consequences: [...this._rule.consequences],\n }\n }\n}\n\n/** Create a new RuleBuilder for a rule with the given name. */\nexport function createRule(name: string): RuleBuilder {\n return new RuleBuilder(name)\n}\n","import type { DroolsFile, 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 _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 * 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 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 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 {\n AccumulateFunction, AccumulatePattern, AndCondition, Condition,\n Consequence, Constraint, ConstraintOperator, DroolsFile, FactPattern,\n FromCondition, Modification, Rule\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 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\n// ─── RULE-LEVEL PARSING ──────────────────────────────────────────────────────\n\nfunction parseRuleName(block: string): string {\n const m = block.match(/\\brule\\s+\"([^\"]+)\"/)\n return m ? m[1] : '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+true\\b/.test(attr)) attrs.noLoop = true\n if (/\\block-on-active\\s+true\\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 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 // 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 // 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: parseImports(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","import type { AndCondition, Condition, Consequence, Constraint, DroolsFile, 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 }\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 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"],"mappings":"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","names":["Operator","Aggregate","resolveCondition"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "drools-builder",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript library for building Drools rules programmatically",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/LucaFraMacera/drools-builder"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "./dist/index.cjs",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"require": {
|
|
21
|
+
"types": "./dist/index.d.cts",
|
|
22
|
+
"default": "./dist/index.cjs"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"prebuild": "vitest run",
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:coverage": "vitest run --coverage",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"prepublishOnly": "npm run build"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@vitest/coverage-v8": "^3.1.1",
|
|
41
|
+
"tsup": "^8.4.0",
|
|
42
|
+
"typescript": "^5.8.3",
|
|
43
|
+
"vitest": "^3.1.1"
|
|
44
|
+
}
|
|
45
|
+
}
|