@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.
Files changed (105) hide show
  1. package/dist/analyzer/analysis.d.ts +72 -0
  2. package/dist/analyzer/analysis.d.ts.map +1 -0
  3. package/dist/builder/conditions.d.ts +29 -0
  4. package/dist/builder/conditions.d.ts.map +1 -0
  5. package/dist/builder/rule.d.ts +40 -0
  6. package/dist/builder/rule.d.ts.map +1 -0
  7. package/dist/cache/cache.d.ts +21 -0
  8. package/dist/cache/cache.d.ts.map +1 -0
  9. package/dist/cache/noop.d.ts +3 -0
  10. package/dist/cache/noop.d.ts.map +1 -0
  11. package/dist/core/evaluate.d.ts +21 -0
  12. package/dist/core/evaluate.d.ts.map +1 -0
  13. package/dist/core/filter.d.ts +8 -0
  14. package/dist/core/filter.d.ts.map +1 -0
  15. package/dist/core/group.d.ts +10 -0
  16. package/dist/core/group.d.ts.map +1 -0
  17. package/dist/core/sort.d.ts +14 -0
  18. package/dist/core/sort.d.ts.map +1 -0
  19. package/dist/engine/engine.d.ts +27 -0
  20. package/dist/engine/engine.d.ts.map +1 -0
  21. package/dist/engine/hooks.d.ts +16 -0
  22. package/dist/engine/hooks.d.ts.map +1 -0
  23. package/dist/engine/state.d.ts +19 -0
  24. package/dist/engine/state.d.ts.map +1 -0
  25. package/dist/index.d.ts +33 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +3083 -0
  28. package/dist/index.js.map +37 -0
  29. package/dist/optimizer/index-builder.d.ts +48 -0
  30. package/dist/optimizer/index-builder.d.ts.map +1 -0
  31. package/dist/serialization/serializer.d.ts +79 -0
  32. package/dist/serialization/serializer.d.ts.map +1 -0
  33. package/dist/simulation/simulator.d.ts +65 -0
  34. package/dist/simulation/simulator.d.ts.map +1 -0
  35. package/dist/types/config.d.ts +87 -0
  36. package/dist/types/config.d.ts.map +1 -0
  37. package/dist/types/consequence.d.ts +21 -0
  38. package/dist/types/consequence.d.ts.map +1 -0
  39. package/dist/types/evaluation.d.ts +70 -0
  40. package/dist/types/evaluation.d.ts.map +1 -0
  41. package/dist/types/rule.d.ts +114 -0
  42. package/dist/types/rule.d.ts.map +1 -0
  43. package/dist/types/state.d.ts +65 -0
  44. package/dist/types/state.d.ts.map +1 -0
  45. package/dist/utils/conditions.d.ts +24 -0
  46. package/dist/utils/conditions.d.ts.map +1 -0
  47. package/dist/utils/hash.d.ts +3 -0
  48. package/dist/utils/hash.d.ts.map +1 -0
  49. package/dist/utils/id.d.ts +2 -0
  50. package/dist/utils/id.d.ts.map +1 -0
  51. package/dist/utils/time.d.ts +8 -0
  52. package/dist/utils/time.d.ts.map +1 -0
  53. package/dist/validation/conflicts.d.ts +25 -0
  54. package/dist/validation/conflicts.d.ts.map +1 -0
  55. package/dist/validation/integrity.d.ts +38 -0
  56. package/dist/validation/integrity.d.ts.map +1 -0
  57. package/dist/validation/schema.d.ts +69 -0
  58. package/dist/validation/schema.d.ts.map +1 -0
  59. package/dist/versioning/version-store.d.ts +50 -0
  60. package/dist/versioning/version-store.d.ts.map +1 -0
  61. package/package.json +35 -31
  62. package/CHANGELOG.md +0 -168
  63. package/__tests__/builder.test.ts +0 -363
  64. package/__tests__/cache.test.ts +0 -130
  65. package/__tests__/config.test.ts +0 -35
  66. package/__tests__/engine.test.ts +0 -1213
  67. package/__tests__/evaluate.test.ts +0 -339
  68. package/__tests__/exports.test.ts +0 -30
  69. package/__tests__/filter-sort.test.ts +0 -303
  70. package/__tests__/integration.test.ts +0 -419
  71. package/__tests__/money-integration.test.ts +0 -149
  72. package/__tests__/validation.test.ts +0 -862
  73. package/biome.json +0 -39
  74. package/docs/MIGRATION-v3.md +0 -118
  75. package/fot.config.ts +0 -5
  76. package/src/analyzer/analysis.ts +0 -401
  77. package/src/builder/conditions.ts +0 -321
  78. package/src/builder/rule.ts +0 -192
  79. package/src/cache/cache.ts +0 -135
  80. package/src/cache/noop.ts +0 -20
  81. package/src/core/evaluate.ts +0 -185
  82. package/src/core/filter.ts +0 -85
  83. package/src/core/group.ts +0 -103
  84. package/src/core/sort.ts +0 -90
  85. package/src/engine/engine.ts +0 -462
  86. package/src/engine/hooks.ts +0 -235
  87. package/src/engine/state.ts +0 -322
  88. package/src/index.ts +0 -303
  89. package/src/optimizer/index-builder.ts +0 -381
  90. package/src/serialization/serializer.ts +0 -408
  91. package/src/simulation/simulator.ts +0 -359
  92. package/src/types/config.ts +0 -184
  93. package/src/types/consequence.ts +0 -38
  94. package/src/types/evaluation.ts +0 -87
  95. package/src/types/rule.ts +0 -112
  96. package/src/types/state.ts +0 -116
  97. package/src/utils/conditions.ts +0 -108
  98. package/src/utils/hash.ts +0 -30
  99. package/src/utils/id.ts +0 -6
  100. package/src/utils/time.ts +0 -42
  101. package/src/validation/conflicts.ts +0 -440
  102. package/src/validation/integrity.ts +0 -473
  103. package/src/validation/schema.ts +0 -386
  104. package/src/versioning/version-store.ts +0 -337
  105. 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,3 @@
1
+ export declare const hashContext: (context: unknown) => string;
2
+ export declare const hashRules: (ruleIds: ReadonlyArray<string>) => string;
3
+ //# sourceMappingURL=hash.d.ts.map
@@ -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,2 @@
1
+ export declare const generateId: () => string;
2
+ //# sourceMappingURL=id.d.ts.map
@@ -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
- "name": "@f-o-t/rules-engine",
3
- "version": "3.0.0",
4
- "type": "module",
5
- "main": "./dist/index.js",
6
- "types": "./dist/index.d.ts",
7
- "exports": {
8
- ".": {
9
- "types": "./dist/index.d.ts",
10
- "default": "./dist/index.js"
11
- }
12
- },
13
- "scripts": {
14
- "build": "bun x --bun fot build",
15
- "test": "bun x --bun fot test",
16
- "lint": "bun x --bun fot lint",
17
- "format": "bun x --bun fot format",
18
- "typecheck": "bun x --bun fot typecheck"
19
- },
20
- "dependencies": {
21
- "@f-o-t/condition-evaluator": "^2.0.2",
22
- "zod": "^4.3.6"
23
- },
24
- "devDependencies": {
25
- "@f-o-t/cli": "^1.0.0",
26
- "@f-o-t/config": "^1.0.0"
27
- },
28
- "repository": {
29
- "type": "git",
30
- "url": "https://github.com/F-O-T/libraries.git",
31
- "directory": "libraries/rules-engine"
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