@o3r/rules-engine
Version:
This module provides a rule engine that can be executed on your Otter application to customize your application (translations, placeholders and configs) based on a json file generated by your CMS.
1 lines • 225 kB
Source Map (JSON)
{"version":3,"file":"o3r-rules-engine.mjs","sources":["../../src/components/rules-engine/shared/fallback-to-pipe.ts","../../src/components/rules-engine/shared/json-or-string-pipe.ts","../../src/components/rules-engine/shared/ruleset-history-helper.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot-component.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot-component.html","../../src/components/rules-engine/rule-key-value/rule-key-value-pres-component.ts","../../src/components/rules-engine/rule-key-value/rule-key-value-pres-component.html","../../src/components/rules-engine/rule-actions/rule-actions-pres-component.ts","../../src/components/rules-engine/rule-actions/rule-actions-pres-component.html","../../src/components/rules-engine/rule-condition/rule-condition-pres-component.ts","../../src/components/rules-engine/rule-condition/rule-condition-pres-component.html","../../src/components/rules-engine/rule-tree/rule-tree-pres-component.ts","../../src/components/rules-engine/rule-tree/rule-tree-pres-component.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres-component.ts","../../src/components/rules-engine/ruleset-history/ruleset-history-pres-component.html","../../src/devkit/rules-engine-devkit-interface.ts","../../src/services/rules-engine-token.ts","../../src/stores/rulesets/rulesets.actions.ts","../../src/stores/rulesets/rulesets.effect.ts","../../src/stores/rulesets/rulesets.reducer.ts","../../src/stores/rulesets/rulesets.state.ts","../../src/stores/rulesets/rulesets-module.ts","../../src/stores/rulesets/rulesets.selectors.ts","../../src/stores/rulesets/rulesets.sync.ts","../../src/engine/debug/helpers.ts","../../src/engine/debug/engine-debug.ts","../../src/engine/helpers/filter-ruleset-event-operator.ts","../../src/engine/operator/operator-helpers.ts","../../src/engine/operator/operators/array-based-operators.ts","../../src/engine/operator/operators/basic-operators.ts","../../src/engine/operator/operators/date-based-operators.ts","../../src/engine/operator/operators/number-based-operators.ts","../../src/engine/operator/operators/index.ts","../../src/engine/rule/rule-helpers.ts","../../src/engine/ruleset-executor.ts","../../src/engine/engine.ts","../../src/services/runner/rules-engine-runner-service.ts","../../src/services/runner/rules-engine-runner-module.ts","../../src/devkit/rules-engine-devtools-token.ts","../../src/devkit/rules-engine-devtools.ts","../../src/devkit/rules-engine-devtools-console-service.ts","../../src/devkit/rules-engine-devtools-message-service.ts","../../src/devkit/rules-engine-devtools-module.ts","../../src/fact/fact-abstract-service.ts","../../src/inner-facts/current-time/current-time-facts-service.ts","../../src/o3r-rules-engine.ts"],"sourcesContent":["import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rFallbackTo' })\nexport class O3rFallbackToPipe implements PipeTransform {\n public transform<T>(value: T, fallback = 'undefined'): T | string {\n return value === undefined ? fallback : value;\n }\n}\n","import {\n Pipe,\n PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rJsonOrString' })\nexport class O3rJsonOrStringPipe implements PipeTransform {\n /**\n * @inheritDoc\n */\n public transform(value: any): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value, null, 2);\n }\n}\n","import type {\n DebugEvent,\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../../../engine';\nimport type {\n RulesetExecutionDebug,\n RulesetExecutionStatus,\n} from '../ruleset-history/ruleset-history-pres-component';\n\n/**\n * Compute the status of the execution depending on its execution event type, the output and whether the execution\n * is still active\n * @param rulesetExecution\n * @param isActive\n */\nexport const getStatus = (rulesetExecution: RulesetExecutionErrorEvent | RulesetExecutionEvent, isActive: boolean): RulesetExecutionStatus => {\n if (rulesetExecution.type === 'RulesetExecutionError') {\n return 'Error';\n } else if (rulesetExecution.outputActions?.length === 0) {\n return 'NoEffect';\n } else if (isActive) {\n return 'Active';\n }\n return 'Deactivated';\n};\n\n/**\n * Transform the output of the debug reports into the model for the ruleset history debug panel\n * @param events\n * @param rulesetMap\n */\nexport const rulesetReportToHistory = (events: DebugEvent[], rulesetMap: Record<string, Ruleset>): RulesetExecutionDebug[] => {\n const availableRulesets = Object.values(rulesetMap);\n const lastActiveRulesets = (events.filter((e) => e.type === 'ActiveRulesets').reverse()[0])?.rulesets || [];\n\n return availableRulesets\n .filter((ruleset) => !!ruleset)\n .reduce<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[]>((acc, ruleset) => {\n const rulesetExecutions = events\n .filter((e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent => ((e.type === 'RulesetExecutionError' || e.type === 'RulesetExecution') && e.rulesetId === ruleset.id));\n if (rulesetExecutions) {\n acc.push(...rulesetExecutions);\n }\n return acc;\n }, [])\n .toSorted((execA, execB) => execB.timestamp - execA.timestamp)\n .map((rulesetExecution) => {\n const rulesetInformation = rulesetMap[rulesetExecution.rulesetId];\n const isActive = lastActiveRulesets.find((r) => r.id === rulesetExecution.rulesetId);\n return {\n ...rulesetExecution,\n status: getStatus(rulesetExecution, !!isActive),\n isActive: !!isActive,\n rulesetInformation,\n rulesEvaluations: (rulesetExecution.rulesEvaluations || []).toSorted((evalA, evalB) =>\n (rulesetInformation?.rules.findIndex((r) => r.id === evalA.rule.id) || -1)\n - (rulesetInformation?.rules.findIndex((r) => r.id === evalB.rule.id) || -1)\n )\n };\n });\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport type {\n Facts,\n} from '../../../engine';\nimport {\n O3rJsonOrStringPipe,\n} from '../shared/index';\n\n@Component({\n selector: 'o3r-facts-snapshot',\n styleUrls: ['./facts-snapshot-component.scss'],\n templateUrl: './facts-snapshot-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n O3rJsonOrStringPipe,\n FormsModule,\n ReactiveFormsModule\n ],\n encapsulation: ViewEncapsulation.None\n})\nexport class FactsSnapshotComponent {\n /**\n * Full list of available facts with their current value\n */\n public readonly facts = input.required<{ factName: string; value: Facts }[]>();\n\n /**\n * Search terms\n */\n public readonly search = signal('');\n\n /**\n * Filtered list of facts using search terms\n */\n public readonly filteredFacts = computed(() => {\n const search = this.search();\n const facts = this.facts();\n if (search) {\n const matchString = new RegExp(search.replace(/[\\s#$()*+,.?[\\\\\\]^{|}-]/g, '\\\\$&'), 'i');\n return facts.filter(({ factName, value }) =>\n matchString.test(factName)\n || (typeof value === 'object'\n ? matchString.test(JSON.stringify(value))\n : matchString.test(String(value)))\n );\n } else {\n return facts;\n }\n });\n}\n","<section>\n @if (facts().length < 1) {\n <div class=\"m-2\">\n No facts are registered.\n </div>\n } @else {\n <div class=\"input-group\">\n <label class=\"input-group-text\" for=\"search-fact\">\n <span class=\"mx-1 fa-search\" aria-label=\"Search\"></span>\n </label>\n <input class=\"form-control\" [(ngModel)]=\"search\" type=\"text\" id=\"search-fact\" placeholder=\"Search for fact name or value\" />\n </div>\n <div class=\"mt-3\">\n List of <b>{{facts().length}}</b> registered facts\n @if (facts().length > filteredFacts().length) { (<b>{{filteredFacts().length}}</b> matching the search) }\n </div>\n <ul>\n @for (fact of filteredFacts(); track fact.factName) {\n <li>\n <span class=\"fact-name\">{{fact.factName}}: </span>\n <span class=\"fact-value\">{{fact.value | o3rJsonOrString}}</span>\n </li>\n }\n </ul>\n }\n</section>\n","import {\n CommonModule,\n JsonPipe,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n of,\n Subject,\n} from 'rxjs';\nimport {\n delay,\n startWith,\n switchMap,\n} from 'rxjs/operators';\n\n/**\n * Duration of the notification for clipboard feature (in milliseconds)\n */\nconst NOTIFICATION_DURATION = 1750;\n\n/**\n * Minimal length required to enable clipboard feature\n */\nconst CLIPBOARD_FEATURE_LENGTH_THRESHOLD = 80;\n\n@Component({\n selector: 'o3r-rule-key-value-pres',\n styleUrls: ['./rule-key-value-pres-component.scss'],\n templateUrl: './rule-key-value-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, JsonPipe]\n})\nexport class RuleKeyValuePresComponent implements OnChanges {\n /**\n * Key of the object (name of the fact for example)\n */\n @Input()\n public key?: string;\n\n /**\n * Current value of the object\n */\n @Input()\n public value!: any;\n\n /**\n * Previous value of the object\n */\n @Input()\n public oldValue?: any;\n\n /**\n * Type of display:\n * - 'state': `key: value`, `key: oldValue -> value` or `oldValue -> value`\n * - 'assignment': `key = value`\n */\n @Input()\n public type: 'state' | 'assignment' = 'state';\n\n public shouldLimitCharactersForValue = true;\n public isClipBoardFeatureAvailableForValue = false;\n public isValuePrimitiveType = false;\n\n public shouldLimitCharactersForOldValue = true;\n public isClipBoardFeatureAvailableForOldValue = false;\n public isOldValuePrimitiveType = false;\n\n private readonly triggerNotification = new Subject<void>();\n public showNotification$ = this.triggerNotification.asObservable().pipe(\n switchMap(() => of(false).pipe(delay(NOTIFICATION_DURATION), startWith(true)))\n );\n\n private isClipBoardFeatureAvailable(value: string | undefined) {\n return !!(navigator.clipboard && value && value.length > CLIPBOARD_FEATURE_LENGTH_THRESHOLD);\n }\n\n public ngOnChanges({ value, oldValue }: SimpleChanges) {\n if (value) {\n this.isValuePrimitiveType = value.currentValue === null || typeof value.currentValue !== 'object';\n this.isClipBoardFeatureAvailableForValue = this.isClipBoardFeatureAvailable(this.isValuePrimitiveType ? String(value.currentValue) : JSON.stringify(value.currentValue));\n }\n if (oldValue) {\n this.isOldValuePrimitiveType = oldValue.currentValue === null || typeof oldValue.currentValue !== 'object';\n this.isClipBoardFeatureAvailableForOldValue = this.isClipBoardFeatureAvailable(this.isOldValuePrimitiveType ? String(oldValue.currentValue) : JSON.stringify(oldValue.currentValue));\n }\n }\n\n public async copyToClipBoard(content: string) {\n await navigator.clipboard.writeText(content);\n this.triggerNotification.next();\n }\n}\n","@if (key) {\n <span class=\"input-key\">{{key}}{{type === 'state' ? ':' : ''}}</span>\n}\n{{type === 'assignment' ? '=' : ''}}\n@if (oldValue) {\n <pre class=\"input-value\"\n [class.limit-characters]=\"shouldLimitCharactersForOldValue\"\n (click)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n (keyup.enter)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n tabindex=\"0\"\n >\n {{isOldValuePrimitiveType ? oldValue : (oldValue | json)}}\n </pre>\n @if (isClipBoardFeatureAvailableForOldValue) {\n <button (click)=\"copyToClipBoard(oldValue)\" title=\"Copy to clipboard\">📋</button>\n }\n →\n}\n<pre class=\"input-value\"\n [class.limit-characters]=\"shouldLimitCharactersForValue\"\n (click)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n (keyup.enter)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n tabindex=\"0\"\n>\n {{isValuePrimitiveType ? value : (value | json)}}\n</pre>\n@if (isClipBoardFeatureAvailableForValue) {\n <button (click)=\"copyToClipBoard(value)\" title=\"Copy to clipboard\">📋</button>\n}\n@if (showNotification$ | async) {\n <div role=\"alert\" class=\"notification\">Copied to clipboard</div>\n}\n","import {\n CommonModule,\n JsonPipe,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n ActionBlock,\n AllBlock,\n Facts,\n} from '../../../engine';\nimport {\n RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres-component';\nimport {\n O3rFallbackToPipe,\n} from '../shared/index';\n\n@Component({\n selector: 'o3r-rule-actions-pres',\n styleUrls: ['./rule-actions-pres-component.scss'],\n templateUrl: './rule-actions-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, JsonPipe, RuleKeyValuePresComponent, O3rFallbackToPipe]\n})\nexport class RuleActionsPresComponent {\n /**\n * List of all the output actions of a rules or ruleset execution\n */\n @Input()\n public actions: AllBlock[] | undefined | null;\n\n /**\n * The list of temporary facts used and/or modified within the rule or the ruleset.\n * They are scoped to the ruleset and their value is the one after the rule or ruleset execution.\n */\n @Input()\n public temporaryFacts: Record<string, Facts> | undefined | null;\n\n /**\n * List of temporary facts that will be modified by the ruleset or the rule.\n */\n @Input()\n public runtimeOutputs: string[] | undefined | null;\n\n /**\n * Check if a given block is of type ActionBlock\n * @param block\n */\n public isActionBlock(block: AllBlock): block is ActionBlock {\n return !!(block as ActionBlock).actionType;\n }\n}\n","<div class=\"ruleset-panel-category-title\">Output Actions</div>\n@if (actions?.length === 0 && runtimeOutputs?.length === 0) {\n <div class=\"ruleset-panel-category-body empty\">\n No action\n </div>\n} @else {\n <ul class=\"ruleset-panel-category-body\">\n @for (action of actions; track $index) {\n <li>\n @if (isActionBlock(action)) {\n @switch (action.actionType) {\n @case ('SET_FACT') {\n <div>\n <div>Set Fact</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"action.fact | o3rFallbackTo: 'Missing \\'fact\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'assignment'\" />\n </div>\n </div>\n }\n @case ('UPDATE_CONFIG') {\n <div>\n <div>Update Config {{action.component}} {{action.library}}</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"action.property | o3rFallbackTo: 'Missing \\'property\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'assignment'\" />\n </div>\n </div>\n }\n @case ('UPDATE_ASSET') {\n <div>\n <div>Update Asset:</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.asset | o3rFallbackTo: 'Missing \\'asset\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'state'\" />\n </div>\n </div>\n }\n @case ('UPDATE_LOCALISATION') {\n <div>\n <div>Update localization:</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.key | o3rFallbackTo: 'Missing \\'key\\''\"\n [value]=\"action.value | o3rFallbackTo\"\n [type]=\"'state'\" />\n </div>\n </div>\n }\n @case ('UPDATE_PLACEHOLDER') {\n <div [class.error]=\"!action.placeholderId\">\n <div>Update placeholder in {{action.component}} {{action.library}}</div>\n <div>\n <o3r-rule-key-value-pres\n [oldValue]=\"action.placeholderId | o3rFallbackTo: 'Missing \\'placeholderId\\''\"\n [value]=\"action.value\"\n [type]=\"'state'\" />\n </div>\n </div>\n }\n @default {\n <div class=\"error\">\n <div>Unrecognized action</div>\n <div>{{action | json}}</div>\n </div>\n }\n }\n }\n </li>\n }\n @for (runtimeOutput of runtimeOutputs; track $index) {\n <li>\n <div>Set temporary fact</div>\n <div>\n <o3r-rule-key-value-pres\n [key]=\"runtimeOutput | o3rFallbackTo: 'Missing \\'fact\\''\"\n [value]=\"temporaryFacts?.[runtimeOutput] | o3rFallbackTo\"\n [type]=\"'assignment'\" />\n </div>\n </li>\n }\n </ul>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n BinaryOperation,\n GenericOperand,\n OperandFact,\n TopLevelCondition,\n UnaryOperation,\n} from '../../../engine';\n\n@Component({\n selector: 'o3r-rule-condition-pres',\n styleUrls: ['./rule-condition-pres-component.scss'],\n templateUrl: './rule-condition-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: []\n})\nexport class RuleConditionPresComponent {\n private _condition?: TopLevelCondition;\n\n /**\n * Left hand operator as it will be displayed in the template.\n * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n */\n public lhs = 'undefined';\n\n /**\n * Right hand operator as it will be displayed in the template.\n * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n */\n public rhs: string | undefined;\n\n /**\n * Rule condition that will be flattened by the component setter\n */\n @Input()\n public set condition(condition: TopLevelCondition | undefined) {\n this._condition = condition;\n this.lhs = (condition as UnaryOperation | BinaryOperation)?.lhs ? this.getOperandName((condition as UnaryOperation | BinaryOperation).lhs) : 'undefined';\n this.rhs = (condition as BinaryOperation)?.rhs ? this.getOperandName((condition as BinaryOperation).rhs) : undefined;\n }\n\n public get condition(): TopLevelCondition | undefined {\n return this._condition;\n }\n\n private getOperandName(operand: GenericOperand): string {\n const value = `${operand.value ?? 'MISSING_VALUE'}`;\n return (operand as OperandFact).path ? (operand as OperandFact).path!.replace(/^\\$/, value) : value;\n }\n}\n","@if (!condition) {\n <span class=\"input-value\">true</span>\n} @else {\n @if (!$any(condition).all && !$any(condition).any && !$any(condition).not) {\n <span class=\"input-key\">{{ lhs }}</span> {{ $any(condition).operator }}\n @if (rhs !== undefined) {\n <span class=\"input-value\">{{ rhs }}</span>\n }\n }\n @if ($any(condition).all || $any(condition).any || $any(condition).not) {\n @if ($any(condition).all) {\n <span>ALL</span>\n }\n @if ($any(condition).any) {\n <span>ANY</span>\n }\n @if ($any(condition).not) {\n <span>NOT</span>\n }\n <span>(\n @for (cond of $any(condition).all || $any(condition).any || [$any(condition).not]; track cond; let last = $last) {\n <o3r-rule-condition-pres [condition]=\"cond\" />\n @if (!last) {\n <span>, </span>\n }\n }\n )</span>\n }\n}\n","import {\n CommonModule,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n AllBlock,\n TopLevelCondition,\n} from '../../../engine';\nimport {\n RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres-component';\nimport {\n RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres-component';\n\n@Component({\n selector: 'o3r-rule-tree-pres',\n styleUrls: ['./rule-tree-pres-component.scss'],\n templateUrl: './rule-tree-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, RuleActionsPresComponent, RuleConditionPresComponent]\n})\nexport class RuleTreePresComponent {\n /**\n * Rule name. Will only be defined at the root of the rule tree.\n */\n @Input()\n public name?: string;\n\n /**\n * Type of the block being resolved.\n * A type \"IF_ELSE\" will display two branches and the success and failure outputs associated\n * Else, only the successElements will be shown\n */\n @Input()\n public blockType = '';\n\n /**\n * The condition under which the success elements will be displayed.\n */\n @Input()\n public condition?: TopLevelCondition;\n\n /**\n * If case output\n */\n @Input()\n public successElements: AllBlock[] = [];\n\n /**\n * Else case output\n */\n @Input()\n public failureElements: AllBlock[] = [];\n\n /**\n * Should the \"Else case scenario\" actions be displayed\n */\n public failureActionsExpanded = false;\n\n /**\n * Should the \"If case scenario\" actions be displayed\n */\n public successActionsExpanded = false;\n}\n","@if (name) {\n <span>{{name | titlecase}}:</span>\n}\n<div class=\"rule-wrapper tree\">\n @if (blockType === 'IF_ELSE') {\n @if (!name) {\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n }\n <div class=\"rule-conditions\">\n <div class=\"rule-conditions-title\">If\n <o3r-rule-condition-pres [condition]=\"condition\" />\n </div>\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n </div>\n <div class=\"rule-actions-wrapper tree-node\">\n <div class=\"rule-actions tree-branch\">\n <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n <div class=\"rule-action-title success-actions\"\n tabindex=\"0\"\n (click)=\"successActionsExpanded = !successActionsExpanded\"\n (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\">\n <i class=\"icon refx-icon-validate\"></i>\n <span>Then</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!successActionsExpanded\"\n [class.icon-caret-up]=\"successActionsExpanded\">\n </i>\n </div>\n @if (successActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"successElements\" />\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\" />\n </div>\n <div class=\"rule-actions tree-branch\">\n <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n <div class=\"rule-action-title error-actions\"\n tabindex=\"0\"\n (click)=\"failureActionsExpanded = !failureActionsExpanded\"\n (keyup.enter)=\"failureActionsExpanded = !failureActionsExpanded\">\n <i class=\"icon refx-icon-cross\"></i>\n <span>Else</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!failureActionsExpanded\"\n [class.icon-caret-up]=\"failureActionsExpanded\">\n </i>\n </div>\n @if (failureActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"failureElements\" />\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: failureElements}\" />\n </div>\n </div>\n } @else {\n <div class=\"rule-conditions\">\n <div class=\"rule-conditions-title\">If <span class=\"input-value\">true</span></div>\n <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n <div></div>\n <div></div>\n </div>\n </div>\n <div class=\"rule-actions-wrapper\">\n <div class=\"rule-actions\">\n <div class=\"rule-action-title success-actions\" tabindex=\"0\"\n (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\"\n (click)=\"successActionsExpanded = !successActionsExpanded\">\n <i class=\"icon refx-icon-validate\">\n </i>\n <span>Then</span>\n <i class=\"icon\"\n [class.icon-caret-down]=\"!successActionsExpanded\"\n [class.icon-caret-up]=\"successActionsExpanded\">\n </i>\n </div>\n @if (successActionsExpanded) {\n <o3r-rule-actions-pres class=\"rule-tree-actions\"\n [actions]=\"successElements\" />\n }\n <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\" />\n </div>\n </div>\n }\n</div>\n\n<ng-template #subTree let-blocks=\"blocks\">\n <div class=\"rule-sub-trees\">\n @for (block of blocks; track block) {\n @if (block.blockType === 'IF_ELSE') {\n <div class=\"tree-branch\">\n <o3r-rule-tree-pres\n [blockType]=\"'IF_ELSE'\"\n [condition]=\"block.condition\"\n [failureElements]=\"block.failureElements\"\n [successElements]=\"block.successElements\" />\n </div>\n }\n }\n </div>\n</ng-template>\n","import {\n CommonModule,\n} from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type {\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../../../engine';\nimport {\n RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres-component';\nimport {\n RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres-component';\nimport {\n RuleTreePresComponent,\n} from '../rule-tree/rule-tree-pres-component';\nimport {\n O3rFallbackToPipe,\n O3rJsonOrStringPipe,\n} from '../shared/index';\n\nexport type RulesetExecutionStatus = 'Error' | 'Active' | 'Deactivated' | 'NoEffect';\n/**\n * Model of a RulesetExecution with more information for debug purpose\n */\nexport type RulesetExecutionDebug = (RulesetExecutionEvent | RulesetExecutionErrorEvent) & {\n isActive: boolean;\n status: RulesetExecutionStatus;\n rulesetInformation: Ruleset | undefined;\n};\n\n@Component({\n selector: 'o3r-ruleset-history-pres',\n styleUrls: ['./ruleset-history-pres-component.scss'],\n templateUrl: './ruleset-history-pres-component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n O3rFallbackToPipe,\n O3rJsonOrStringPipe,\n RuleActionsPresComponent,\n RuleKeyValuePresComponent,\n RuleTreePresComponent\n ]\n})\nexport class RulesetHistoryPresComponent {\n private readonly cd = inject(ChangeDetectorRef);\n\n /**\n * Reflects the state of each ruleset expanded elements.\n * Each ruleset entry contains a list of subpanel that can be collapsed or expanded.\n * Ruleset whole panel status is store the 'ruleset' entry.\n * @example\n * Expanded ruleset with rule overview collapsed:\n * {'rulesetId': {'ruleset' : true, 'ruleOverview': false}}\n * @note Collapsing a ruleset will not reset the subpanel expansion status\n */\n public expansionStatus: { [key: string]: { [subpanel: string]: boolean } } = {};\n\n @Input()\n public rulesetExecutions?: RulesetExecutionDebug[] | null = [];\n\n @Input()\n public executionDurationFormat = '1.3-3';\n\n /**\n * Toggle a ruleset subpanel\n * @param ruleId\n * @param subpanel element to collapse. 'ruleset' will toggle the whole panel but won't reset the subpanels states.\n */\n public toggleExpansion(ruleId: string, subpanel: string) {\n if (this.expansionStatus[ruleId]) {\n this.expansionStatus[ruleId][subpanel] = !this.expansionStatus[ruleId][subpanel];\n } else {\n this.expansionStatus[ruleId] = { [subpanel]: true };\n }\n this.cd.detectChanges();\n }\n}\n","<section>\n @if (rulesetExecutions) {\n <ul class=\"rulesets\">\n @for (execution of rulesetExecutions; track execution) {\n <li class=\"ruleset\">\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\n <div class=\"ruleset-panel-title ruleset-expansion-action\"\n [class.error]=\"execution.type === 'RulesetExecutionError'\"\n (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n @if (execution.rulesetInformation?.linkedComponents?.or) {\n <div class=\"ruleset-panel-subtitle\">\n @for (lc of execution.rulesetInformation?.linkedComponents?.or; track lc; let isLast = $last) {\n <div>{{lc.name}} {{lc.library}} @if (!isLast) {\n <span> OR </span>\n }</div>\n }\n </div>\n }\n @if (execution.rulesetInformation?.validityRange; as validityRange) {\n <div class=\"ruleset-panel-subtitle\">\n Date range: {{validityRange.from}} - {{validityRange.to}}\n </div>\n }\n </div>\n <div class=\"ruleset-panel-title-aside\">\n @if (execution.status === 'Error') {\n <span class=\"error capsule\">Error</span>\n }\n @if (execution.status === 'Active') {\n <span class=\"success capsule\">Applied</span>\n }\n @if (execution.status === 'Deactivated') {\n <span class=\"inactive capsule\">Deactivated</span>\n }\n @if (execution.status === 'NoEffect') {\n <span class=\"warn capsule\">No effect</span>\n }\n <span class=\"time capsule\">\n <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n </span>\n <button\n class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n </button>\n </div>\n </div>\n @if (expansionStatus[execution.executionId]?.ruleset) {\n <div class=\"ruleset-panel-description\">\n <ng-container [ngTemplateOutlet]=\"rules\"\n [ngTemplateOutletContext]=\"{\n rules: execution.rulesetInformation?.rules,\n expansionID: execution.executionId\n }\" />\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts\n }\" />\n @if (execution.type === 'RulesetExecutionError') {\n <div class=\"ruleset-panel-category-title\">Rules:</div>\n <ul class=\"ruleset-panel-category-body rule-description\">\n @for (ruleEvaluation of execution.rulesEvaluations; track ruleEvaluation; let index = $index) {\n @let rule = execution.rulesetInformation?.rules?.[index];\n <li>\n <ng-container>\n <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n @if (ruleEvaluation.error) {\n <span class=\"capsule error\">Error</span>\n }\n </div>\n <div>\n @if (ruleEvaluation.error) {\n <span class=\"ruleset-panel-category-title\">Error:</span>\n <pre class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error | o3rJsonOrString}}</pre>\n }\n <ng-container [ngTemplateOutlet]=\"inputs\"\n [ngTemplateOutletContext]=\"{\n inputs: execution.inputFacts,\n runtimeInputs: rule?.inputRuntimeFacts\n }\" />\n @if (!ruleEvaluation.error) {\n <o3r-rule-actions-pres\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"rule?.outputRuntimeFacts\"\n />\n }\n </div>\n </ng-container>\n </li>\n }\n </ul>\n } @else {\n <o3r-rule-actions-pres [actions]=\"execution.outputActions\" />\n <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n <ul class=\"rule-description ruleset-panel-category-body\">\n @for (ruleEvaluation of execution.rulesEvaluations; track ruleEvaluation; let index = $index) {\n @let rule = execution.rulesetInformation?.rules?.[index];\n <li>\n <div class=\"ruleset-panel-title\">\n <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n @if (ruleEvaluation.cached) {\n <span class=\"capsule inactive\">Cached</span>\n }\n <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n </div>\n <div>\n <ng-container [ngTemplateOutlet]=\"triggers\"\n [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\" />\n <o3r-rule-actions-pres\n [actions]=\"ruleEvaluation.outputActions\"\n [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n [runtimeOutputs]=\"rule?.outputRuntimeFacts\" />\n </div>\n </li>\n }\n </ul>\n }\n </div>\n }\n </li>\n }\n </ul>\n} @else {\n <div class=\"alert alert-danger m-2\" role=\"alert\">\n The Rules Engine is not configured on this page.\n </div>\n}\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n <ul class=\"ruleset-panel-category-body triggers\">\n @for (trigger of (triggers | keyvalue); track trigger) {\n @if (trigger.value?.factName) {\n <li>\n <o3r-rule-key-value-pres\n [key]=\"trigger.value.factName\"\n [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n [value]=\"trigger.value.newValue | o3rFallbackTo\"\n [type]=\"'state'\" />\n </li>\n }\n }\n </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\n <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n <span>Rules Overview</span>\n <button class=\"icon\"\n [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n </button>\n </div>\n @if (expansionStatus[expansionID]?.rulesOverview) {\n @if (rules?.length === 0) {\n <div class=\"ruleset-panel-category-body empty\">No rule</div>\n }\n @if (rules?.length > 0) {\n <ul class=\"ruleset-panel-category-body\">\n @for (rule of rules; track rule) {\n <li>\n <o3r-rule-tree-pres [name]=\"rule.name\"\n [condition]=\"rule?.rootElement?.condition\"\n [blockType]=\"rule?.rootElement?.blockType\"\n [successElements]=\"rule?.rootElement?.successElements\"\n [failureElements]=\"rule?.rootElement?.failureElements\" />\n </li>\n }\n </ul>\n }\n }\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n @if (inputs?.length === 0) {\n <div class=\"ruleset-panel-category-body empty\">No inputs</div>\n }\n @if (inputs?.length > 0) {\n <ul class=\"ruleset-panel-category-body\">\n @for (input of inputs; track input) {\n <li>\n <o3r-rule-key-value-pres\n [key]=\"input.factName\"\n [value]=\"input.value | o3rFallbackTo\"\n [type]=\"'state'\" />\n </li>\n }\n @for (input of runtimeInputs; track input) {\n <li>{{input}} (scope limited to ruleset)</li>\n }\n </ul>\n }\n</ng-template>\n","import type {\n ConnectContentMessage,\n DevtoolsCommonOptions,\n MessageDataTypes,\n OtterMessageContent,\n RequestMessagesContentMessage,\n} from '@o3r/core';\nimport type {\n DebugEvent,\n Ruleset,\n} from '../engine';\n\nexport interface RulesEngineDevtoolsServiceOptions extends DevtoolsCommonOptions {\n /** Size of events list emitted by rules engine; When undefined all history will be kept */\n rulesEngineStackLimit?: number;\n}\n\n/** Rules Engine debug event Message Content */\nexport interface RulesEngineDebugEventsContentMessage extends OtterMessageContent<'rulesEngineEvents'> {\n /** Map of registered rulesets */\n rulesetMap: Record<string, Ruleset>;\n /** List of event from the Rules Engine Debugger */\n events: DebugEvent[];\n}\n\ntype RulesEngineMessageContents = RulesEngineDebugEventsContentMessage;\n\n/** List of possible DataTypes for RulesEngine messages */\nexport type RulesEngineMessageDataTypes = MessageDataTypes<RulesEngineMessageContents>;\n\n/** List of all messages for configuration purpose */\nexport type AvailableRulesEngineMessageContents = RulesEngineMessageContents\n | ConnectContentMessage\n | RequestMessagesContentMessage<RulesEngineMessageDataTypes>;\n\nexport const isRulesEngineMessage = (message: any): message is AvailableRulesEngineMessageContents => {\n return message && (\n message.dataType === 'rulesEngineEvents'\n || message.dataType === 'requestMessages'\n || message.dataType === 'connect'\n );\n};\n","import {\n InjectionToken,\n} from '@angular/core';\n\n/** Determine if the action should be executed */\nexport const RULES_ENGINE_OPTIONS = new InjectionToken<boolean>('Rules Engine Options');\n\n/** Rules engine configuration */\nexport interface RulesEngineServiceOptions {\n /** Determine if the actions resulting of the rule engine should be executed */\n dryRun: boolean;\n /** Flag to activate the run of Rules Engine in debug mode */\n debug: boolean;\n /** Limit the number of debug events kept in stack */\n debugEventsStackLimit?: number;\n}\n\n/** Default Rules engine options */\nexport const DEFAULT_RULES_ENGINE_OPTIONS: Readonly<RulesEngineServiceOptions> = {\n dryRun: false,\n debug: false\n} as const;\n","import {\n createAction,\n props,\n} from '@ngrx/store';\nimport {\n asyncProps,\n AsyncRequest,\n FailAsyncStoreItemEntitiesActionPayload,\n FromApiActionPayload,\n SetActionPayload,\n SetAsyncStoreItemEntitiesActionPayload,\n UpdateActionPayload,\n} from '@o3r/core';\nimport {\n RulesetsModel,\n RulesetsStateDetails,\n} from './rulesets.state';\n\n/** StateDetailsActions */\nconst ACTION_SET = '[Rulesets] set';\nconst ACTION_UPDATE = '[Rulesets] update';\nconst ACTION_RESET = '[Rulesets] reset';\nconst ACTION_CANCEL_REQUEST = '[Rulesets] cancel request';\n\n/** Entity Actions */\nconst ACTION_CLEAR_ENTITIES = '[Rulesets] clear entities';\nconst ACTION_UPSERT_ENTITIES = '[Rulesets] upsert entities';\nconst ACTION_SET_ENTITIES = '[Rulesets] set entities';\nconst ACTION_FAIL_ENTITIES = '[Rulesets] fail entities';\n\n/** Async Actions */\nconst ACTION_SET_ENTITIES_FROM_API = '[Rulesets] set entities from api';\nconst ACTION_UPSERT_ENTITIES_FROM_API = '[Rulesets] upsert entities from api';\n\n/** Action to clear the StateDetails of the store and replace it */\nexport const setRulesets = createAction(ACTION_SET, props<SetActionPayload<RulesetsStateDetails>>());\n\n/** Action to change a part or the whole object in the store. */\nexport const updateRulesets = createAction(ACTION_UPDATE, props<UpdateActionPayload<RulesetsStateDetails>>());\n\n/** Action to reset the whole state, by returning it to initial state. */\nexport const resetRulesets = createAction(ACTION_RESET);\n\n/** Action to cancel a Request ID registered in the store. Can happen from effect based on a switchMap for instance */\nexport const cancelRulesetsRequest = createAction(ACTION_CANCEL_REQUEST, props<AsyncRequest>());\n\n/** Action to clear all rulesets and fill the store with the payload */\nexport const setRulesetsEntities = createAction(ACTION_SET_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to update rulesets with known IDs, insert the new ones */\nexport const upsertRulesetsEntities = createAction(ACTION_UPSERT_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to empty the list of entities, keeping the global state */\nexport const clearRulesetsEntities = createAction(ACTION_CLEAR_ENTITIES);\n\n/** Action to update failureStatus for every RulesetsModel */\nexport const failRulesetsEntities = createAction(ACTION_FAIL_ENTITIES, props<FailAsyncStoreItemEntitiesActionPayload<any>>());\n\n/**\n * Action to put the global status of the store in a pending state. Call SET action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const setRulesetsEntitiesFromApi = createAction(ACTION_SET_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n\n/**\n * Action to put global status of the store in a pending state. Call UPSERT action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const upsertRulesetsEntitiesFromApi = createAction(ACTION_UPSERT_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n Actions,\n createEffect,\n ofType,\n} from '@ngrx/effects';\nimport {\n fromApiEffectSwitchMap,\n} from '@o3r/core';\nimport {\n from,\n of,\n} from 'rxjs';\nimport {\n catchError,\n map,\n mergeMap,\n} from 'rxjs/operators';\nimport {\n cancelRulesetsRequest,\n failRulesetsEntities,\n setRulesetsEntities,\n setRulesetsEntitiesFromApi,\n upsertRulesetsEntities,\n upsertRulesetsEntitiesFromApi,\n} from './rulesets.actions';\n\n/**\n * Service to handle async Rulesets actions\n */\n@Injectable()\nexport class RulesetsEffect {\n protected actions$ = inject(Actions);\n\n /**\n * Set the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n */\n public setEntitiesFromApi$ = createEffect(() =>\n this.actions$.pipe(\n ofType(setRulesetsEntitiesFromApi),\n fromApiEffectSwitchMap(\n (reply, action) => setRulesetsEntities({ entities: reply, requestId: action.requestId }),\n (error, action) => of(failRulesetsEntities({ error, requestId: action.requestId })),\n cancelRulesetsRequest\n )\n )\n );\n\n /**\n * Upsert the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n */\n public upsertEntitiesFromApi$ = createEffect(() =>\n this.actions$.pipe(\n ofType(upsertRulesetsEntitiesFromApi),\n mergeMap((payload) =>\n from(payload.call).pipe(\n map((reply) => upsertRulesetsEntities({ entities: reply, requestId: payload.requestId })),\n catchError((err) => of(failRulesetsEntities({ error: err, requestId: payload.requestId })))\n )\n )\n )\n );\n}\n","import {\n createEntityAdapter,\n} from '@ngrx/entity';\nimport {\n ActionCreator,\n createReducer,\n on,\n ReducerTypes,\n} from '@ngrx/store';\nimport {\n asyncStoreItemAdapter,\n} from '@o3r/core';\nimport * as actions from './rulesets.actions';\nimport {\n RulesetsModel,\n RulesetsState,\n} from './rulesets.state';\n\n/**\n * Rulesets Store adapter\n */\nexport const rulesetsAdapter = createEntityAdapter<RulesetsModel>({\n selectId: (model) => model.id\n});\n\n/**\n * Rulesets Store initial value\n */\nexport const rulesetsInitialState = rulesetsAdapter.getInitialState<RulesetsState>({\n requestIds: []\n});\n\n/**\n * List of basic actions for Rulesets Store\n */\nexport const rulesetsReducerFeatures: ReducerTypes<RulesetsState, ActionCreator[]>[] = [\n on(actions.resetRulesets, () => rulesetsInitialState),\n\n on(actions.setRulesets, (state, payload) => ({ ids: state.ids, entities: state.entities, ...payload.stateDetails })),\n\n on(actions.cancelRulesetsRequest, (state, action) => asyncStoreItemAdapter.resolveRequest(state, action.requestId)),\n\n on(actions.updateRulesets, (state, payload) => ({ ...state, ...payload.stateDetails })),\n\n on(actions.setRulesetsEntities, (state, payload) =>\n rulesetsAdapter.addMany(\n payload.entities,\n rulesetsAdapter.removeAll(asyncStoreItemAdapter.resolveRequest(state, payload.requestId)))\n ),\n\n on(actions.upsertRulesetsEntities, (state, payload) =>\n rulesetsAdapter.upsertMany(payload.entities, asyncStoreItemAdapter.resolveRequest(state, payload.requestId))\n ),\n\n on(actions.clearRulesetsEntities, (state) => rulesetsAdapter.removeAll(state)),\n\n on(actions.failRulesetsEntities, (state, payload) =>\n asyncStoreItemAdapter.failRequest(state, payload.requestId)\n ),\n\n on(actions.setRulesetsEntitiesFromApi, actions.upsertRulesetsEntitiesFromApi, (state, payload) =>\n asyncStoreItemAdapter.addRequest(state, payload.requestId))\n];\n\n/**\n * Rulesets Store reducer\n */\nexport const rulesetsReducer = createReducer(\n rulesetsInitialState,\n ...rulesetsReducerFeatures\n);\n","import {\n EntityState,\n} from '@ngrx/entity';\nimport {\n AsyncStoreItem,\n} from '@o3r/core';\nimport type {\n Ruleset,\n} from '../../engine';\n\n/**\n * Rulesets model\n */\nexport interface RulesetsModel extends Ruleset {\n}\n\n/**\n * Rulesets state details\n */\nexport interface RulesetsStateDetails extends AsyncStoreItem {\n}\n\n/**\n * Rulesets store state\n */\nexport interface RulesetsState extends EntityState<RulesetsModel>, RulesetsStateDetails {\n}\n\n/**\n * Name of the Rulesets Store\n */\nexport const RULESETS_STORE_NAME = 'rulesets';\n\n/**\n * Rulesets Store Interface\n */\nexport interface RulesetsStore {\n /** Rulesets state */\n [RULESETS_STORE_NAME]: RulesetsState;\n}\n","import {\n InjectionToken,\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n EffectsModule,\n} from '@ngrx/effects';\nimport {\n Action,\n ActionReducer,\n StoreModule,\n} from '@ngrx/store';\nimport {\n RulesetsEffect,\n} from './rulesets.effect';\nimport {\n rulesetsReducer,\n} from './rulesets.reducer';\nimport {\n RULESETS_STORE_NAME,\n RulesetsState,\n} from './rulesets.state';\n\n/** Token of the Rulesets reducer */\nexport const RULESETS_REDUCER_TOKEN = new InjectionToken<ActionReducer<RulesetsState, Action>>('Feature Rulesets Reducer');\n\n/** Provide default reducer for Rulesets store */\nexport function getDefaultRulesetsReducer() {\n return rulesetsReducer;\n}\n\n@NgModule({\n imports: [\n StoreModule.forFeature(RULESETS_STORE_NAME, RULESETS_REDUCER_TOKEN), EffectsModule.forFeature([RulesetsEffect])\n ],\n providers: [\n { provide: RULESETS_REDUCER_TOKEN, useFactory: getDefaultRulesetsReducer }\n ]\n})\nexport class RulesetsStoreModule {\n public static forRoot<T extends RulesetsState>(reducerFactory: () => ActionReducer<T, Action>): ModuleWithProviders<RulesetsStoreModule> {\n return {\n ngModule: RulesetsStoreModule,\n providers: [\n { provide: RULESETS_REDUCER_TOKEN, useFactory: reducerFactory }\n ]\n };\n }\n}\n","import {\n createFeatureSelector,\n createSelector,\n} from '@ngrx/store';\nimport {\n computeItemIdentifier,\n} from '@o3r/core';\nimport type {\n Ruleset,\n} from '../../engine';\nimport {\n rulesetsAdapter,\n} from './rulesets.reducer';\nimport {\n RULESETS_STORE_NAME,\n RulesetsState,\n} from './rulesets.state';\n\nconst { selectIds, selectEntities, selectAll, selectTotal } = rulesetsAdapter.getSelectors();\n\n/** Select Rulesets State */\nexport const selectRulesetsState = createFeatureSelector<RulesetsState>(RULESETS_STORE_NAME);\n\n/** Select the array of Rulesets ids */\nexport const selectRulesetsIds = createSelector(selectRulesetsState, selectIds);\n\n/** Select the array of Rulesets */\nexport const selectAllRulesets = createSelector(selectRulesetsState, selectAll);\n\n/** Select the dictionary of Rulesets entities */\nexport const selectRulesetsEntities = createSelector(selectRulesetsState, selectEntities);\n\n/** Select the total Rulesets count */\nexport const selectRulesetsTotal = createSelector(selectRulesetsState, selectTotal);\n\n/** Select the store pending status */\nexport const selectRulesetsStorePendingStatus = createSelector(selectRulesetsState, (state) => state.isPending || false);\n\n/**\n * Check if the given value is a valid date\n * @param d\n */\nconst isValidDate = (d: any) => !Number.isNaN(d) && d instanceof Date;\n\n/**\n * Returns the rulesets which are in the validity range, if provided\n */\nexport const selectRuleSetsInRange = createSelector(\n selectAllRulesets,\n (ruleSets) => ruleSets.filter((ruleSet: Ruleset) => {\n const validity = ruleSet.validityRange;\n if (!validity || (!validity.from && !validity.to)) {\n return true;\n }\n\n const from = validity.from && new Date(validity.from);\n const to = validity.to && new Date(validity.to);\n\n if ((to && !isValidDate(to)) || (from && !isValidDate(from))) {\n return false;\n }\n const time = Date.now();\n if (to && from) {\n return from.getTime() <= time && to.getTime() >= time;\n }\n\n if (from) {\n return from.getTime() <= time;\n }\n return to && to.getTime() >= time;\n })\n);\n\n/**\n * Returns the rulesets ids which are not onDemand and in the validity range\n */\nexport const selectActiveRuleSets = createSelector(\n selectRuleSetsInRange,\n (ruleSets) => ruleSets\n .filter((ruleSet: Ruleset) => (!ruleSet.linkedComponents?.or?.length))\n .map((ruleSet: Ruleset) => ruleSet.id));\n\n/**\n * Assign component to RulesetIds Map\n * @param compName\n * @param library\n * @param ruleSetId\n * @param acc\n */\nfunction linkComponentToRuleset(compName: string, library: string, ruleSetId: string, acc: Record<string, string[]> = {}) {\n const configName = computeItemIdentifier(compName, library);\n acc[ruleSetId] ||= [];\n acc[ruleSetId].push(configName);\n}\n\n/**\n * Select the map of ruleSets to activate based on linked components\n */\nexport const selectComponentsLinkedToRuleset = createSelector(\n selectRuleSetsInRange,\n (ruleSets) =>\n ruleSets\n .reduce((acc: { or: { [key: string]: string[] } }, ruleSet: Ruleset) => {\n if (!ruleSet.linkedComponents?.or || ruleSet.linkedComponents.or.length === 0) {\n return acc;\n }\n if (ruleSet.linkedComponents?.or?.length) {\n ruleSet.linkedComponents.or.forEach((linkComp) => {\n linkComponentToRuleset(linkComp.name, linkComp.library, ruleSet.id, acc.or);\n });\n return acc;\n }\n return acc;\n }, { or: {} })\n);\n","import {\n asyncStoreItemAdapter,\n Serializer,\n} from '@o3r/core';\nimport {\n rulesetsAdapter,\n rulesetsInitialState,\n} from './rulesets.reducer';\nimport {\n RulesetsModel,\n RulesetsState,\n} from './rulesets.state';\n\nexport const rulesetsStorageSerializer = (state: RulesetsState) => {\n return asyncStoreItemAdapter.clearAsyncStoreItem(state);\n};\n\nexport const rulesetsStorageDeserializer = (rawObject: any) => {\n if (!rawObject || !rawObject.ids) {\n return rulesetsInitialState;\n }\n const storeObject = rulesetsAdapter.getInitialState<RulesetsState>(rawObject);\n for (const id of rawObject.ids) {\n storeObject.entities[id] = rawObject.entities[id] as RulesetsModel;\n }\n return storeObject;\n};\n\nexport const rulesetsStorageSync: Serializer<RulesetsState> = {\n serialize: rulesetsStorageSerializer,\n deserialize: rulesetsStorageDeserializer\n};\n","import {\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n} from '../engine-interface';\nimport type {\n Facts,\n} from '../fact';\nimport {\n ActionBlock,\n Rule,\n} from '../structure';\n\n/**\n * Function to retrieve from 2 sequential executions only the triggers which activated the last ruleset execution\n * @param currRes Current ruleset execution object\n * @param prevRes Previous ruleset execution object\n * @returns The triggers list which activates the last ruleset execution\n */\nexport function retrieveRulesetTriggers(currRes: RuleEvaluationOutput[], prevRes: RuleEvaluationOutput[] | undefined) {\n let rulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n const allCurrRulesetTriggersList = currRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n const allCurrRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n allCurrRulesetTriggersList.forEach((rTrig) => {\n Object.keys(rTrig).forEach((ruleId) => {\n allCurrRulesetTriggers[ruleId] = rTrig[ruleId];\n });\n });\n\n if (prevRes) {\n const allPrevRulesetTriggersList = prevRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n const allPrevRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n allPrevRulesetTriggersList.forEach((rTrig) => {\n Object.keys(rTrig).forEach((ruleId) => {\n allPrevRulesetTriggers[ruleId] = rTrig[ruleId];\n });\n });\n\n Object.entries(allCurrRulesetTriggers).forEach(([ruleId, ruleTriggers]) => {\n Object.keys(ruleTriggers).forEach((factName) => {\n if (!allPrevRulesetTriggers[ruleId]\n || !allPrevRulesetTriggers[ruleId][factName]\n || ruleTriggers[factName].newValue !== allPrevRulesetTriggers[ruleId][factName].newValue) {\n (rulesetTriggers[ruleId] ||= {})[factName] = ruleTriggers[factName];\n }\n });\n });\n } else {\n rulesetTriggers = allCurrRulesetTriggers;\n }\n return rulesetTriggers;\n}\n\n/**\n * Flag as cached the rules evaluations which are from previous ruleset executions\n * @param rulesEvaluations all rules evaluations list\n * @param triggers Ruleset triggers object\n * @returns Rules evaluation list with flagged rules evaluation from previous ruleset executions\n */\nexport function flagCachedRules(rulesEvaluations: RuleEvaluation[], triggers: Record<string, Record<string, EvaluationReason>>): (RuleEvaluation & { cached?: boolean })[] {\n const rulesWhichTriggeredExecution = Object.keys(triggers);\n\n return rulesEvaluations.map((e) => {\n if (e && !rulesWhichTriggeredExecution.includes(e.rule.id)) {\n return { ...e, cached: true };\n }\n return { ...e };\n });\n}\n\n/**\n * Create the debug rule evaluation object\n * @param rule\n * @param rulesetName\n * @param outputActions\n * @param outputError\n * @param runtimeFactValues\n * @param factValues\n * @param oldFactValues\n * @param inputFacts\n */\nexport function handleRuleEvaluationDebug(\n rule: Rule,\n rulesetName: string,\n outputActions: ActionBlock[] | undefined,\n outputError: any,\n runtimeFactValues: Record<string, Facts>,\n factValues: any[] | undefined,\n oldFactValues: any[] | undefined,\n inputFacts: string[] | undefined = []\n) {\n const executionId = `${rulesetName} - ${rule.name}`;\n\n const reasons: Record<string, Record<string, EvaluationReason>> = {};\n for (let index = 0; index < factValues!.length; index++) {\n if (!oldFactValues) {\n (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], newValue: factValues![index] };\n } else if (oldFactValues[index]?.toString() !== factValues![index]?.toString()) {\n (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], oldValue: oldFactValues[index], newValue: factValues![index] };\n }\n }\n\n const ruleEvaluation: RuleEvaluation = {\n timestamp: Date.now(),\n outputActions,\n id: executionId,\n triggers: reasons,\n temporaryFacts: rule.outputRuntimeFacts.concat(rule.inputRuntimeFacts).reduce<Record<string, Facts>>((acc, runtimeFactName) => {\n if (typeof runtimeFactValues[runtimeFactName] !== 'undefined') {\n acc[runtimeFactName] = runtimeFactValues[runtimeFactName];\n }\n return acc;\n }, {}\n ),\n rule: { id: rule.id, name: rule.name },\n ...(outputError ? { error: outputError } : {})\n };\n return ruleEvaluation;\n}\n","import {\n debounceTime,\n Observable,\n ReplaySubject,\n Subject,\n} from 'rxjs';\nimport {\n concatMap,\n share,\n shareReplay,\n startWith,\n switchMap,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport type {\n RulesEngine,\n} from '../engine';\nimport {\n BaseRulesetExecution,\n DebugEvent,\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../engine-interface';\nimport type {\n Facts,\n} from '../fact';\nimport {\n RulesetExecutor,\n} from '../ruleset-executor';\nimport type {\n ActionBlock,\n Ruleset,\n} from '../structure';\nimport {\n flagCachedRules,\n retrieveRulesetTriggers,\n} from './helpers';\n\nexport interface EngineDebuggerOptions {\n /**\n * Limit of events to keep in the stack before subscribing to the debugEvents$ stream.\n * @default undefined no limit\n */\n eventsStackLimit?: number;\n}\n\n/**\n * Rules engine debugger object to emit debug events\n */\nexport class EngineDebugger {\n private registeredRuleEngine?: RulesEngine;\n\n private registeredRulesets: Pick<Ruleset, 'name' | 'id'>[] = [];\n\n // Keep a small history in case the events$ stream from the engine is subscribed after rules engine initialization\n private readonly debugEventsSubject$: ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>;\n\n private performanceMeasures$!: Observable<PerformanceMeasure[]>;\n\n private readonly requestFactsSnapshot = new Subject<void>();\n\n /** Stream emitting a debug event when is fired; timeline is kept */\n public readonly debugEvents$: Observable<DebugEvent>;\n\n /** Retrieved the rules engine plugged to the debugger */\n public get rulesEngine(): RulesEngine | undefined {\n return this.registeredRuleEngine;\n }\n\n /**\n * Instantiate a rules engine debugger\n * @param options Options to configure the debugger\n */\n constructor(options?: EngineDebuggerOptions) {\n this.debugEventsSubject$ = new ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>(options?.eventsStackLimit);\n this.initializePerformanceObserver();\n this.debugEvents$ = new Observable<DebugEvent>((subscriber) => {\n const factsSnapshotSubscription = this.requestFactsSnapshot.pipe(\n debounceTime(1000),\n switchMap(async () => {\n const timestamp = Date.now();\n const facts = await this.getFactsSnapshot(this.registeredRuleEngine!.getRegisteredFactsNames());\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'AvailableFactsSnapshot',\n facts\n }));\n })\n ).subscribe();\n const debugEventsSubscription = this.debugEventsSubject$.pipe(\n withLatestFrom(this.performanceMeasures$),\n concatMap(async ([eventFunc, performanceMeasures]) => {\n const debugEvent: DebugEvent = await eventFunc();\n if (debugEvent.type === 'RulesetExecution' || debugEvent.type === 'RulesetExecutionError') {\n let rulesetDuration = 0;\n debugEvent.rulesEvaluations.forEach((rule) => {\n const mark = `rules-engine:${\n this.registeredRuleEngine?.rulesEngineInstanceName || ''\n }:${debugEvent.rulesetName}:${rule.rule.name}`;\n const measures = performanceMeasures.filter((m) => m.name === mark);\n const duration = measures.at(-1)?.duration || 0;\n rule.duration = duration;\n rulesetDuration += duration;\n });\n debugEvent.duration = rulesetDuration;\n }\n return debugEvent;\n }),\n tap((debugEvent) => {\n if (debugEvent.type === 'RulesetExecution') {\n this.rulesEngine?.logger?.debug?.(`${debugEvent.rulesetName} has been triggered and resulted in ${JSON.stringify(debugEvent.outputActions)}`);\n }\n })\n ).subscribe(subscriber);\n\n return () => {\n factsSnapshotSubscription.unsubscribe();\n debugEventsSubscription.unsubscribe();\n };\n }).pipe(share());\n }\n\n private initializePerformanceObserver() {\n this.performanceMeasures$ = new Observable<PerformanceMeasure[]>((subscriber) => {\n const performanceObserver = new PerformanceObserver((list) => {\n subscriber.next(list.getEntries() as PerformanceMeasure[]);\n });\n performanceObserver.observe({ entryTypes: ['measure'] });\n return () => performanceObserver.disconnect();\n }).pipe(startWith([]), shareReplay(1));\n }\n\n private async createBaseExecutionOutputObject(ruleset: Ruleset, executionCounter: number,\n rulesetInputFacts: string[], runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n const inputFacts = await this.getFactsSnapshot(rulesetInputFacts);\n\n const baseRulesetOutputExecution: BaseRulesetExecution = {\n executionCounter,\n executionId: `${ruleset.id}-${executionCounter}`,\n rulesetId: ruleset.id,\n rulesetName: ruleset.name,\n inputFacts,\n triggers: rulesetTriggers,\n rulesEvaluations: flagCachedRules(rulesExecutions?.toSorted((a, b) => a.timestamp - b.timestamp) || [], rulesetTriggers),\n temporaryFacts: runtimeFactValues\n };\n return baseRulesetOutputExecution;\n }\n\n private async rulesetExecution(\n timestamp: number,\n ruleset: Ruleset,\n executionCounter: number,\n rulesetInputFacts: string[],\n allOutputActions: ActionBlock[],\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]) {\n const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n const rulesetOutputExecution: RulesetExecutionEvent = {\n timestamp,\n type: 'RulesetExecution',\n outputActions: allOutputActions,\n ...baseRulesetOutputExecution\n };\n\n return rulesetOutputExecution;\n }\n\n private async rulesetExecutionError(\n timestamp: number,\n ruleset: Ruleset,\n rulesetInputFacts: string[],\n executionCounter: number,\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]\n ) {\n const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n const rulesExecWithErrors = rulesExecutions.filter((ex) => !!ex && !!ex.error);\n const rulesetOutputExecutionSkip: RulesetExecutionErrorEvent = {\n timestamp,\n type: 'RulesetExecutionError',\n rulesCausingTheError: rulesExecWithErrors.map((e) => e.rule) || [],\n errors: rulesExecWithErrors.map((e) => e.error),\n ...baseRulesetOutputExecution\n };\n return rulesetOutputExecutionSkip;\n }\n\n /**\n * Plug the debugger to a Rule Engine\n * @param rulesEngine\n */\n public registerRuleEngine(rulesEngine: RulesEngine) {\n this.registeredRuleEngine = rulesEngine;\n }\n\n /**\n * Handle ruleset execution debug info\n * @param currRes\n * @param prevRes\n * @param allExecutionsValid\n * @param rulesetInputFacts\n * @param runtimeFactValues\n * @param executionCounter\n * @param ruleset\n */\n public handleDebugRulesetExecutionInfo(\n currRes: RuleEvaluationOutput[],\n prevRes: RuleEvaluationOutput[] | undefined,\n allExecutionsValid: boolean,\n rulesetInputFacts: string[],\n runtimeFactValues: Record<string, Facts>,\n executionCounter: number,\n ruleset: Ruleset) {\n const rulesetTriggers = retrieveRulesetTriggers(currRes, prevRes);\n const rulesetOutputExecution = currRes.map((r) => r.evaluation!);\n\n if (!allExecutionsValid) {\n this.addRulesetExecutionErrorEvent(ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesetOutputExecution);\n }\n\n return {\n executionCounter,\n rulesetOutputExecution,\n allExecutionsValid,\n rulesetTriggers\n };\n }\n\n /**\n * Emits an 'AvailableRulesets' debug event when rulesets are registered to the rules engine\n * @param rulesets\n */\n public addAvailableRulesets(rulesets: Ruleset[]) {\n const timestamp = Date.now();\n this.registeredRulesets = [...this.registeredRulesets, ...rulesets.map((r) => ({ name: r.name, id: r.id }))];\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'AvailableRulesets',\n availableRulesets: this.registeredRulesets\n }));\n }\n\n /**\n * Computes and emits an 'ActiveRulesets' debug event when the active rulesets are changing\n * @param ruleSetExecutorMap map off all rulesets executors\n * @param restrictiveRuleSets ids of the rulesets to activate; if not provided all registered rulesets will be considered as active\n */\n public activeRulesetsChange(ruleSetExecutorMap: Record<string, RulesetExecutor>, restrictiveRuleSets?: string[]) {\n const timestamp = Date.now();\n const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n const activeRulesets = restrictiveRuleSets\n ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n : Object.values(rulesets);\n\n this.debugEventsSubject$.next(() => ({\n timestamp,\n type: 'ActiveRulesets',\n rulesets: activeRulesets.map((a) => ({ name: ruleSetExecutorMap[a.id].ruleset.name, id: ruleSetExecutorMap[a.id].ruleset.id }))\n }));\n }\n\n /**\n * Emits an 'AllActions' debug event each time the rules engine outputs the list of actions\n * @param actions list of outputted actions\n */\n public allActionsChange(actions: ActionBlock[]) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => ({ timestamp, type: 'AllActions', actions }));\n }\n\n /**\n * Emits a 'RulesetExecution' debug event at the output of a successful ruleset execution\n * @param ruleset\n * @param executionCounter\n * @param rulesetInputFacts\n * @param allOutputActions\n * @param runtimeFactValues\n * @param rulesetTriggers\n * @param rulesExecutions\n */\n public addRulesetExecutionEvent(ruleset: Ruleset, executionCounter: number,\n rulesetInputFacts: string[], allOutputActions: ActionBlock[], runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => this.rulesetExecution(timestamp, ruleset, executionCounter,\n rulesetInputFacts, allOutputActions, runtimeFactValues, rulesetTriggers, rulesExecutions));\n }\n\n /**\n * Emits a 'RulesetExecutionError' debug event at the output of a failing ruleset execution\n * @param ruleset\n * @param rulesetInputFacts\n * @param executionCounter\n * @param runtimeFactValues\n * @param rulesetTriggers\n * @param rulesExecutions\n */\n public addRulesetExecutionErrorEvent(\n ruleset: Ruleset,\n rulesetInputFacts: string[],\n executionCounter: number,\n runtimeFactValues: Record<string, Facts>,\n rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n rulesExecutions: RuleEvaluation[]\n ) {\n const timestamp = Date.now();\n this.debugEventsSubject$.next(() => this.rulesetExecutionError(timestamp, ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesExecutions));\n }\n\n /**\n * Emits a 'AvailableFactsSnapshot' debug event when a fact value is updated\n * @param _id\n * @param factValue$\n */\n public addAvailableFactsSnapshotEvent(\n _id: string,\n factValue$: Observable<any>\n ) {\n factValue$.subscribe(() => this.requestFactsSnapshot.next());\n }\n\n /**\n * Returns a list of fact name and value pairs\n * @param factsNames List of facts names to get the value for\n */\n public async getFactsSnapshot(factsNames: string[]) {\n const facts: { factName: string; value: any }[] = [];\n if (!this.registeredRuleEngine) {\n throw new Error('Rule engine not plugged to the debugger');\n }\n for (const factName of factsNames) {\n facts.push({ factName, value: await this.registeredRuleEngine.retrieveFactValue(factName) });\n }\n return facts;\n }\n}\n","import {\n combineLatest,\n Observable,\n of,\n} from 'rxjs';\nimport {\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport {\n RulesetExecutor,\n} from '../ruleset-executor';\n\n/**\n * Filter the actions outputted by the rules engine, based on active rulesets\n * @param restrictiveRuleSets list of rules sets to get the event stream for\n */\nexport function filterRulesetsEventStream(restrictiveRuleSets?: string[]) {\n return (source$: Observable<Record<string, RulesetExecutor>>) => source$.pipe(\n switchMap((ruleSetExecutorMap) => {\n const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n const activeRulesets = restrictiveRuleSets\n ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n : Object.values(rulesets);\n\n return activeRulesets?.length > 0\n ? combineLatest(activeRulesets.map((ruleset) => ruleset.rulesResultsSubject$)).pipe(\n map((item) => item.reduce((acc, currentValue) => {\n acc.push(...currentValue);\n return acc;\n }, [])))\n : of([]);\n }),\n shareReplay(1)\n );\n}\n","import type {\n Facts,\n} from '../fact';\nimport {\n DateInput,\n Operator,\n SupportedSimpleTypes,\n} from './operator-interface';\n\n/**\n * Execute Operator\n * @param lhs Left hand side\n * @param rhs Right hand side\n * @param operator Operator to compare values\n * @param operatorFacts Facts that operator can depend on\n */\nexport function executeOperator<L = unknown, R = unknown>(lhs: L, rhs: R, operator: Operator<L, R>, operatorFacts?: Record<string, Facts | undefined>) {\n const validLhs = (!operator.validateLhs || operator.validateLhs(lhs));\n const validRhs = (!operator.validateRhs || operator.validateRhs(rhs));\n let operatorFactValues: Record<string, Facts> | undefined;\n if (operatorFacts && operator.factImplicitDependencies) {\n operatorFactValues = operator.factImplicitDependencies.reduce((acc, dep) => {\n if (operatorFacts[dep]) {\n acc[dep] = operatorFacts[dep]!;\n } else {\n throw new Error(`The fact \"${dep}\" requested by ${operator.name} cannot be found.`);\n }\n return acc;\n }, {} as Record<string, Facts>);\n }\n if (!validLhs) {\n throw new Error(`Invalid left operand: ${JSON.stringify(lhs)}`);\n }\n if (!validRhs) {\n throw new Error(`Invalid right operand: ${JSON.stringify(rhs)}`);\n }\n const obs = operator.evaluator(lhs, rhs, operatorFactValues);\n return obs;\n}\n\n/**\n * Validate a number operand\n * @param operand value of one of the operands\n */\nexport function numberValidator(operand: unknown): operand is number | string {\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- needed to convert any variable in a number (or NaN)\n return operand !== '' && !Array.isArray(operand) && !Number.isNaN(+`${operand}`);\n}\n\n/**\n * Validate an operand is a range of numbers\n * @param operatorInput value of one of the operands\n */\nexport function isRangeNumber(operatorInput: unknown): operatorInput is [number | string, number | string] {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && numberValidator(operatorInput[0])\n && numberValidator(operatorInput[1])\n && operatorInput[0] <= operatorInput[1];\n}\n\n/**\n * Verifies if the parameter is a valid date for the operator (getTime function available returning a number)\n * @param operatorInput\n */\nexport const isValidDate = (operatorInput: any): operatorInput is Date => {\n if (!operatorInput || typeof operatorInput.getTime !== 'function') {\n return false;\n }\n const getTimeResult = operatorInput.getTime();\n return typeof getTimeResult === 'number' && !Number.isNaN(getTimeResult);\n};\n\n/**\n * Verifies if the parameter is a valid input for Date constructor (new Date returns a valid date)\n * @param operatorInput\n */\nexport const isValidDateInput = (operatorInput: any): operatorInput is DateInput => {\n return operatorInput === 0 || (!!operatorInput && isValidDate(new Date(operatorInput)));\n};\n\n/**\n * Verifies if the parameter is a valid date range\n * @param operatorInput\n */\nexport const isValidDateRange = (operatorInput: any): operatorInput is [DateInput, DateInput] => {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && isValidDateInput(operatorInput[0])\n && isValidDateInput(operatorInput[1])\n && new Date(operatorInput[0]) <= new Date(operatorInput[1]);\n};\n\n/**\n * Verifies if the parameter is a valid time input\n * @param operatorInput\n */\nexport const isValidTimeInput = (operatorInput: any): operatorInput is string => {\n if (!isString(operatorInput) || !/^\\d{1,2}:\\d{2}$/.test(operatorInput)) {\n return false;\n }\n const [hours, minutes] = operatorInput.split(':').map((value) => +value);\n return hours < 24 && minutes < 60;\n};\n\n/**\n * Verifies if the parameter is a valid time range\n * @param operatorInput\n */\nexport const isValidTimeRange = (operatorInput: any): operatorInput is [string, string] => {\n return Array.isArray(operatorInput)\n && operatorInput.length === 2\n && isValidTimeInput(operatorInput[0])\n && isValidTimeInput(operatorInput[1]);\n};\n\n/**\n * Validate that a value is a supported simple type\n * @param value value to validate\n */\nexport function isSupportedSimpleTypes(value: unknown): value is SupportedSimpleTypes {\n return ['string', 'boolean', 'number', 'undefined'].includes(typeof value) || value === null || isValidDate(value);\n}\n\n/**\n * Validate that a value is a string\n * @param value\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Parse input to return RegExp\n * @param inputRegExp\n */\nexport function parseRegExp(inputRegExp: string) {\n if (inputRegExp.startsWith('/')) {\n const finalSlash = inputRegExp.lastIndexOf('/');\n const regexpPattern = inputRegExp.slice(1, finalSlash);\n const regexpFlags = inputRegExp.slice(finalSlash + 1);\n return new RegExp(regexpPattern, regexpFlags);\n }\n return new RegExp(inputRegExp);\n}\n","import {\n isRangeNumber,\n isString,\n isSupportedSimpleTypes,\n numberValidator,\n parseRegExp,\n} from '../operator-helpers';\nimport {\n Operator,\n SupportedSimpleTypes,\n} from '../operator-interface';\n\n/**\n * Check if any of the variable's value is equal to a specific value\n * @title contains\n */\nexport const arrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'arrayContains',\n evaluator: (value, b) => value.includes(b),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is included in the text variable\n * @title contains\n */\nexport const stringContains: Operator<string, string> = {\n name: 'stringContains',\n evaluator: (inputString, substring) => inputString.includes(substring),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is different from a specific value\n * @title does not contain\n */\nexport const notArrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'notArrayContains',\n evaluator: (array, value) => !array.includes(value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is not included in the text variable\n * @title does not contain\n */\nexport const notStringContains: Operator<string, string> = {\n name: 'notStringContains',\n evaluator: (inputString, substring: any) => !inputString.includes(substring),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable equals a specific value\n * @title all equal to\n */\nexport const allEqual: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'allEqual',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (array, value) => array.every((elementValue) => elementValue == value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if every numerical value of the variable is greater than a specific value\n * @title all >\n */\nexport const allGreater: Operator<SupportedSimpleTypes[], number | string> = {\n name: 'allGreater',\n evaluator: (array, value) => array.every((elementValue) => numberValidator(elementValue) && +elementValue > +value),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if every value of the variable is in a specific list\n * @title all in\n */\nexport const allIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'allIn',\n evaluator: (array, value) => array.every((elementValue) => value.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if every value of the variable is not in a specific list\n * @title none in\n */\nexport const allNotIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'allNotIn',\n evaluator: (array, value) => !array.some((elementValue) => value.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if every numerical value of the variable is lower than a specific value\n * @title all <\n */\nexport const allLower: Operator<number[], number | string> = {\n name: 'allLower',\n evaluator: (arrayNumber, number) => arrayNumber.every((elementNumber) => elementNumber < +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if every string value of the variable matches a specific pattern\n * @title all match\n */\nexport const allMatch: Operator<string[], string> = {\n name: 'allMatch',\n evaluator: (array, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return array.every((elementValue) => regExp.test(elementValue));\n },\n validateLhs: Array.isArray,\n validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is included in a specified range\n * @title all between\n */\nexport const allRangeNumber: Operator<number[], [number | string, number | string]> = {\n name: 'allRangeNumber',\n evaluator: (rangeArray, [from, to]) =>\n rangeArray.every((elementValue) => elementValue >= +from && elementValue <= +to),\n validateLhs: Array.isArray,\n validateRhs: isRangeNumber\n};\n\n/**\n * Check if at least one of the values of the variable equals a specific value\n * @title one equal to\n */\nexport const oneEquals: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n name: 'oneEquals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (array, value) => array.some((elementValue) => elementValue == value),\n validateLhs: Array.isArray,\n validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if one of the values of the variable is greater than a specific value\n * @title one >\n */\nexport const oneGreater: Operator<number[], number | string> = {\n name: 'oneGreater',\n evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue > +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if at least one of the values of the variable is equal to one in a specified list\n * @title one in\n */\nexport const oneIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n name: 'oneIn',\n evaluator: (firstArray, secondArray) =>\n firstArray.some((elementValue) => secondArray.includes(elementValue)),\n validateLhs: Array.isArray,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if one of the values of the variable is lower than a specific value\n * @title one <\n */\nexport const oneLower: Operator<number[], number | string> = {\n name: 'oneLower',\n evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue < +number),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if one of the values of the variable matches a specific pattern\n * @title one matches\n */\nexport const oneMatches: Operator<string[], string> = {\n name: 'oneMatches',\n evaluator: (arrayString, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return arrayString.some((elementValue) => regExp.test(elementValue));\n },\n validateLhs: Array.isArray,\n validateRhs: isString\n};\n\n/**\n * Check if one of the values of the variable is included in a specified range\n * @title one between\n */\nexport const oneRangeNumber: Operator<number[], [number | string, number | string]> = {\n name: 'oneRangeNumber',\n evaluator: (arrayNumber, [from, to]) =>\n arrayNumber.some((elementValue) => elementValue >= +from && elementValue <= +to),\n validateLhs: Array.isArray,\n validateRhs: isRangeNumber\n};\n\n/**\n * Check if the number of values of the variable is equal to a specific value\n * @title number of =\n */\nexport const lengthEquals: Operator<any[], number | string> = {\n name: 'lengthEquals',\n evaluator: (array, length) => array.length === Number(length),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is different from a specific value\n * @title number of ≠\n */\nexport const lengthNotEquals: Operator<any[], number | string> = {\n name: 'lengthNotEquals',\n evaluator: (array, length) => array.length !== Number(length),\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower or equal to a specific value\n * @title number of ≤\n */\nexport const lengthLessThanOrEquals: Operator<any[], number | string> = {\n name: 'lengthLessThanOrEquals',\n evaluator: (array, length) => array.length <= +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower than a specific value\n * @title number of <\n */\nexport const lengthLessThan: Operator<any[], number | string> = {\n name: 'lengthLessThan',\n evaluator: (array, length) => array.length < +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater or equal to a specific value\n * @title number of ≥\n */\nexport const lengthGreaterThanOrEquals: Operator<any[], number | string> = {\n name: 'lengthGreaterThanOrEquals',\n evaluator: (array, length) => array.length >= +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater than a specific value\n * @title number of >\n */\nexport const lengthGreaterThan: Operator<any[], number | string> = {\n name: 'lengthGreaterThan',\n evaluator: (array, length) => array.length > +length,\n validateLhs: Array.isArray,\n validateRhs: numberValidator\n};\n\n/** List of all default array operators */\nexport const arrayBasedOperators = [\n allEqual,\n allGreater,\n allIn,\n allLower,\n allMatch,\n allNotIn,\n allRangeNumber,\n arrayContains,\n lengthEquals,\n lengthNotEquals,\n lengthGreaterThan,\n lengthGreaterThanOrEquals,\n lengthLessThan,\n lengthLessThanOrEquals,\n notArrayContains,\n notStringContains,\n oneEquals,\n oneGreater,\n oneIn,\n oneLower,\n oneMatches,\n oneRangeNumber,\n stringContains\n];\n","import {\n isString,\n isSupportedSimpleTypes,\n parseRegExp,\n} from '../operator-helpers';\nimport {\n Operator,\n SupportedSimpleTypes,\n UnaryOperator,\n} from '../operator-interface';\n\n/**\n * Check if a variable is equal to a specific value\n * @title is equal to\n */\nexport const equals: Operator = {\n name: 'equals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (firstValue, secondValue) => firstValue == secondValue\n};\n\n/**\n * Check if a variable is different from a specific value\n * @title is not equal to\n */\nexport const notEquals: Operator = {\n name: 'notEquals',\n // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n evaluator: (firstValue, secondValue) => firstValue != secondValue\n};\n\n/**\n * Check if the variable's value is included in a specified list\n * @title is in\n */\nexport const inArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n name: 'inArray',\n evaluator: (value, array) => array.includes(value),\n validateLhs: isSupportedSimpleTypes,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if the variable's value is not included in the value list\n * @title is not in\n */\nexport const notInArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n name: 'notInArray',\n evaluator: (value, array) => !array.includes(value),\n validateLhs: isSupportedSimpleTypes,\n validateRhs: Array.isArray\n};\n\n/**\n * Check if the text variable is part of the specified value\n * @title within\n */\nexport const inString: Operator<string, string> = {\n name: 'inString',\n evaluator: (value, inputString) => inputString.includes(value),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if the text variable is not part of the specified value\n * @title not within\n */\nexport const notInString: Operator<string, string> = {\n name: 'notInString',\n evaluator: (value, inputString) => !inputString.includes(value),\n validateLhs: isString,\n validateRhs: isString\n};\n\n/**\n * Check if the variable and its value are defined\n * @title is defined\n */\nexport const isDefined: UnaryOperator<any> = {\n name: 'isDefined',\n evaluator: (input) => input !== undefined && input !== null\n};\n\n/**\n * Check if the variable and its value are undefined\n * @title is not defined\n */\nexport const isUndefined: UnaryOperator<any> = {\n name: 'isUndefined',\n evaluator: (input) => input === undefined || input === null\n};\n\n/**\n * Check if the text variable matches the specified RegExp pattern\n * @title matches the pattern\n */\nexport const matchesPattern: Operator<string, string> = {\n name: 'matchesPattern',\n evaluator: (value, inputRegExp) => {\n const regExp = parseRegExp(inputRegExp);\n return regExp.test(value);\n },\n validateLhs: isString,\n validateRhs: isString\n};\n\n/** List of all default basic operators */\nexport const basicOperators = [\n equals, inArray, inString, isDefined, isUndefined, matchesPattern, notEquals, notInArray, notInString\n];\n","import {\n isValidDateInput,\n isValidDateRange,\n numberValidator,\n} from '../operator-helpers';\nimport {\n DateInput,\n Operator,\n} from '../operator-interface';\n\n/**\n * Check if a date variable is in a specified date range\n * @title is between\n */\nexport const inRangeDate: Operator<Date, [DateInput, DateInput], DateInput> = {\n name: 'inRangeDate',\n evaluator: (date, [from, to]) => {\n const dateObject = new Date(date);\n return new Date(from) <= dateObject && new Date(to) >= dateObject;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateRange\n};\n\n/**\n * Check if the value of the variable is in the next x minutes\n * @title is in next minutes\n * @returns false for dates before `now` and for dates after `now` + `nextMinutes`, true for dates between `now` and `now` + `nextMinutes`\n */\nexport const dateInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n name: 'dateInNextMinutes',\n evaluator: (leftDateInput, minutes, operatorFactValues) => {\n if (!operatorFactValues) {\n throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n }\n if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n throw new Error('o3rCurrentTime value is not a number');\n }\n const currentTimeValue = operatorFactValues.o3rCurrentTime;\n return inRangeDate.evaluator(leftDateInput, [currentTimeValue, currentTimeValue + +minutes * 60_000]);\n },\n factImplicitDependencies: ['o3rCurrentTime'],\n validateLhs: isValidDateInput,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the value of the variable is not in the next x minutes\n * @title is not in next minutes\n * @returns false for dates before `now` and for dates between `now` and `now` + `nextMinutes`, true for dates after `now` + `nextMinutes`\n */\nexport const dateNotInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n name: 'dateNotInNextMinutes',\n evaluator: (leftDateInput, minutes, operatorFactValues) => {\n if (!operatorFactValues) {\n throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n }\n if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n throw new Error('o3rCurrentTime value is not a number');\n }\n const currentTimeValue = operatorFactValues.o3rCurrentTime;\n const now = new Date(currentTimeValue);\n const leftDate = new Date(leftDateInput);\n const targetDate = new Date(new Date(currentTimeValue).setMinutes(now.getMinutes() + +minutes));\n return leftDate >= now && leftDate > targetDate;\n },\n factImplicitDependencies: ['o3rCurrentTime'],\n validateLhs: isValidDateInput,\n validateRhs: numberValidator\n};\n\n/**\n * Check if a date variable is prior than a specified date\n * @title is before\n */\nexport const dateBefore: Operator<Date, DateInput, DateInput> = {\n name: 'dateBefore',\n evaluator: (leftDate, rightDate) => {\n const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateTime < secondDateTime;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is posterior than a specified date\n * @title is after\n */\nexport const dateAfter: Operator<Date, DateInput, DateInput> = {\n name: 'dateAfter',\n evaluator: (leftDate, rightDate) => {\n const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateTime > secondDateTime;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is the same as a specified date\n * @title is equal to\n */\nexport const dateEquals: Operator<Date, DateInput, DateInput> = {\n name: 'dateEquals',\n evaluator: (leftDate, rightDate) => {\n const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateIgnoringHours === secondDateIgnoringHours;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is different from a specified date\n * @title is not equal\n */\nexport const dateNotEquals: Operator<Date, DateInput, DateInput> = {\n name: 'dateNotEquals',\n evaluator: (leftDate, rightDate) => {\n const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n return firstDateIgnoringHours !== secondDateIgnoringHours;\n },\n validateLhs: isValidDateInput,\n validateRhs: isValidDateInput\n};\n\nexport const dateBasedOperators = [\n inRangeDate, dateInNextMinutes, dateNotInNextMinutes, dateAfter, dateBefore, dateEquals, dateNotEquals\n];\n","import {\n numberValidator,\n} from '../operator-helpers';\nimport {\n Operator,\n} from '../operator-interface';\n\n/**\n * Check if the number variable is greater or equal to a specific value\n * @title ≥\n */\nexport const greaterThanOrEqual: Operator<number, number, number | string, number | string> = {\n name: 'greaterThanOrEqual',\n evaluator: (firstNumber, secondNumber) => firstNumber >= secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is greater than a specific value\n * @title >\n */\nexport const greaterThan: Operator<number, number, number | string, number | string> = {\n name: 'greaterThan',\n evaluator: (firstNumber, secondNumber) => firstNumber > secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower or equal to a specific value\n * @title ≤\n */\nexport const lessOrEqual: Operator<number, number, number | string, number | string> = {\n name: 'lessOrEqual',\n evaluator: (firstNumber, secondNumber) => firstNumber <= secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower than a specific value\n * @title <\n */\nexport const lessThan: Operator<number, number, number | string, number | string> = {\n name: 'lessThan',\n evaluator: (firstNumber, secondNumber) => firstNumber < secondNumber,\n validateLhs: numberValidator,\n validateRhs: numberValidator\n};\n\n/** List of all default number based operators */\nexport const numberBasedOperators = [greaterThan, greaterThanOrEqual, lessThan, lessOrEqual];\n","import {\n arrayBasedOperators,\n} from './array-based-operators';\nimport {\n basicOperators,\n} from './basic-operators';\nimport {\n dateBasedOperators,\n} from './date-based-operators';\nimport {\n numberBasedOperators,\n} from './number-based-operators';\n\nexport * from './array-based-operators';\nexport * from './basic-operators';\nexport * from './date-based-operators';\nexport * from './number-based-operators';\n\nexport const operatorList = [...arrayBasedOperators, ...basicOperators, ...numberBasedOperators, ...dateBasedOperators];\n","import {\n AllConditions,\n AnyConditions,\n BinaryOperation,\n NotCondition,\n Operand,\n OperandFact,\n UnaryOperation,\n} from '../structure';\n\n/**\n * Determine if the condition is a properties condition\n * @param condition Condition to analyze\n */\nexport function isConditionProperties(condition: any): condition is BinaryOperation | UnaryOperation {\n return condition && typeof condition.operator !== 'undefined' && typeof condition.lhs !== 'undefined';\n}\n\n/**\n * Determine if the given operand is a Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandFact(operand: any): operand is OperandFact {\n return operand && operand.type === 'FACT';\n}\n\n/**\n * Determine if the given operand is a Inner Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandRuntimeFact(operand: any): operand is Operand<'RUNTIME_FACT', string> {\n return operand && operand.type === 'RUNTIME_FACT';\n}\n\n/**\n * Determine if the given operand is a Static Value operand\n * @param operand Operand to analyze\n */\nexport function isOperandLiteral(operand: any): operand is Operand<'LITERAL'> {\n return operand && operand.type === 'LITERAL';\n}\n\n/**\n * Determine if the given condition is All based child conditions\n * @param condition Condition node\n */\nexport function isAllConditions(condition: any): condition is AllConditions {\n return condition && typeof condition.all !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Any based child conditions\n * @param condition Condition node\n */\nexport function isAnyConditions(condition: any): condition is AnyConditions {\n return condition && typeof condition.any !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Not based child conditions\n * @param condition Condition node\n */\nexport function isNotCondition(condition: any): condition is NotCondition {\n return condition && typeof condition.not !== 'undefined';\n}\n","/** Ruleset executor */\nimport {\n JSONPath,\n} from 'jsonpath-plus';\nimport {\n combineLatest,\n Observable,\n of,\n} from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n pairwise,\n shareReplay,\n startWith,\n switchMap,\n tap,\n} from 'rxjs/operators';\nimport {\n handleRuleEvaluationDebug,\n} from './debug/helpers';\nimport type {\n RulesEngine,\n} from './engine';\nimport {\n EngineRuleset,\n EvaluationReason,\n RuleEvaluation,\n RuleEvaluationOutput,\n} from './engine-interface';\nimport type {\n Facts,\n} from './fact';\nimport {\n executeOperator,\n} from './operator/operator-helpers';\nimport {\n Operator,\n} from './operator/operator-interface';\nimport {\n isAllConditions,\n isConditionProperties,\n isNotCondition,\n isOperandFact,\n isOperandLiteral,\n isOperandRuntimeFact,\n} from './rule/rule-helpers';\nimport {\n ActionBlock,\n ActionSetTemporaryFactBlock,\n AllBlock,\n GenericOperand,\n IfElseBlock,\n NestedCondition,\n Rule,\n Ruleset,\n} from './structure';\n\n/** Type of the retrieve fact function */\nexport type RetrieveFactFuncType = <T = unknown> (id: string) => Observable<T | undefined>;\n\nexport class RulesetExecutor {\n /** retrieveFactFunc */\n protected readonly rulesEngine: RulesEngine;\n\n /** Map of available operators */\n protected readonly operators: Record<string, Operator<unknown, unknown>>;\n\n /** Delay before fact stream defaulting value */\n public readonly factDefaultDelay?: number;\n\n /** Ruleset associated to the current executor*/\n public readonly ruleset: Ruleset;\n\n /** Ruleset plugged to the fact stream, that contains actions stream result */\n public readonly engineRuleset: EngineRuleset;\n\n private executionCounter = 0;\n\n /**\n * Create a new ruleset executor\n * @param ruleset Ruleset to evaluate\n * @param rulesEngine Instance of the rules engine\n */\n constructor(ruleset: Ruleset, rulesEngine: RulesEngine) {\n this.ruleset = ruleset;\n this.rulesEngine = rulesEngine;\n this.operators = rulesEngine.operators;\n this.engineRuleset = this.plugRuleset();\n }\n\n /**\n * Recursively explores a rule to identify and collect input facts.\n * Input facts are identified based on the 'FACT' type and operator-specific implicit dependencies.\n * @param currentObject The current object being explored.\n * @param ruleInputFacts A set to store the identified input facts for the rule.\n */\n private collectRuleInputFacts(currentObject: AllBlock | NestedCondition | NestedCondition[], ruleInputFacts: Set<string>) {\n if (currentObject && isOperandFact(currentObject)) {\n ruleInputFacts.add(currentObject.value);\n } else if (Array.isArray(currentObject)) {\n currentObject.forEach((elem) => this.collectRuleInputFacts(elem, ruleInputFacts));\n } else {\n for (const key in currentObject) {\n if ((key === 'operator') && isConditionProperties(currentObject)) {\n const op = this.operators[currentObject[key]];\n if (op && op.factImplicitDependencies) {\n op.factImplicitDependencies.forEach((dep) => ruleInputFacts.add(dep));\n }\n } else if (typeof currentObject[key as keyof (AllBlock | NestedCondition)] === 'object') {\n this.collectRuleInputFacts(currentObject[key as keyof (AllBlock | NestedCondition)], ruleInputFacts);\n }\n }\n }\n }\n\n /**\n * Report performance mark for a rule run\n * @param rule Rule to measure\n * @param status status of the rule evaluation\n */\n protected performanceMark(rule: Rule, status: 'start' | 'end') {\n if (this.rulesEngine.performance) {\n const markName = `rules-engine:${this.rulesEngine.rulesEngineInstanceName}:${this.ruleset.name}:${rule.name}`;\n this.rulesEngine.performance.mark(`${markName}:${status}`);\n if (status === 'end') {\n this.rulesEngine.performance.measure(markName, `${markName}:start`, `${markName}:end`);\n }\n }\n }\n\n /**\n * Get operand value stream according to its type\n * @param operand operand of the condition\n * @param factsValue\n * @param runtimeFactValues\n */\n protected getOperandValue(operand: GenericOperand | undefined, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): unknown {\n if (typeof operand === 'undefined') {\n return undefined;\n } else if (isOperandFact(operand)) {\n const factValue = factsValue[operand.value];\n // eslint-disable-next-line new-cap -- convention for JSONPath\n return operand.path ? factValue && JSONPath({ wrap: false, json: factValue, path: operand.path }) : factValue;\n } else if (isOperandLiteral(operand)) {\n return operand.value;\n } else if (isOperandRuntimeFact(operand)) {\n return runtimeFactValues[operand.value];\n }\n return undefined;\n }\n\n /**\n * Process a root rule from a ruleset, and return the associated actions to be processed\n * Will also update the runtimeFactValues map that is ruleset wise\n * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n * @param rule\n * @param factsValue\n * @param runtimeFactValues\n * @protected\n */\n protected evaluateRule(rule: Rule, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>) {\n return this.evaluateBlock(rule.rootElement, factsValue, runtimeFactValues);\n }\n\n /**\n * Recursively process a block to extract all the actions keeping the order\n * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n * @param element\n * @param factsValue\n * @param runtimeFactValues This runtime fact map will be mutated by all the runtime facts actions executed\n * @param actions\n * @protected\n */\n protected evaluateBlock(element: AllBlock, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>, actions: ActionBlock[] = []) {\n if (this.isIfElseBlock(element)) {\n (!element.condition || this.evaluateCondition(element.condition, factsValue, runtimeFactValues) ? element.successElements : element.failureElements)\n .forEach((elementResult) => this.evaluateBlock(elementResult, factsValue, runtimeFactValues, actions));\n } else if (this.isActionBlock(element)) {\n if (this.isActionSetTemporaryFactBlock(element)) {\n runtimeFactValues[element.fact] = element.value;\n } else {\n actions.push(element);\n }\n }\n return actions;\n }\n\n /**\n * Returns true if the element is a IfElse block\n * @param element\n * @protected\n */\n protected isIfElseBlock(element: AllBlock): element is IfElseBlock {\n return element.blockType === 'IF_ELSE';\n }\n\n /**\n * Returns true if the element is an action block\n * @param element\n * @protected\n */\n protected isActionBlock(element: AllBlock): element is ActionBlock {\n return 'elementType' in element && element.elementType === 'ACTION';\n }\n\n /**\n * Returns true if the action sets a temporary fact\n * @param element\n * @protected\n */\n protected isActionSetTemporaryFactBlock(element: ActionBlock): element is ActionSetTemporaryFactBlock {\n return 'actionType' in element && element.actionType === 'SET_FACT';\n }\n\n /**\n * Evaluate a condition block\n * @param nestedCondition\n * @param factsValue\n * @param runtimeFactValues\n * @protected\n */\n protected evaluateCondition(nestedCondition: NestedCondition, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): boolean {\n if (isConditionProperties(nestedCondition)) {\n const operator = this.operators[nestedCondition.operator];\n if (operator === undefined) {\n throw new Error(`Unknown operator : ${nestedCondition.operator}, skipping the rule execution...`);\n }\n return executeOperator(this.getOperandValue(nestedCondition.lhs, factsValue, runtimeFactValues),\n this.getOperandValue('rhs' in nestedCondition ? nestedCondition.rhs : undefined, factsValue, runtimeFactValues), operator, factsValue);\n }\n\n if (isNotCondition(nestedCondition)) {\n return !this.evaluateCondition(nestedCondition.not, factsValue, runtimeFactValues);\n }\n if (nestedCondition.all || nestedCondition.any) {\n const evaluate = (condition: NestedCondition) => this.evaluateCondition(condition, factsValue, runtimeFactValues);\n return isAllConditions(nestedCondition) ? nestedCondition.all.every((element) => evaluate(element)) : nestedCondition.any.some((element) => evaluate(element));\n }\n throw new Error(`Unknown condition block met : ${JSON.stringify(nestedCondition)}`);\n }\n\n /**\n * Find rule input facts\n * @param obj\n */\n protected readonly findRuleInputFacts = (obj: AllBlock): string[] => {\n const ruleInputFacts = new Set<string>();\n this.collectRuleInputFacts(obj, ruleInputFacts);\n return Array.from(ruleInputFacts);\n };\n\n /**\n * Plug ruleset to fact streams and trigger a first evaluation\n */\n protected plugRuleset() {\n const inputFactsForRule: Record<string, string[]> = {};\n this.ruleset.rules.forEach((rule) => inputFactsForRule[rule.id] = this.findRuleInputFacts(rule.rootElement));\n const factsThatRerunEverything: string[] = [];\n this.ruleset.rules.forEach((rule) => {\n if (rule.outputRuntimeFacts.length > 0 || rule.inputRuntimeFacts.length > 0) {\n factsThatRerunEverything.push(...inputFactsForRule[rule.id]);\n } else {}\n });\n const triggerFull$: Observable<unknown[]> = factsThatRerunEverything.length === 0\n ? of([])\n : combineLatest(factsThatRerunEverything.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact)));\n const result$ = triggerFull$.pipe(switchMap(() => {\n const runtimeFactValues: Record<string, Facts> = {};\n\n let rulesetInputFacts: string[];\n if (this.rulesEngine.debugMode) {\n rulesetInputFacts = Array.from(this.ruleset.rules.reduce((acc, rule) => {\n inputFactsForRule[rule.id].forEach((factName) => acc.add(factName));\n return acc;\n }, new Set<string>()));\n }\n\n return combineLatest(this.ruleset.rules.map((rule) => {\n const inputFacts = inputFactsForRule[rule.id];\n const values$ = inputFacts.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact));\n return (values$.length > 0 ? combineLatest(values$) : of([[]] as (Facts | undefined)[]))\n .pipe(\n startWith(undefined),\n pairwise(),\n tap(() => this.performanceMark(rule, 'start')),\n map(([oldFactValues, factValues]) => {\n const output: RuleEvaluationOutput = { actions: undefined };\n\n try {\n output.actions = this.evaluateRule(rule, inputFacts.reduce<Record<string, Facts | undefined>>((acc, id, index) => {\n acc[id] = factValues![index];\n return acc;\n }, {}), runtimeFactValues);\n } catch (error) {\n output.actions = undefined;\n output.error = error;\n }\n\n if (this.rulesEngine.debugMode) {\n output.evaluation = handleRuleEvaluationDebug(rule, this.ruleset.name, output.actions, output.error, runtimeFactValues, factValues, oldFactValues, inputFacts);\n } else if (output.error) {\n const errorToLog = output.error instanceof Error || typeof output.error === 'string' ? output.error.toString() : JSON.stringify(output.error);\n this.rulesEngine.logger?.error(`Error while evaluating rule ID: ${rule.id}; message: ${errorToLog}`);\n this.rulesEngine.logger?.warn(`Skipping rule ${rule.name}, and the associated ruleset`);\n }\n return output;\n }),\n tap(() => this.performanceMark(rule, 'end'))\n );\n })).pipe(\n startWith(undefined),\n pairwise(),\n map(([prevRes, currRes]) => {\n const actionsLists = currRes!.map((r) => r.actions);\n const allExecutionsValid = actionsLists.every((actions) => !!actions);\n\n let execInfo: {\n executionCounter?: number;\n actionsLists: ActionBlock[][];\n rulesetOutputExecution?: RuleEvaluation[];\n allExecutionsValid?: boolean;\n rulesetTriggers?: Record<string, Record<string, EvaluationReason>>;\n } = { actionsLists: (allExecutionsValid ? actionsLists : [[]]) };\n\n if (this.rulesEngine.engineDebug) {\n execInfo = {\n ...execInfo,\n ...this.rulesEngine.engineDebug.handleDebugRulesetExecutionInfo(\n currRes!, prevRes, allExecutionsValid, rulesetInputFacts, runtimeFactValues, ++this.executionCounter, this.ruleset)\n };\n }\n return execInfo;\n }),\n map((output) => {\n const outputActions = ([] as ActionBlock[]).concat(...output.actionsLists);\n\n if (this.rulesEngine.engineDebug && output.allExecutionsValid) {\n this.rulesEngine.engineDebug.addRulesetExecutionEvent(this.ruleset, output.executionCounter!,\n rulesetInputFacts, outputActions, runtimeFactValues, output.rulesetTriggers!,\n output.rulesetOutputExecution!);\n }\n\n return outputActions;\n }),\n distinctUntilChanged((prev, curr) => prev.length === 0 && curr.length === 0)\n );\n }), shareReplay({ bufferSize: 1, refCount: true }));\n\n return {\n id: this.ruleset.id,\n validityRange: this.ruleset.validityRange,\n linkedComponents: this.ruleset.linkedComponents,\n rulesResultsSubject$: result$\n } as EngineRuleset;\n }\n}\n","import type {\n Logger,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n firstValueFrom,\n merge,\n Observable,\n of,\n} from 'rxjs';\nimport {\n delay,\n distinctUntilChanged,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport {\n EngineDebugger,\n} from './debug/engine-debug';\nimport {\n FactObject,\n RulesEngineOptions,\n} from './engine-interface';\nimport type {\n Fact,\n Facts,\n} from './fact/index';\nimport {\n filterRulesetsEventStream,\n} from './helpers/filter-ruleset-event-operator';\nimport {\n Operator,\n operatorList,\n UnaryOperator,\n} from './operator/index';\nimport {\n RulesetExecutor,\n} from './ruleset-executor';\nimport {\n ActionBlock,\n Ruleset,\n} from './structure';\n\n/** Rules engine */\nexport class RulesEngine {\n /** Map of registered fact stream, this map is mutated by the ruleset executors */\n private readonly factMap: Record<string, FactObject<any>> = {};\n\n /** Subject containing the rulesets and the results stream*/\n private readonly rulesetMapSubject = new BehaviorSubject<Record<string, RulesetExecutor>>({});\n\n /** Map of available operators */\n public operators: Record<string, Operator<unknown, unknown>>;\n\n /** List of events for the current state of the rules engine */\n public readonly events$: Observable<ActionBlock[]>;\n\n /** Delay before fact stream defaulting value */\n public factDefaultDelay?: number;\n\n /**\n * Instance of engine debug object; Undefined if debugMode is not active\n */\n public readonly engineDebug?: EngineDebugger;\n\n /** Name of the rules engine instance */\n public readonly rulesEngineInstanceName: string;\n\n /**\n * Performance reporter to use for performance measurements.\n * @default window.performance on browser only, undefined on node\n */\n public readonly performance;\n\n /**\n * Log the engine errors\n */\n public readonly logger?: Logger;\n /**\n * Flag to check if the run is in debug mode or not\n */\n public get debugMode(): boolean {\n return !!this.engineDebug;\n }\n\n /**\n * Rules engine\n * @param options rules engine options\n */\n constructor(options?: RulesEngineOptions) {\n this.performance = options?.performance || (typeof window === 'undefined' ? undefined : window.performance);\n this.engineDebug = options?.debugger;\n this.engineDebug?.registerRuleEngine(this);\n this.logger = options?.logger;\n this.rulesEngineInstanceName = options?.rulesEngineInstanceName || 'RulesEngine';\n this.factDefaultDelay = options?.factDefaultDelay;\n // Load default operators\n this.operators = operatorList.reduce<Record<string, Operator<any, any>>>((acc, operator) => {\n acc[operator.name] = operator;\n return acc;\n }, {});\n this.events$ = this.rulesetMapSubject.pipe(\n this.prepareActionsStream(),\n this.handleActionsStreamOutput()\n );\n if (options?.facts) {\n this.upsertFacts(options.facts);\n }\n if (options?.rules) {\n this.upsertRulesets(options.rules);\n }\n if (options?.operators) {\n this.upsertOperators(options.operators);\n }\n }\n\n /**\n * Attach debug events to actions stream if debug engine is activated\n */\n private handleActionsStreamOutput<T extends ActionBlock = ActionBlock>(): (actionsStream$: Observable<T[]>) => Observable<T[]> {\n return (actionsStream$: Observable<T[]>) => this.engineDebug ? actionsStream$.pipe(tap((allActions) => this.engineDebug!.allActionsChange(allActions))) : actionsStream$;\n }\n\n /**\n * Create the actions stream event based on provided active rulesets ids; Handle debug too\n * @param ruleSets\n */\n private prepareActionsStream<T extends ActionBlock = ActionBlock>(ruleSets?: string[]): (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => Observable<T[]> {\n return (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => (this.engineDebug\n ? rulesetMapSubject$.pipe(\n tap((ruleSetExecutorMap) => this.engineDebug!.activeRulesetsChange(ruleSetExecutorMap, ruleSets)),\n filterRulesetsEventStream(ruleSets))\n : rulesetMapSubject$.pipe(filterRulesetsEventStream(ruleSets))) as Observable<T[]>;\n }\n\n /**\n * Create or retrieve a fact stream\n * The fact stream created will be registered in the engine\n * @param id ID of the fact to retrieve\n * @param factValue$ Value stream for the fact\n */\n public retrieveOrCreateFactStream<T = Facts>(id: string, factValue$?: Observable<T>): Observable<T | undefined> {\n // trick to emit undefined if the observable is not immediately emitting (to not bloc execution)\n const obs$ = factValue$\n ? merge(factValue$, of(undefined).pipe(delay(this.factDefaultDelay || 0), takeUntil(factValue$)))\n : factValue$;\n const factObj = this.factMap[id];\n if (factObj) {\n if (factValue$) {\n factObj.subject.next(obs$);\n }\n return factObj.value$;\n }\n\n const subject = new BehaviorSubject<Observable<T | undefined> | undefined>(obs$);\n const value$ = subject.pipe(\n switchMap((value) => value || of(undefined)),\n distinctUntilChanged(),\n shareReplay(1)\n );\n\n this.factMap[id] = {\n subject,\n value$\n };\n\n return value$;\n }\n\n /**\n * Retrieve the promise of the latest value of a fact.\n * Return undefined if the fact is not defined.\n * @param id ID of the fact to retrieve\n */\n public retrieveFactValue<T = unknown>(id: string): Promise<T | undefined> | undefined {\n return this.factMap[id].value$ && firstValueFrom(this.retrieveOrCreateFactStream<T>(id), { defaultValue: undefined });\n }\n\n /**\n * Update or insert fact in rules engine\n * @param facts fact list to add / update\n */\n public upsertFacts<T = unknown>(facts: Fact<T> | Fact<T>[]) {\n (Array.isArray(facts) ? facts : [facts]).forEach(({ id, value$ }) => {\n this.engineDebug?.addAvailableFactsSnapshotEvent(id, value$);\n this.retrieveOrCreateFactStream(id, value$);\n });\n }\n\n /**\n * Update or insert rule in rules engine\n * @param rulesets\n */\n public upsertRulesets(rulesets: Ruleset[]) {\n this.engineDebug?.addAvailableRulesets(rulesets);\n\n this.rulesetMapSubject.next(\n rulesets.reduce((accRuleset, ruleset) => {\n accRuleset[ruleset.id] = new RulesetExecutor(ruleset, this);\n return accRuleset;\n }, { ...this.rulesetMapSubject.value })\n );\n }\n\n /**\n * Update or insert operator in rules engine\n * @param operators operator list to add / update\n */\n public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n this.operators = operators.reduce((acc, operator) => {\n acc[operator.name] = operator;\n return acc;\n }, { ...this.operators });\n }\n\n /**\n * Operator to apply on a stream of rulesets ids\n * Returns a stream of actions outputted by the rules engine, corresponding to the rulesetsIds\n */\n public getEventStream<T extends ActionBlock = ActionBlock>(): (rulesetsIds$: Observable<string[] | undefined>) => Observable<T[]> {\n return (rulesetsIds$: Observable<string[] | undefined>) =>\n rulesetsIds$.pipe(\n switchMap((ruleSets) => this.rulesetMapSubject.pipe(this.prepareActionsStream<T>(ruleSets))),\n this.handleActionsStreamOutput()\n );\n }\n\n /** Get the list of registered facts names */\n public getRegisteredFactsNames() {\n return Object.keys(this.factMap);\n }\n}\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n select,\n Store,\n} from '@ngrx/store';\nimport type {\n RulesEngineActionHandler,\n} from '@o3r/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n combineLatest,\n Observable,\n} from 'rxjs';\nimport {\n filter,\n map,\n shareReplay,\n switchMap,\n} from 'rxjs/operators';\nimport type {\n ActionBlock,\n Fact,\n Operator,\n Ruleset,\n UnaryOperator,\n} from '../../engine/index';\nimport {\n EngineDebugger,\n operatorList,\n RulesEngine,\n} from '../../engine/index';\nimport type {\n RulesetsStore,\n} from '../../stores';\nimport {\n selectActiveRuleSets,\n selectAllRulesets,\n selectComponentsLinkedToRuleset,\n setRulesetsEntities,\n} from '../../stores';\nimport {\n RULES_ENGINE_OPTIONS,\n RulesEngineServiceOptions,\n} from '../rules-engine-token';\n\n@Injectable()\nexport class RulesEngineRunnerService {\n private readonly store = inject<Store<RulesetsStore>>(Store);\n private readonly logger = inject(LoggerService);\n\n /** Rulesets to restrict the execution of the engine */\n protected ruleSets$: Observable<string[] | undefined>;\n\n /** List of action handlers */\n protected readonly actionHandlers = new Set<RulesEngineActionHandler>();\n\n /** Observable of component linked to the component */\n protected linkedComponents$: BehaviorSubject<{ [key: string]: number }> = new BehaviorSubject({});\n\n /** Map of engines dedicated to each rule sets */\n public readonly engine: RulesEngine;\n\n /** stream of the whole ruleset results */\n public events$: Observable<ActionBlock[]>;\n\n /** Enable action execution on new state change */\n public enabled: boolean;\n\n constructor() {\n const engineConfig = inject<RulesEngineServiceOptions>(RULES_ENGINE_OPTIONS, { optional: true });\n\n this.enabled = !engineConfig?.dryRun;\n this.engine = new RulesEngine({\n debugger: engineConfig?.debug ? new EngineDebugger({ eventsStackLimit: engineConfig?.debugEventsStackLimit }) : undefined,\n logger: this.logger\n });\n this.ruleSets$ = combineLatest([\n this.store.pipe(select(selectActiveRuleSets)),\n this.linkedComponents$.pipe(\n switchMap((linkedComponentsNamesMap) => this.store.pipe(\n select(selectComponentsLinkedToRuleset),\n map((rulesetsWithLinkedComponentsMap) =>\n Object.keys(rulesetsWithLinkedComponentsMap.or).filter((rulesetId) =>\n rulesetsWithLinkedComponentsMap.or[rulesetId].some((componentId) => linkedComponentsNamesMap[componentId] > 0)\n )\n )\n ))\n )\n ]).pipe(\n map(([activeRulesets, linkedComponentsRulesetsIds]) => ([...activeRulesets, ...linkedComponentsRulesetsIds]))\n );\n\n this.events$ = this.ruleSets$.pipe(\n this.engine.getEventStream<ActionBlock>(),\n shareReplay(1)\n );\n\n this.upsertOperators(operatorList);\n\n this.store.pipe(\n select(selectAllRulesets),\n takeUntilDestroyed()\n ).subscribe((rulesets: Ruleset[]) => this.engine.upsertRulesets(rulesets));\n this.events$.pipe(takeUntilDestroyed(), filter(() => this.enabled)).subscribe((events) => {\n void this.executeActions(events);\n });\n }\n\n /**\n * Execute the list of actions\n * @param actions\n */\n protected async executeActions(actions: ActionBlock[]) {\n const actionHandlers = [...this.actionHandlers];\n\n const supportedActions = new Set(actionHandlers.flatMap((handler) => handler.supportingActions));\n\n const actionMaps = actions\n .filter((action) => {\n const isKnown = supportedActions.has(action.actionType);\n if (!isKnown) {\n this.logger.warn(`The action ${action.actionType} does not have registered handler`);\n }\n return isKnown;\n })\n .reduce((acc, action) => {\n acc[action.actionType] ||= [];\n acc[action.actionType].push(action);\n return acc;\n }, {} as Record<string, ActionBlock[]>);\n\n const handling = actionHandlers\n .map((handler) =>\n handler.executeActions(\n handler.supportingActions\n .filter((supportedAction) => actionMaps[supportedAction])\n .reduce<ActionBlock[]>((acc, supportedAction) => acc.concat(actionMaps[supportedAction]), [])\n )\n );\n\n // eslint-disable-next-line @typescript-eslint/await-thenable -- `executeActions` can return void or Promise<void>\n await Promise.all(handling);\n }\n\n /**\n * Update or insert fact in the rules engine\n * @param facts fact list to add / update\n */\n public upsertFacts(facts: Fact<unknown> | Fact<unknown>[]) {\n this.engine.upsertFacts(facts);\n }\n\n /**\n * Update or insert operator in the rules engine\n * @param operators operator list to add / update\n */\n public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n this.engine.upsertOperators(operators);\n }\n\n /**\n * Upsert a list of RuleSets to be run in the rules engine\n * @param ruleSets\n */\n public upsertRulesets(ruleSets: Ruleset[]) {\n this.store.dispatch(setRulesetsEntities({ entities: ruleSets }));\n }\n\n /**\n * Add action handlers in the rules engine\n * @param actionHandlers\n */\n public registerActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n actionHandlers.forEach((actionHandler) => this.actionHandlers.add(actionHandler));\n }\n\n /**\n * Remove action handlers in the rules engine\n * @param actionHandlers\n */\n public unregisterActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n actionHandlers.forEach((actionHandler) => this.actionHandlers.delete(actionHandler));\n }\n\n /**\n * Enable temporary a rule set\n * @param componentComputedName Name of the component to enable the ruleset for\n */\n public enableRuleSetFor(componentComputedName: string) {\n const newMap = this.linkedComponents$.value;\n newMap[componentComputedName] = newMap[componentComputedName] ? newMap[componentComputedName] + 1 : 1;\n this.linkedComponents$.next(newMap);\n }\n\n /**\n * Disable temporary a rule set\n * @param componentComputedName Name of the component to disable the ruleset for\n */\n public disableRuleSetFor(componentComputedName: string) {\n const newMap = this.linkedComponents$.value;\n if (newMap[componentComputedName] > 0) {\n newMap[componentComputedName]--;\n this.linkedComponents$.next(newMap);\n }\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n StoreModule,\n} from '@ngrx/store';\nimport {\n provideLogger,\n} from '@o3r/logger';\nimport {\n RulesetsStoreModule,\n} from '../../stores/index';\nimport {\n DEFAULT_RULES_ENGINE_OPTIONS,\n RULES_ENGINE_OPTIONS,\n RulesEngineServiceOptions,\n} from '../rules-engine-token';\nimport {\n RulesEngineRunnerService,\n} from './rules-engine-runner-service';\n\n@NgModule({\n imports: [\n StoreModule,\n RulesetsStoreModule\n ]\n})\nexport class RulesEngineRunnerModule {\n public static forRoot(options?: Partial<RulesEngineServiceOptions>): ModuleWithProviders<RulesEngineRunnerModule> {\n const opts = options ? { ...DEFAULT_RULES_ENGINE_OPTIONS, ...options } : DEFAULT_RULES_ENGINE_OPTIONS;\n return {\n ngModule: RulesEngineRunnerModule,\n providers: [\n provideLogger(),\n { provide: RULES_ENGINE_OPTIONS, useValue: opts },\n RulesEngineRunnerService\n ]\n };\n }\n}\n","import {\n InjectionToken,\n} from '@angular/core';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS: Readonly<RulesEngineDevtoolsServiceOptions> = {\n isActivatedOnBootstrap: false\n} as const;\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS = new InjectionToken<RulesEngineDevtoolsServiceOptions>('Otter RulesEngine Devtools options');\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n select,\n Store,\n} from '@ngrx/store';\nimport {\n combineLatest,\n firstValueFrom,\n Observable,\n} from 'rxjs';\nimport {\n map,\n scan,\n shareReplay,\n} from 'rxjs/operators';\nimport type {\n ActiveRulesetsEvent,\n AvailableRulesets,\n BaseRulesetExecution,\n DebugEvent,\n Ruleset,\n RulesetExecutionErrorEvent,\n RulesetExecutionEvent,\n} from '../engine';\nimport {\n RulesEngineRunnerService,\n} from '../services';\nimport {\n RulesetsModel,\n RulesetsStore,\n selectRulesetsEntities,\n} from '../stores';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OtterRulesEngineDevtools {\n protected store = inject<Store<RulesetsStore>>(Store);\n private readonly rulesEngineService = inject(RulesEngineRunnerService);\n\n /** Stream of rules engine report */\n public readonly rulesEngineReport$?: Observable<{ events: DebugEvent[]; rulesetMap: Record<string, Ruleset> }>;\n\n /** Stream of rules engine event */\n public readonly rulesEngineEvents$?: Observable<DebugEvent[]>;\n\n /**\n * Return true if the rules engine debug option is activated\n */\n public get isRulesEngineDebugActivated(): boolean {\n return !!this.rulesEngineService.engine.debugMode;\n }\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n const eventsStackLimit = (options || OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS).rulesEngineStackLimit;\n this.rulesEngineEvents$ = this.rulesEngineService.engine.engineDebug?.debugEvents$.pipe(\n scan((previousEvents, currentEvent) => {\n const stack = eventsStackLimit && previousEvents.length === eventsStackLimit ? previousEvents.slice(1) : previousEvents;\n return [...stack, currentEvent];\n }, [] as DebugEvent[]),\n shareReplay(1)\n );\n\n this.rulesEngineReport$ = this.rulesEngineEvents$ && combineLatest([this.rulesEngineEvents$, this.store.pipe(select(selectRulesetsEntities))]).pipe(\n map(([events, rulesetEntities]) => {\n const rulesetMap: Record<string, Ruleset> = Object.entries(rulesetEntities)\n .reduce<Record<string, RulesetsModel>>((acc, [id, ruleset]) => {\n if (ruleset) {\n acc[id] = ruleset;\n }\n return acc;\n }, {});\n return { events, rulesetMap };\n }),\n shareReplay(1)\n );\n }\n\n /** Return the list of debug events emitted by rules engine */\n public async getCurrentRulesEngineEventsStack(): Promise<DebugEvent[] | undefined> {\n return this.rulesEngineEvents$ && firstValueFrom(this.rulesEngineEvents$);\n }\n\n /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n public async getActiveRulesets() {\n const lastActiveRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'ActiveRulesets').reverse()[0];\n return (lastActiveRulesetsEvent as ActiveRulesetsEvent)?.rulesets;\n }\n\n /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n public async getAvailableRulesets() {\n const lastAvailableRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AvailableRulesets').reverse()[0];\n return (lastAvailableRulesetsEvent as AvailableRulesets)?.availableRulesets;\n }\n\n /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n public async getAllOutputActions() {\n return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AllActions')?.reverse()[0];\n }\n\n /**\n * Get the list of executions for the given ruleset\n * @param rulesetId\n */\n public async getRulesetExecutions(rulesetId: string): Promise<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[] | undefined> {\n return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter(\n (e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent =>\n (e.type === 'RulesetExecution' || e.type === 'RulesetExecutionError')\n && (e as BaseRulesetExecution).rulesetId === rulesetId);\n }\n\n /**\n * Check if the ruleset is activ in the moment when the function is called\n * @param rulesetId\n * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n */\n public async isRulesetActive(rulesetId: string) {\n return !!(await this.getActiveRulesets())?.find((r) => r.id === rulesetId);\n }\n\n /**\n * Get the list of rules executed for the specified ruleset\n * @param rulesetId\n */\n public async getRulesEvaluationsForRuleset(rulesetId: string) {\n const rulesetExec = await this.getRulesetExecutions(rulesetId);\n return rulesetExec?.flatMap((e) => (e as BaseRulesetExecution)?.rulesEvaluations?.filter((re) => !re.cached));\n }\n\n /**\n * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getInputFactsForRuleset(rulesetId: string) {\n const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n return rulesetExecutions ? (rulesetExecutions.at(-1) as BaseRulesetExecution).inputFacts : undefined;\n }\n\n /**\n * Get the list of triggers for the specified ruleset\n * @param rulesetId\n */\n public async getTriggersForRuleset(rulesetId: string) {\n const rulesEvaluationsForRuleset = await this.getRulesEvaluationsForRuleset(rulesetId);\n return rulesEvaluationsForRuleset?.flatMap((e) => Object.values(e.triggers)).flatMap((triggersMap) => Object.values(triggersMap));\n }\n\n /**\n * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getOutputActionsForRuleset(rulesetId: string) {\n const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n return rulesetExecutions ? (rulesetExecutions.at(-1) as RulesetExecutionEvent).outputActions : undefined;\n }\n\n /** Get the list of fact names and corresponding values */\n public getAllFactsSnapshot() {\n const registeredFacts = this.rulesEngineService?.engine.getRegisteredFactsNames();\n if (registeredFacts) {\n return this.rulesEngineService.engine.engineDebug?.getFactsSnapshot(registeredFacts);\n }\n }\n\n /**\n * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n * @param rulesetId\n */\n public getRulesetInformation(rulesetId: string): Promise<Ruleset | undefined> {\n return firstValueFrom(this.store.pipe(\n select(selectRulesetsEntities),\n map((entities) => entities[rulesetId] as Ruleset | undefined)\n ));\n }\n}\n","/* eslint-disable no-console -- purpose of the service is to log in the console */\nimport {\n inject,\n Injectable,\n} from '@angular/core';\nimport type {\n DevtoolsServiceInterface,\n WindowWithDevtools,\n} from '@o3r/core';\nimport {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\nimport {\n OtterRulesEngineDevtools,\n} from './rules-engine-devtools';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RulesEngineDevtoolsConsoleService implements DevtoolsServiceInterface {\n /** Name of the Window property to access to the devtools */\n public static readonly windowModuleName = 'rulesEngine';\n\n private readonly rulesEngineDevtools = inject(OtterRulesEngineDevtools);\n\n private readonly options: RulesEngineDevtoolsServiceOptions;\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n this.options = {\n ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n ...options\n };\n\n if (this.options.isActivatedOnBootstrap) {\n this.activate();\n }\n }\n\n /** @inheritDoc */\n public activate() {\n const windowWithDevtools: WindowWithDevtools = window;\n windowWithDevtools._OTTER_DEVTOOLS_ ||= {};\n windowWithDevtools._OTTER_DEVTOOLS_[RulesEngineDevtoolsConsoleService.windowModuleName] = this;\n\n console.info(`Otter rules engine Devtools is now accessible via the _OTTER_DEVTOOLS_.${RulesEngineDevtoolsConsoleService.windowModuleName} variable`);\n }\n\n /** Return the list of debug events emitted by rules engine */\n public async getCurrentRulesEngineEventsStack() {\n console.log(await this.rulesEngineDevtools.getCurrentRulesEngineEventsStack());\n }\n\n /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n public async getActiveRulesets() {\n console.log(await this.rulesEngineDevtools.getActiveRulesets());\n }\n\n /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n public async getAvailableRulesets() {\n console.log(await this.rulesEngineDevtools.getAvailableRulesets());\n }\n\n /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n public async getAllOutputActions() {\n console.log(await this.rulesEngineDevtools.getAllOutputActions());\n }\n\n /**\n * Get the list of executions for the given ruleset\n * @param rulesetId\n */\n public async getRulesetExecutions(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesetExecutions(rulesetId));\n }\n\n /**\n * Check if the ruleset is activ in the moment when the function is called\n * @param rulesetId\n * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n */\n public async isRulesetActive(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.isRulesetActive(rulesetId));\n }\n\n /**\n * Get the list of rules executed for the specified ruleset\n * @param rulesetId\n */\n public async getRulesEvaluationsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesEvaluationsForRuleset(rulesetId));\n }\n\n /**\n * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getInputFactsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getInputFactsForRuleset(rulesetId));\n }\n\n /**\n * Get the list of triggers for the specified ruleset\n * @param rulesetId\n */\n public async getTriggersForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getTriggersForRuleset(rulesetId));\n }\n\n /**\n * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n * @param rulesetId\n */\n public async getOutputActionsForRuleset(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getOutputActionsForRuleset(rulesetId));\n }\n\n /** Get the list of fact names and corresponding values */\n public async getAllFactsSnapshot() {\n console.log(await this.rulesEngineDevtools.getAllFactsSnapshot());\n }\n\n /**\n * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n * @param rulesetId\n */\n public async getRulesetInformation(rulesetId: string) {\n console.log(await this.rulesEngineDevtools.getRulesetInformation(rulesetId));\n }\n}\n","import {\n DestroyRef,\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n DevtoolsServiceInterface,\n filterMessageContent,\n sendOtterMessage,\n} from '@o3r/core';\nimport {\n LoggerService,\n} from '@o3r/logger';\nimport {\n BehaviorSubject,\n combineLatest,\n fromEvent,\n} from 'rxjs';\nimport type {\n DebugEvent,\n} from '../engine';\nimport {\n AvailableRulesEngineMessageContents,\n isRulesEngineMessage,\n RulesEngineDevtoolsServiceOptions,\n RulesEngineMessageDataTypes,\n} from './rules-engine-devkit-interface';\nimport {\n OtterRulesEngineDevtools,\n} from './rules-engine-devtools';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RulesEngineDevtoolsMessageService implements DevtoolsServiceInterface {\n private readonly rulesEngineDevtools = inject(OtterRulesEngineDevtools);\n private readonly logger = inject(LoggerService);\n\n private readonly options: RulesEngineDevtoolsServiceOptions;\n private readonly forceEmitRulesEngineReport = new BehaviorSubject<void>(undefined);\n private readonly sendMessage = sendOtterMessage<AvailableRulesEngineMessageContents>;\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n const options = inject<RulesEngineDevtoolsServiceOptions>(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, { optional: true });\n\n this.options = {\n ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n ...options\n };\n\n if (this.options.isActivatedOnBootstrap) {\n this.activate();\n }\n }\n\n /**\n * Function to trigger a re-send a requested messages to the Otter Chrome DevTools extension\n * @param only restricted list of messages to re-send\n */\n private handleReEmitRequest(only?: RulesEngineMessageDataTypes[]) {\n if (!only || only.includes('rulesEngineEvents')) {\n this.forceEmitRulesEngineReport.next();\n }\n }\n\n /**\n * Function to handle the incoming messages from Otter Chrome DevTools extension\n * @param message\n */\n private handleEvents(message: AvailableRulesEngineMessageContents) {\n this.logger.debug('Message handling by the configuration service', message);\n\n switch (message.dataType) {\n case 'connect': {\n this.connectPlugin();\n break;\n }\n case 'requestMessages': {\n this.handleReEmitRequest(message.only);\n break;\n }\n default: {\n this.logger.warn('Message ignored by the configuration service', message);\n }\n }\n }\n\n private readonly serializeError = (error: any) => error instanceof Error ? error.toString() : error;\n\n /**\n * Serialize exceptions in a way that will display the error message after a JSON.stringify()\n * @param debugEvent\n */\n private serializeReportEvent(debugEvent: DebugEvent) {\n if (debugEvent.type !== 'RulesetExecutionError') {\n return debugEvent;\n }\n return {\n ...debugEvent,\n rulesEvaluations: debugEvent.rulesEvaluations.map((ruleEvaluation) => ({\n ...ruleEvaluation,\n error: this.serializeError(ruleEvaluation.error)\n })),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- type is explicitly `any`\n errors: debugEvent.errors.map((error) => this.serializeError(error))\n };\n }\n\n /**\n * Function to start the rules engine reporting to the Otter Chrome DevTools extension\n */\n private startRulesEngineReport() {\n if (this.rulesEngineDevtools.rulesEngineReport$) {\n combineLatest([\n this.forceEmitRulesEngineReport,\n this.rulesEngineDevtools.rulesEngineReport$\n ]).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(\n ([,report]) => {\n const sanitizedReport = { ...report, events: report.events.map((reportEvents) => this.serializeReportEvent(reportEvents)) };\n this.sendMessage('rulesEngineEvents', sanitizedReport);\n }\n );\n }\n }\n\n /**\n * Function to connect the plugin to the Otter DevTools extension\n */\n private connectPlugin() {\n this.logger.info('Otter DevTools is plugged to the application');\n this.forceEmitRulesEngineReport.next();\n }\n\n /** Activate the Otter DevTools */\n public activate() {\n this.startRulesEngineReport();\n\n fromEvent(window, 'message').pipe(\n takeUntilDestroyed(this.destroyRef),\n filterMessageContent(isRulesEngineMessage)\n ).subscribe((e) => this.handleEvents(e));\n }\n}\n","import {\n ModuleWithProviders,\n NgModule,\n} from '@angular/core';\nimport {\n StoreModule,\n} from '@ngrx/store';\nimport {\n RulesetsStoreModule,\n} from '../stores/index';\nimport type {\n RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit-interface';\nimport {\n RulesEngineDevtoolsConsoleService,\n} from './rules-engine-devtools-console-service';\nimport {\n RulesEngineDevtoolsMessageService,\n} from './rules-engine-devtools-message-service';\nimport {\n OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools-token';\n\n@NgModule({\n imports: [\n StoreModule,\n RulesetsStoreModule\n ],\n providers: [\n { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS },\n RulesEngineDevtoolsMessageService,\n RulesEngineDevtoolsConsoleService\n ]\n})\nexport class RulesEngineDevtoolsModule {\n /**\n * Initialize Otter Devtools\n * @param options\n */\n public static instrument(options: Partial<RulesEngineDevtoolsServiceOptions>): ModuleWithProviders<RulesEngineDevtoolsModule> {\n return {\n ngModule: RulesEngineDevtoolsModule,\n providers: [\n { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: { ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS, ...options }, multi: false },\n RulesEngineDevtoolsMessageService,\n RulesEngineDevtoolsConsoleService\n ]\n };\n }\n}\n","import {\n FactDefinitions,\n FactSet,\n} from '../engine/index';\nimport {\n RulesEngineRunnerService,\n} from '../services/runner/rules-engine-runner-service';\n\n/** Abstract fact set service */\nexport abstract class FactsService<T extends FactDefinitions> {\n #isRegistered = false;\n\n /** Get the registered state */\n public get isRegistered() {\n return this.#isRegistered;\n }\n\n /** Set of facts provided */\n public abstract facts: FactSet<T>;\n\n constructor(private readonly rulesEngine: RulesEngineRunnerService) {}\n\n /** Register the set of facts */\n public register() {\n this.rulesEngine.upsertFacts(\n Object.entries(this.facts)\n .map(([id, factValue]) => ({ id, value$: factValue }))\n );\n this.#isRegistered = true;\n }\n}\n","import {\n inject,\n Injectable,\n} from '@angular/core';\nimport {\n BehaviorSubject,\n} from 'rxjs';\nimport {\n FactsService,\n} from '../../fact';\nimport {\n RulesEngineRunnerService,\n} from '../../services';\nimport {\n CurrentTimeFacts,\n} from './current-time-facts';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CurrentTimeFactsService extends FactsService<CurrentTimeFacts> {\n private readonly currentTimeSubject$ = new BehaviorSubject(Date.now());\n /** @inheritDoc */\n public facts = {\n o3rCurrentTime: this.currentTimeSubject$.asObservable()\n };\n\n constructor() {\n const rulesEngine = inject(RulesEngineRunnerService);\n\n super(rulesEngine);\n }\n\n /** Compute the current time */\n public tick() {\n this.currentTimeSubject$.next(Date.now());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","actions.resetRulesets","actions.setRulesets","actions.cancelRulesetsRequest","actions.updateRulesets","actions.setRulesetsEntities","actions.upsertRulesetsEntities","actions.clearRulesetsEntities","actions.failRulesetsEntities","actions.setRulesetsEntitiesFromApi","actions.upsertRulesetsEntitiesFromApi","isValidDate"],"mappings":"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"}