@f-o-t/rules-engine 3.0.0 → 3.0.5
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/analyzer/analysis.d.ts +72 -0
- package/dist/analyzer/analysis.d.ts.map +1 -0
- package/dist/builder/conditions.d.ts +29 -0
- package/dist/builder/conditions.d.ts.map +1 -0
- package/dist/builder/rule.d.ts +40 -0
- package/dist/builder/rule.d.ts.map +1 -0
- package/dist/cache/cache.d.ts +21 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/noop.d.ts +3 -0
- package/dist/cache/noop.d.ts.map +1 -0
- package/dist/core/evaluate.d.ts +21 -0
- package/dist/core/evaluate.d.ts.map +1 -0
- package/dist/core/filter.d.ts +8 -0
- package/dist/core/filter.d.ts.map +1 -0
- package/dist/core/group.d.ts +10 -0
- package/dist/core/group.d.ts.map +1 -0
- package/dist/core/sort.d.ts +14 -0
- package/dist/core/sort.d.ts.map +1 -0
- package/dist/engine/engine.d.ts +27 -0
- package/dist/engine/engine.d.ts.map +1 -0
- package/dist/engine/hooks.d.ts +16 -0
- package/dist/engine/hooks.d.ts.map +1 -0
- package/dist/engine/state.d.ts +19 -0
- package/dist/engine/state.d.ts.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3083 -0
- package/dist/index.js.map +37 -0
- package/dist/optimizer/index-builder.d.ts +48 -0
- package/dist/optimizer/index-builder.d.ts.map +1 -0
- package/dist/serialization/serializer.d.ts +79 -0
- package/dist/serialization/serializer.d.ts.map +1 -0
- package/dist/simulation/simulator.d.ts +65 -0
- package/dist/simulation/simulator.d.ts.map +1 -0
- package/dist/types/config.d.ts +87 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/consequence.d.ts +21 -0
- package/dist/types/consequence.d.ts.map +1 -0
- package/dist/types/evaluation.d.ts +70 -0
- package/dist/types/evaluation.d.ts.map +1 -0
- package/dist/types/rule.d.ts +114 -0
- package/dist/types/rule.d.ts.map +1 -0
- package/dist/types/state.d.ts +65 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/utils/conditions.d.ts +24 -0
- package/dist/utils/conditions.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +3 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/time.d.ts +8 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/validation/conflicts.d.ts +25 -0
- package/dist/validation/conflicts.d.ts.map +1 -0
- package/dist/validation/integrity.d.ts +38 -0
- package/dist/validation/integrity.d.ts.map +1 -0
- package/dist/validation/schema.d.ts +69 -0
- package/dist/validation/schema.d.ts.map +1 -0
- package/dist/versioning/version-store.d.ts +50 -0
- package/dist/versioning/version-store.d.ts.map +1 -0
- package/package.json +35 -31
- package/CHANGELOG.md +0 -168
- package/__tests__/builder.test.ts +0 -363
- package/__tests__/cache.test.ts +0 -130
- package/__tests__/config.test.ts +0 -35
- package/__tests__/engine.test.ts +0 -1213
- package/__tests__/evaluate.test.ts +0 -339
- package/__tests__/exports.test.ts +0 -30
- package/__tests__/filter-sort.test.ts +0 -303
- package/__tests__/integration.test.ts +0 -419
- package/__tests__/money-integration.test.ts +0 -149
- package/__tests__/validation.test.ts +0 -862
- package/biome.json +0 -39
- package/docs/MIGRATION-v3.md +0 -118
- package/fot.config.ts +0 -5
- package/src/analyzer/analysis.ts +0 -401
- package/src/builder/conditions.ts +0 -321
- package/src/builder/rule.ts +0 -192
- package/src/cache/cache.ts +0 -135
- package/src/cache/noop.ts +0 -20
- package/src/core/evaluate.ts +0 -185
- package/src/core/filter.ts +0 -85
- package/src/core/group.ts +0 -103
- package/src/core/sort.ts +0 -90
- package/src/engine/engine.ts +0 -462
- package/src/engine/hooks.ts +0 -235
- package/src/engine/state.ts +0 -322
- package/src/index.ts +0 -303
- package/src/optimizer/index-builder.ts +0 -381
- package/src/serialization/serializer.ts +0 -408
- package/src/simulation/simulator.ts +0 -359
- package/src/types/config.ts +0 -184
- package/src/types/consequence.ts +0 -38
- package/src/types/evaluation.ts +0 -87
- package/src/types/rule.ts +0 -112
- package/src/types/state.ts +0 -116
- package/src/utils/conditions.ts +0 -108
- package/src/utils/hash.ts +0 -30
- package/src/utils/id.ts +0 -6
- package/src/utils/time.ts +0 -42
- package/src/validation/conflicts.ts +0 -440
- package/src/validation/integrity.ts +0 -473
- package/src/validation/schema.ts +0 -386
- package/src/versioning/version-store.ts +0 -337
- package/tsconfig.json +0 -29
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Condition, type ConditionGroup } from "@f-o-t/condition-evaluator";
|
|
2
|
+
/**
|
|
3
|
+
* Collects all unique field names from a condition tree.
|
|
4
|
+
* Traverses nested condition groups recursively.
|
|
5
|
+
*/
|
|
6
|
+
export declare const collectConditionFields: (condition: ConditionGroup) => Set<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Collects all unique operators from a condition tree.
|
|
9
|
+
* Returns a map of operator to its type (e.g., "equals" -> "string").
|
|
10
|
+
*/
|
|
11
|
+
export declare const collectConditionOperators: (condition: ConditionGroup) => Map<string, Set<string>>;
|
|
12
|
+
/**
|
|
13
|
+
* Counts the total number of leaf conditions in a condition tree.
|
|
14
|
+
*/
|
|
15
|
+
export declare const countConditions: (condition: Condition | ConditionGroup) => number;
|
|
16
|
+
/**
|
|
17
|
+
* Calculates the maximum depth of a condition tree.
|
|
18
|
+
*/
|
|
19
|
+
export declare const calculateMaxDepth: (condition: Condition | ConditionGroup, currentDepth?: number) => number;
|
|
20
|
+
/**
|
|
21
|
+
* Counts the number of condition groups in a condition tree.
|
|
22
|
+
*/
|
|
23
|
+
export declare const countConditionGroups: (condition: Condition | ConditionGroup) => number;
|
|
24
|
+
//# sourceMappingURL=conditions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditions.d.ts","sourceRoot":"","sources":["../../src/utils/conditions.ts"],"names":[],"mappings":"AAAA,OAAO,EACJ,KAAK,SAAS,EACd,KAAK,cAAc,EAErB,MAAM,4BAA4B,CAAC;AAEpC;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAChC,WAAW,cAAc,KACzB,GAAG,CAAC,MAAM,CAeZ,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACnC,WAAW,cAAc,KACzB,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAiBzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GACzB,WAAW,SAAS,GAAG,cAAc,KACrC,MAQF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC3B,WAAW,SAAS,GAAG,cAAc,EACrC,qBAAgB,KAChB,MAaF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC9B,WAAW,SAAS,GAAG,cAAc,KACrC,MAYF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,GAAI,SAAS,OAAO,KAAG,MAyB9C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,SAAS,aAAa,CAAC,MAAM,CAAC,KAAG,MAE1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,QAAO,MAK7B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type TimingResult<T> = {
|
|
2
|
+
readonly result: T;
|
|
3
|
+
readonly durationMs: number;
|
|
4
|
+
};
|
|
5
|
+
export declare const measureTime: <T>(fn: () => T) => TimingResult<T>;
|
|
6
|
+
export declare const measureTimeAsync: <T>(fn: () => Promise<T>) => Promise<TimingResult<T>>;
|
|
7
|
+
export declare const withTimeout: <T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string) => Promise<T>;
|
|
8
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,YAAY,CAAC,CAAC,CAK1D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,CAAC,EACrC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAKzB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,EAC1B,SAAS,OAAO,CAAC,CAAC,CAAC,EACnB,WAAW,MAAM,EACjB,qBAAoC,KACpC,OAAO,CAAC,CAAC,CAgBX,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ConsequenceDefinitions, DefaultConsequences } from "../types/consequence";
|
|
2
|
+
import type { Rule } from "../types/rule";
|
|
3
|
+
export type ConflictType = "DUPLICATE_ID" | "DUPLICATE_CONDITIONS" | "OVERLAPPING_CONDITIONS" | "CONTRADICTORY_CONSEQUENCES" | "PRIORITY_COLLISION" | "UNREACHABLE_RULE";
|
|
4
|
+
export type Conflict<TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences> = {
|
|
5
|
+
readonly type: ConflictType;
|
|
6
|
+
readonly severity: "error" | "warning" | "info";
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly ruleIds: ReadonlyArray<string>;
|
|
9
|
+
readonly rules: ReadonlyArray<Rule<TContext, TConsequences>>;
|
|
10
|
+
readonly details?: Readonly<Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
export type ConflictDetectionOptions = {
|
|
13
|
+
readonly checkDuplicateIds?: boolean;
|
|
14
|
+
readonly checkDuplicateConditions?: boolean;
|
|
15
|
+
readonly checkOverlappingConditions?: boolean;
|
|
16
|
+
readonly checkPriorityCollisions?: boolean;
|
|
17
|
+
readonly checkUnreachableRules?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare const detectConflicts: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>, options?: ConflictDetectionOptions) => ReadonlyArray<Conflict<TContext, TConsequences>>;
|
|
20
|
+
export declare const hasConflicts: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>, options?: ConflictDetectionOptions) => boolean;
|
|
21
|
+
export declare const hasErrors: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>, options?: ConflictDetectionOptions) => boolean;
|
|
22
|
+
export declare const getConflictsByType: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(conflicts: ReadonlyArray<Conflict<TContext, TConsequences>>, type: ConflictType) => ReadonlyArray<Conflict<TContext, TConsequences>>;
|
|
23
|
+
export declare const getConflictsBySeverity: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(conflicts: ReadonlyArray<Conflict<TContext, TConsequences>>, severity: "error" | "warning" | "info") => ReadonlyArray<Conflict<TContext, TConsequences>>;
|
|
24
|
+
export declare const formatConflicts: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(conflicts: ReadonlyArray<Conflict<TContext, TConsequences>>) => string;
|
|
25
|
+
//# sourceMappingURL=conflicts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/validation/conflicts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ConsequenceDefinitions, DefaultConsequences } from "../types/consequence";
|
|
2
|
+
import type { Rule, RuleSet } from "../types/rule";
|
|
3
|
+
export type IntegrityIssue = {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly message: string;
|
|
6
|
+
readonly severity: "error" | "warning" | "info";
|
|
7
|
+
readonly path?: string;
|
|
8
|
+
readonly ruleId?: string;
|
|
9
|
+
readonly details?: Readonly<Record<string, unknown>>;
|
|
10
|
+
};
|
|
11
|
+
export type IntegrityCheckResult = {
|
|
12
|
+
readonly valid: boolean;
|
|
13
|
+
readonly issues: ReadonlyArray<IntegrityIssue>;
|
|
14
|
+
};
|
|
15
|
+
export type IntegrityCheckOptions = {
|
|
16
|
+
readonly checkCircularReferences?: boolean;
|
|
17
|
+
readonly checkOrphanedRuleSets?: boolean;
|
|
18
|
+
readonly checkMissingReferences?: boolean;
|
|
19
|
+
readonly checkFieldConsistency?: boolean;
|
|
20
|
+
readonly requiredFields?: ReadonlyArray<string>;
|
|
21
|
+
readonly allowedCategories?: ReadonlyArray<string>;
|
|
22
|
+
readonly allowedTags?: ReadonlyArray<string>;
|
|
23
|
+
};
|
|
24
|
+
export declare const checkIntegrity: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>, ruleSets?: ReadonlyArray<RuleSet>, options?: IntegrityCheckOptions) => IntegrityCheckResult;
|
|
25
|
+
export declare const checkRuleFieldCoverage: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>, expectedFields: ReadonlyArray<string>) => {
|
|
26
|
+
coveredFields: ReadonlyArray<string>;
|
|
27
|
+
uncoveredFields: ReadonlyArray<string>;
|
|
28
|
+
extraFields: ReadonlyArray<string>;
|
|
29
|
+
coveragePercentage: number;
|
|
30
|
+
};
|
|
31
|
+
export declare const getUsedFields: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>) => ReadonlyArray<string>;
|
|
32
|
+
export declare const getUsedOperators: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<Rule<TContext, TConsequences>>) => ReadonlyArray<{
|
|
33
|
+
field: string;
|
|
34
|
+
operator: string;
|
|
35
|
+
type: string;
|
|
36
|
+
}>;
|
|
37
|
+
export declare const formatIntegrityResult: (result: IntegrityCheckResult) => string;
|
|
38
|
+
//# sourceMappingURL=integrity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../../src/validation/integrity.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACT,sBAAsB,EACtB,mBAAmB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACjC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC/C,CAAC;AAqSF,eAAO,MAAM,cAAc,GACxB,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,EACnD,WAAU,aAAa,CAAC,OAAO,CAAM,EACrC,UAAS,qBAA0B,KACnC,oBAoBF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAChC,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,EACnD,gBAAgB,aAAa,CAAC,MAAM,CAAC,KACrC;IACA,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC;CAyB7B,CAAC;AAEF,eAAO,MAAM,aAAa,GACvB,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,KACnD,aAAa,CAAC,MAAM,CAWtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC1B,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,KACnD,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4BjE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,QAAQ,oBAAoB,KAAG,MA2BpE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type ConditionGroup } from "@f-o-t/condition-evaluator";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { ConsequenceDefinitions, DefaultConsequences } from "../types/consequence";
|
|
4
|
+
import { type Rule } from "../types/rule";
|
|
5
|
+
export declare const ValidationErrorSchema: z.ZodObject<{
|
|
6
|
+
path: z.ZodString;
|
|
7
|
+
message: z.ZodString;
|
|
8
|
+
code: z.ZodString;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type ValidationError = z.infer<typeof ValidationErrorSchema>;
|
|
11
|
+
export declare const ValidationResultSchema: z.ZodObject<{
|
|
12
|
+
valid: z.ZodBoolean;
|
|
13
|
+
errors: z.ZodArray<z.ZodObject<{
|
|
14
|
+
path: z.ZodString;
|
|
15
|
+
message: z.ZodString;
|
|
16
|
+
code: z.ZodString;
|
|
17
|
+
}, z.core.$strip>>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type ValidationResult = z.infer<typeof ValidationResultSchema>;
|
|
20
|
+
export declare const ValidationOptionsSchema: z.ZodObject<{
|
|
21
|
+
validateConditions: z.ZodOptional<z.ZodBoolean>;
|
|
22
|
+
validateConsequences: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
strictMode: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export type ValidationOptions = z.infer<typeof ValidationOptionsSchema>;
|
|
26
|
+
export type ResolvedValidationOptions = {
|
|
27
|
+
validateConditions: boolean;
|
|
28
|
+
validateConsequences: boolean;
|
|
29
|
+
strictMode: boolean;
|
|
30
|
+
};
|
|
31
|
+
export declare const validateRule: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rule: unknown, options?: ValidationOptions & {
|
|
32
|
+
consequenceSchemas?: TConsequences;
|
|
33
|
+
}) => ValidationResult;
|
|
34
|
+
export declare const validateRules: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rules: ReadonlyArray<unknown>, options?: ValidationOptions & {
|
|
35
|
+
consequenceSchemas?: TConsequences;
|
|
36
|
+
}) => ValidationResult;
|
|
37
|
+
export declare const validateRuleSet: (ruleSet: unknown) => ValidationResult;
|
|
38
|
+
export declare const validateConditions: (conditions: ConditionGroup) => ValidationResult;
|
|
39
|
+
export declare const parseRule: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rule: unknown, options?: ValidationOptions & {
|
|
40
|
+
consequenceSchemas?: TConsequences;
|
|
41
|
+
}) => Rule<TContext, TConsequences>;
|
|
42
|
+
export declare const safeParseRule: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(rule: unknown, options?: ValidationOptions & {
|
|
43
|
+
consequenceSchemas?: TConsequences;
|
|
44
|
+
}) => {
|
|
45
|
+
success: true;
|
|
46
|
+
data: Rule<TContext, TConsequences>;
|
|
47
|
+
} | {
|
|
48
|
+
success: false;
|
|
49
|
+
errors: ReadonlyArray<ValidationError>;
|
|
50
|
+
};
|
|
51
|
+
export declare const createRuleValidator: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(consequenceSchemas: TConsequences, defaultOptions?: ValidationOptions) => {
|
|
52
|
+
validate: (rule: unknown, options?: ValidationOptions) => {
|
|
53
|
+
valid: boolean;
|
|
54
|
+
errors: {
|
|
55
|
+
path: string;
|
|
56
|
+
message: string;
|
|
57
|
+
code: string;
|
|
58
|
+
}[];
|
|
59
|
+
};
|
|
60
|
+
parse: (rule: unknown, options?: ValidationOptions) => Rule<TContext, TConsequences>;
|
|
61
|
+
safeParse: (rule: unknown, options?: ValidationOptions) => {
|
|
62
|
+
success: false;
|
|
63
|
+
errors: ReadonlyArray<ValidationError>;
|
|
64
|
+
} | {
|
|
65
|
+
success: true;
|
|
66
|
+
data: Rule<TContext, TConsequences>;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/validation/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAEJ,KAAK,cAAc,EAErB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACT,sBAAsB,EACtB,mBAAmB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,IAAI,EAA6B,MAAM,eAAe,CAAC;AAMrE,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,sBAAsB;;;;;;;iBAGjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB;;;;iBAIlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAGxE,MAAM,MAAM,yBAAyB,GAAG;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;CACtB,CAAC;AAsLF,eAAO,MAAM,YAAY,GACtB,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,MAAM,OAAO,EACb,UAAS,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,aAAa,CAAA;CAAO,KACxE,gBAyCF,CAAC;AAEF,eAAO,MAAM,aAAa,GACvB,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,OAAO,aAAa,CAAC,OAAO,CAAC,EAC7B,UAAS,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,aAAa,CAAA;CAAO,KACxE,gBAmBF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,OAAO,KAAG,gBAkBlD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC5B,YAAY,cAAc,KAC1B,gBAGF,CAAC;AAEF,eAAO,MAAM,SAAS,GACnB,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,MAAM,OAAO,EACb,UAAS,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,aAAa,CAAA;CAAO,KACxE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAQ9B,CAAC;AAEF,eAAO,MAAM,aAAa,GACvB,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,MAAM,OAAO,EACb,UAAS,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,aAAa,CAAA;CAAO,KAEtE;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;CAAE,GACtD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,CAAA;CAM5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC7B,QAAQ,GAAG,OAAO,EAClB,aAAa,SAAS,sBAAsB,GAAG,mBAAmB,EAElE,oBAAoB,aAAa,EACjC,iBAAgB,iBAAsB;qBAGlB,OAAO,YAAW,iBAAiB;;;;;;;;kBAMtC,OAAO,YAAW,iBAAiB;sBAM/B,OAAO,YAAW,iBAAiB;iBA5B3C,KAAK;gBAAU,aAAa,CAAC,eAAe,CAAC;;iBAD7C,IAAI;;;CAoCnB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ConsequenceDefinitions, DefaultConsequences } from "../types/consequence";
|
|
2
|
+
import type { Rule } from "../types/rule";
|
|
3
|
+
export type RuleVersion<TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences> = {
|
|
4
|
+
readonly versionId: string;
|
|
5
|
+
readonly ruleId: string;
|
|
6
|
+
readonly version: number;
|
|
7
|
+
readonly rule: Rule<TContext, TConsequences>;
|
|
8
|
+
readonly createdAt: Date;
|
|
9
|
+
readonly createdBy?: string;
|
|
10
|
+
readonly comment?: string;
|
|
11
|
+
readonly changeType: "create" | "update" | "delete" | "enable" | "disable";
|
|
12
|
+
};
|
|
13
|
+
export type VersionHistory<TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences> = {
|
|
14
|
+
readonly ruleId: string;
|
|
15
|
+
readonly currentVersion: number;
|
|
16
|
+
readonly versions: ReadonlyArray<RuleVersion<TContext, TConsequences>>;
|
|
17
|
+
};
|
|
18
|
+
export type VersionStore<TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences> = {
|
|
19
|
+
readonly histories: ReadonlyMap<string, VersionHistory<TContext, TConsequences>>;
|
|
20
|
+
};
|
|
21
|
+
export declare const createVersionStore: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>() => VersionStore<TContext, TConsequences>;
|
|
22
|
+
export declare const addVersion: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, rule: Rule<TContext, TConsequences>, changeType: RuleVersion<TContext, TConsequences>["changeType"], options?: {
|
|
23
|
+
createdBy?: string;
|
|
24
|
+
comment?: string;
|
|
25
|
+
}) => VersionStore<TContext, TConsequences>;
|
|
26
|
+
export declare const getHistory: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, ruleId: string) => VersionHistory<TContext, TConsequences> | undefined;
|
|
27
|
+
export declare const getVersion: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, ruleId: string, version: number) => RuleVersion<TContext, TConsequences> | undefined;
|
|
28
|
+
export declare const getLatestVersion: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, ruleId: string) => RuleVersion<TContext, TConsequences> | undefined;
|
|
29
|
+
export declare const getAllVersions: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, ruleId: string) => ReadonlyArray<RuleVersion<TContext, TConsequences>>;
|
|
30
|
+
export declare const rollbackToVersion: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, ruleId: string, targetVersion: number, options?: {
|
|
31
|
+
createdBy?: string;
|
|
32
|
+
comment?: string;
|
|
33
|
+
}) => {
|
|
34
|
+
store: VersionStore<TContext, TConsequences>;
|
|
35
|
+
rule: Rule<TContext, TConsequences> | undefined;
|
|
36
|
+
};
|
|
37
|
+
export declare const compareVersions: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, ruleId: string, version1: number, version2: number) => {
|
|
38
|
+
version1: RuleVersion<TContext, TConsequences> | undefined;
|
|
39
|
+
version2: RuleVersion<TContext, TConsequences> | undefined;
|
|
40
|
+
differences: ReadonlyArray<{
|
|
41
|
+
field: string;
|
|
42
|
+
oldValue: unknown;
|
|
43
|
+
newValue: unknown;
|
|
44
|
+
}>;
|
|
45
|
+
} | null;
|
|
46
|
+
export declare const getVersionsByDateRange: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, startDate: Date, endDate: Date) => ReadonlyArray<RuleVersion<TContext, TConsequences>>;
|
|
47
|
+
export declare const getVersionsByChangeType: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, changeType: RuleVersion<TContext, TConsequences>["changeType"]) => ReadonlyArray<RuleVersion<TContext, TConsequences>>;
|
|
48
|
+
export declare const pruneOldVersions: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(store: VersionStore<TContext, TConsequences>, keepCount: number) => VersionStore<TContext, TConsequences>;
|
|
49
|
+
export declare const formatVersionHistory: <TContext = unknown, TConsequences extends ConsequenceDefinitions = DefaultConsequences>(history: VersionHistory<TContext, TConsequences>) => string;
|
|
50
|
+
//# sourceMappingURL=version-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-store.d.ts","sourceRoot":"","sources":["../../src/versioning/version-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,33 +1,37 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
2
|
+
"name": "@f-o-t/rules-engine",
|
|
3
|
+
"version": "3.0.5",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"dist"
|
|
7
|
+
],
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "bun x --bun fot build",
|
|
18
|
+
"test": "bun x --bun fot test",
|
|
19
|
+
"lint": "bun x --bun fot lint",
|
|
20
|
+
"format": "bun x --bun fot format",
|
|
21
|
+
"typecheck": "bun x --bun fot typecheck"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@f-o-t/condition-evaluator": "^2.0.2",
|
|
25
|
+
"zod": "^4.3.6"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@f-o-t/cli": "^1.0.0",
|
|
29
|
+
"@f-o-t/config": "^1.0.0",
|
|
30
|
+
"@types/bun": "latest"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/F-O-T/libraries.git",
|
|
35
|
+
"directory": "libraries/rules-engine"
|
|
36
|
+
}
|
|
33
37
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [3.0.0] - 2026-01-31
|
|
9
|
-
|
|
10
|
-
### ⚠️ BREAKING CHANGES
|
|
11
|
-
|
|
12
|
-
- Engine now requires `evaluator` or `operators` configuration
|
|
13
|
-
- `evaluateRule()` function signature changed to accept evaluator parameter
|
|
14
|
-
- `evaluateRules()` function signature changed to accept evaluator parameter
|
|
15
|
-
|
|
16
|
-
### 🎉 Features
|
|
17
|
-
|
|
18
|
-
- **Custom operators support**: Use custom operators from any library (e.g., `@f-o-t/money/operators`)
|
|
19
|
-
- **Plugin system integration**: Full integration with `@f-o-t/condition-evaluator` plugin system
|
|
20
|
-
- **Better extensibility**: Easily compose multiple operator sets
|
|
21
|
-
- **Type-safe operators**: Better TypeScript support for custom operator types
|
|
22
|
-
|
|
23
|
-
### 📚 Documentation
|
|
24
|
-
|
|
25
|
-
- Added migration guide for v2 → v3
|
|
26
|
-
- Updated README with custom operator examples
|
|
27
|
-
- Added examples for money operators integration
|
|
28
|
-
|
|
29
|
-
### 🔧 Migration
|
|
30
|
-
|
|
31
|
-
See [MIGRATION-v3.md](./docs/MIGRATION-v3.md) for detailed migration instructions.
|
|
32
|
-
|
|
33
|
-
**Quick migration:**
|
|
34
|
-
```typescript
|
|
35
|
-
// Before (v2.x)
|
|
36
|
-
const engine = createEngine({ consequences: MyConsequences });
|
|
37
|
-
|
|
38
|
-
// After (v3.x)
|
|
39
|
-
const engine = createEngine({
|
|
40
|
-
consequences: MyConsequences,
|
|
41
|
-
evaluator: createEvaluator() // Add this
|
|
42
|
-
});
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## [2.0.2] - 2026-01-25
|
|
48
|
-
|
|
49
|
-
### Changed
|
|
50
|
-
|
|
51
|
-
- Updated dependencies to latest versions
|
|
52
|
-
|
|
53
|
-
## [2.0.1] - 2025-12-31
|
|
54
|
-
|
|
55
|
-
### Changed
|
|
56
|
-
|
|
57
|
-
- Removed unused imports and dead code
|
|
58
|
-
- Removed unused `ConditionGroup` type import from index-builder
|
|
59
|
-
- Removed unused `ConflictResolutionStrategySchema` import from config types
|
|
60
|
-
- Removed unused `_cacheStats` variable from engine stats
|
|
61
|
-
- Removed unused `_collectAllConditionIds` helper function from integrity validation
|
|
62
|
-
|
|
63
|
-
## [2.0.0] - 2025-12-24
|
|
64
|
-
|
|
65
|
-
### Added
|
|
66
|
-
|
|
67
|
-
- **Zod Schema-First Types**: All configuration types now built from Zod schemas
|
|
68
|
-
- `CacheConfigSchema`, `ValidationConfigSchema`, `VersioningConfigSchema`, `LogLevelSchema`
|
|
69
|
-
- `ConflictResolutionStrategySchema`, `EvaluateOptionsSchema`, `EvaluateConfigSchema`
|
|
70
|
-
- `RuleStatsSchema`, `CacheStatsSchema`, `EngineStatsSchema`
|
|
71
|
-
- `ValidationErrorSchema`, `ValidationResultSchema`, `ValidationOptionsSchema`
|
|
72
|
-
- **Hook Error Handling**: New `onHookError` callback for capturing hook errors
|
|
73
|
-
- Previously hooks failed silently; now errors are reported via callback
|
|
74
|
-
- **Hook Timeout Protection**: New `hookTimeoutMs` config option
|
|
75
|
-
- Prevents slow hooks from blocking engine execution indefinitely
|
|
76
|
-
- Timeout errors are reported through `onHookError`
|
|
77
|
-
- **Orphaned Reference Detection**: `ImportResult` now includes `orphanedReferences`
|
|
78
|
-
- Detects when imported RuleSets reference non-existent rule IDs
|
|
79
|
-
- New `OrphanedReference` type exported
|
|
80
|
-
- **Shared Conditions Utility**: New internal `src/utils/conditions.ts`
|
|
81
|
-
- `collectConditionFields()`, `collectConditionOperators()`, `countConditions()`
|
|
82
|
-
- `calculateMaxDepth()`, `countConditionGroups()`
|
|
83
|
-
- **Config Helper Functions**: New functions replace constants
|
|
84
|
-
- `getDefaultCacheConfig()`, `getDefaultValidationConfig()`, `getDefaultVersioningConfig()`
|
|
85
|
-
- `getDefaultLogLevel()`, `getDefaultConflictResolution()`
|
|
86
|
-
- `parseCacheConfig()`, `parseValidationConfig()`, `parseVersioningConfig()`
|
|
87
|
-
|
|
88
|
-
### Changed
|
|
89
|
-
|
|
90
|
-
- **Cache Eviction Performance**: O(n) → O(1) for oldest entry eviction
|
|
91
|
-
- Now uses ES6 Map insertion order for FIFO eviction
|
|
92
|
-
- **Strict Mode Behavior**: `strictMode: true` now implicitly enables consequence validation
|
|
93
|
-
- Previously required both `strictMode: true` and `validateConsequences: true`
|
|
94
|
-
|
|
95
|
-
### Removed
|
|
96
|
-
|
|
97
|
-
- **BREAKING**: Removed FP utility exports from `src/utils/pipe.ts`
|
|
98
|
-
- `pipe()`, `compose()`, `identity()`, `always()`, `tap()`
|
|
99
|
-
- These generic utilities are not domain-specific; use lodash/ramda instead
|
|
100
|
-
- **BREAKING**: Removed `delay()` from `src/utils/time.ts`
|
|
101
|
-
- Low value utility; use `Bun.sleep()` or inline `new Promise(resolve => setTimeout(resolve, ms))`
|
|
102
|
-
- **BREAKING**: Removed `DEFAULT_*` constant exports
|
|
103
|
-
- `DEFAULT_CACHE_CONFIG` → use `getDefaultCacheConfig()`
|
|
104
|
-
- `DEFAULT_VALIDATION_CONFIG` → use `getDefaultValidationConfig()`
|
|
105
|
-
- `DEFAULT_VERSIONING_CONFIG` → use `getDefaultVersioningConfig()`
|
|
106
|
-
- `DEFAULT_ENGINE_CONFIG` → removed (use schema defaults)
|
|
107
|
-
- **BREAKING**: Removed internal mutable type exports
|
|
108
|
-
- `MutableEngineState`, `MutableOptimizerState`, `MutableRuleStats`
|
|
109
|
-
- These are internal implementation details
|
|
110
|
-
|
|
111
|
-
### Fixed
|
|
112
|
-
|
|
113
|
-
- **Silent Hook Errors**: All 11 hook execution functions now report errors via `onHookError`
|
|
114
|
-
- **Redundant Sorting**: Removed unnecessary sort in `evaluate()` (rules already sorted on add/update)
|
|
115
|
-
|
|
116
|
-
## [1.0.0] - 2025-12-10
|
|
117
|
-
|
|
118
|
-
### Added
|
|
119
|
-
|
|
120
|
-
- Initial release of the rules engine library
|
|
121
|
-
- **Engine**: Stateful rule management with `createEngine()`
|
|
122
|
-
- Add, update, remove, enable/disable rules
|
|
123
|
-
- Rule sets for grouping related rules
|
|
124
|
-
- Configurable caching with TTL and max size
|
|
125
|
-
- Lifecycle hooks (onBeforeEvaluation, onAfterEvaluation, onRuleMatch, onRuleError, onCacheHit)
|
|
126
|
-
- Conflict resolution strategies: "all", "first-match", "highest-priority"
|
|
127
|
-
- **Fluent Builders**: Chainable APIs for building rules and conditions
|
|
128
|
-
- `rule()` builder with full configuration options
|
|
129
|
-
- Shorthand condition helpers: `num()`, `str()`, `bool()`, `date()`, `arr()`
|
|
130
|
-
- Logical operators: `all()`, `any()`, `and()`, `or()`
|
|
131
|
-
- **Core Evaluation**: Built on `@f-o-t/condition-evaluator`
|
|
132
|
-
- `evaluateRule()` and `evaluateRules()` functions
|
|
133
|
-
- Filter rules by tags, category, enabled status
|
|
134
|
-
- Sort rules by priority, name, created/updated date
|
|
135
|
-
- Group rules by category, priority, enabled status, or custom function
|
|
136
|
-
- **Validation**: Comprehensive rule validation
|
|
137
|
-
- Schema validation with Zod
|
|
138
|
-
- Conflict detection (duplicate IDs, overlapping conditions, priority collisions, unreachable rules)
|
|
139
|
-
- Integrity checks (negative priority, missing fields, invalid operators)
|
|
140
|
-
- **Simulation**: Test rules without side effects
|
|
141
|
-
- `simulate()` for single context testing
|
|
142
|
-
- `batchSimulate()` for multiple contexts
|
|
143
|
-
- `whatIf()` for comparing rule set changes
|
|
144
|
-
- **Versioning**: Track rule changes with rollback support
|
|
145
|
-
- Version store with full history
|
|
146
|
-
- Rollback to any previous version
|
|
147
|
-
- Prune old versions
|
|
148
|
-
- **Indexing & Optimization**: Fast rule lookups
|
|
149
|
-
- Build indexes by field, tag, category, priority
|
|
150
|
-
- Optimization suggestions for rule sets
|
|
151
|
-
- **Analysis**: Rule set analytics
|
|
152
|
-
- Complexity analysis per rule
|
|
153
|
-
- Field, operator, and consequence usage statistics
|
|
154
|
-
- Find most complex rules
|
|
155
|
-
- **Serialization**: Import/export capabilities
|
|
156
|
-
- JSON export/import with optional ID regeneration
|
|
157
|
-
- Clone rules
|
|
158
|
-
- Merge and diff rule sets
|
|
159
|
-
- **Utilities**: Functional programming helpers
|
|
160
|
-
- `pipe()`, `compose()`, `identity()`, `always()`, `tap()`
|
|
161
|
-
- `measureTime()`, `measureTimeAsync()`, `withTimeout()`, `delay()`
|
|
162
|
-
- `generateId()`, `hashContext()`, `hashRules()`
|
|
163
|
-
|
|
164
|
-
### Changed
|
|
165
|
-
|
|
166
|
-
- **Internal refactor**: Removed 12 internal barrel files
|
|
167
|
-
- All imports now use direct file paths instead of barrel re-exports
|
|
168
|
-
- No public API changes - only internal module structure improvements
|