{"_id":"@apimediaru/dispatcher","_rev":"15-62197009ce023f5d304f61725eb9b4bc","name":"@apimediaru/dispatcher","dist-tags":{"latest":"1.0.10"},"versions":{"0.1.0":{"name":"@apimediaru/dispatcher","version":"0.1.0","license":"MIT","_id":"@apimediaru/dispatcher@0.1.0","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"118abb9f3ac33970cabd88fef8ebe9460e035dd0","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-0.1.0.tgz","fileCount":5,"integrity":"sha512-wbRjQceB0xU0uQ9GbSYVZZUuuLiyuXMfKJifvlwkV0rOpYr8tTbepVw7j8McnSE+UEX3cTTVGSA8XPSp0TlKGw==","signatures":[{"sig":"MEQCIHIO+iuEwEd/Wx3zJeb41W8XSQ9SFEH3+pGAZmck9jvgAiB4jqJWUnxt25/Ves2gTlxj6U38fqVtab7pcdkmnvcUGQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43215},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"31e04099ddd358c36d8e7afaa6ce320983b56c4a","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"9.8.0","description":"Effect dispatcher package","directories":{},"_nodeVersion":"16.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"4.4.6","vitest":"0.33.0","lodash-es":"^4.17.0","typescript":"5.1.6","@types/lodash":"4.14.195","vite-plugin-dts":"3.3.1","@types/lodash-es":"4.17.8","@apimediaru/shared":"2.11.0","@apimediaru/driven-event":"0.3.0"},"peerDependencies":{"lodash-es":"^4.17.0","@apimediaru/shared":"^0.3.2","@apimediaru/driven-event":"0.2.33"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_0.1.0_1692177077670_0.964637031905653","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@apimediaru/dispatcher","version":"0.1.1","license":"MIT","_id":"@apimediaru/dispatcher@0.1.1","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"3df489dd41044632b1723f9c81019ee11082da05","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-0.1.1.tgz","fileCount":5,"integrity":"sha512-j7+ucZBkjNa5msv//a2ejnJhR4n2uiHKjhKFX9/rtzSy7gbX4bQtZRgPg0Y/kCV6wkXM1o8caz9bLJOpFHCh2w==","signatures":[{"sig":"MEUCIQDMVv0fQmSwqz80+nOiBCAA2hibFu9d9u9bpuJ8Bx1LyAIgdQz5e4OVkV04HOIUgy5PpnW50rlJBS0DcFMMnzUNluw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43273},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"1e136df9f1e9d73770b511c3d5f3829c66ed4fe4","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"lerna/7.1.4/node@v16.20.0+x64 (win32)","description":"Effect dispatcher package","directories":{},"_nodeVersion":"16.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"4.4.6","vitest":"0.33.0","lodash-es":"^4.17.0","typescript":"5.1.6","@types/lodash":"4.14.195","vite-plugin-dts":"3.3.1","@types/lodash-es":"4.17.8","@apimediaru/shared":"2.11.0","@apimediaru/driven-event":"0.3.0"},"peerDependencies":{"lodash-es":"^4.17.0","@apimediaru/shared":"^0.3.2","@apimediaru/driven-event":"^0.2.33"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_0.1.1_1692177430848_0.28322525608801064","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"@apimediaru/dispatcher","version":"0.1.2","license":"MIT","_id":"@apimediaru/dispatcher@0.1.2","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"c7bbd3d997b662820ebeac07759c17e943d8143e","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-0.1.2.tgz","fileCount":5,"integrity":"sha512-NmszeU5OTaYi9EghZgEr2q/py688kOro6AfmKcFCItHF4UCXhaL0EPCOAaqkZyrmyaWhttJbHbecjl1Bf+l9xg==","signatures":[{"sig":"MEUCIFwhlAgHqKkyOKdwqBrGtRpVhD2gunlv1hy3YpFqNbJoAiEA/bjJj42ClZrcMvzN6V96TX3G21aMy1Kv3UBLQEJSPZg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43296},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"6abd2e6a05ac4b239aa1d9164ee1798d1a2419d3","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"lerna/7.1.4/node@v16.20.0+x64 (win32)","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"4.4.6","vitest":"0.33.0","lodash-es":"^4.17.0","typescript":"5.1.6","@types/lodash":"4.14.195","vite-plugin-dts":"3.3.1","@types/lodash-es":"4.17.8","@apimediaru/shared":"2.11.0","@apimediaru/driven-event":"1.0.1"},"peerDependencies":{"lodash-es":"^4.17.0","@apimediaru/shared":"^0.3.2","@apimediaru/driven-event":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_0.1.2_1692178063117_0.3408787810535461","host":"s3://npm-registry-packages"}},"0.1.3":{"name":"@apimediaru/dispatcher","version":"0.1.3","license":"MIT","_id":"@apimediaru/dispatcher@0.1.3","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"15cc5248d9c88fd7a63ce331451a48fdf24692a1","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-0.1.3.tgz","fileCount":5,"integrity":"sha512-QaDkxD1Nwt/kpFaAkqt0w17PxBVlWL0lyuBTws/HFGsSHYVG5EriAcXNQW8ABLQ5C/hLfWKJCxIf4MCikHhjpA==","signatures":[{"sig":"MEYCIQCM76wcgBtjduUkof56pITfI2YwJVYWlfvDTFRVNzcbcQIhAP64AIWJfDuSIKf8PsCCdPyVHoyhcDVwnzTEzU36qKEQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43297},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"dd2a5dfbe28a0f124ca80f4f96f6772f16e1ca3d","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"lerna/7.1.4/node@v16.20.0+x64 (win32)","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"4.4.6","vitest":"0.33.0","lodash-es":"^4.17.0","typescript":"5.1.6","@types/lodash":"4.14.195","vite-plugin-dts":"3.3.1","@types/lodash-es":"4.17.8","@apimediaru/shared":"2.11.0","@apimediaru/driven-event":"1.0.1"},"peerDependencies":{"lodash-es":"^4.17.0","@apimediaru/shared":"^2.11.0","@apimediaru/driven-event":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_0.1.3_1692178404693_0.8808757030561161","host":"s3://npm-registry-packages"}},"0.1.4":{"name":"@apimediaru/dispatcher","version":"0.1.4","license":"MIT","_id":"@apimediaru/dispatcher@0.1.4","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"3bba307e77f46ea428ab503f0a2c02af233c2caa","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-0.1.4.tgz","fileCount":5,"integrity":"sha512-G9IW2o0E5v/lMdV5ltRXUKxhcjM6K9qTNBZMwFEOBOWSIe8m6GM1FTGgGEKg9VkeM1izexXzFZG1JBVGth25rA==","signatures":[{"sig":"MEUCIGFVAqbuTgplOcroIrCjseAqfw9C1riPKBd1ElmMcMaCAiEAxeZYSgsySKpP6Y+wWRPLCt0qiLIR/WkcHIKNeiQTcUs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":43297},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"61a2422860cc8a84f202180bd7859d555f226f6e","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"lerna/7.1.4/node@v16.20.0+x64 (win32)","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"16.20.0","_hasShrinkwrap":false,"devDependencies":{"vite":"4.4.6","vitest":"0.33.0","lodash-es":"^4.17.0","typescript":"5.1.6","@types/lodash":"4.14.195","vite-plugin-dts":"3.3.1","@types/lodash-es":"4.17.8","@apimediaru/shared":"2.12.0","@apimediaru/driven-event":"1.0.2"},"peerDependencies":{"lodash-es":"^4.17.0","@apimediaru/shared":"^2.11.0","@apimediaru/driven-event":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_0.1.4_1693172224534_0.3350277421671324","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@apimediaru/dispatcher","version":"1.0.0","license":"MIT","_id":"@apimediaru/dispatcher@1.0.0","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"1c6412e247ea969b5575c1e85e8f493aebd1452b","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.0.tgz","fileCount":5,"integrity":"sha512-LTEzCChUMCoXPUnGcN47+ZuEEDw89pN22aljJ5BcKPaZrWnkbpmYFa9E7kpE8U9OVgURK6aJFpIBsrakvbdNZQ==","signatures":[{"sig":"MEQCIDMB4UuSDSK12yVsTwEA4f7QfZDJEPXS32ls1YHmxjDcAiB15tiBiNEhi530l5WBag8uUg//1xPdhq8ctn/uIFloiA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":82172},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"fb451127e59abd9041059f8ce49fa390438406a4","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.1.0","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"lodash-es":"^4.17.0","@apimediaru/shared":"^2.22.2","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"4.5.0","vitest":"1.0.0-beta.4","lodash-es":"^4.17.21","typescript":"5.2.2","@types/lodash":"4.14.201","vite-plugin-dts":"3.6.3","@types/lodash-es":"4.17.11","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.0_1703026916296_0.3050231978397948","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@apimediaru/dispatcher","version":"1.0.1","license":"MIT","_id":"@apimediaru/dispatcher@1.0.1","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"b0d2aabddf8ab5c21f2f10c2b3e95596f91770cc","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.1.tgz","fileCount":5,"integrity":"sha512-IJDfGuwT4tRLKdUJBsLCAfO/q6pIrZp+JkEuOHdqAEDtb6ow2y3MfSCYe8EKLW9jppeDq0rM8YYqe7aSBfUK8g==","signatures":[{"sig":"MEYCIQDphVDmlBCUSmdxn2pXqQ5M62gwCOcoFlDHsJpbgfNtewIhAPFQhVhQOtj/+1iP2JPNgIy7PNxS5zckqmS0kB/gCFa0","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":83673},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"b92d0db004721d0cf6488c1dd13efd32fa42bc22","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"9.8.1","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"18.18.2","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.29.1","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.2.6","vitest":"1.4.0","lodash-es":"^4.17.21","typescript":"5.4.3","@types/lodash":"4.17.0","vite-plugin-dts":"3.7.3","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.1_1713791291960_0.572543860876588","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@apimediaru/dispatcher","version":"1.0.2","license":"MIT","_id":"@apimediaru/dispatcher@1.0.2","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"b9c5fcd48b3ea7b306f9e6e1064e4ad0407f5c10","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.2.tgz","fileCount":5,"integrity":"sha512-iv+2y+lm2I74d+cTPdyNa2V0HUlY3kixVcVGw206eAC9ISeIvBAIyfkJjqLmFajdYS61tNjblmFdkvZEicNSFQ==","signatures":[{"sig":"MEUCIErNwHqwWGLNAIrH5YEIxTE+VscoVPYbjwLDri2l+hInAiEAj7hMMIfut+RGvbpoRW880RpJXoKVpY8cCcNsRAGYHlY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84642},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"165399611dff5cbe533c4e197b4efdbb5826e825","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"9.8.1","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"18.18.2","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.29.1","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.2.6","vitest":"1.4.0","lodash-es":"^4.17.21","typescript":"5.4.3","@types/lodash":"4.17.0","vite-plugin-dts":"3.7.3","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.2_1713802803353_0.25407292698277284","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@apimediaru/dispatcher","version":"1.0.3","license":"MIT","_id":"@apimediaru/dispatcher@1.0.3","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"9b32be04878e1c7fd0fce5ed0a6b7bf4e1a4a564","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.3.tgz","fileCount":5,"integrity":"sha512-/RD5044CwlZuYJDtSzj4gxzMj85JQO7QWj+UWaX7dKH1EKJqUl/vpN1k03X4xVkYJmhZfE62ul0mAG4t1V0bnw==","signatures":[{"sig":"MEQCIGEjxCIZSGyw4fwk0znbVxi3JD+0lLdS8xLj0P1iDWqEAiA0fXbbwBt4nfzJagOY1SMVqZtA9ran9YiZhQ8TvuiqXQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84756},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"1bf551f6946fb3ad8ad185a317f9d5548f49eb02","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"9.8.1","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"18.18.2","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.29.1","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.2.6","vitest":"1.4.0","lodash-es":"^4.17.21","typescript":"5.4.3","@types/lodash":"4.17.0","vite-plugin-dts":"3.7.3","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.3_1713805189294_0.8969812344106858","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"@apimediaru/dispatcher","version":"1.0.4","license":"MIT","_id":"@apimediaru/dispatcher@1.0.4","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"e8ae540915f8e84d7eb6e3af57e34eea383b1922","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.4.tgz","fileCount":5,"integrity":"sha512-RpjxV2Q+URxNyKgvvyNzmWGz2tCY1x461uwPE8lHxSVliih9jPgCLlUfEwgqdo0KyKMiermyRCyqboYN9I7M7A==","signatures":[{"sig":"MEUCIQDqE6tQD5hnwSjw5ctls+81ROctZdw8G/FOp9bOQcp7qgIgJ+T4YxEt/eSq3+o9sAqfd5wblQLwILOWKCBHboz7y0Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84653},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"441c9f2433c405ece9d23ec0fbefe77850796f55","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.1.0","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.31.1","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.3.3","vitest":"2.0.3","lodash-es":"^4.17.21","typescript":"5.5.3","@types/lodash":"4.17.6","vite-plugin-dts":"3.9.1","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.4_1721082243063_0.5886856512688441","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"@apimediaru/dispatcher","version":"1.0.5","license":"MIT","_id":"@apimediaru/dispatcher@1.0.5","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"c0e71b4b4c314bf3a92ae4879129d238dda03d94","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.5.tgz","fileCount":5,"integrity":"sha512-2GCxF8eOvjxNT4ZHHsn+x3O6kVMaA/rfT5Xcl/Qg35r8CAyxqYf3YBxfOnhqAhwpEHkAes1uqgZVD541dp09wA==","signatures":[{"sig":"MEUCIQDxPkXOTYm6kuPR3f+2GCwnR13klA5ZzIryjqXglz2N5QIgZkW/ry5ju0+T1901QTDPPr/Qn8HALREgGnUgFu3ARFo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84757},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"9cb1314e0af79d0d92ef6847c8b4b389707fc660","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.1.0","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.31.6","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.3.3","vitest":"2.0.3","lodash-es":"^4.17.21","typescript":"5.5.3","@types/lodash":"4.17.6","vite-plugin-dts":"3.9.1","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.5_1721734302841_0.7141514975807908","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"@apimediaru/dispatcher","version":"1.0.6","license":"MIT","_id":"@apimediaru/dispatcher@1.0.6","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"6c9929f77ff75db83a623821e745cc28300580b1","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.6.tgz","fileCount":5,"integrity":"sha512-0Xo16Ik+wLi+LfIuK5ybtlk+cTckdFfFZGpAd1fBd+Jrz6TwQP8DYMzOlNLEhkiC4+m/H+4WdhMnOvKKpmXUag==","signatures":[{"sig":"MEQCIAggm8dRzTRDFxFbm6++T1oKcxqNB2qQGKim2LqvMYEVAiAAwX1CTq05oeRp8kqoA4Oab7OvXQzyOFHPQ+mcjZOcdg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84743},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"a07050a25c409cf5ad7f65470fb2a243cceae3e5","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.1.0","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.31.6","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.3.3","vitest":"2.0.3","lodash-es":"^4.17.21","typescript":"5.5.3","@types/lodash":"4.17.6","vite-plugin-dts":"3.9.1","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.6_1721735174906_0.2876277952770434","host":"s3://npm-registry-packages"}},"1.0.7":{"name":"@apimediaru/dispatcher","version":"1.0.7","license":"MIT","_id":"@apimediaru/dispatcher@1.0.7","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"efcab819addf10d377637a3d51c595e406eceef0","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.7.tgz","fileCount":5,"integrity":"sha512-muIbw1RULMWZn5koxOsdkS4qVHouIpnmMTM16yhBQTJjiq/YtWfCasTS1Z2hQ/aeP32qQ3kY7Xa3A1lkFs1oNg==","signatures":[{"sig":"MEYCIQDU2YiaZOpe0+0aadPfznz65oD+jUhpfTBHgOXqWXK6+AIhALXl8VPoOTwsCvbNw9dumI2CEv3Yl6PUOWecDwOTO9fh","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84803},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"a07050a25c409cf5ad7f65470fb2a243cceae3e5","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.1.0","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.31.6","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.3.3","vitest":"2.0.3","lodash-es":"^4.17.21","typescript":"5.5.3","@types/lodash":"4.17.6","vite-plugin-dts":"3.9.1","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.7_1721735896006_0.19918836556427766","host":"s3://npm-registry-packages"}},"1.0.8":{"name":"@apimediaru/dispatcher","version":"1.0.8","license":"MIT","_id":"@apimediaru/dispatcher@1.0.8","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"e9db94a23bc3ee7edcdab73cb0d52f7f8c4a36aa","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.8.tgz","fileCount":5,"integrity":"sha512-/VlRGaHILT6fD1AQ/wno7HWmMKZJ1JW3sUWyQWCd1DDbT95/g2vmOPaMaRaLtoGgBFk7hJztZWxGIkpTU6QnwA==","signatures":[{"sig":"MEUCIGZ1e0wPLCP4m0Y1V6Ns7iEbwLhHO57ERu8hXK/WSHsrAiEAq0fmCwhKA5K75AQP0Wxk9rAaMjqYwxPLWixwjIOjke4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84920},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"5b62dcdb37e0f79d25e41f2aba98d2fc76daf71b","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.1.0","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"lodash-es":"^4.17.21","@apimediaru/shared":"^2.31.6","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.3.3","vitest":"2.0.3","lodash-es":"^4.17.21","typescript":"5.5.3","@types/lodash":"4.17.6","vite-plugin-dts":"3.9.1","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.8_1721737831556_0.11339158968609864","host":"s3://npm-registry-packages"}},"1.0.9":{"name":"@apimediaru/dispatcher","version":"1.0.9","license":"MIT","_id":"@apimediaru/dispatcher@1.0.9","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"dist":{"shasum":"d6c396b16389ae70c26e0d8926dc75b876b09be5","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.9.tgz","fileCount":5,"integrity":"sha512-1lF91M8Z82/MAAYuxg2FIQdY2AhgGU95aVSNN9m109fZAeSqn/m6p8CPlJfqoc6BdFN/1PAgZ2/w69dbV3KzYA==","signatures":[{"sig":"MEQCICcmDRi4WST08nX21dYUqBLptbB9CrTaiUcklSkpiKjvAiAuQVx+ADby7LHC6QlQyLj1AWN6CaUxDM6W6RSclw5Cmw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":84996},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.umd.cjs"}},"gitHead":"362f35c5896a88e3f50b28b049a4ef2209d13298","scripts":{"dev":"vite","test":"yarn test:unit","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test:unit":"vitest run","prepublishOnly":"yarn test && yarn build","test:unit:watch":"vitest watch"},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"_npmVersion":"10.8.2","description":"Effect dispatcher package","directories":{},"sideEffects":false,"_nodeVersion":"20.18.0","dependencies":{"@apimediaru/shared":"^2.35.1","@apimediaru/driven-event":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"5.4.8","vitest":"2.1.2","lodash-es":"^4.17.21","typescript":"5.6.2","@types/lodash":"4.17.10","vite-plugin-dts":"4.2.3","@types/lodash-es":"4.17.12","@apimediaru/shared":"workspace:*","@apimediaru/driven-event":"1.0.0"},"peerDependencies":{"lodash-es":"^4.17.21"},"_npmOperationalInternal":{"tmp":"tmp/dispatcher_1.0.9_1728387258660_0.42896622719691146","host":"s3://npm-registry-packages"}},"1.0.10":{"name":"@apimediaru/dispatcher","version":"1.0.10","type":"module","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"}},"description":"Effect dispatcher package","license":"MIT","sideEffects":false,"publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc -p tsconfig.dist.json && vite build","clean":"rimraf ./dist","test":"yarn test:unit","test:unit":"vitest run","test:unit:watch":"vitest watch","prepublishOnly":"yarn test && yarn build"},"dependencies":{"@apimediaru/driven-event":"^1.0.1","@apimediaru/shared":"^2.36.0"},"devDependencies":{"@apimediaru/driven-event":"1.0.1","@apimediaru/shared":"workspace:*","@types/lodash":"4.17.15","@types/lodash-es":"4.17.12","lodash-es":"^4.17.21","typescript":"5.7.3","vite":"6.1.0","vite-plugin-dts":"4.5.0","vitest":"3.0.5"},"peerDependencies":{"lodash-es":"^4.17.21"},"module":"./dist/index.js","types":"./dist/index.d.ts","_id":"@apimediaru/dispatcher@1.0.10","gitHead":"c4ccb165130d770830175272471dd135db433c08","_nodeVersion":"20.18.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-qP1cMt6YHqLf0yXCeojBoaa+JUeF4MW5CjzWkVYdnGnvXtiPc8NF5NlGesgAi8cRTql4rgtSGdKWv8+xPovbDw==","shasum":"0b43fb292746448b305b3ea1c8514f65795be4d0","tarball":"https://registry.npmjs.org/@apimediaru/dispatcher/-/dispatcher-1.0.10.tgz","fileCount":27,"unpackedSize":87742,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFij7DF4185peOnHSljOc4mO2NASDC91PW1mxep/ykOPAiBrUCzM6HR1cEp7vNf498N981jDtr83BoavpEleefDlDg=="}]},"_npmUser":{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"},"directories":{},"maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dispatcher_1.0.10_1740471538580_0.6386684936193692"},"_hasShrinkwrap":false}},"time":{"created":"2023-08-16T09:11:17.566Z","modified":"2025-02-25T08:18:59.068Z","0.1.0":"2023-08-16T09:11:17.824Z","0.1.1":"2023-08-16T09:17:11.055Z","0.1.2":"2023-08-16T09:27:43.294Z","0.1.3":"2023-08-16T09:33:25.037Z","0.1.4":"2023-08-27T21:37:04.791Z","1.0.0":"2023-12-19T23:01:56.570Z","1.0.1":"2024-04-22T13:08:12.122Z","1.0.2":"2024-04-22T16:20:03.605Z","1.0.3":"2024-04-22T16:59:49.504Z","1.0.4":"2024-07-15T22:24:03.215Z","1.0.5":"2024-07-23T11:31:43.005Z","1.0.6":"2024-07-23T11:46:15.051Z","1.0.7":"2024-07-23T11:58:16.206Z","1.0.8":"2024-07-23T12:30:31.716Z","1.0.9":"2024-10-08T11:34:18.841Z","1.0.10":"2025-02-25T08:18:58.833Z"},"license":"MIT","description":"Effect dispatcher package","maintainers":[{"name":"graandy","email":"it@apimedia.ru"},{"name":"exileofaranei","email":"anoceanofmyownregret@gmail.com"}],"readme":"# @apimediaru/dispatcher\n\n## Установка\n\n`npm install @apimediaru/dispatcher`\n\n## Начало использования\n\n**Идея компонента**: есть часто встречающиеся задачи, например, поменять заголовок в форме по клику, поменять подзаголовок, поставить новую цель, достигнуть какой-то цели и т.д. Ранее мы применяли императивный подход к решению таких задач, заводишь новый обработчик события на клик, создаешь функцию, в ней определяешь какие значения брать из каких атрибутов, что с этим значением делать и т.д. Получается много однотипного повторяющегося кода, который потом тяжело переиспользовать даже внутри одного проекта. Решено было как-то обобщить решение подобных микро задач в один компонент, чтоб его было легко использовать и настраивать, чтоб подход был максимально декларативным и не приходилось думать над тем как это сделать, а максимально сосредоточиться на том что нужно сделать. Для решения подобных задач был создан `Dispatcher`.\n\nВ качестве основы `Dispatcher` используются эффекты `Effects` - небольшие классы, создающиеся с помощью объекта-конфигурации. С помощью них можно быстро создать новый сценарий обработки нажатия на различные элементы. Условно можно представить эффект как запланированное действие, которое срабатывает при нажатии на элементы. Так как `Dispatcher` использует делегирование событий, то не имеет значения когда подходящий под эффект элемент был добавлен на страницу.\n\nЭффект по своей сути состоит из трех составляющих, можно представить что такое эффект, ответив на вопросы:\n1) нажатие на какие элементы будет запускать этот эффект? `trigger`\n2) нужны ли эффекту какие-либо данные, если да, то откуда и как их получить при срабатывании эффекта? `getter`\n3) что нужно сделать с полученными данными? `handler`\n\nВ простейшем виде эффект будет выглядеть следующим образом:\n```javascript\nimport { createDispatcher, createEffect } from '@apimediaru/dispatcher';\n\n// Создаем экземпляр диспетчера\nconst dispatcher = createDispatcher({\n  // Опции диспетчера\n  fallbackTarget: '.js-form-popup, #my-special-form',\n});\n\n// Создание эффекта\nconst effect = createEffect({\n  // Эффект сработает по клику на элементы с классом .js-init-effect\n  trigger: '.js-init-effect',\n  // Значением эффекта всегда будет результат выполнения `getter`, в данном случае `value` элемента\n  getter: ({ target }) => target.value,\n  // Обработчик эффекта получит результат `getter` и в данном случае выведет значение в консоль\n  handler: ({ value }) => console.log(value), \n});\n\n// Добавляем эффект диспетчеру\ndispatcher.addEffect(effect);\n```\n\nОднако, сам по себе эффект ничего не делает, чтобы эффект мог сработать, необходимо добавить его к диспетчеру эффектов `Dispatcher`, тогда он будет учитываться при обработке обытий.\n\n## Эффекты\n\n### DispatcherEffect\n\nЭффект - сценарий обработки события нажатия на элемент, который позволяет декларативно описать на какие элементы должно обрабатываться нажатие, как получать данные и как этими данными оперировать. Существенно сокращает количество кода, необходимого для решения подобных задач и упрощает разработку (*но это не точно*).\n\n### Типы эффектов\n\nСуществует несколько встроенных сценариев  эффектов, все они расширяют базовый класс `DispatcherEffect` и принимают в качестве аргумента объект с опциями.\n\n| Тип         | Класс                        | Factory                  | Назначение                                                               |\n|:------------|:-----------------------------|:-------------------------|:-------------------------------------------------------------------------|\n| `pure`      | `DispatcherEffect`           | `createPureEffect`       | Пустой эффект, который требует явного указания `getter` и `handler`      |\n| `base`      | `DispatcherEffectBase`       | `createBaseEffect`       | Эффект с предустановленным `getter`, который берет значение из атрибутов |\n| `code`      | `DispatcherCodeEffect`       | `createCodeEffect`       | Эффект для модификации содержимого DOM элементов                         |\n| `input`     | `DispatcherInputEffect`      | `createInputEfffect`     | Эффект для модификации значения `input` элементов                        |\n| `attribute` | `DispatcherAttributeEffect`  | `createAttributeEffect`  | Эффект для изменения значения атрибутов элементов                        |\n\nМожно получить список типов, импортировав объект `EffectTypes`:\n```javascript\nimport { EffectTypes } from '@apimediaru/dispatcher';\n\n// EffectTypes.PURE;\n// EffectTypes.BASE;\n// EffectTypes.CODE;\n// EffectTypes.INPUT;\n// EffectTypes.ATTRIBUTE;\n```\n\n### Общие опции для всех эффектов\n\n```typescript\ninterface EffectOptions {\n  // CSS селектор, клик по таким элементам будет запускать эффект\n  trigger: string;\n\n  // Значение по умолчанию\n  defaultValue?: string;\n\n  // Цели для диспетчеризации эффекты по умолчанию\n  to?: OverallSelector;\n\n  // Атрибуты элемента, запустившем событие, которые будет проверять dispatcher для определения цели диспетчеризации эффекта\n  toAttributes?: string;\n\n  // Позволяет определить свою логику получения эффектом значения\n  getter?(payload: { target: HTMLElement, event: DrivenEvent }): string;\n\n  // Позволяет определить свою логику обработки эффекта\n  handler?(payload: { value: any, dispatchTo: HTMLElement[], effect: DispathcerEffect }): void;\n\n  // Коллбэк, срабатывает на каждую обработку эффекта\n  onDispatch?: AnyFn;\n\n  // Функция обратного вызова, которая вызывается перед обработкой эффекта.\n  // Eсли функция явно вернет `false`, то выполнение эффекта будет остановлено.\n  gate?(payload: { target: HTMLElement, event: DrivenEvent }): false | void;\n\n  // Отменить действие по умолчанию для события\n  preventDefault?: boolean;\n\n  // Состояние включения эффекта. Выключенные эффекты игнорируются диспетчером\n  disabled?: boolean;\n\n  // У каждого типа эффектов могут быть свои дополнительные настройки\n  settings?: any;\n}\n\n```\n\n### DispatcherEffect\n\n`DispatcherEffect` создается с помощью функции `createPureEffect(options: EffectCommonOptions = {}): DispatcherEffect`.\n\nБазовый эффект, реализация логики обработки которого полностью зависит от нужд разработчика, которому необходимо самостоятельно указать `getter` и `handler`.\n\nНапример, создадим простой эффект, который по нажатию на элементы с классом `.js-demo`, будет брать значение атрибута `data-effect-value` и выводить значение в консоль.\n\n\n```javascript\nimport { createPureEffect, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher().addEffect(\n  createPureEffect({\n    trigger: '.js-demo',\n    getter: ({ element }) => element.getAtribute('data-effect-value'),\n    handler: ({ value }) => console.log(value),\n  }),\n);\n```\n\nМогут быть ситуации, когда отсутствует необходимость получения значения из элемента, в таких случаях эффект может быть функциональным, для этого можно просто опустить определение `getter`.\n\n```javascript\nimport { createPureEffect, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher().addEffect(\n  createPureEffect({\n    trigger: '.js-demo',\n    handler: () => alert('clicked'),\n  }),\n);\n```\n\nПо умолчанию эффект, также как и события, всплывает наверх по `DOM` дереву, однако это поведение можно предотвратить с помощью опции `gate`. В качестве `event` используется класс-обертка `DrivenEvent` над браузерным событием, который позволяет отследить использование `preventDefault`, `stopPropagation`, `stopImmediatePropagation`. Доступ к оригинальному событию можно получить через `event.originalEvent`.\n\n```javascript\nimport { createPureEffect, createDispatcher } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\ndispatcher.addEffect(\n  createPureEffect({\n    trigger: '.js-demo',\n    gate: ({ target, event }) => {\n      if (target.classList.contains('no-bubble')) {\n        event.stopPropagation();\n      }\n    },\n    handler: () => alert('clicked'),\n  }),\n);\n```\n\nТакже с помощью `gate` можно отменить поведение по умолчанию для события.\n\n```javascript\nimport { createPureEffect, createDispatcher } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\ndispatcher.addEffect(\n  createPureEffect({\n    trigger: '.js-demo',\n    gate: ({ target, event }) => {\n      if (target.tagName === 'A') {\n        event.originalEvent.preventDefault();\n      }\n    },\n    handler: () => alert('clicked'),\n  }),\n);\n```\n\nЛибо остановить выполнение эффекта если функция `gate` явно вернет `false`.\n\n```javascript\nimport { createPureEffect, createDispatcher } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\ndispatcher.addEffect(\n  createPureEffect({\n    trigger: '.js-demo',\n    gate: ({ target, event }) => {\n      if (target.classList.contains('js-prevent-effect')) {\n        return false;\n      }\n    },\n    handler: () => alert('clicked'),\n  }),\n);\n```\n\nВсе эффекты могут переопределять цели для диспетчеризации через атрибут `data-dispatch-to` путем указания `CSS` селектора в качестве значения. Так можно менять цели зффекта из разметки страницы.\n\n```html\n<div class=\"js-default-effect-target\"></div>\n\n<!-- Поведение эффекта по умолчанию -->\n<button class=\"js-demo\" data-effect-value=\"demo\">Trigger effect</button>\n\n<!-- Диспетчеризация эффекта на другие элементы с помощью атрибута -->\n<button class=\"js-demo\" data-effect-value=\"demo\" data-dispatch-to=\".js-another-target, #my-custom-target\">Trigger effect</button>\n\n<!-- Дополнительные цели для диспетчеризации -->\n<div class=\"js-another-target\"></div>\n<div id=\"my-custom-target\"></div>\n```\n\n```javascript\nimport { createPureEffect, createDispatcher } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher({\n  fallbackTarget: '.js-default-effect-target',\n});\n\ndispatcher.addEffect(\n  createPureEffect({\n    trigger: '.js-demo',\n    getter: ({ element }) => element.getAtribute('data-effect-value'),\n    handler: ({ value, dispatchTo }) => {\n      dispatchTo.forEach((element) => {\n        element.setAttribute('data-new-attribute', value);\n      });\n    },\n  }),\n);\n```\n\n### DispatcherEffectBase\n\nНаследует класс `DispatcherEffect`.\n\n`DispatcherEffectBase` создается с помощью функции `createBaseEffect(options: BaseEffectOptions = {}): DispatcherEffectBase`.\n\nБолее продвинутый класс, который спроектирован для того, чтобы брать значения из атрибутов или содержимого `DOM` элементов.\nИмеет встроенный `getter`, но по прежнему не имеет `handler`, который должен указываться самостоятельно.\n\nОпции:\n\n```typescript\ninterface BaseEffectOptions extends EffectOptions {\n  // Названия атрибутов для получения значения. Можно указать массив атрибутов,\n  // тогда поиск значения будет происходить путем перебора массива атрибутов\n  // до получения первого не пустого значения\n  valueAttributes?: AttributeName;\n\n  // Важно! Имеет больший приоритет чем опция `valueAttributes`!\n  // Названия атрибутов, которые содержат css селектор. Сначала будет найдено первое не пустое значение\n  // среди указанных атрибутов, затем содержимое первого найденно по селектору элемента элемента (innerHTML)\n  // будет взято в качестве значения эффекта.\n  // С помощью этой опции можно создавать скрытые элементы, которые будут использоваться для получения данных для\n  // последующей обработки эффектом\n  valueTemplateAttributes?: AttributeName;\n\n  // В случаях, когда нужно провести манипуляции внутри целевых элементов, указывается css селектор. Тогда\n  // цели для диспетчеризации будут искаться внутри `dispatchTo` элементов\n  payloadTarget?: AttributeName;\n```\n\nСоздадим для примера следующий эффект:\n\n```javascript\nimport { createBaseEffect, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher().addEffect(\n  createBaseEffect({\n    // Триггер эффекта\n    trigger: '.js-demo',\n\n    // Значение по умолчанию\n    defaultValue: 'Стандартное значение',\n\n    // Получение значения из атрибутов\n    valueAttributes: ['data-first', 'data-second', 'data-third'],\n\n    // Получение значения через содержимое DOM элементов\n    valueTemplateAttributes: ['data-template', 'data-template-2'],\n\n    // Обработчик значения\n    handler: ({ value }) => console.log(valuee),\n  }),\n);\n```\n\n```html\n<!-- Получение значения из атрибутов -->\n<!-- value -->\n<button class=\"js-demo\" data-first=\"value\">Demo #1</button>\n<!-- value 2 -->\n<button class=\"js-demo\" data-first data-second=\"value 2\">Demo #2</button>\n<!-- value 3 -->\n<button class=\"js-demo\" data-third=\"value 3\">Demo #3</button>\n<!-- Стандартное значение -->\n<button class=\"js-demo\" data-first data-second data-third>Demo #4</button>\n<!-- Стандартное значение -->\n<button class=\"js-demo\">Demo #5</button>\n\n<!-- Получение значения из DOM элементов -->\n<div style=\"display: none;\">\n  <!-- Шаблоны значений -->\n  <div id=\"template-1\">Шаблонное значение</div>\n  <div id=\"template-2\">Значение-шаблон 2</div>\n</div>\n<!-- Шаблонное значение -->\n<button class=\"js-demo\" data-first=\"value\" data-template=\"#template-1\">Demo #6</button>\n<!-- Значение-шаблон 2 -->\n<button class=\"js-demo\" data-template-2=\"template-2\">Demo #6</button>\n<!-- value 2 -->\n<button class=\"js-demo\" data-template-2 data-second=\"value 2\">Demo #6</button>\n<!-- Стандартное значение -->\n<button class=\"js-demo\" data-template-2 data-second>Demo #6</button>\n```\n\n### DispatcherCodeEffect\n\nНаследует класс `DispatcherEffectBase`.\n\n`DispatcherCodeEffect` создается с помощью функции `createCodeEffect(options: CodeEffectOptions = {}): DispatcherCodeEffect`.\n\nДанный эффект предназначен для изменения содержимого `DOM` элементов. Простейшие примеры использования: изменение заголовков всплывающих форм при нажатии на кнопку открытия, изменение подзаголовков и т.д. Данный эффект уже имеет свой стандартный `handler`, который, конечно, можно перепределить на свой через `handler`.\n\n```typescript\ninterface CodeEffectSettings {\n  hideIfEmpty?: boolean | string;\n}\n\ninterface CodeEffectOptions extends BaseEffectOptions {\n  settings?: {\n    // Скрывать элемент при пустых значениях (по умолчанию включено)\n    // Если булевое значение, то скрывается сам элемент. Если строка - будет осуществлен поиск ближайшего родителя, если таковой найдется, то скрыт будет уже он\n    hideIfEmpty?: boolean | string;\n  };\n}\n```\n\nПример: необходимо по клику на элементы с классом `js-demo-effect` или дата-атрибутом `data-demo-effect` брать значение из атрибута `data-first`, если он пуст, то брать из `data-second`, затем найти на странице все элементы с классом `js-data-target` или id `demo`, внутри которых есть элементы с классом `js-demo-title` или `js-title`, поменять у таких элементов содержимое на знчение, полученное из атрибутов, но для одной кнопки все тоже самое нужно сделать для элемента с классом `js-data-target-2`. Если значение в атрибутах есть, то показывать элемент, если значения нет, то скрывать через `display: none`. Если у триггер-элемента заполнен атрибут `data-source`, то взять его значение, которое является селектором, и найти первый подходящий элемент на странице и взять в качестве значения содержимое этого элемента. Обычных подход к решению такой задачи потребует достаточно много кода. Решение через `Dispatcher` и `DispatcherCodeEffect`.\n\nРазметка:\n```html\n<div style=\"display: none;\">\n  <div id=\"hidden-source\">\n     <p>Hidden title template</p>\n  </div>\n</div>\n\n<button class=\"js-demo-effect\" data-first=\"example\">Demo #1</button>\n<button class=\"js-demo-effect\" data-first=\"\" data-second=\"example 2\">Demo #2</button>\n<button class=\"js-demo-effect\" data-source=\"#hidden-source\">Demo #3</button>\n<button data-demo-effect data-second=\"example 3\" data-dispatch-to=\".js-data-target-2\">Demo #4</button>\n\n<div class=\"js-data-target\">\n  <h2 class=\"js-demo-title\">Default title</h2>\n</div>\n<div id=\"demo\">\n  <h2 class=\"js-title\">Default title #2</h2>\n</div>\n<div class=\"js-data-target-2\">\n  <h2 class=\"js-title\">Default title #3</h2>\n</div>\n```\n\nСоздание эффекта:\n```javascript\nimport { createCodeEffect, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher().addEffect(\n  createCodeEffect({\n    // Триггером для срабатывания этого эффекта будут элементы, которые попадают под этот селектор\n    trigger: '.js-demo-effect, [data-demo-effect]',\n    // Бери значение сначала из атрибута `data-first`, затем из `data-second`\n    valueAttributes: ['data-first', 'data-second'],\n    // Шаблонное значение\n    templateAttributes: 'data-source',\n    // Селектор целевых элементов по умолчанию\n    to: '.js-data-target, #demo',\n    // Селектор для поиска элементов, где нужно поменять значение\n    payloadTarget: '.js-demo-title, .js-title',\n    // Логируем элемент и значение при каждом срабатывании эффекта\n    onDispatch: ({ element, value }) => {\n      console.log(element, value);\n    },\n    // Настройки для эффекта типа `CODE`\n    settings: {\n      // Скрывать элементы если значение не было найдено\n      hideIfEmpty: true,\n    },\n  }),\n);\n```\n\n## DispatcherAttributeEffect\n\nНаследует класс `DispatcherEffectBase`.\n\n`DispatcherAttributeEffect` создается с помощью функции `createCodeEffect(options: AttributeEffectOptions = {}): DispatcherAttributeEffect`.\n\nЭффект предназначен для изменения/установки значений атрибутов у целевых элементов. Например, изменений целей при открытии формы по клику на кнопку.\n\n```typescript\ninterface AttributeEffectOptions extends BaseEffectOptions {}\n```\n\nПример: изменять атрибут `data-form-goal` у форм с классом `js-form` или `js-form-2` при клике на элементы с классом `js-set-form-goal`. Брать значение из атрибутов `data-goal`, `data-maybe-goal`, `data-definitely-goal`, значение по умолчанию `goal-default` (demo #1,2,3,4). Также должна быть возможность поменять изменить цель в какой-то произвольной форме по селектору (demo #5).\n\nРазметка:\n```html\n<button class=\"js-set-form-goal\" data-goal=\"goal\">Demo #1</button>\n<button class=\"js-set-form-goal\" data-maybe-goal=\"goal 2\">Demo #2</button>\n<button class=\"js-set-form-goal\" data-goal=\"\" data-definitely-goal=\"goal 33\">Demo #3</button>\n<button class=\"js-set-form-goal\">Demo #4</button>\n<button class=\"js-set-form-goal\" data-dispatch-to=\".js-form-3\" data-goal=\"custom target goal\">Demo #5</button>\n\n<form class=\"js-form\"></form>\n<form class=\"js-form-2\"></form>\n```\n\nЭффект:\n```javascript\nimport { createAttributeEffect, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher().addEffect(\n  createAttributeEffect({\n    // Триггер\n    trigger: '.js-set-form-goal',\n    // Откуда брать значение\n    valueAttributes: ['data-goal', 'data-maybe-goal', 'data-definitely-goal'],\n    // Куда положить значение\n    payloadAttributes: 'data-form-goal',\n    // Значение по умолчанию\n    defaultValue: 'goal-default',\n    // С какими элементами работать\n    to: '.js-form, .js-form-2',\n  }),\n);\n```\n\n### DispatcherInputEffect\n\nНаследует класс `DispatcherInputEffect`.\n\n`DispatcherAttributeEffect` создается с помощью функции `createInputEffect(options: AttributeEffectOptions = {}): DispatcherInputEffect`.\n\nЭффект предназначен для изменения значений `input` элементов с возможностью создать новый `input` элемент, если цель диспетчеризации не имеет подходящего элемента на момент срабатывания эффекта.\n\n```typescript\ninterface InputEffectSettings {\n  createIfNotExists?: boolean | {\n    attributes?: Attributes;\n    properties?: Properties;\n  };\n}\n\ninterface InputEffectOptions extends BaseEffectOptions {\n  settings?: InputEffectSettings;\n}\n```\n\nПример: необходимо поменять `value` у `input` элементов в форме, если таких нет, то создать скрытый `readonly` `input` c классом `custom-input`, типом `text` и присвоить значение. `name` `input` элементов - `type`. Совершать изменения по клику на элементы с классом `js-set-input`. Значение брать из атрибута `data-new-value` (#1), значение по умолчанию - `default input value` (#2). Искать среди элементов с классом `js-input-parent`.\n\n```html\n<button class=\"js-set-input\" data-new-value=\"input value\">Demo #1</button>\n\n<form class=\"js-input-parent\">\n  <input type=\"text\" name=\"type\">\n</form>\n<form class=\"js-input-parent\"></form>\n```\n\n```javascript\nimport { createAttributeEffect, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher().addEffect(\n  createInputEffect({\n    // Триггер\n    trigger: '.js-set-input',\n    // Откуда брать значения\n    valueAttributes: 'data-new-value',\n    // Значение по умолчанию\n    defaultValue: 'default-input-value',\n    // Где поменять значение\n    payloadTarget: 'input[name=\"type\"]',\n    // С какими элементами работать по умолчанию\n    to: '.js-input-parent',\n    // Настройки для эффекта `INPUT`\n    settings: {\n      // Создать если не существует\n      createIfNotExists: true,\n      // Задать атрибуты\n      attributes: {\n        class: 'custom-input',\n        type: 'text',\n        name: 'type',\n        readonly: '',\n      },\n      // Определить свойства\n      properties: {\n        hidden: true,\n      },\n    },\n  }),\n);\n```\n\n### Создание эффектов на основе объектов\n\nДля создания эффекта на основе объектов (может быть полезно при создании множества эффектов на основе объекта) необходимо воспользоваться функцией `createEffect`, сигнатура которой:\n\n`createEffect(options: Object = {}): typeof DispatcherEffect`\n\nДля указания какой эффект необходимо создать в объекте конфигурации необходимо указать тип эффекта с ключом `effectType`. В случаях когда `effectType` не указан, и также не указан `getter`, то будет создан `DispatcherEffectBase`, иначе `DispatcherEffect`.\n\n```javascript\nimport { createEffect, EffectTypes, createDispatcher } from '@apimediaru/dispatcher';\n\ncreateDispatcher([\n  // DispatcherEffect\n  createEffect({\n    // ... options for pure effect\n  }),\n\n  // DispatcherEffect\n  createEffect({\n    effectType: EffectTypes.PURE,\n    // ... options for pure effect\n  }),\n\n  // DispatcherEffect\n  createEffect({\n    effectType: EffectTypes.BASE,\n    // ... options for base effect\n  }),\n\n  // DispatcherEffect\n  createEffect({\n    effectType: EffectTypes.CODE,\n    // ... options for code effect\n  }),\n\n  // DispatcherEffect\n  createEffect({\n    effectType: EffectTypes.INPUT,\n    // ... options for input effect\n  }),\n\n  // DispatcherEffect\n  createEffect({\n    effectType: EffectTypes.ATTRIBUTE,\n    // ... options for attribute effect\n  }),\n]);\n```\n\nС помощью такого способа создания эффектов можно создавать карты эффектов:\n```javascript\nimport { createDispatcher, addEffects, removeEffectsFromKernelDispatcher } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\n\nconst effects = {\n  title: {\n    effectType: 'code',\n    trigger: '.js-set-title',\n    valueAttributes: 'data-attr',\n    payloadTarget: '.js-title',\n  },\n  type: {\n    effectType: 'input',\n    trigger: '.js-set-type',\n    valueAttributes: 'data-attr',\n    payloadTarget: 'input[name=type]',\n    settings: {\n      createIfNotExists: false,\n      attributes: {\n        type: 'text',\n        name: 'type',\n      },\n      properties: {\n        hidden: true,\n      },\n    },\n  },\n  // ... прочие эффекты\n};\n\n// Добавляем эффекты на основе объекта\nconst dispatcherEffects = addEffects(dispatcher, effects);\n\n// В дальнейшем мы можем отвязать эффекты от диспечтера если появится такая необходимость\nremoveEffects(dispatcher, dispatcherEffects);\n```\n\n\n### Factory\n\nЧтобы создать диспетчер, необходимо воспользоваться функцией `createDispatcher`, c сигнатурой `createDispatcher(options: Object = {}): Dispatcher`:\n\n```javascript\nimport { createDispatcher } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher({\n  fallbackTarget: '.js-form-popup, #my-special-form',\n});\n```\n\n### Опции:\n\n`delegateTarget: string | HTMLElement | HTMLElement[]`  \nЭлементы к которым будет применяться делегирование событий.  \nПо умолчанию: `[document.documentElement]`\n\n`fallbackTarget: null | string | HTMLElement | HTMLElement[]`  \nЭлементы, которые будут являться целями для диспетчеризации эффектов по умолчанию.  \nПо умолчанию: `null`\n\n### Instance API\n\n`addEffect(effect: DispatcherEffect, id?: string): Dispatcher`  \nДобавить новый эффект.\n\n`removeEffect(effect: string|DispatcherEffect): Dispatcher`  \nУдалить существующий эффект по id или по ссылке на эффект.\n\n`getEffectId(effect: DispatcherEffect): string|null`  \nПолучить id эффекта.\n\n`getEffect(id: string): DispatcherEffect|null`  \nПолучить эффект по id.\n\n`getEffects(): DispatcherEffect[]`  \nПолучить массив всех добавленных эффектов.\n\n`getEffectEntries(): [string, DispatcherEffect][]`  \nВозвращает массив пар эффектов `[id, effect]`.\n\n`invokeGetter(effectId: string, element: HTMLElement): Promise<string|null>`  \nВызвать `getter` определенного эффекта и получить результирующее значение.\n\n`invokeOperation(effectId: string, payload: { value: any, dispatchTo: HTMLElement[] }): Dispatcher`  \nВызвать `handler` определенного эффекта.\n\n### Functional API\n\n#### `addEffects`\n\n`addEffects(dispatcher: Dispatcher, namespaceOrEffects: string | DispatcherEffectList, rest?: DispatcherEffectList): DispatcherEffect[]`\n\nДля удобства разработчику предоставлена возможность добавлять эффекты в диспетчер несколькими способами в зависимости от ситуации.\n\nПервым аргументом идет ссылка на диспетчер, второй аргумент может быть `string` - пространство имен или `DispatcherEffectList`, третий `DispatcherEffectList` если указано пространство имен.\n\n```typescript\ntype DispatcherEffectList = string | Array<DispatcherEffect | [string, DispathcerEffect]> | Object<string, DispatcherEffect>\n```\n\nДобавление эффектов представленных в виде массива, где каждый элемент массива может быть `DispatcherEffect`, либо кортежем `[string, DispatcherEffect]`.\n\n```javascript\nimport { addEffects, createDispatcher, createEffect } from '@apimediaru/dispatcher';\nconst dispatcher = createDispatcher();\naddEffects(dispatcher, [\n  // id будет сгенерировано автоматически\n  createEffect({\n    // ... options\n  }),\n  \n  // добавляем по выбранному id\n  ['custom-effect', createEffect({\n    // ... options\n  })],\n]);\n```\n\nМожно добавить эффекты в виде объекта, где ключ будет использоваться в качестве `id` эффекта. В случае, если значение не будет являться экземпляром класса `DispatcherEffect`, то эффект из такого объекта будет автоматически создан с помощью `createEffect`.\n\n```javascript\nimport { addEffects, createDispatcher, createEffect, EffectTypes } from '@apimediaru/dispatcher;';\nconst dispatcher = createDispatcher();\naddEffects(dispatcher, 'custom-namespace', {\n  // custom-namespace/first-effect\n  'first-effect': createEffect({\n    // ... options\n  }),\n  \n  // custom-namespace/another-namespace\n  'another-effect': {\n    effectType: EffectTypes.CODE,\n    trigger: '.js-inline-effect',\n    getter: () => {},\n    handler: () => {},\n  },\n});\n```\n\n#### `removeEffects`\n\n`removeEffects(dispatcher: Dispatcher, namespaceOrEffects: string | DispatcherEffectList, rest?: DispatcherEffectList): DispatcherEffect[]`\n\nРаботает по такой же логике, как и `addEffects`, за исключением того, что можно передать в качестве аргумента с эффектами массив из строк идентификаторов.\n\n```javascript\nimport { addEffects, removeEffects, createDispatcher, createEffect, EffectTypes } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\nconst effectsConfig = {\n  first: createEffect(/* options */),\n  second: createEffect(/* options */),\n  third: createEffect(/* options */),\n};\n\n// Добавляем эффекты\nconst effects = addEffects(dispatcher, effectsConfig);\n\n// Вариант 1: удалить эффект, передав массив из эффектов\nremoveEffects(dispatcher, effects);\n\n// Вариант 2: удалить по id\nremoveEffects(dispatcher, ['first', 'second', 'third']);\n```\n\nПример с импользованием пространства имен:\n\n```javascript\nimport { addEffects, removeEffects, createDispatcher, createEffect, EffectTypes } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\nconst namespace = 'custom-namespace';\nconst effectsConfig = {\n  first: createEffect(/* options */),\n  second: createEffect(/* options */),\n  third: createEffect(/* options */),\n};\n\n// Добавляем эффекты\nconst effects = addEffects(dispatcher, namespace, effectsConfig);\n\n// Вариант 1: удалить эффект, передав массив из эффектов\nremoveEffects(dispatcher, effects);\n\n// Вариант 2: удалить по id\nremoveEffects(dispatcher, namespace, ['first', 'second', 'third']);\n```\n\n### Программный вызов эффектов\n\nСуществует возможность программного запуска эффектов через `invokeGetter` и `invokeOperation`.\n\nПрограммный вызов эффекта\n```javascript\nimport { createDispatcher, createEffect, EffectTypes } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\n\ndispatcher.addEffect(createEffect({\n  effectType: EffectTypes.PURE,\n  trigger: '.js-demo',\n  handler: () => alert('Invoke test'),\n}), 'demo-effect');\n\n// Будет вызван `alert`\ndispatcher.invokeOperation('demo-effect');\n```\n\nПолучение значения\n```javascript\nimport { createDispatcher, createEffect, EffectTypes } from '@apimediaru/dispatcher';\n\nconst dispatcher = createDispatcher();\n\ndispatcher.addEffect(createEffect({\n  effectType: 'pure',\n  trigger: '.js-demo',\n  getter: () => 'returned value',\n}), 'demo-effect');\n\ndispatcher.invokeGetter('demo-effect').then((value) => {\n  console.log(value);\n});\n```\n\nБолее сложный пример с получением данных из элемента\n```javascript\nconst dispatcher = createDispatcher();\n\ndispatcher.addEffect(createEffect({\n  effectType: 'base',\n  trigger: '.js-demo',\n  valueAttributes: ['data-attr-1'],\n}), 'demo-effect');\n\ndispatcher.invokeGetter('demo-effect', document.getElementById('invoke')).then((value) => {\n  console.log(value);\n});\n```\n","readmeFilename":"README.md"}