{"_id":"@dmytromykhailiuk/condition-flow-engine","_rev":"6-1fd289f5df8cf808018539a09dc84d8a","name":"@dmytromykhailiuk/condition-flow-engine","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.0":{"name":"@dmytromykhailiuk/condition-flow-engine","version":"1.0.0","author":{"name":"Dmytro Mykhailiuk"},"license":"ISC","_id":"@dmytromykhailiuk/condition-flow-engine@1.0.0","maintainers":[{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"}],"homepage":"https://github.com/dmytromykhailiuk/condition-flow-engine#readme","bugs":{"url":"https://github.com/dmytromykhailiuk/condition-flow-engine/issues"},"dist":{"shasum":"5ec34e16e744822b1b2573326a6934b374a7d943","tarball":"https://registry.npmjs.org/@dmytromykhailiuk/condition-flow-engine/-/condition-flow-engine-1.0.0.tgz","fileCount":60,"integrity":"sha512-D2s2x9iQP+aepsWcSPAH/tRLD2hABWcBXepkOOG0iyTRKt8HIaY7vbkbztEwmJEBTV0S6sdrv8vYGpRh07bLlA==","signatures":[{"sig":"MEYCIQCDnBKUcT/6NF5exQFfhfyd0ipBnzhhZg5g9a6jLGCQFgIhAIbN+3EaX+WTtlRjfZVhH16t9pZC0pDx9lxrx7W+VCMN","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":109693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkC1f5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowDw//SR01F/jNsEfI0J3reWtqyRwU+lQNS7rq4B2oObDcvf8r8nAp\r\nJo6DU+m5fAsT7phQr40+EFpIcOrVDT7cGnuN0tH/gYhYSzdXGnb8P3RLznfK\r\nZzWBf7BzfwZ9XS2qRaJ/OAnYxAwVW8FszICA0SPvm6QRjZifmrlxWdYQDQJc\r\ne31NXpV8ZY7sIBx4kHFi32Z1cms4dDXSJXgY97FVwWlpAzH2TLQNTiYC+jpa\r\nQ+onpo5OsmvtNechwMeEm2iVuYgRGpua8ClnWbImtAkKiJeCVWNf1o3LkFL1\r\nbqXrX0omALBtWM1NdaebzcZBHO3K9vc+U8J19VGcyI+SYJxc9T/f1V6B5BEA\r\nuYsftXukj2i5nuKGX2imk3Mp2tEGeXgeH6GNm4PpWG8bMLnPYX98nWQHCBOX\r\nzs+Xe6nQqXwB/+2t8E73RocqrcjSm50DsQRJdhr40meE8INOYlpqXksSARtb\r\nOC7XZP4itjcVKzj5MfZ95mQsAyyTO6khXdd09JHBBc67958kMSzQH3Znb5/w\r\nzLMLB3igoMTKeP4oe1lVMige0oFVEGEoCtdBMsAdetYkRd8ojdnKqJhTKKFg\r\n5EsoADASPYySo49YTyyJZiGg06a6yuYFigvzbtKcCjiUb1+ADHUpDHopLOH2\r\nHfm8O11HBN5rRnN5V7qWViYpBJkE3NdLiLE=\r\n=oayM\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/src/index.js","types":"dist/src/index.d.ts","gitHead":"bf4034ee6ad3fe67d7e036709ac8140013c73dca","scripts":{"compile":"npx tsc"},"_npmUser":{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"},"repository":{"url":"git+https://github.com/dmytromykhailiuk/condition-flow-engine.git","type":"git"},"_npmVersion":"8.19.2","description":"Flexible flow management solution","directories":{},"_nodeVersion":"18.10.0","dependencies":{"rxjs":"^7.8.0"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.35.0","prettier":"^2.8.4","typescript":"^4.9.5","@types/node":"^18.15.0","eslint-config-prettier":"^8.7.0","@typescript-eslint/parser":"^5.54.1","eslint-config-airbnb-typescript":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/condition-flow-engine_1.0.0_1678465016855_0.15477684914740153","host":"s3://npm-registry-packages"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"1.0.1":{"name":"@dmytromykhailiuk/condition-flow-engine","version":"1.0.1","author":{"name":"Dmytro Mykhailiuk"},"license":"ISC","_id":"@dmytromykhailiuk/condition-flow-engine@1.0.1","maintainers":[{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"}],"homepage":"https://github.com/dmytromykhailiuk/condition-flow-engine#readme","bugs":{"url":"https://github.com/dmytromykhailiuk/condition-flow-engine/issues"},"dist":{"shasum":"0d0ede0a614edcc71d0c38853f0b330c78b97346","tarball":"https://registry.npmjs.org/@dmytromykhailiuk/condition-flow-engine/-/condition-flow-engine-1.0.1.tgz","fileCount":60,"integrity":"sha512-tzjv9FmepTQIzZJshuaFltMBIHCNfc0BLWwzfw+0Dn1eWbBuRcO3KFO5ucLBtq82Z0oWmdQtwZaEXjgQDv7qXw==","signatures":[{"sig":"MEUCIQCUdpsSJ8GoDC9lpkS2cwUf3HS+MgB0hLXnKDEBdZhmZgIgW4bOYo/VCwV0ZoOOSmRKvs8tlaiimiThixSdDWUO80U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":109992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkC1v0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIFhAAo3YeQpd/Epf3IFyokcR7Ik6bJfFQGV2SSryHrrq9PiEHB1Fx\r\nnfaWnvizmERvSl1Ep+OZ9TZYUjsQTjiBqTVtWUx3o+ekNq7Swyyc905T6UcP\r\nxIBWEpPZu6AiIK3VlNVEwOC1V01Q8IFELGD0bLGMUSJctTWWpKWsIY9jXLYi\r\nU/ZW2FGupMJ8MJGIA+feaQ4XXq0fkrOy+9ze1YvvUc1E6uvz2398oA1dbhuZ\r\nLFMwwjf1IGUUXa2hO4mm+ZpnBOqtNn66Hs9oDRiq4miGQ4BtiGQH7gG2l39O\r\nr03RFhYbNrycJR8s/xUnkdMGlX0jawnOSMlmkXH1tH471M4TC/ZFMVaE2A+c\r\nFl7FoaUC4da5Zb+wycqnB4Rct6O1R/K/uayLNk0H03a+NXJlI+EWD+de6Rca\r\nq+fVQa3z7wMePdfavfXt+te1QGhNJM7nZ4uKI1QltMA3lUAu5yDIyS+QM4YQ\r\nVokOsqS26cEsTKLRqr+gphZ+WJG8Q6jbzLjdTqcEVVMKaYbIN3aSkhyLorsC\r\nVidaQCktFgvC9sdUg/DHEwwDWvYhqE90HEud0Y2mCKf9Mda6Ingp41Fd9duc\r\nuTcKpkDUyIgrwGRDY8BFt+OzBYiB6MYrbJZ2bAN0oAI0B4Qc/13PenEZjLyo\r\nXNh5C1iwBYFS9DoSEqPvSCBtuVt6m1JRP3o=\r\n=WbMV\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/src/index.js","types":"dist/src/index.d.ts","gitHead":"71e3360417e83db8c7102fa9c3d6ff2e4b597ed4","scripts":{"compile":"npx tsc"},"_npmUser":{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"},"repository":{"url":"git+https://github.com/dmytromykhailiuk/condition-flow-engine.git","type":"git"},"_npmVersion":"8.19.2","description":"Flexible flow management solution","directories":{},"_nodeVersion":"18.10.0","dependencies":{"rxjs":"^7.8.0"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.35.0","prettier":"^2.8.4","typescript":"^4.9.5","@types/node":"^18.15.0","eslint-config-prettier":"^8.7.0","@typescript-eslint/parser":"^5.54.1","eslint-config-airbnb-typescript":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/condition-flow-engine_1.0.1_1678466036326_0.9635459925160137","host":"s3://npm-registry-packages"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"1.0.5":{"name":"@dmytromykhailiuk/condition-flow-engine","version":"1.0.5","author":{"name":"Dmytro Mykhailiuk"},"license":"ISC","_id":"@dmytromykhailiuk/condition-flow-engine@1.0.5","maintainers":[{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"}],"homepage":"https://github.com/dmytromykhailiuk/condition-flow-engine#readme","bugs":{"url":"https://github.com/dmytromykhailiuk/condition-flow-engine/issues"},"dist":{"shasum":"0d2153a99aec5bc85a26cc6ec79d83c4a20cbc1f","tarball":"https://registry.npmjs.org/@dmytromykhailiuk/condition-flow-engine/-/condition-flow-engine-1.0.5.tgz","fileCount":27,"integrity":"sha512-befAGbUrhsX/zYWzOBzk66awiYn2JBcDkye5bn4+BYNFAvhw21Q3p75tu6SOzjVAO0P5WYSIK7V7izoG6l6E5A==","signatures":[{"sig":"MEYCIQDvEvkgaYEgA9WweJ53vtyo1Jf4GiLRdIId9UDMY7i25wIhAMe+wLDc7f0EzEE+rTy8Hw0nGIefUxVxOP8L3SaHr3qk","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":94836},"main":"dist/src/index.js","types":"dist/src/index.d.ts","gitHead":"e6e5a49f5f4f5a0985233fc00c47d526ec845272","scripts":{"compile":"npx tsc"},"_npmUser":{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"},"repository":{"url":"git+https://github.com/dmytromykhailiuk/condition-flow-engine.git","type":"git"},"_npmVersion":"8.19.2","description":"Flexible flow management solution","directories":{},"_nodeVersion":"18.10.0","dependencies":{"rxjs":"^7.8.0"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.35.0","prettier":"^2.8.4","typescript":"^4.9.5","@types/node":"^18.15.0","eslint-config-prettier":"^8.7.0","@typescript-eslint/parser":"^5.54.1","eslint-config-airbnb-typescript":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/condition-flow-engine_1.0.5_1706209664839_0.7463739102378615","host":"s3://npm-registry-packages"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"1.0.6":{"name":"@dmytromykhailiuk/condition-flow-engine","version":"1.0.6","author":{"name":"Dmytro Mykhailiuk"},"license":"ISC","_id":"@dmytromykhailiuk/condition-flow-engine@1.0.6","maintainers":[{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"}],"homepage":"https://github.com/dmytromykhailiuk/condition-flow-engine#readme","bugs":{"url":"https://github.com/dmytromykhailiuk/condition-flow-engine/issues"},"dist":{"shasum":"b5596958c45a9be3dc79546803d5a8d6e02d1d33","tarball":"https://registry.npmjs.org/@dmytromykhailiuk/condition-flow-engine/-/condition-flow-engine-1.0.6.tgz","fileCount":27,"integrity":"sha512-DN/sWe0qXN0pKOKJT9WJDqNr1H5FYB1D7nVJYxb6U/oxMhpbM6yrsKUh/uwo9EQTbdv3d4lp+7JbMqdh24sUYw==","signatures":[{"sig":"MEQCIFzhzXVtXQXpCWvp7nHHE5ZlNaBG+Q3XJh8NkVsnLIBxAiAmlB4zdjNVZs/MiwXx2AXcGmIExue36VGlr3IyzrQlYA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":94956},"main":"dist/src/index.js","types":"dist/src/index.d.ts","gitHead":"ec7094a5b3a1fc4c5ea06fa6e31535419f488849","scripts":{"compile":"npx tsc"},"_npmUser":{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"},"repository":{"url":"git+https://github.com/dmytromykhailiuk/condition-flow-engine.git","type":"git"},"_npmVersion":"8.19.2","description":"Flexible flow management solution","directories":{},"_nodeVersion":"18.10.0","dependencies":{"rxjs":"^7.8.0"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.35.0","prettier":"^2.8.4","typescript":"^4.9.5","@types/node":"^18.15.0","eslint-config-prettier":"^8.7.0","@typescript-eslint/parser":"^5.54.1","eslint-config-airbnb-typescript":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/condition-flow-engine_1.0.6_1706213212210_0.9273436695731856","host":"s3://npm-registry-packages"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"1.0.7":{"name":"@dmytromykhailiuk/condition-flow-engine","version":"1.0.7","author":{"name":"Dmytro Mykhailiuk"},"license":"ISC","_id":"@dmytromykhailiuk/condition-flow-engine@1.0.7","maintainers":[{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"}],"homepage":"https://github.com/dmytromykhailiuk/condition-flow-engine#readme","bugs":{"url":"https://github.com/dmytromykhailiuk/condition-flow-engine/issues"},"dist":{"shasum":"49c8d7c5f66272b6125970b8e0d9dd70c7e677fe","tarball":"https://registry.npmjs.org/@dmytromykhailiuk/condition-flow-engine/-/condition-flow-engine-1.0.7.tgz","fileCount":27,"integrity":"sha512-1fPb2NOfFa1tKCCLBQJNZncyUgVPxCRcnfwJzLceHjx+Ol5iWDMtZIWygo5jKOd8nxQ589KxinOW117FHkCfrA==","signatures":[{"sig":"MEYCIQDYi1b6QIgBb3mI3W8FkJAbmZgDs30Jq2KYfhjw+C4ssQIhANz4lEYVcLalO0lzwH/R1d9QaYtkYJ2zHTAJZxRYJ2XC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":101699},"main":"dist/src/index.js","types":"dist/src/index.d.ts","gitHead":"27a658ba812f20fb429e875a81e4ba6f5a4ac540","scripts":{"compile":"npx tsc"},"_npmUser":{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"},"repository":{"url":"git+https://github.com/dmytromykhailiuk/condition-flow-engine.git","type":"git"},"_npmVersion":"8.19.2","description":"Flexible flow management solution","directories":{},"_nodeVersion":"18.10.0","dependencies":{"rxjs":"^7.8.0"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^8.0.3","eslint":"^8.35.0","prettier":"^2.8.4","typescript":"^4.9.5","@types/node":"^18.15.0","eslint-config-prettier":"^8.7.0","@typescript-eslint/parser":"^5.54.1","eslint-config-airbnb-typescript":"^17.0.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/condition-flow-engine_1.0.7_1706217130709_0.4157085373974416","host":"s3://npm-registry-packages"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"time":{"created":"2023-03-10T16:16:56.581Z","modified":"2026-08-12T16:10:29.485Z","1.0.0":"2023-03-10T16:16:57.010Z","1.0.1":"2023-03-10T16:33:56.497Z","1.0.5":"2024-01-25T19:07:44.988Z","1.0.6":"2024-01-25T20:06:52.415Z","1.0.7":"2024-01-25T21:12:10.902Z"},"bugs":{"url":"https://github.com/dmytromykhailiuk/condition-flow-engine/issues"},"author":{"name":"Dmytro Mykhailiuk"},"license":"ISC","homepage":"https://github.com/dmytromykhailiuk/condition-flow-engine#readme","repository":{"url":"git+https://github.com/dmytromykhailiuk/condition-flow-engine.git","type":"git"},"description":"Flexible flow management solution","maintainers":[{"name":"dmytromykhailiuk","email":"dimamykhayluk@gmail.com"}],"readme":"# Flexible flow management solution\n\n**Solution for big projects with dynamic application behaviour based on configurations**\n\n## Installation\n\n```sh\nnpm i @dmytromykhailiuk/condition-flow-engine\n```\n\n## Purpose\n\n**Why you should use this library?**\n- You need flow runner solution\n- You need condition validation solution based on JSON config\n- You want to have dynamic application behaviour based on JSON config\n\n**Interesting packages**\n\n- [Dependency Injection Container](https://www.npmjs.com/package/@dmytromykhailiuk/dependency-injection-container)\n- [React Dependency Injection Module](https://www.npmjs.com/package/@dmytromykhailiuk/react-di-module)\n- [RxJS React Redux Effects](https://www.npmjs.com/package/@dmytromykhailiuk/rx-react-redux-effect)\n- [Condition Flow Engine](https://www.npmjs.com/package/@dmytromykhailiuk/condition-flow-engine)\n\n**If you answered yes to one of the options, then this library is right choice.**\n\n## Flow Runner\n\n```typescript\n\nimport { ofType, Action, createFlowRunner } from \"condition-flow-engine-with-di\";\n\nconst actions$ = new Subject<Action>();\n\nactions$.pipe(\n  ofType('ADD'),\n  // we can do any synchronous or asynchronous stuff\n  map(({ context, value, id }) => ({ type: 'ADD End', id, context: context + value })), // We should dispatch same action type but with \" End\" sufix\n).subscribe(actions$.next),\n\nactions$.pipe(\n  ofType('MULTIPLY'),\n  // we can do any synchronous or asynchronous stuff\n  map(({ context, value, id }) => ({ type: 'MULTIPLY End', id, context: context * value })), // We should dispatch same action type but with \" End\" sufix\n).subscribe(actions$.next),\n\n\nconst runFlow = createFlowRunner({\n  actions$,\n  dispatch: actions$.next,\n});\n\nrunFlow<number>(\n  [\n    {\n      type: 'ADD',\n      value: 5\n    },\n    {\n      type: 'MULTIPLY',\n      value: 1.5\n    },\n    {\n      type: 'ADD',\n      value: -8\n    },\n  ],\n  3\n).subscribe((result) => {\n  console.log(result); // 4\n})\n\n```\n\n## Validate condition\n\n```typescript\n\nimport { validateCondition, ConditionObject, Operation } from './condition-functions';\n\nconst condition: ConditionObject = {\n  operation: Operation.AND,\n  value: [\n    {\n      operation: Operation.GE,\n      mapFromGlobalContext: ['damage', 'severity'],\n      value: 3,\n    },\n    {\n      operation: Operation.EQ,\n      mapFromGlobalContext: ['damage', 'type'],\n      value: 'Scratch',\n    },\n    {\n      operation: Operation.TO_BOOLEAN_EQ,\n      mapFromGlobalContext: ['damage', 'images'],\n      value: true,\n    },\n    {\n      operation: Operation.NE,\n      mapFromGlobalContext: ['user', 'role'],\n      value: 'admin',\n    },\n    {\n      operation: Operation.INCLUDES,\n      mapFromGlobalContext: ['user', 'site'],\n      value: [1, 2, 3, 4],\n    },\n  ],\n};\n\nconst context1 = {\n  damage: {\n    severity: 4,\n    type: 'Scratch',\n    images: ['/images/image1', '/images/image2'],\n  },\n  user: {\n    role: 'client',\n    site: 3\n  },\n};\n\nconst context2 = {};\n\nconst isContext1Valid = validateCondition({ condition, context: context1 }); // true\nconst isContext2Valid = validateCondition({ condition, context: context2 }); // false\n\n```\n\n# Condition Flow Engine\n\n## Flow Map\n\n```typescript\n\nconst actions$ = new Subject<Action>();\n\nconst conditionFlowEngine = createConditionFlowEngine({\n  flowRunner: createFlowRunner({\n    actions$: actions$.asObservable(),\n    dispatch: actions$.next,\n  }),\n  config: {\n    flowsMap: {\n      doSomething: [{ type: 'action1' }, { type: 'action2' }],\n      doOtherStuff: [{ type: 'action2' }, { type: 'action3' }, { type: 'action3' }],\n    },\n  }\n});\n\nconditionFlowEngine.runFlow('doSomething', null); // run Flow by Flow Name in flowsMap\n\n```\n\n## Condition Map\n\n```typescript\n\nconst actions$ = new Subject<Action>();\n\nconst conditionFlowEngine = createConditionFlowEngine({\n  flowRunner: createFlowRunner({\n    actions$: actions$.asObservable(),\n    dispatch: actions$.next,\n  }),\n  config: {\n    conditionsMap: {\n      isAdmin: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['user', 'role'],\n        value: 'admin'\n      }\n    },\n  }\n});\n\nconditionFlowEngine.validateCondition({ condition: 'isAdmin', context: { user: { role: 'admin' } } }); // validate condition by Condition Name in conditionsMap\n\n```\n\n## Validate Conditions And Run Flow\n\n```typescript\n\nconst actions$ = new Subject<Action>();\n\nconst conditionFlowEngine = createConditionFlowEngine({\n  flowRunner: createFlowRunner({\n    actions$: actions$.asObservable(),\n    dispatch: actions$.next,\n  }),\n  config: {\n    flowsMap: {\n      doSomething: [{ type: 'action1' }, { type: 'action2' }],\n      doOtherStuff: [{ type: 'action2' }, { type: 'action3' }, { type: 'action3' }],\n    },\n    conditionsMap: {\n      isAdmin: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['user', 'role'],\n        value: 'admin',\n      },\n      isFirstLesson: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['lessons', 'length'],\n        value: '1',\n      },\n    },\n    flowValidatorMap: {\n      canOpenScores: {\n        conditionToValidate: 'isAdmin',\n        conditionToIgnore: 'isFirstLesson',\n        onSuccess: 'doSomething',\n      },\n    },\n  }\n});\n\nconditionFlowEngine.validateConditionsAndRunFlow({\n  validator: 'canOpenScores',\n  context: {\n    user: { role: 'isAdmin' },\n    lessons: [\n      {\n        /* */\n      },\n      {\n        /* */\n      },\n      {\n        /* */\n      },\n    ],\n  },\n}); // doSomething flow will be executed\n\n```\n\n## Run Hooks\n\n```typescript\n\nconst actions$ = new Subject<Action>(); // for exmple -> here should be actions$ from redux\n\nconst conditionFlowEngine = createConditionFlowEngine({\n  flowRunner: createFlowRunner({\n    actions$: actions$.asObservable(),\n    dispatch: actions$.next,\n  }),\n  config: {\n    flowsMap: {\n      doSomething: [{ type: 'action1' }, { type: 'action2' }],\n      doOtherStuff: [{ type: 'action2' }, { type: 'action3' }, { type: 'action3' }],\n    },\n    conditionsMap: {\n      isAdmin: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['user', 'role'],\n        value: 'admin',\n      },\n    },\n    hooks: {\n      // validate conditions one by one and run flow for first valid condition\n      onLessonCreated: [\n        {\n          condition: 'isAdmin',\n          flow: 'doSomething',\n        },\n        'doOtherStuff',\n      ],\n    },\n  }\n});\n\nconditionFlowEngine.runHook('onLessonCreated', { user: { role: 'student' } }); // doOtherStuff flow will be executed\n\n```\n\n## Update config\n\n```typescript\n\nconst actions$ = new Subject<Action>();\n\nconst conditionFlowEngine = createConditionFlowEngine({\n  flowRunner: createFlowRunner({\n    actions$: actions$.asObservable(),\n    dispatch: actions$.next,\n  }),\n  config: {\n    conditionsMap: {\n      isAdmin: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['user', 'role'],\n        value: 'admin'\n      }\n    },\n  }\n});\n\nconditionFlowEngine.updateConfig((currentConfig) => ({\n  ...currentConfig,\n  isFirstLesson: {\n    operation: Operation.EQ,\n    mapFromLocalContext: ['lessons', 'length'],\n    value: '1',\n  },\n}));\n\nconditionFlowEngine.validateCondition({ condition: 'isFirstLesson', context: { lessons: [1] } }) // true\n\n```\n\n## Background Flows\n\n```typescript\n\nconst actions$ = new Subject<Action>();\n\nconst conditionFlowEngine = createConditionFlowEngine({\n  flowRunner: createFlowRunner({\n    actions$: actions$.asObservable(),\n    dispatch: actions$.next,\n  }),\n  config: {\n    flowsMap: {\n      doSomething: [{ type: 'action1' }, { type: 'action2' }],\n      doOtherStuff: [{ type: 'action2' }, { type: 'action3' }, { type: 'action3' }],\n    },\n    conditionsMap: {\n      isAdmin: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['user', 'role'],\n        value: 'admin',\n      },\n      isFirstLesson: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['currentLesson'],\n        value: '1',\n      },\n      isLessonsFinished: {\n        operation: Operation.EQ,\n        mapFromLocalContext: ['isLessonsFinished'],\n        value: true,\n      },\n    },\n    backgroundFlows: {\n      showAlert: [\n        {\n          conditionToSubscribe: 'isFirstLesson',\n          conditionToRunFlow: 'isLessonsFinished',\n          flow: 'doSomething',\n        },\n      ],\n    },\n  }\n});\n\nconst context$ = new BehaviorSubject<any>({ currentLesson: 1, isLessonsFinished: false });\n\nconditionFlowEngine.runBackgroundFlows('showAlert', context$);\n\n// delay 2000\n\ncontext$.next({ currentLesson: null, isLessonsFinished: true }); // doSomething flow will be executed\n\n// For unsubcribe logic\n\nconditionFlowEngine.runBackgroundFlows('showAlert', context$); // unsubcribe from showAlert BackgroundFlows and try to subscribe againe\n\n// OR\n\nconditionFlowEngine.stopBackgrounFlows('showAlert'); // unsubcribe from showAlert BackgroundFlows\n\n// OR \n\nconditionFlowEngine.stopAllBackgrounFlows(); // unsubcribe from all BackgroundFlows\n\n```\n","readmeFilename":"README.md"}